Skip to content
Sign a PDF

Every signature reaches your server the moment it happens.

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 SignQuick cloud, running in this tab.

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

Signature:
Sign here

Signer 2

Signature:
Waiting for the next document.

Your serverPOST https://your-server/hooks

    The API, read at any momentBearer sq_…
    Your agent asks, through MCPnpx @signquick/mcp

    Webhooks: SignQuick calls your server.

    Set them up in Settings: an HTTPS address, the events you want, and a secret that starts with whsec_, shown once.

    EventSent whenIn data
    document.createdA document is saved to the account.documentId, fileName, status, createdAt
    signing_request.createdA document is sent to signers.signingRequestId, documentId, title, signers, expiresAt
    signer.signedOne signer has signed.signingRequestId, title, signer, signedAt
    signer.declinedOne signer has declined.signingRequestId, title, signer, reason, declinedAt
    signing_request.completedEveryone has signed.signingRequestId, documentId, title, signers, completedAt
    document.signedThe same moment, for the document: it now carries every signature.The same as above

    How each call is made

    The same for every event, so one handler can check them all.

    • The bodyJSON: event, timestamp (Unix seconds, as a string) and data.
    • The headersX-SignQuick-Event, X-SignQuick-Timestamp, and X-SignQuick-Signature: the HMAC-SHA256 of timestamp.body with your secret, in hex.
    • DeliveryUp to four tries, after 1, 5 and 30 seconds, 10 seconds each. Redirects aren't followed.
    • WhereHTTPS only; private and local addresses are refused. Point one at your own server, or at any automation tool that can receive a webhook.
    • How manyUp to 10 webhooks per account. There is no delivery log and no test button.
    Check the signature in Node.js, before you trust the body
    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.

    The API: read where things stand.

    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.

    CallWhat it does
    GET /api/v1/documentsLists your documents, newest first, up to 100: id, fileName, pageCount, status, createdAt.
    GET /api/v1/signatures/:idReturns 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.

    The MCP server: ask your agent.

    @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.
    • Where it runsClaude Code, Claude Desktop, Cursor, or any client that speaks MCP.

    Next to the other e-signature APIs.

    Each price comes from the vendor's own pricing page, checked on October 16, 2026, excluding tax.

    • SignQuick Business$19 a month, or $144 a year: no monthly document limit and no fee per envelope, with webhooks, the API to read and the MCP server.
    • BoldSign API$30 a month for 40 envelopes, then $0.75 each.
    • DocuSign API Starter$50 a month for 40 envelopes.
    • Dropbox Sign API Essentials$75 a month billed yearly ($900), for 50 signature requests a month.
    • Youtrust API Plus104 € a month with a 12-month commitment, for 500 signatures a year.

    Read this before you compare: their APIs send documents. SignQuick's API and MCP server read; you send from the app.

    Every source, on the comparison page

    Before you build on it.

    What the API does not do, said plainly.

    • SendingFrom the app only. 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.
    • Why sending stays in the appA signing link carries the key that decrypts the document, after the #, and browsers never send that part of an address to a server. That keeps your documents unreadable to us, and it is why a link made by a server, for an API call, has no key. How the links work.
    • Uploading a PDFThrough the app; the API reads what is in your account.
    • Integrations, SDKs, embedded signingNone: webhooks and REST are what there is, and the signing page can't be put in an iframe. Zapier, Make or n8n can catch a webhook like any other server.

    Business is $19 a month, or $144 a year.