heruAPI
e.firma and CSD

Sign a document with the worker's e.firma

PlannedDesigned and scheduled for the v1 API. The contract can still change; the route is not served yet.

POST
/signatures

For digital contracts. You send the PDF; the worker reviews and signs it with their e.firma on a hosted page. You get the signed document and the certificate data.

Needs the signatures:write scope.

Authorization

oauth2 signatures:write
headerAuthorizationBearer <token>

OAuth 2.0 client credentials. Exchange your client_id and client_secret at /oauth/token of the environment for a bearer token valid for one hour. The playground of every operation asks for your own client and keeps it in your browser tab only.

Scope: signatures:write

Header parameters

Idempotency-Key*string

Unique per operation. Retrying with the same key returns the original result for 24 hours.

Lengthlength <= 255

Request body

application/json
  1. body
external_id*string

Your id for this document, e.g. your contract number. Echoed back in every response and webhook.

Lengthlength <= 128
worker_id*string

The worker who signs, with the e.firma they uploaded at enrollment.

Match^wrk_[0-7][0-9a-hjkmnp-tv-z]{25}$
document*
purpose?string

What the document is. The worker sees it on the signing page.

Response body

Created

application/json
  1. response
id*string
Match^sig_[0-7][0-9a-hjkmnp-tv-z]{25}$
external_id*string

Your id, as you sent it.

status*string

awaiting_worker until the worker signs; signed once they did; rejected if they declined; expired when the signing link ran out unused.

Value in"awaiting_worker""signed""rejected""expired"
worker_id*string
Match^wrk_[0-7][0-9a-hjkmnp-tv-z]{25}$
purpose?string|null
signing*

Where the worker reviews and signs the document with their e.firma.

signed_document?|

Signed link to download the signed PDF, valid for 15 minutes. heru creates a new one every time you get the signature. Null until status is signed.

certificate?|null
created_at*string
Formatdate-time
updated_at*string
Formatdate-time
curl -X POST 'https://api.dev.b2b.heru.app/v1/signatures' \  -H 'Idempotency-Key: try-it-0001' \  -H 'Content-Type: application/json' \  -d '{  "external_id": "CTR-2026-000417",  "worker_id": "wrk_01m4ra8w0he5esnnsew0v9ffkv",  "document": {    "filename": "contrato-prestacion-servicios-DRV-000088213.pdf",    "content_base64": "JVBERi0xLjcKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoIDMgMCBSL0ZpbHRlci9GbGF0ZURlY29kZT4+"  },  "purpose": "Contrato de prestación de servicios"}'
{  "id": "sig_01m4rcp7xvfrct34z0q3s0r2yb",  "external_id": "CTR-2026-000417",  "status": "awaiting_worker",  "worker_id": "wrk_01m4ra8w0he5esnnsew0v9ffkv",  "purpose": "Contrato de prestación de servicios",  "signing": {    "url": "https://sign.heru.app/s/Wq4nT8vK2xLp7RzM3cYb?expires=1791992780&signature=6d1a9c3e72",    "expires_at": "2026-10-19T15:46:20.731Z"  },  "signed_document": null,  "certificate": null,  "created_at": "2026-10-12T15:46:20.731Z",  "updated_at": "2026-10-12T15:46:20.731Z"}
© 2026 Kuarto Inc. (heru)heru.appQuestions about your integration? Contact your heru account team.