Docs

Pacts

Create a pact

Create a pact from a template or a one-off file, and optionally send it in the same call.

POST/v1/pacts

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

Authorizationstringheaderrequired
Bearer followed by your API key: Bearer sgk_…. The key also works in an X-Api-Key header. See Authentication.

Query parameters

include_linksbooleanquerydefault: false
With send, add the first signer's signing_url to the response.

Body

application/json
template_uidstring
The template to use. Required unless you upload a file.
filefile
Multipart only: a PDF or .docx (10 MB at most) used for this pact alone. It needs glyphs like a template.
recipientsarray of objectsrequired
Who 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
namestringrequired
Their name (150 characters at most).
emailstringrequired
Their address. Each address can appear once.
rolestringdefault: signer
signer signs; cc gets the finished copy and costs nothing.
One of signer cc
titlestring
Shown to signers and in emails, 150 characters at most. Defaults to the template's name (or the file name).
messagestring
A note included in the invitation email.
lapse_daysintegerdefault: 30
Days from sending until it lapses unsigned, 1 to 365. Values outside are clamped.
domain_hoststring
One 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: false
Send 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.
uidstring
The pact's id: 8 letters and digits.
titlestring
Shown to signers and in emails (150 characters at most).
statusstring
See Pact lifecycle.
One of draft sent sealed declined voided lapsed
messagestring | null
Your note in the invitation email.
page_countinteger
Pages in the document.
created_bystring
Where it was created: the dashboard, the API or the MCP server.
One of web api mcp
current_signerinteger | null
The 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) | null
When it was sent.
date_lapsesstring (date-time) | null
When it lapses if it is not sealed first.
date_sealedstring (date-time) | null
When the last signer signed.
date_updatedstring (date-time)
When anything about it last changed.
documents_chargedinteger | null
Documents it used when it was sent. null on a draft.
documents_costinteger | null
What sending this draft will use: one document per 3 signers, rounded up. Only set on a draft.
sent_sha256string
SHA-256 (lowercase hex) of the PDF as sent. The sigil records it too.
signed_sha256string | null
SHA-256 of the signed PDF, once sealed.
recipientsarray of objects
Signers in order, then CCs.
ShowHide recipient attributes
orderinteger
Position, starting at 1. Signers come first, numbered in the order you gave them; CCs follow.
rolestring
Signers sign in order; a CC gets the finished copy.
One of signer cc
namestring
The recipient's name.
emailstring
The recipient's address, lowercased.
statusstring
Where this recipient is.
One of pending viewed signed declined
date_viewedstring (date-time) | null
When they first opened their signing link.
date_signedstring (date-time) | null
When they signed.
typed_namestring | null
The full name they typed when signing.
decline_reasonstring | null
Their reason, if they declined.
signing_urlstring
The 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.
linksobject
Where to get the files.
ShowHide child attributes
documentstring (URL)
The document as sent (download).
signedstring (URL) | null
The signed PDF, once sealed (download).
sigilstring (URL) | null
The sigil (certificate of completion), once sealed (download).
dashboardstring (URL)
The pact's page on the dashboard (needs a login).
fieldsarray of objects
The pact's own copy of the fields, with values as signers fill them in.
Single-pact responses only.
ShowHide field attributes
idinteger | null
The field's id on a pact. null on a template.
recipientinteger
The 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.
typestring
What the signer provides.
One of signature initials name date text checkbox
pageinteger
The page it is on, starting at 1.
xnumber
Distance from the page's left edge, in PDF points (1/72 inch).
ynumber
Distance from the top of the page to the box's bottom edge, in points: the glyph's text baseline. Signatures stand on that line.
widthnumber
The box's width in points: set by the field type for a glyph, as drawn for a field placed by hand on the website.
heightnumber
The 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 | null
The label from the glyph, such as Company in \t1:Company\, or the one typed in the field editor.
requiredboolean
false when the glyph ends in ! (\t1:Phone!\, \c1!\), or when the field was made optional in the field editor.
valuestring | null
What 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 objects
The audit trail, oldest first.
Single-pact responses only.
ShowHide event attributes
eventstring
What happened.
One of created fields sent emailed email_failed viewed consented signed declined sealed copy_emailed copy_email_failed voided reissued
atstring (date-time)
When it happened.
bystring | null
Who did it: your email address, or the signer's. null for what the system does on its own, such as sealing.
tostring | null
Who an email went to, for emailed, email_failed, reissued, copy_emailed and copy_email_failed.
notestring | null
Detail, such as signer 2, the consent version, or the reason given for voiding or declining.
warningstring
Set 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

StatusWhen
400 Bad RequestThe 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 UnauthorizedThe API key is missing, wrong or revoked.
403 ForbiddenThe account's plan does not include API access (Pro and Business do).
409 ConflictWith send: not enough documents left. Nothing is created.

Every error body is { "error": "message" }. See Errors.