# A row becomes a contract. A signature becomes the next step.

Send contracts from n8n, Clay, Zapier, Make or any tool with an HTTP step. Reruns never send twice, and a signed webhook tells your workflow the moment a document is done.

## Signing is the step that breaks the automation

A deal closes in the CRM. A new hire lands in the sheet. Everything else runs on its own, until someone has to open an e-signature app, upload a PDF, drag boxes and click send. Then wait, and check, and copy the signed file back.

docuinked turns that into two HTTP calls and a webhook.

## Two steps send the contract

Save the contract once as a template in the web app, with its signer roles and fields. Each run then makes a draft from it, filling the roles in order with the people from your row. A second call sends it.

The `Idempotency-Key` header is what makes a rerun safe. Use something from your row, like a deal id. If the step runs again, you get the first reply back instead of a second contract.

[Templates in the API >](/docs/api#create_from_template)
```
curl https://docuinked.com/v1/templates/TEMPLATE_ID/documents \
  -H "Authorization: Bearer $DOCUINKED_API_KEY" \
  -H "Idempotency-Key: deal-4821-draft" \
  -H "Content-Type: application/json" \
  -d '{"title": "Services agreement, deal 4821",
       "signers": [{"name": "Dana Reed",
                    "email": "dana@example.com"}]}'
```

```
curl https://docuinked.com/v1/documents/DOCUMENT_ID/send \
  -H "Authorization: Bearer $DOCUINKED_API_KEY" \
  -H "Idempotency-Key: deal-4821-send" \
  -H "Content-Type: application/json" -d '{}'
```

## A signature starts the next step

Add one webhook and your workflow hears about every change: sent, signed by one person, declined, completed. Each delivery is signed with HMAC-SHA256, so your workflow can check it came from us before it acts.

When `document.completed` arrives, fetch the sealed PDF and file it, update the deal, or start onboarding.

[Webhooks and signature checks >](/docs/webhooks)
```
{"id": "evt_...",
 "type": "document.completed",
 "document": "doc_...",
 "created_at": "2026-11-07T15:04:05Z"}
```

```
DocuInked-Signature: t=1794150245,v1=5f8a...
```

## Built for things that run unattended

### Reruns are safe
Every write takes an `Idempotency-Key`. A retry returns the first result, never a second email.

### Mistakes stay small
Live sends have a daily limit during the beta, so a runaway loop can't reach hundreds of people.

### Errors you can branch on
Every error has a stable code and says whether a retry is safe. See [errors](/docs/errors).

### Test without emailing anyone
Test keys never send email. Magic addresses sign or decline on their own, so the whole flow runs in a test run.

### Fields from your PDF
Put `{{signature:1}}` tags or plain anchor text in your document, and fields land in the right place every time.

### Agents in the loop
If an AI step in your workflow prepares the contract, give it an agent key. A person approves before anything is sent.

[See every integration >](/integrations)

## Honest limits

There are no native n8n, Zapier or Make listings yet. Those are coming. Today you use each tool's HTTP step, which works with every endpoint. There is no bulk send yet: one call sends one document, so a list of 50 means 50 calls, each with its own idempotency key.

## Common questions

### Do I need a developer to set this up?

No. If you can fill in an HTTP step with a URL, a header and some JSON, you can send a contract. The [integrations](/integrations) pages show the exact settings for each tool.

### What happens if my workflow runs twice by mistake?

If both runs send the same `Idempotency-Key`, the second gets the first reply back and nothing new is sent. Use a value from your data, like a row or deal id, so a rerun always sends the same key.

### How does my workflow know a contract was signed?

Add a webhook for `document.completed`, or poll `get_document` on a schedule. The webhook is faster and costs you no extra runs.
