↗ · Developers & agents

Built for AI agents

Everything the dashboard does, an agent can do over the API or the MCP server. Upload a PDF, place the signature fields, send it to one or more signers, watch their progress, and pull back the sealed copy once they've signed. No screen, no clicking, no human in the loop.

10 tools

MCP server at /api/mcp

OpenAPI 3.1

Self-discovering spec

Idempotent

Retries never duplicate

· The whole flow over HTTP

Six calls from PDF to signed copy

No dashboard step anywhere in here. The same six moves work as REST calls or as MCP tools, with the same Bearer key.

  1. 01

    Discover

    Call get_me, or GET /v1/me, to read the plan, the limits, and what the key can do before you spend a write.

  2. 02

    Upload

    POST /v1/documents with a public URL, a multipart file, or base64 bytes. Sign Sail fetches and parses the PDF.

  3. 03

    Place fields

    PUT the field coordinates, or write {{sig:s1}} tags into the PDF and let auto-placement find them on upload.

  4. 04

    Send

    POST /v1/envelopes with the recipients. Signers get their email; an Idempotency-Key keeps a retry from double-sending.

  5. 05

    Track

    Poll GET /v1/envelopes/{id} for per-recipient progress, or subscribe to webhooks and skip the polling.

  6. 06

    Download

    GET /v1/envelopes/{id}/pdf once everyone has signed. The sealed PDF ships with its SHA-256 audit trail inside.

· Quickstart

The whole thing, end to end

Upload a contract, place two fields for one signer, send it, then download the signed PDF once it lands. Set KEY to your ss_live_ key and every call reuses it.

# Your key is created under Account → Developer settings (Business plan)
KEY="ss_live_…"
BASE="https://signsail.com/api/v1"
AUTH="Authorization: Bearer $KEY"

# 1. Upload a PDF by URL (or -F [email protected] for multipart)
DOC=$(curl -s -X POST "$BASE/documents" -H "$AUTH" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/contract.pdf","title":"NDA"}' | jq -r .id)

# 2. Place a signature + date field for signer 1 (coords normalized 0..1)
curl -s -X PUT "$BASE/documents/$DOC/fields" -H "$AUTH" \
  -H "Content-Type: application/json" \
  -d '{"placements":[
        {"recipientRef":1,"fieldType":"SIGNATURE","pageIndex":0,
         "x":0.12,"y":0.80,"w":0.25,"h":0.06,"required":true},
        {"recipientRef":1,"fieldType":"DATE_SIGNED","pageIndex":0,
         "x":0.45,"y":0.80,"w":0.18,"h":0.04,"required":true}
      ]}'

# 3. Send it. The Idempotency-Key makes a retry safe.
ENV=$(curl -s -X POST "$BASE/envelopes" -H "$AUTH" \
  -H "Content-Type: application/json" -H "Idempotency-Key: nda-send-001" \
  -d "{\"documentId\":\"$DOC\",\"recipients\":[{\"email\":\"[email protected]\",\"name\":\"Dana\"}]}" | jq -r .id)

# 4. Poll status, then download once it's completed
curl -s "$BASE/envelopes/$ENV" -H "$AUTH" | jq .status
curl -s "$BASE/envelopes/$ENV/pdf" -H "$AUTH" -o signed.pdf

Prefer not to send coordinates? Write tags like {{sig:s1}} into the PDF and Sign Sail places the fields on upload. The full tag grammar, prefill fields, and webhook shapes are in the API & MCP guide.

· Why it suits agents

The details that matter to code, not people

A signing API is only agent-friendly if it's discoverable, predictable, and safe to retry. We built for that on purpose.

It reads its own spec

The full REST surface is published as OpenAPI 3.1 at /api/v1/openapi.json. An agent fetches it and learns every endpoint, parameter, and response without a hand-written wrapper. The placement schema is generated from the same source the API validates against, so it can't drift.

Errors you can branch on

Every failure returns a stable code (VALIDATION_ERROR, NOT_READY, RATE_LIMITED, CONFLICT, and the rest), not just a prose message. Validation errors also carry a fields map, so an agent knows exactly what to fix before it retries.

Retries that don't duplicate

POST /v1/documents and POST /v1/envelopes both take an Idempotency-Key header. Replay the same key and you get the original response back, marked Idempotent-Replayed: true, instead of a second document going out.

Visible rate limits

Reads are capped at 1000 per minute and writes at 300, per key owner. Every response carries X-RateLimit-Limit, -Remaining, and -Reset, so an agent backs off on the headers rather than guessing its way into a 429.

One set of cores, two front doors

The REST API and the MCP server call the exact same internal functions the dashboard uses. Whichever surface an agent reaches for, the behavior is identical, and new capabilities land on both at once.

Discoverable from the root

An llms.txt at the domain root points agents straight at the spec, the MCP server, and the guides. The tools that retrieve it (Claude, Cursor, and the rest) find their way in without a human pasting links.

· MCP server

Ten tools at /api/mcp

Connect with the same Bearer key you'd use for HTTP. Each tool wraps the same core the REST API calls, so the two never drift apart.

  • get_mePlan, features, and limits for the key
  • list_documentsList the PDFs you've uploaded
  • upload_documentIngest a PDF from a URL or base64
  • get_document_fieldsRead placed fields and page geometry
  • place_fieldsSet signature, date, text, and checkbox fields
  • send_for_signatureCreate and send the envelope
  • get_envelope_statusCheck per-recipient progress
  • void_envelopeCancel an envelope in flight
  • list_contactsRead your saved contacts
  • download_signed_pdfPull back the sealed PDF when done

· Drop-in skill

Hand your agent a SKILL.md

A ready-made agent skill that teaches the whole signing flow — setup, field placement, the tag grammar, error codes, and the MCP tools. Install it into Claude Code as a personal skill in one line.

mkdir -p ~/.claude/skills/signsail && curl -sL https://signsail.com/skill.md -o ~/.claude/skills/signsail/SKILL.md

Or point any agent at the raw file at /skill.md. It's also linked from llms.txt, so agents that read your site find it on their own.

Hand the signing to your agent.

The API and MCP server are on the Business plan. Start free, build on the dashboard, and upgrade when you're ready to let code take the wheel.