Skip to main content
POST
/
api
/
partner
/
request
Partner access requests
curl --request POST \
  --url https://api.example.com/api/partner/request \
  --header 'Content-Type: application/json' \
  --data '
{
  "firmName": "<string>",
  "contactName": "<string>",
  "workEmail": "<string>",
  "role": "<string>",
  "expectedVolume": "<string>",
  "useCase": "<string>",
  "recaptchaToken": "<string>"
}
'
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
firmName: '<string>',
contactName: '<string>',
workEmail: '<string>',
role: '<string>',
expectedVolume: '<string>',
useCase: '<string>',
recaptchaToken: '<string>'
})
};

fetch('https://api.example.com/api/partner/request', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
import requests

url = "https://api.example.com/api/partner/request"

payload = {
"firmName": "<string>",
"contactName": "<string>",
"workEmail": "<string>",
"role": "<string>",
"expectedVolume": "<string>",
"useCase": "<string>",
"recaptchaToken": "<string>"
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
{
  "status": "<string>",
  "message": "<string>"
}
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.
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 for how to use and protect it.

Request

firmName
string
required
Your firm or company name. Trimmed; at most 200 characters.
contactName
string
required
The requester’s full name. Trimmed; at most 200 characters.
workEmail
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.
role
string
Your role at the firm (for example “Escrow officer”). At most 120 characters.
expectedVolume
string
Rough expected volume (for example “10-20 closings/month”). At most 120 characters.
useCase
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.
recaptchaToken
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.
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."
  }'
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"
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"

Response

Both outcomes return 200 OK — the status field tells you which path your request took.
status
string
required
"issued" — a trial key was created and emailed to workEmail. "pending" — the request is queued for human review.
message
string
required
A browser-safe confirmation message matching the status.
{
  "status": "issued",
  "message": "Your Closing Rooms access is ready — check your email."
}
{
  "status": "pending",
  "message": "Thanks — we're reviewing your request and will email you shortly."
}

Errors

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