> ## Documentation Index
> Fetch the complete documentation index at: https://docs.signsealship.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Partner access requests API: self-serve API key requests

> Request a SignSealShip partner API key self-serve — business emails with a clear use case get an instant trial key, and everything else is human-reviewed.

Request partner API access without holding any credential yet. This endpoint is public and rate limited to 5 requests per hour per IP.

## How screening works

Your request is screened automatically:

* **Instant issue** — a business-domain work email (not a free provider such as gmail.com or outlook.com) plus a firm name and use case that are coherent and clearly related to notarization, closings, legal, title, or lending work gets a trial key issued immediately and emailed to the work email you submitted.
* **Human review** — everything else is queued for a person to review. You receive the same 200 response with `status: "pending"`, and the decision arrives by email.

The reasons behind a review decision are internal and are never included in the response or the email.

<Info>
  Issued keys start on the trial tier (5 active rooms) and are revocable. The
  raw key appears once, in the email — SignSealShip stores only its hash. See
  [authentication](/api-reference/authentication) for how to use and protect it.
</Info>

## Request

<ParamField body="firmName" type="string" required>
  Your firm or company name. Trimmed; at most 200 characters.
</ParamField>

<ParamField body="contactName" type="string" required>
  The requester's full name. Trimmed; at most 200 characters.
</ParamField>

<ParamField body="workEmail" type="string" required>
  A deliverable work email address, at most 254 characters. The issued key is
  sent here. A business domain is the strongest signal for instant issue.
</ParamField>

<ParamField body="role" type="string">
  Your role at the firm (for example "Escrow officer"). At most 120 characters.
</ParamField>

<ParamField body="expectedVolume" type="string">
  Rough expected volume (for example "10-20 closings/month"). At most 120
  characters.
</ParamField>

<ParamField body="useCase" type="string">
  What you plan to build or run on the API. At most 4,000 characters. A clear,
  on-topic description is the other half of the instant-issue gate.
</ParamField>

<ParamField body="recaptchaToken" type="string">
  Bot-screening token sent automatically by the request form on
  signsealship.com. Optional — omit it when calling the API directly; a
  missing token never blocks a request, and a low-scoring one routes the
  request to human review rather than rejecting it.
</ParamField>

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://signsealship.com/api/partner/request \
    -H "Content-Type: application/json" \
    -d '{
      "firmName": "Maple Title Co.",
      "contactName": "Dana Reyes",
      "workEmail": "dana@mapletitle.com",
      "role": "Escrow officer",
      "expectedVolume": "15 closings/month",
      "useCase": "Create a Verified Closing Room per escrow file and share the live link with buyers, sellers, and lenders."
    }'
  ```

  ```javascript Node theme={null}
  const res = await fetch("https://signsealship.com/api/partner/request", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      firmName: "Maple Title Co.",
      contactName: "Dana Reyes",
      workEmail: "dana@mapletitle.com",
      role: "Escrow officer",
      expectedVolume: "15 closings/month",
      useCase:
        "Create a Verified Closing Room per escrow file and share the live link with buyers, sellers, and lenders.",
    }),
  });
  const body = await res.json();
  console.log(body.status); // "issued" or "pending"
  ```

  ```python Python theme={null}
  import requests

  res = requests.post(
      "https://signsealship.com/api/partner/request",
      json={
          "firmName": "Maple Title Co.",
          "contactName": "Dana Reyes",
          "workEmail": "dana@mapletitle.com",
          "role": "Escrow officer",
          "expectedVolume": "15 closings/month",
          "useCase": (
              "Create a Verified Closing Room per escrow file and share the "
              "live link with buyers, sellers, and lenders."
          ),
      },
  )
  print(res.json()["status"])  # "issued" or "pending"
  ```
</CodeGroup>

## Response

Both outcomes return `200 OK` — the status field tells you which path your request took.

<ResponseField name="status" type="string" required>
  `"issued"` — a trial key was created and emailed to `workEmail`.
  `"pending"` — the request is queued for human review.
</ResponseField>

<ResponseField name="message" type="string" required>
  A browser-safe confirmation message matching the status.
</ResponseField>

<CodeGroup>
  ```json Issued theme={null}
  {
    "status": "issued",
    "message": "Your Closing Rooms access is ready — check your email."
  }
  ```

  ```json Pending theme={null}
  {
    "status": "pending",
    "message": "Thanks — we're reviewing your request and will email you shortly."
  }
  ```
</CodeGroup>

## Errors

| Status | Body                                                                      | When                                                      |
| ------ | ------------------------------------------------------------------------- | --------------------------------------------------------- |
| 400    | `{"error": "firmName, contactName, and a valid workEmail are required."}` | A required field is missing or the email shape is invalid |
| 429    | —                                                                         | More than 5 requests in an hour from one IP               |
