Recipients API
Manage the people on an envelope, resend invitations and create signing URLs for embedded signing.
Replace recipients
/v1/envelopes/{id}/recipientsSets the complete list of recipients of a draft. Pass id to keep an existing recipient; recipients you leave out are deleted together with their fields.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope id.
Request body application/json
recipientsarray of objectrequiredThe complete new set, as full objects. Pass
idto keep an existing recipient (and their fields); recipients you leave out are removed with their fields. For a kept recipient, omittingaccess_codeorphonekeeps the stored value. An unknownidis a 422 (paramrecipients.N.id).Child attributes
idstring · uuidExisting recipient to keep.
namestringrequiredRecipient name.
max 255 chars
emailstring · emailrequiredmax 255 chars
rolestringDefaults to
signer.One of
signerin_person_signerapproverviewerccrouting_orderintegerRecipients with the same number are invited together; higher numbers wait.
default 1 · ≥ 1
languagestringLanguage of the emails and signing page. Defaults to your account language.
One of
enesfrdeptitnlplrujazhhiverificationstringExtra identity check before signing. Defaults to
none.One of
noneaccess_codeemail_otpsms_otpaccess_codestring | nullRequired when
verificationisaccess_code. Share it with the recipient yourself; it is stored hashed and never returned.max 64 chars
phonestring | nullE.164 phone number, required when
verificationissms_otp. Returned masked.private_messagestring | nullNote only this recipient sees.
max 1000 chars
Response
An envelope including its fields (returned by retrieve, create and every update).
objectstringrequired= "envelope"idstring · uuidrequiredtitlestringrequiredstatusstringrequireddraft(not sent yet) →sent(out for signature) →completed(everyone finished). An envelope can also end asdeclined,voidedorexpired.One of
draftsentcompleteddeclinedvoidedexpiredmessageobjectEmail sent to recipients.
Child attributes
subjectstring | nullbodystring | null
metadataMetadataYour own key/value pairs (string → string). Up to 20 keys; keys up to 40 characters of letters, digits,
_,.and-; string values up to 500 characters (numbers are converted to strings; booleans and nested objects are rejected). Echoed on the envelope and in webhooks; filter lists withmetadata[key]=value.max 20 keys
template_idstring · uuid | nullTemplate the envelope was created from.
sourcestringCreated through the API or on the website.
One of
apiapppage_countintegerremindersobjectChild attributes
delay_daysinteger | nullDays before the first reminder.
frequency_daysinteger | nullDays between reminders after that.
recipientsarray of RecipientrequiredSorted by routing order.
Child attributes (Recipient)
objectstringrequired= "recipient"idstring · uuidrequiredrolestringrequiredsignersigns remotely;in_person_signersigns on your device (embedded signing);approverapproves without signing;viewermust open the document;ccgets a copy when it completes.One of
signerin_person_signerapproverviewerccrole_namestring | nullTemplate role this recipient fills, if any.
namestring | nullemailstring · email | nullrouting_orderintegerrequiredstatusstringrequiredpending: not their turn yet (or the envelope is a draft);sent: invited;viewed: opened the envelope;completed: finished;declined;delegated: handed over to someone else.One of
pendingsentviewedcompleteddeclineddelegatedlanguagestring | nullverificationstringOne of
noneaccess_codeemail_otpsms_otpphonestring | nullMasked, e.g.
+44 ••• ••• 4821.sent_atstring · date-time | nullviewed_atstring · date-time | nullcompleted_atstring · date-time | nulldeclined_atstring · date-time | nulldecline_reasonstring | null
filesobjectrequiredDownload URLs (authenticate with your API key).
signedandcertificatearenulluntil the envelope is completed.Child attributes
originalstring · urisignedstring · uri | nullcertificatestring · uri | null
created_atstring · date-timerequiredsent_atstring · date-time | nullcompleted_atstring · date-time | nulldeclined_atstring · date-time | nullvoided_atstring · date-time | nullvoid_reasonstring | nullexpires_atstring · date-time | nullAfter this the envelope can no longer be signed;
null= never.fieldsarray of FieldChild attributes (Field)
objectstringrequired= "field"idstringrequiredField id.
recipient_idstring · uuid | nullThe recipient who fills this field.
typestringrequiredOne of
signatureinitialsnameemailcompanytitledatetextnumbercheckboxradiodropdownattachmentformulanotepageintegerrequiredPage number, 1-based.
≥ 1
xnumberrequiredLeft edge as a fraction of the page width (origin top-left).
0–1
ynumberrequiredTop edge as a fraction of the page height (origin top-left).
0–1
widthnumberrequiredWidth as a fraction of the page width.
0.02–1
heightnumberrequiredHeight as a fraction of the page height.
0.01–1
requiredbooleanrequiredWhether the recipient must fill the field.
labelstring | nullLabel shown to the recipient.
max 120 chars
placeholderstring | nullmax 120 chars
optionsarray of string | nullChoices for
dropdown(and the value of eachradiobutton).max 50 items
group_namestring | nullGroups
radiobuttons; required for radio fields.max 120 chars
default_valuestring | nullPre-filled value. Required for
notefields (the text shown).max 2000 chars
validationstring | nullInput format check for
textfields.One of
emailnumberphonezipdateformulastring | nullOnly for
formulafields, e.g.[qty] * [price].max 500 chars
read_onlybooleanfont_sizeinteger | null8–20
valuestring | boolean | object | any | nullOnly present once the envelope is
completed. Text value;true/falsefor checkboxes;{ "filled": true }for signature, initials and attachment fields;nullif left empty.
Response headers: X-Request-Id, Signkoi-Version, X-RateLimit-Limit, X-RateLimit-Remaining.
Errors
- 401Missing, invalid, expired or revoked API key (
api_key_missing,invalid_api_key). - 403The key lacks a required scope (
insufficient_scope) or the account is suspended (account_suspended). - 404No such resource, or it belongs to someone else (
resource_missing, e.g. "No such envelope." / "No such recipient."). - 409The envelope is not a draft (
envelope_not_draft). - 422Invalid parameters (
validation_failed, withparamanderrors) or a business rule failed (e.g.missing_signature_field). - 429Too many requests (
rate_limited): your key's per-minute limit, or an endpoint's own limit. Wait forRetry-Afterseconds. - 500Something went wrong on our side (
internal_error). Safe to retry with the same Idempotency-Key.
Every error uses the error object.
Example request
curl -X PUT https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/recipients \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"recipients": [
{
"id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"name": "Maya Patel",
"email": "maya@example.com",
"verification": "email_otp"
},
{
"name": "Jonas Weber",
"email": "jonas@example.com",
"role": "cc",
"routing_order": 2
}
]
}'Example response
{
"object": "envelope",
"id": "9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47",
"title": "Consulting agreement — Acme Ltd",
"status": "draft",
"message": {
"subject": "Please sign: Consulting agreement",
"body": "Hi Maya, here is the agreement we discussed."
},
"metadata": {
"crm_deal_id": "D-10492"
},
"template_id": null,
"source": "api",
"page_count": 3,
"reminders": {
"delay_days": 2,
"frequency_days": 3
},
"recipients": [
{
"object": "recipient",
"id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"role": "signer",
"role_name": null,
"name": "Maya Patel",
"email": "maya@example.com",
"routing_order": 1,
"status": "pending",
"language": "en",
"verification": "email_otp",
"phone": null,
"sent_at": null,
"viewed_at": null,
"completed_at": null,
"declined_at": null,
"decline_reason": null
},
{
"object": "recipient",
"id": "e7b3d915-0c4a-4b6e-8f27-5a1c9d3e6b08",
"role": "cc",
"role_name": null,
"name": "Jonas Weber",
"email": "jonas@example.com",
"routing_order": 2,
"status": "pending",
"language": "de",
"verification": "none",
"phone": null,
"sent_at": null,
"viewed_at": null,
"completed_at": null,
"declined_at": null,
"decline_reason": null
}
],
"files": {
"original": "https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/files/original",
"signed": null,
"certificate": null
},
"created_at": "2026-11-14T09:30:05Z",
"sent_at": null,
"completed_at": null,
"declined_at": null,
"voided_at": null,
"void_reason": null,
"expires_at": null,
"fields": [
{
"object": "field",
"id": "48213",
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "signature",
"page": 1,
"x": 0.12,
"y": 0.82,
"width": 0.3,
"height": 0.06,
"required": true,
"label": null,
"placeholder": null,
"options": null,
"group_name": null,
"default_value": null,
"validation": null,
"formula": null,
"read_only": false,
"font_size": null
},
{
"object": "field",
"id": "48214",
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "date",
"page": 1,
"x": 0.6,
"y": 0.84,
"width": 0.2,
"height": 0.04,
"required": true,
"label": null,
"placeholder": null,
"options": null,
"group_name": null,
"default_value": null,
"validation": null,
"formula": null,
"read_only": false,
"font_size": null
}
]
}Correct a recipient
/v1/envelopes/{id}/recipients/{rid}Fixes a recipient's details while the envelope is out for signature and the recipient has not finished. Changing the email issues a new signing link (the old one stops working) and re-sends the invitation if it is their turn.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope id.
ridstring · uuidrequiredRecipient id.
Request body application/json
Correct a recipient who has not finished yet. Changing the email issues a new signing link (the old one stops working) and re-sends the invitation if it is their turn.
namestringRecipient name.
max 255 chars
emailstring · emailmax 255 chars
languagestringLanguage of the emails and signing page. Defaults to your account language.
One of
enesfrdeptitnlplrujazhhiverificationstringExtra identity check before signing. Defaults to
none.One of
noneaccess_codeemail_otpsms_otpaccess_codestring | nullRequired when
verificationisaccess_code. Share it with the recipient yourself; it is stored hashed and never returned.max 64 chars
phonestring | nullE.164 phone number, required when
verificationissms_otp. Returned masked.private_messagestring | nullNote only this recipient sees.
max 1000 chars
Response
Returns the EnvelopeDetail object — its attributes are listed under Replace recipients.
Response headers: X-Request-Id, Signkoi-Version, X-RateLimit-Limit, X-RateLimit-Remaining.
Errors
- 401Missing, invalid, expired or revoked API key (
api_key_missing,invalid_api_key). - 403The key lacks a required scope (
insufficient_scope) or the account is suspended (account_suspended). - 404No such resource, or it belongs to someone else (
resource_missing, e.g. "No such envelope." / "No such recipient."). - 409The envelope is not out for signature (
envelope_not_sent) or the recipient has finished (recipient_finished). - 422Invalid parameters (
validation_failed, withparamanderrors) or a business rule failed (e.g.missing_signature_field). - 429Too many requests (
rate_limited): your key's per-minute limit, or an endpoint's own limit. Wait forRetry-Afterseconds. - 500Something went wrong on our side (
internal_error). Safe to retry with the same Idempotency-Key.
Every error uses the error object.
Example request
curl -X PATCH https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/recipients/c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73 \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "maya.patel@example.com"
}'Example response
{
"object": "envelope",
"id": "9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47",
"title": "Consulting agreement — Acme Ltd",
"status": "sent",
"message": {
"subject": "Please sign: Consulting agreement",
"body": "Hi Maya, here is the agreement we discussed."
},
"metadata": {
"crm_deal_id": "D-10492"
},
"template_id": null,
"source": "api",
"page_count": 3,
"reminders": {
"delay_days": 2,
"frequency_days": 3
},
"recipients": [
{
"object": "recipient",
"id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"role": "signer",
"role_name": null,
"name": "Maya Patel",
"email": "maya.patel@example.com",
"routing_order": 1,
"status": "sent",
"language": "en",
"verification": "email_otp",
"phone": null,
"sent_at": "2026-11-14T09:30:12Z",
"viewed_at": null,
"completed_at": null,
"declined_at": null,
"decline_reason": null
},
{
"object": "recipient",
"id": "e7b3d915-0c4a-4b6e-8f27-5a1c9d3e6b08",
"role": "cc",
"role_name": null,
"name": "Jonas Weber",
"email": "jonas@example.com",
"routing_order": 2,
"status": "pending",
"language": "de",
"verification": "none",
"phone": null,
"sent_at": null,
"viewed_at": null,
"completed_at": null,
"declined_at": null,
"decline_reason": null
}
],
"files": {
"original": "https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/files/original",
"signed": null,
"certificate": null
},
"created_at": "2026-11-14T09:30:05Z",
"sent_at": "2026-11-14T09:30:12Z",
"completed_at": null,
"declined_at": null,
"voided_at": null,
"void_reason": null,
"expires_at": "2026-12-14T09:30:12Z",
"fields": [
{
"object": "field",
"id": "48213",
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "signature",
"page": 1,
"x": 0.12,
"y": 0.82,
"width": 0.3,
"height": 0.06,
"required": true,
"label": null,
"placeholder": null,
"options": null,
"group_name": null,
"default_value": null,
"validation": null,
"formula": null,
"read_only": false,
"font_size": null
},
{
"object": "field",
"id": "48214",
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "date",
"page": 1,
"x": 0.6,
"y": 0.84,
"width": 0.2,
"height": 0.04,
"required": true,
"label": null,
"placeholder": null,
"options": null,
"group_name": null,
"default_value": null,
"validation": null,
"formula": null,
"read_only": false,
"font_size": null
}
]
}Resend the invitation
/v1/envelopes/{id}/recipients/{rid}/resendEmails the invitation again to one recipient whose turn it is. Limited to 10 calls a minute per account.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope id.
ridstring · uuidrequiredRecipient id.
Headers
Idempotency-KeystringAny unique string (1–255 chars), e.g. a UUID. Retrying with the same key and body within 24 hours returns the original response instead of repeating the action.
Response
Returns the EnvelopeDetail object — its attributes are listed under Replace recipients.
Response headers: X-Request-Id, Signkoi-Version, X-RateLimit-Limit, X-RateLimit-Remaining.
Errors
- 401Missing, invalid, expired or revoked API key (
api_key_missing,invalid_api_key). - 403The key lacks a required scope (
insufficient_scope) or the account is suspended (account_suspended). - 404No such resource, or it belongs to someone else (
resource_missing, e.g. "No such envelope." / "No such recipient."). - 409Not possible right now:
envelope_not_sent,recipient_not_active(not their turn yet),recipient_finishedorrecipient_in_person(in-person signers get no email). - 429More than 10 resends a minute (
rate_limited), or your key's rate limit. - 500Something went wrong on our side (
internal_error). Safe to retry with the same Idempotency-Key.
Every error uses the error object.
Example request
curl -X POST https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/recipients/c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73/resend \
-H "Authorization: Bearer $SIGNKOI_API_KEY"Example response
{
"object": "envelope",
"id": "9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47",
"title": "Consulting agreement — Acme Ltd",
"status": "sent",
"message": {
"subject": "Please sign: Consulting agreement",
"body": "Hi Maya, here is the agreement we discussed."
},
"metadata": {
"crm_deal_id": "D-10492"
},
"template_id": null,
"source": "api",
"page_count": 3,
"reminders": {
"delay_days": 2,
"frequency_days": 3
},
"recipients": [
{
"object": "recipient",
"id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"role": "signer",
"role_name": null,
"name": "Maya Patel",
"email": "maya@example.com",
"routing_order": 1,
"status": "sent",
"language": "en",
"verification": "email_otp",
"phone": null,
"sent_at": "2026-11-14T09:30:12Z",
"viewed_at": null,
"completed_at": null,
"declined_at": null,
"decline_reason": null
},
{
"object": "recipient",
"id": "e7b3d915-0c4a-4b6e-8f27-5a1c9d3e6b08",
"role": "cc",
"role_name": null,
"name": "Jonas Weber",
"email": "jonas@example.com",
"routing_order": 2,
"status": "pending",
"language": "de",
"verification": "none",
"phone": null,
"sent_at": null,
"viewed_at": null,
"completed_at": null,
"declined_at": null,
"decline_reason": null
}
],
"files": {
"original": "https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/files/original",
"signed": null,
"certificate": null
},
"created_at": "2026-11-14T09:30:05Z",
"sent_at": "2026-11-14T09:30:12Z",
"completed_at": null,
"declined_at": null,
"voided_at": null,
"void_reason": null,
"expires_at": "2026-12-14T09:30:12Z",
"fields": [
{
"object": "field",
"id": "48213",
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "signature",
"page": 1,
"x": 0.12,
"y": 0.82,
"width": 0.3,
"height": 0.06,
"required": true,
"label": null,
"placeholder": null,
"options": null,
"group_name": null,
"default_value": null,
"validation": null,
"formula": null,
"read_only": false,
"font_size": null
},
{
"object": "field",
"id": "48214",
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "date",
"page": 1,
"x": 0.6,
"y": 0.84,
"width": 0.2,
"height": 0.04,
"required": true,
"label": null,
"placeholder": null,
"options": null,
"group_name": null,
"default_value": null,
"validation": null,
"formula": null,
"read_only": false,
"font_size": null
}
]
}Create a signing URL
/v1/envelopes/{id}/recipients/{rid}/signing-urlReturns a URL that opens the signing page for this recipient, for embedded or in-person signing in your own app. Only for the recipient whose turn it is (409 not_recipients_turn otherwise). Each call is recorded in the audit trail. Never send this URL to anyone but the recipient.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope id.
ridstring · uuidrequiredRecipient id.
Headers
Idempotency-KeystringAny unique string (1–255 chars), e.g. a UUID. Retrying with the same key and body within 24 hours returns the original response instead of repeating the action.
Response
objectstring= "signing_url"urlstring · uriOpens the signing page for this recipient. Treat it like a password: do not log or share it.
recipient_idstring · uuid
Response headers: X-Request-Id, Signkoi-Version, X-RateLimit-Limit, X-RateLimit-Remaining.
Errors
- 401Missing, invalid, expired or revoked API key (
api_key_missing,invalid_api_key). - 403The key lacks a required scope (
insufficient_scope) or the account is suspended (account_suspended). - 404No such resource, or it belongs to someone else (
resource_missing, e.g. "No such envelope." / "No such recipient."). - 409The envelope is not out for signature (
envelope_not_sent), or it is not this recipient's turn (not_recipients_turn). - 429Too many requests (
rate_limited): your key's per-minute limit, or an endpoint's own limit. Wait forRetry-Afterseconds. - 500Something went wrong on our side (
internal_error). Safe to retry with the same Idempotency-Key.
Every error uses the error object.
Example request
curl -X POST https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/recipients/c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73/signing-url \
-H "Authorization: Bearer $SIGNKOI_API_KEY"Example response
{
"object": "signing_url",
"url": "https://signkoi.com/s/8kQ2…",
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73"
}