Guide · Contract Signing

Contract signing API

Send any contract for legally binding e-signature in three API calls. Multi-party routing, OTP-verified identity, PKCS#7-sealed output, and a hash-chained audit trail — all included on the free tier.

Get free API keys →Integration guide
Send a two-party contract — curl
# 1. Auth
TOKEN=$(curl -s -X POST https://api.getsigned.app/oauth/token \
  -d "grant_type=client_credentials&client_id=$CID&client_secret=$CSECRET" \
  | jq -r .access_token)

# 2. Create envelope — two signers, sequential (Party A first, then Party B)
ENV=$(curl -s -X POST https://api.getsigned.app/v1/envelopes \
  -H "Authorization: Bearer $TOKEN" \
  -F "document=@msa.pdf;type=application/pdf" \
  -F 'signers=[
        {"id":"s1","name":"Acme Corp",   "email":"legal@acme.com",   "routing_order":1},
        {"id":"s2","name":"Vendor Ltd",  "email":"sign@vendor.co",   "routing_order":2}
     ]' \
  -F 'fields=[
        {"signer_id":"s1","type":"signature","page":4,"x":120,"y":680},
        {"signer_id":"s2","type":"signature","page":4,"x":380,"y":680}
     ]' | jq -r .id)

# 3. Send — Acme Corp gets their link now; Vendor Ltd gets theirs after Acme signs
curl -s -X POST https://api.getsigned.app/v1/envelopes/$ENV/send \
  -H "Authorization: Bearer $TOKEN"

# → envelope.completed webhook fires when both parties finish
# → GET /v1/envelopes/$ENV/document returns the PKCS#7-sealed contract

What the contract signing API includes

Any contract, any format

Upload any standard PDF — NDAs, MSAs, SOWs, SLAs, employment agreements, lease agreements. No template required for one-off contracts.

Multi-party routing

Sequential or parallel signer routing via routing_order. Party A signs, then Party B — or both sign simultaneously. Mixed routing for approval chains.

OTP identity verification

Each signer verifies via email or SMS OTP before signing. The verification event is logged in the audit trail with timestamp and IP.

PKCS#7 sealed output

The completed contract is sealed with a CA-issued digital signature. Any byte-level modification invalidates the seal — detectable by any PDF reader.

Hash-chained audit trail

Every event — view, consent, OTP, signature, seal — is appended to a hash-chained log. Tampering with any event breaks the chain.

Completion webhooks

Subscribe to envelope.completed and receive a real-time POST when all parties finish. Download the sealed contract from /v1/envelopes/{id}/document.

Frequently asked questions

What is a contract signing API?

A contract signing API is a REST interface that handles the full lifecycle of collecting legally binding electronic signatures on a contract: uploading the document, declaring signers and field positions, dispatching signing invitations, tracking progress, and returning a sealed tamper-evident document when all parties complete. It removes the need to build your own signing UI, identity verification, audit trail, or document sealing infrastructure.

Are contracts signed via API legally binding?

Yes. Electronic signatures on contracts are legally binding under the US ESIGN Act and UETA (all 50 states) and under Canadian provincial electronic commerce acts including Ontario's ECA and BC's ECPA. The legal validity depends on demonstrating intent to sign and attribution — both established by the OTP-verified audit trail that GetSigned generates. The PKCS#7 seal proves the document has not been altered since signing.

How do I send a contract for signing via the API?

Three API calls: (1) POST /oauth/token — get a bearer token with your client credentials. (2) POST /v1/envelopes — upload the contract PDF, declare signers with name and email, specify signature field coordinates. (3) POST /v1/envelopes/{id}/send — dispatch signing links. Each signer receives a tokenized email link, verifies via OTP, and signs. When all parties complete, the envelope.completed webhook fires with the sealed contract ready to download.

How do I handle a two-party contract where both sides need to sign?

Declare both signers in the signers array. Set routing_order: 1 on Party A and routing_order: 2 on Party B for sequential signing — Party B receives their link only after Party A completes. Set both to routing_order: 1 for parallel signing — both receive links simultaneously and sign in any order. Assign each signer's signature fields via signer_id in the fields array.

How do I know when a contract is fully executed?

Subscribe to the envelope.completed webhook. It fires when every signer has completed and the document has been sealed. The webhook payload includes the envelope ID, status, and completion timestamp. Use it to trigger downstream actions: store the sealed PDF, update your CRM, send a countersigned copy to all parties, or unlock a provisioning flow.

Related: Multi-signer routing · Audit trail guide · E-signature legality · Template API

Collect contract signatures in minutes

Get free API keys →