SignFox API
A simple REST API for e-signatures: upload a PDF as a template, place fields, send envelopes, track signing, and download the completed, cryptographically signed document. The full machine-readable spec is at /openapi.json (OpenAPI 3.0).
Base URL and authentication
All endpoints live under https://signfox.co/api/v1. Create an API key in Settings → API keys and pass it as a Bearer token on every request:
Authorization: Bearer sfk_xxxxxxxxxxxx_...Keys are scoped to your organization and shown once at creation. Requests are rate-limited to 120 per minute per key; exceeding it returns 429.
Idempotency
POST /templates and POST /envelopes accept an optional Idempotency-Key header (max 200 characters). The first successful response for a key is stored and replayed verbatim on retries — with an Idempotency-Replayed: true response header — so a timed-out request can be retried without creating a duplicate. Failed requests are not cached and may safely be retried with the same key.
Quickstart
Create a template, activate it, and send it for signature:
# 1. Create a template from a PDF
curl -s https://signfox.co/api/v1/templates \
-H "Authorization: Bearer $SIGNFOX_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: tmpl-nda-001" \
-d '{"name": "NDA", "pdfBase64": "'"$(base64 < nda.pdf)"'"}'
# => {"id": 12, "name": "NDA", "status": "DRAFT", "pageCount": 3}
# 2. Place a signature field (fractions of the page, 0..1)
curl -s -X PUT https://signfox.co/api/v1/templates/12/fields \
-H "Authorization: Bearer $SIGNFOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fields": [{"recipientRole": "signer1", "type": "SIGNATURE",
"page": 1, "x": 0.1, "y": 0.75, "width": 0.25, "height": 0.08}]}'
# 3. Activate it
curl -s -X POST https://signfox.co/api/v1/templates/12/activate \
-H "Authorization: Bearer $SIGNFOX_API_KEY"
# 4. Send an envelope
curl -s https://signfox.co/api/v1/envelopes \
-H "Authorization: Bearer $SIGNFOX_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: env-nda-jo-001" \
-d '{"templateId": 12, "subject": "Please sign the NDA",
"recipients": [{"name": "Jo", "email": "jo@example.com",
"role": "signer1", "order": 1}]}'
# => {"id": 34, "status": "SENT", "recipients": [...]}Recipients sign in ascending order; recipients sharing the same order form a parallel group and may sign in any sequence. Set "kind": "CC" on a recipient to send them the completed document without asking for a signature.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /envelopes | List envelopes (pagination + q/status/from/to filters) |
| POST | /envelopes | Create and optionally send an envelope (idempotent) |
| GET | /envelopes/{id} | Get an envelope with recipient statuses |
| PATCH | /envelopes/{id} | Update subject/message while DRAFT or SENT |
| POST | /envelopes/{id}/void | Void an envelope |
| GET | /envelopes/{id}/signed-pdf | Download the completed, signed PDF |
| GET | /templates | List templates (pagination) |
| POST | /templates | Create a template from a base64 PDF (idempotent) |
| GET | /templates/{id} | Get a template with its fields |
| PUT | /templates/{id}/fields | Replace the template's field set |
| POST | /templates/{id}/activate | Activate a draft template |
| DELETE | /templates/{id}/activate | Archive a template |
Errors use a consistent shape: {"error": "message", "ref": "a1b2c3d4"} — include the ref when contacting support. See the OpenAPI spec for full request and response schemas.