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>"
}Guides
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.
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.
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
string
required
Your firm or company name. Trimmed; at most 200 characters.
string
required
The requester’s full name. Trimmed; at most 200 characters.
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.
string
Your role at the firm (for example “Escrow officer”). At most 120 characters.
string
Rough expected volume (for example “10-20 closings/month”). At most 120
characters.
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.
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 return200 OK — the status field tells you which path your request took.
string
required
"issued" — a trial key was created and emailed to workEmail.
"pending" — the request is queued for human review.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
| 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 |