Pacts
Create a pact
Create a pact from a template or a one-off file, and optionally send it in the same call.
Send a JSON body to use a saved template. To send a document without saving it as a template, send multipart/form-data instead, with a file part and the other fields as form fields (recipients as a JSON string).
Without send, the pact is a draft: check its documents_cost and send it with Send a pact. With "send": true the first signer is emailed in the same call, and documents are charged then.
Authorization
AuthorizationstringheaderrequiredBearer followed by your API key: Bearer sgk_…. The key also works in an X-Api-Key header. See Authentication.Query parameters
include_linksbooleanquerydefault: falseWith
send, add the first signer's signing_url to the response.Body
application/jsontemplate_uidstringThe template to use. Required unless you upload a
file.filefileMultipart only: a PDF or
.docx (10 MB at most) used for this pact alone. It needs glyphs like a template.recipientsarray of objectsrequiredWho signs, in order, and who gets a copy. Signers are numbered in the order given (the first is signer 1, matching
\s1\), then CCs. Every glyph number needs a signer, and every signer needs at least one glyph. At most 99 recipients.ShowHide recipient attributes
namestringrequiredTheir name (150 characters at most).
emailstringrequiredTheir address. Each address can appear once.
rolestringdefault: signersigner signs; cc gets the finished copy and costs nothing.One of
signer cctitlestringShown to signers and in emails, 150 characters at most. Defaults to the template's name (or the file name).
messagestringA note included in the invitation email.
lapse_daysintegerdefault: 30Days from sending until it lapses unsigned, 1 to 365. Values outside are clamped.
domain_hoststringOne of your verified custom domains to send under: signer pages and emails then carry that domain and its branding. Leave it out to send from the main site.
sendbooleandefault: falseSend it now. Uses one document per 3 signers; refused with
409 (and nothing is created) when you do not have enough.Response
201 CreatedThe new pact: a draft, or sent when you asked.
warning is set if the first invitation email failed.uidstringThe pact's id: 8 letters and digits.
titlestringShown to signers and in emails (150 characters at most).
statusstringSee Pact lifecycle.
One of
draft sent sealed declined voided lapsedmessagestring | nullYour note in the invitation email.
page_countintegerPages in the document.
created_bystringWhere it was created: the dashboard, the API or the MCP server.
One of
web api mcpcurrent_signerinteger | nullThe
order of the signer whose turn it is while the pact is sent; otherwise null.date_createdstring (date-time)When the draft was created.
date_sentstring (date-time) | nullWhen it was sent.
date_lapsesstring (date-time) | nullWhen it lapses if it is not sealed first.
date_sealedstring (date-time) | nullWhen the last signer signed.
date_updatedstring (date-time)When anything about it last changed.
documents_chargedinteger | nullDocuments it used when it was sent.
null on a draft.documents_costinteger | nullWhat sending this draft will use: one document per 3 signers, rounded up. Only set on a draft.
sent_sha256stringSHA-256 (lowercase hex) of the PDF as sent. The sigil records it too.
signed_sha256string | nullSHA-256 of the signed PDF, once sealed.
recipientsarray of objectsSigners in order, then CCs.
ShowHide recipient attributes
orderintegerPosition, starting at 1. Signers come first, numbered in the order you gave them; CCs follow.
rolestringSigners sign in order; a CC gets the finished copy.
One of
signer ccnamestringThe recipient's name.
emailstringThe recipient's address, lowercased.
statusstringWhere this recipient is.
One of
pending viewed signed declineddate_viewedstring (date-time) | nullWhen they first opened their signing link.
date_signedstring (date-time) | nullWhen they signed.
typed_namestring | nullThe full name they typed when signing.
decline_reasonstring | nullTheir reason, if they declined.
signing_urlstringThe private link for the signer whose turn it is. Anyone with it can sign as that person, so only give it to them.
Only with
include_links=1, and only on the waiting signer.linksobjectWhere to get the files.
fieldsarray of objectsThe pact's own copy of the fields, with values as signers fill them in.
Single-pact responses only.
ShowHide field attributes
idinteger | nullThe field's id on a pact.
null on a template.recipientintegerThe signer the field belongs to: the number in its glyph (
\s2\ → 2), or the signer it was given to in the website's field editor.typestringWhat the signer provides.
One of
signature initials name date text checkboxpageintegerThe page it is on, starting at 1.
xnumberDistance from the page's left edge, in PDF points (1/72 inch).
ynumberDistance from the top of the page to the box's bottom edge, in points: the glyph's text baseline. Signatures stand on that line.
widthnumberThe box's width in points: set by the field type for a glyph, as drawn for a field placed by hand on the website.
heightnumberThe box's height in points: set by the field type for a glyph, as drawn for a field placed by hand on the website.
labelstring | nullThe label from the glyph, such as
Company in \t1:Company\, or the one typed in the field editor.requiredbooleanfalse when the glyph ends in ! (\t1:Phone!\, \c1!\), or when the field was made optional in the field editor.valuestring | nullWhat was filled in, once that signer has signed: text as typed,
"1" or "0" for a checkbox, the typed name for name, and the signing date (MM/dd/yyyy, UTC) for date. Signatures and initials are images on the PDF, so they stay null.eventsarray of objectsThe audit trail, oldest first.
Single-pact responses only.
ShowHide event attributes
eventstringWhat happened.
One of
created fields sent emailed email_failed viewed consented signed declined sealed copy_emailed copy_email_failed voided reissuedatstring (date-time)When it happened.
bystring | nullWho did it: your email address, or the signer's.
null for what the system does on its own, such as sealing.tostring | nullWho an email went to, for
emailed, email_failed, reissued, copy_emailed and copy_email_failed.notestring | nullDetail, such as
signer 2, the consent version, or the reason given for voiding or declining.warningstringSet when an invitation email could not be delivered. The action still happened: resend the link, or check the address.
Only on create (with
send), send and resend responses, and only when an email failed.Errors
| Status | When |
|---|---|
| 400 Bad Request | The body is not a JSON object; no template_uid or file; an unknown template; a recipient without a name or with an invalid or repeated address; signers that do not match the glyphs; a domain_host that is not a verified domain; or an unreadable file. |
| 401 Unauthorized | The API key is missing, wrong or revoked. |
| 403 Forbidden | The account's plan does not include API access (Pro and Business do). |
| 409 Conflict | With send: not enough documents left. Nothing is created. |
Every error body is { "error": "message" }. See Errors.