Skip to content

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
Two monitors showing webhook handler code on a developer desk

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.

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. 1

    Create a key

    Open API and webhooks in the app and create an API key for your workspace.

  2. 2

    Add a webhook

    Register your endpoint URL and choose the events you want to receive.

  3. 3

    Prepare a template

    Turn your agreement into a template and name the variables your code will fill.

  4. 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.

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

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
Business includes 1,000 API calls per day and Company 10,000 per day. Starter does not include API access.
Which webhook events are available
agreement.sent, agreement.viewed, agreement.signed, agreement.declined and renewal.due. You choose the events for each endpoint in the app under API and webhooks.
Where do I create API keys
In the app under Developers. You can create several keys, name them by service and revoke any of them at any time.
Do signers need a Signee account
No. Signers open the agreement from the email link and sign in the browser. Only your workspace users need accounts.
Does an agreement sent by API count toward my plan
Yes. It counts toward documents sent per month, the same as one sent from the editor, and deleting it does not return the quota.
Can I fill templates with data from my own system
Yes. Pass the template variables in the request. Required variables that are missing are reported before the agreement is sent.

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.

One sentence in, agreement with signature fields out.

Draft my agreement