Envelopes API
An envelope is one or more PDFs sent to recipients for signature. Create, update, send, remind, void and track them.
On this page
List envelopes
/v1/envelopesEnvelopes you own, newest first. Fields are not included; retrieve an envelope to get them.
Required scope:envelopes:read
Query parameters
statusstringOnly envelopes in this status (public names only; anything else is a 422 with
paramstatus).One of
draftsentcompleteddeclinedvoidedexpiredsearchstringMatches the title.
created_afterstring · date-timeISO 8601 date or date-time (inclusive).
created_beforestring · date-timeISO 8601 date or date-time (inclusive).
template_idstring · uuidOnly envelopes created from this template.
metadata[key]objectExact metadata match, e.g.
metadata[crm_deal_id]=D-10492. Several keys must all match.pageintegerPage number, starting at 1.
default 1
per_pageintegerItems per page.
default 20
Response
A page of envelopes (without fields).
objectstring= "list"dataarray of EnvelopeChild attributes (Envelope)
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.
pageintegerper_pageintegertotalintegerhas_morebooleanWhether another page follows.
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). - 422Invalid filter, e.g. an unknown
status(validation_failed). - 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 -G https://signkoi.com/api/v1/envelopes \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
--data-urlencode "status=sent" \
--data-urlencode "metadata[crm_deal_id]=D-10492"Example response
{
"object": "list",
"data": [
{
"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"
}
],
"page": 1,
"per_page": 20,
"total": 1,
"has_more": false
}Create an envelope
/v1/envelopesCreates an envelope from one or more PDFs, optionally with recipients, fields and metadata, and sends it right away with send: true. Upload the files as multipart (file or files[]) or inline as base64 in JSON. If you pass recipients but no fields, a signature box is placed on the last page for the first signer. Counts against your plan's monthly document allowance (402 plan_limit when it is used up); requests rejected by validation use no quota, and if anything fails after the upload the envelope is removed and the quota refunded. If send is true and the envelope is not ready (for example a signer without a signature field), nothing is kept and you get a 422 with the reason as code.
Required scope:envelopes:write
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.
Request body application/json
filesarray of objectrequiredPDFs, base64-encoded (up to 10; the same size limits as uploads on the website, 25 MB by default). Several files are merged into one envelope in order.
1–10 items
Child attributes
namestringFile name, e.g.
agreement.pdf. Defaults todocument-N.pdf.content_base64stringrequiredBase64 PDF. A
data:application/pdf;base64,prefix and line breaks are accepted.
titlestringDefaults to the first file name without its extension.
messageMessageInputChild attributes (MessageInput)
subjectstring | nullDefaults to "Please sign: {title}".
max 200 chars
bodystring | nullmax 2000 chars
recipientsarray of RecipientInputChild attributes (RecipientInput)
keystringYour own reference for this recipient (unique within the request), so fields can point at it with
recipient_key.max 64 chars
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
fieldsarray of FieldInputIf omitted, a signature box is placed on the last page for the first signer.
Child attributes (FieldInput)
recipient_keystringThe
keyof the recipient who fills the field (wins overrecipient_index)…recipient_indexinteger…or their 0-based position in
recipients.≥ 0
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
requiredbooleanWhether 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
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
expires_in_daysinteger | nullDays the envelope stays signable after sending;
null= never expires.One of
13730remindersRemindersInputChild attributes (RemindersInput)
delay_daysinteger | null1–60
frequency_daysinteger | null1–60
sendbooleanSend immediately. If sending fails validation nothing is kept and you get a 422 with the reason.
default false
Request body multipart/form-data
Same as the JSON body, but upload the PDF(s) as files. recipients, fields, metadata, message and reminders are JSON-encoded strings.
filefileOne PDF…
files[]array of file…or several (up to 10).
titlestringrecipientsstringJSON array of RecipientInput.
fieldsstringJSON array of FieldInput.
metadatastringJSON object.
messagestringJSON object
{subject, body}.remindersstringJSON object
{delay_days, frequency_days}.expires_in_daysintegersendboolean
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, Idempotent-Replayed.
Errors
- 401Missing, invalid, expired or revoked API key (
api_key_missing,invalid_api_key). - 402The plan's monthly document allowance is used up (
plan_limit). - 403The key lacks a required scope (
insufficient_scope) or the account is suspended (account_suspended). - 413A file, or all files together, is larger than allowed (
file_too_large). - 422Invalid request (
validation_failed), a file problem (file_required,file_conflict,too_many_files,invalid_file,invalid_base64,file_not_pdf,invalid_pdf,invalid_json;paramisfile,files,files.Norfiles.N.content_base64), or withsend: truea send check (no_recipients,missing_recipient_details,unassigned_fields,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 POST https://signkoi.com/api/v1/envelopes \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
-H "Idempotency-Key: 5f1d7c1e-0b8a-4c2e-9f3d-61a2b7e4c905" \
-H "Content-Type: application/json" \
-d '{
"title": "Consulting agreement — Acme Ltd",
"files": [
{
"name": "agreement.pdf",
"content_base64": "JVBERi0xLjcKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFI…"
}
],
"message": {
"subject": "Please sign: Consulting agreement",
"body": "Hi Maya, here is the agreement we discussed."
},
"recipients": [
{
"key": "client",
"name": "Maya Patel",
"email": "maya@example.com",
"verification": "email_otp"
},
{
"name": "Jonas Weber",
"email": "jonas@example.com",
"role": "cc",
"routing_order": 2,
"language": "de"
}
],
"fields": [
{
"recipient_key": "client",
"type": "signature",
"page": 1,
"x": 0.12,
"y": 0.82,
"width": 0.3,
"height": 0.06
},
{
"recipient_key": "client",
"type": "date",
"page": 1,
"x": 0.6,
"y": 0.84,
"width": 0.2,
"height": 0.04
}
],
"metadata": {
"crm_deal_id": "D-10492"
},
"expires_in_days": 30,
"reminders": {
"delay_days": 2,
"frequency_days": 3
},
"send": true
}'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
}
]
}Retrieve an envelope
/v1/envelopes/{id}The envelope with its recipients and fields. Field values are included once the envelope is completed. Envelopes that are not yours return 404. Field ids change whenever the fields are replaced, so don't store them long-term.
Required scope:envelopes:read
Path parameters
idstring · uuidrequiredEnvelope id.
Response
Returns the EnvelopeDetail object — its attributes are listed under Create an envelope.
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."). - 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 https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47 \
-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
}
]
}Update an envelope
/v1/envelopes/{id}Change the title, message, expiry or reminders of a draft (409 envelope_not_draft otherwise), or the metadata of any envelope. Metadata is merged: keys you send are set, keys set to null are removed, others are kept; metadata: null clears it. message: null clears subject and body; expires_in_days: null removes the expiry.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope id.
Request body application/json
title, message, expires_in_days and reminders can only change while the envelope is a draft (409 envelope_not_draft otherwise). metadata can change at any time.
titlestringmessageobject | nullnullclears both subject and body.Child attributes
subjectstring | nullDefaults to "Please sign: {title}".
max 200 chars
bodystring | nullmax 2000 chars
expires_in_daysinteger | nullDays the envelope stays signable after sending;
null= no expiry.One of
13730remindersRemindersInputChild attributes (RemindersInput)
delay_daysinteger | null1–60
frequency_daysinteger | null1–60
metadataobject | nullMerged into the existing metadata. Set a key to
nullto delete it, or passmetadata: nullto clear all keys.
Response
Returns the EnvelopeDetail object — its attributes are listed under Create an envelope.
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 PATCH https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47 \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"metadata": {
"crm_stage": "contract_sent",
"old_key": null
}
}'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
}
]
}Delete a draft
/v1/envelopes/{id}Permanently deletes a draft envelope. Sent envelopes cannot be deleted (409 envelope_not_draft); void them instead.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope id.
Response
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). - 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 DELETE https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47 \
-H "Authorization: Bearer $SIGNKOI_API_KEY"Replace fields
/v1/envelopes/{id}/fieldsSets the complete list of fields of a draft. Every field is recreated, so field ids change on each call. Coordinates are fractions (0–1) of the page, origin top-left. Every field needs a recipient_id; signature, initials, date and input fields must belong to a signer or in_person_signer.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope id.
Request body application/json
fieldsarray of objectrequiredThe complete new set of fields; existing fields are replaced.
Child attributes
recipient_idstring · uuidrequiredThe recipient who fills the 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
requiredbooleanWhether 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
Response
Returns the EnvelopeDetail object — its attributes are listed under Create an envelope.
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/fields \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fields": [
{
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "signature",
"page": 1,
"x": 0.12,
"y": 0.82,
"width": 0.3,
"height": 0.06
},
{
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"type": "text",
"page": 1,
"x": 0.12,
"y": 0.3,
"width": 0.35,
"height": 0.04,
"label": "Company number",
"required": false
}
]
}'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
}
]
}Send an envelope
/v1/envelopes/{id}/sendSends a draft: the first recipients in the routing order are invited by email. Fails with 422 and a code when the envelope is not ready: no_recipients, missing_recipient_details, missing_signature_field, unassigned_fields or expired.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope 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 Create an envelope.
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). - 422The envelope is not ready to send:
no_recipients,missing_recipient_details,unassigned_fields,missing_signature_fieldorexpired. - 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/send \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
-H "Idempotency-Key: 5f1d7c1e-0b8a-4c2e-9f3d-61a2b7e4c905"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
}
]
}Void an envelope
/v1/envelopes/{id}/voidCancels an envelope that is out for signature. Recipients who still had something to do are told by email, with your reason. Only sent envelopes can be voided.
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope 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.
Request body application/json
reasonstringrequiredShown to the recipients in the void email.
max 500 chars
Response
Returns the EnvelopeDetail object — its attributes are listed under Create an envelope.
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; expired envelopes count as not sent). - 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 POST https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/void \
-H "Authorization: Bearer $SIGNKOI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"reason": "Terms changed; a new version follows."
}'Example response
{
"object": "envelope",
"id": "9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47",
"title": "Consulting agreement — Acme Ltd",
"status": "voided",
"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": "2026-11-14T12:00:00Z",
"void_reason": "Terms changed; a new version follows.",
"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
}
]
}Send a reminder
/v1/envelopes/{id}/remindEmails the invitation again to every recipient whose turn it is (in-person signers excluded). Only for sent envelopes. Limited to 6 calls a minute per account (429 rate_limited with Retry-After).
Required scope:envelopes:write
Path parameters
idstring · uuidrequiredEnvelope 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 Create an envelope.
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 nobody can be reminded (nobody_to_remind). - 429More than 6 reminders 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/remind \
-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
}
]
}Retrieve the audit trail
/v1/envelopes/{id}/audit-trailEvery recorded event of the envelope, oldest first — document.created, envelope.sent, recipient.sent, recipient.viewed, recipient.completed, envelope.completed and so on. actor is the person who acted, or null for system events. IP addresses and verification codes are never included.
Required scope:envelopes:read
Path parameters
idstring · uuidrequiredEnvelope id.
Query parameters
pageintegerPage number, starting at 1.
default 1
per_pageintegerItems per page.
default 20
Response
The audit trail, oldest first.
objectstring= "list"dataarray of AuditEventChild attributes (AuditEvent)
objectstring= "audit_event"eventstringe.g.
envelope.sent,recipient.viewed,recipient.completed,envelope.completed.actorobject | nullChild attributes
namestring | nullemailstring | null
recipient_idstring · uuid | nullcreated_atstring · date-time
pageintegerper_pageintegertotalintegerhas_morebooleanWhether another page follows.
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."). - 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 https://signkoi.com/api/v1/envelopes/9b2f4c1e-7a3d-4e8b-9c51-2d6f8a0b3e47/audit-trail \
-H "Authorization: Bearer $SIGNKOI_API_KEY"Example response
{
"object": "list",
"data": [
{
"object": "audit_event",
"event": "document.created",
"actor": {
"name": "Rina Koh",
"email": "rina@acme.example"
},
"recipient_id": null,
"created_at": "2026-11-14T09:30:05Z"
},
{
"object": "audit_event",
"event": "envelope.sent",
"actor": {
"name": "Rina Koh",
"email": "rina@acme.example"
},
"recipient_id": null,
"created_at": "2026-11-14T09:30:12Z"
},
{
"object": "audit_event",
"event": "recipient.viewed",
"actor": {
"name": "Maya Patel",
"email": "maya@example.com"
},
"recipient_id": "c4e1a8f2-3b7d-4f19-a6c2-8e5d0b9f1a73",
"created_at": "2026-11-15T13:58:01Z"
}
],
"page": 1,
"per_page": 20,
"total": 3,
"has_more": false
}