Skip to main content

Before you start

You need API credentials. Sign up for the console, create an application, and copy your client_id and client_secret.

Step 1 — Get a token

Exchange your credentials for a bearer token. Tokens expire after 1 hour.
curl -s -X POST https://api.getsigned.ca/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET"
Response
{
  "access_token": "eyJhbGci...",
  "token_type": "Bearer",
  "expires_in": 3600
}
Set the token in your shell for the rest of this guide:
TOKEN="eyJhbGci..."

Step 2 — Create an envelope

Upload a PDF and define one signer with a signature field.
curl -s -X POST https://api.getsigned.ca/v1/envelopes \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "tenantId": "acme-corp",
    "subject": "Service Agreement",
    "createdBy": "your-user-id",
    "signers": [
      {
        "name": "Jane Smith",
        "email": "jane@example.com",
        "routingOrder": 1,
        "authMethod": "email_otp"
      }
    ]
  }'
Response
{
  "id": "env_01HX...",
  "status": "draft",
  "tenantId": "acme-corp",
  "subject": "Service Agreement"
}
Save the envelope ID:
ENVELOPE_ID="env_01HX..."

Step 3 — Upload the PDF

curl -s -X POST https://api.getsigned.ca/v1/envelopes/$ENVELOPE_ID/document \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/octet-stream" \
  --data-binary @agreement.pdf
Response
{
  "documentId": "doc_01HX...",
  "sha256": "a3f2...",
  "pageCount": 3
}

Step 4 — Place a signature field

Tell GetSigned where on the page Jane should sign. Coordinates are in PDF points (1/72 inch), origin at the bottom-left of the page.
curl -s -X POST https://api.getsigned.ca/v1/envelopes/$ENVELOPE_ID/fields \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "documentId": "doc_01HX...",
    "signerId": "sgn_01HX...",
    "type": "signature",
    "page": 1,
    "x": 72,
    "y": 72,
    "w": 200,
    "h": 60,
    "required": true
  }'
Use the drag-drop field placer in the console (/envelopes/{id}/place) to position fields visually without calculating coordinates manually.

Step 5 — Send

Dispatch signing invites. Jane receives an email with her tokenized signing link.
curl -s -X POST https://api.getsigned.ca/v1/envelopes/$ENVELOPE_ID/send \
  -H "Authorization: Bearer $TOKEN"
Response
{
  "status": "sent",
  "signers": [
    {
      "id": "sgn_01HX...",
      "email": "jane@example.com",
      "signingUrl": "https://sign.getsigned.ca/sign/eyJ..."
    }
  ]
}

Step 6 — Receive the webhook

When Jane completes signing, GetSigned sends a POST to your configured webhook endpoint:
{
  "event": "envelope.completed",
  "envelopeId": "env_01HX...",
  "completedAt": "2026-06-19T14:32:00Z",
  "documentUrl": "https://api.getsigned.ca/v1/envelopes/env_01HX.../document"
}
Download the sealed PDF from documentUrl using your bearer token and store it in your system.

What you get

The downloaded PDF:
  • Contains all signed fields flattened into the document
  • Has a PKCS#7 digital signature covering every byte (verifiable in Adobe Acrobat)
  • Has an audit certificate page at the end listing every event with timestamps and IPs
  • Is hash-chained in your audit log — tamper-detectable even with direct database access

Next steps

Configure webhooks

Set up your endpoint and verify signatures

Multi-signer routing

Route documents through multiple signers in sequence