Upload a PDFdocument.created
You upload service-agreement.pdf in Send, place the fields and send. Your browser makes one private link per signer, for you to pass on.
Prices in euros for French, German, Spanish, Italian, Portuguese, Dutch and Polish; in dollars otherwise.
On Business, $19 a month or $144 a year, with no fee per envelope: signed webhooks when a document is sent, signed or declined, an API that reads your documents and where each signature stands, and an MCP server so your AI agent can read them too. Plain REST and JSON, no SDK.
The formats are the code's own, the data is an example, and nothing leaves your browser. Sign the first line yourself and the events carry your name.
Upload a PDFdocument.created
You upload service-agreement.pdf in Send, place the fields and send. Your browser makes one private link per signer, for you to pass on.
From a generatordocument.created
You fill in the contract generator and click Send for signature: consulting-agreement.pdf is encrypted, saved to your account, and opens in Send.
From your documentssigning_request.created
You pick mutual-nda.pdf, already in your account, place the fields and send. Nothing new is saved, so there is no document.created.
Upload a PDF. Sent from the app, one link per signer.
SERVICE AGREEMENTPage 3 of 3
7. Signatures. Each party signs below, in this order. This agreement takes effect on the date of the last signature.
Signer 1 you, if you sign
Signer 2
Your serverPOST https://your-server/hooks
Set them up in Settings: an HTTPS address, the events you want, and a secret that starts with whsec_, shown once.
| Event | Sent when | In data |
|---|---|---|
document.created | A document is saved to the account. | documentId, fileName, status, createdAt |
signing_request.created | A document is sent to signers. | signingRequestId, documentId, title, signers, expiresAt |
signer.signed | One signer has signed. | signingRequestId, title, signer, signedAt |
signer.declined | One signer has declined. | signingRequestId, title, signer, reason, declinedAt |
signing_request.completed | Everyone has signed. | signingRequestId, documentId, title, signers, completedAt |
document.signed | The same moment, for the document: it now carries every signature. | The same as above |
The same for every event, so one handler can check them all.
event, timestamp (Unix seconds, as a string) and data.X-SignQuick-Event, X-SignQuick-Timestamp, and X-SignQuick-Signature: the HMAC-SHA256 of timestamp.body with your secret, in hex.import { createHmac, timingSafeEqual } from "node:crypto"; export function fromSignQuick(headers, rawBody, secret) { const t = headers["x-signquick-timestamp"]; const expected = createHmac("sha256", secret).update(`${t}.${rawBody}`).digest("hex"); const got = headers["x-signquick-signature"] || ""; return got.length === expected.length && timingSafeEqual(Buffer.from(got), Buffer.from(expected)); }
Your server is told the moment a document is signed.
Create a key on your API keys page. It starts with sq_, is shown once, is stored hashed, and can be revoked. Send it as Authorization: Bearer.
| Call | What it does |
|---|---|
GET /api/v1/documents | Lists your documents, newest first, up to 100: id, fileName, pageCount, status, createdAt. |
GET /api/v1/signatures/:id | Returns a signing request and each of its signers, with their status. The id is the signingRequestId your webhooks carry. |
curl https://signquick.app/api/v1/signatures/REQUEST_ID \
-H "Authorization: Bearer sq_YOUR_KEY"A missing or wrong key answers 401, and a request that isn't yours answers 404. Listing documents from an account without Business answers 403.
@signquick/mcp, published on npm. It uses the same key and the same API. Other e-signature services have one too; this one comes with Business and no extra fee.
{
"mcpServers": {
"signquick": {
"command": "npx",
"args": ["-y", "@signquick/mcp"],
"env": { "SIGNQUICK_API_KEY": "sq_YOUR_KEY" }
}
}
}list_documents“List my SignQuick documents.”get_signature_status“Who has signed request 7c1e…?” Give it the signingRequestId of your webhooks.Each price comes from the vendor's own pricing page, checked on October 16, 2026, excluding tax.
Read this before you compare: their APIs send documents. SignQuick's API and MCP server read; you send from the app.
What the API does not do, said plainly.
POST /api/v1/signatures and the MCP server's send_for_signature exist, but the links they make can't be signed: don't build on them.Business is $19 a month, or $144 a year.