Developers
E-signature API and webhooks for agreements
An e-signature API lets your own software send agreements for signature and react when they are signed. With the Signee API you create an agreement from a template with variables, add signers in order, send it, and receive webhooks when it is viewed, signed or declined, or when a renewal falls due.
- Create agreements from templates
- Signers, order and sending in one call
- Webhooks for viewed, signed, declined
- Renewal due events after signing
RequestCreate from a template and send
curl -X POST https://signee.io/api/v1/agreements \ -H "Authorization: Bearer $SIGNEE_KEY" \ -d '{ "template": "order-form", "variables": { "customer": "Acme Retail", "fee_usd": 3000 }, "signers": [{ "email": "[email protected]", "order": 1 }], "send": true }'
201 CreatedResponse, 184 ms
{
"id": "agr_8KQ2",
"status": "sent",
"missing_fields": [],
"signing_url": "https://signee.io/sign/7c1e..."
}
WebhookPOST to your endpoint after signing
{
"event": "agreement.signed",
"agreement_id": "agr_8KQ2",
"renewal_date": "2027-10-01"
}
Agreements from your product, without building a signing tool
If your app onboards customers, partners or contractors, there is usually an agreement somewhere in the flow. Building signing yourself means storing consent, tracking each signer, producing a sealed PDF and keeping evidence of who signed what and when. The API hands that work to Signee while the agreement starts and ends in your product.
The agreement still lives in Signee, so your team sees it in the same repository as contracts sent by hand, with the same audit trail and the same renewal tracking. Signee is contract management software first, and the API is another way to put agreements into it.
For teams that prefer rules over code, much of the same can be done inside the app with contract automation software: generate drafts from CRM deals, route approvals and run actions after signature, then use the API only where your own system needs to start or hear about an agreement.
When
Events you subscribe to
-
agreement.viewed
A signer opened the agreement from the email link
-
agreement.signed
All signers signed, sealed PDF ready
-
agreement.declined
A signer declined, with the reason given
-
renewal.due
A notice or renewal date is approaching
What the API does
The calls most integrations need
Everything below runs against the same workspace, templates and limits you use in the app.
Create from a template
Pick a template and pass variables such as customer name, fee and start date. Missing required variables are reported before anything is sent.
Add signers and order
List signers with email and order. Sign one after another or in parallel, the same options as in the editor.
Send in the same request
Create and send in one call, or create a draft that a teammate reviews and sends from the app.
Webhooks
Subscribe an endpoint to viewed, signed, declined and renewal due events. Each endpoint has its own secret.
Read status and files
Fetch an agreement to see its status, each signer state and the link to the signed PDF with the audit certificate.
Keys per workspace
Create and revoke API keys in the app under API and webhooks. Revoked keys stop working right away.
Getting started
From key to first signed agreement
-
1
Create a key
Open API and webhooks in the app and create an API key for your workspace.
-
2
Add a webhook
Register your endpoint URL and choose the events you want to receive.
-
3
Prepare a template
Turn your agreement into a template and name the variables your code will fill.
-
4
Create and send
Post the template, variables and signers, and listen for the signed event.
Signers receive the same experience as any agreement sent from the editor: an email link, consent to electronic records, signing on any device and a sealed PDF at the end. The electronic signature software page describes that flow and the audit trail in detail.
Reference
Endpoints of API version 1
Base address https://signee.io/api/v1. Every request sends the key as Authorization: Bearer followed by the key. A key in the address or the request body is refused.
- GET /agreements List agreements of the workspace, newest first. Filters status and per_page (up to 100).
- POST /agreements Create an agreement from one sentence (prompt) or from a template with variables. Optional signers, and send true to send it in the same call.
- GET /agreements/{id} One agreement with its status, signers, variables, missing fields and key dates.
- POST /agreements/{id}/send Send a draft for signature. Optional signers, expires_in_days, reminder_every_days and signing_order.
- GET /agreements/{id}/pdf The PDF. After the last signature this is the sealed copy with the audit certificate.
- GET /templates Library templates and your own templates with the variables each one expects.
- GET /webhooks Your webhook endpoints and the events they receive. Secrets are never returned.
Create and send in one request
curl https://signee.io/api/v1/agreements \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"template": "order-form",
"variables": { "customer_name": "Acme Retail", "fee": "3,000 USD per month" },
"signers": [ { "name": "Tom Reed", "email": "[email protected]", "order": 1 } ],
"send": true
}'
The answer is 201 with the agreement under data and the result of sending under send. When a required variable is empty, send carries the error missing with the empty fields named, and the agreement stays a draft.
Checking a webhook signature
Each delivery is a JSON POST with the headers X-Signee-Event, X-Signee-Delivery and X-Signee-Signature. The signature has the form t=timestamp,v1=hex. Compute HMAC-SHA256 of the timestamp, a dot and the raw body with your endpoint secret and compare it with the hex value. Reject deliveries older than five minutes.
$expected = hash_hmac('sha256', $t.'.'.$rawBody, $secret);
hash_equals($expected, $v1); // true for a genuine delivery
Answer with any 2xx status. Other answers are retried after 1, 5, 30, 120 and 360 minutes, and you can retry or send a test delivery from the app.
Errors and limits
Errors return JSON with error.code and error.message. 401 means a missing, unknown or revoked key, 403 a plan without API access or a used up document quota, 404 an agreement outside your workspace, 409 an agreement that was already sent, 422 invalid input and 429 the daily call limit of your plan. Every answer carries X-RateLimit-Limit and X-RateLimit-Remaining, and the daily count resets at midnight UTC.
- Oct 9, 08:02 Agreement created from template by API key Onboarding service, hash cb0082faa5ee
- Oct 9, 08:02 Sent to 1 signer Onboarding service, hash 640ce73b7568
- Oct 9, 08:15 Opened from email link Rita Gomez, hash fe3621654fc0
- Oct 9, 08:17 Consent to electronic records accepted Rita Gomez, hash 2b0090ec3b73
- Oct 9, 08:18 Signed, document sealed Rita Gomez, hash a712d5d82c0c
Each event stores the hash of the previous one. Any change after sealing breaks the chain and shows on the certificate.
Security and evidence
API keys belong to a workspace and are shown once when created. Store them on your server, never in a browser or mobile app. Each webhook endpoint has its own secret, so you can confirm that a delivery came from Signee before acting on it.
Agreements created through the API record the key that created them in the audit trail, next to every view, consent and signature with time and IP address. Events are chained by hash, so a later change to the record is visible. Storage, encryption and access controls are described on the electronic signature security page.
Usage counts the same way as in the app
An agreement sent through the API counts toward the documents sent in your plan, exactly like one sent from the editor. Deleting it afterwards does not return the quota.
Limits
API access by plan
API calls are counted per calendar day for the whole workspace.
Price
- Business
- 149 USD a month, or 74 USD billed yearly
- Company
- 499 USD a month, or 249 USD billed yearly
API calls per day
- Business
- 1,000
- Company
- 10,000
Documents sent per month
- Business
- 150
- Company
- 600
Webhooks
- Business
- Sent, viewed, signed, declined, renewal due
- Company
- Sent, viewed, signed, declined, renewal due
Users included
- Business
- 10
- Company
- 30
Also included
- Business
- CRM merge, approvals, post signature workflows
- Company
- SSO, bulk send, contract imports, audit log export
| What you compare | Business | Company |
|---|---|---|
| Price | 149 USD a month, or 74 USD billed yearly | 499 USD a month, or 249 USD billed yearly |
| API calls per day | 1,000 | 10,000 |
| Documents sent per month | 150 | 600 |
| Webhooks | Sent, viewed, signed, declined, renewal due | Sent, viewed, signed, declined, renewal due |
| Users included | 10 | 30 |
| Also included | CRM merge, approvals, post signature workflows | SSO, bulk send, contract imports, audit log export |
The Starter plan does not include API access. It suits teams that send agreements from the app only.
E-signature API questions
Which plans include the API
Which webhook events are available
Where do I create API keys
Do signers need a Signee account
Does an agreement sent by API count toward my plan
Can I fill templates with data from my own system
Keep reading
Send agreements from your own product
Create an API key, add a webhook and send your first agreement from a template. API access is included in Business and Company.