Skip to content

Integration API

Run the whole life of a document from your own systems

Upload it, build the flow, dispatch it, follow it and archive it — without anyone opening a browser.

One base URL

/api/v1 over HTTPS. Everything is JSON except the documents, which travel as bytes.

One credential

Authorization: Bearer sf_… — Create your account, then create a token under Integrations. If you would rather start from a workspace with sample documents and people, ask for an evaluation account. It acts on behalf of whoever created it and can never do more than that person.

One header that saves you

Idempotency-Key on anything that cannot be undone. Retry with the same key and you get the same answer back, without the effect happening twice.

Loading the API description…

Events & webhooks

Signing depends on people: days can pass between dispatching a flow and completing it. Instead of polling, register a webhook and get a signed POST every time something happens.

The webhook vocabulary is the evidence vocabulary — the same one, not a copy.

There is no separate list of “webhook events”. What your system receives is exactly what the evidence record will show later, with the same code. So when your system says signed and the evidence record is asked in court, there is one version of the facts to discuss instead of two — and an event added to the record can never quietly stop reaching you.

⚠ The codes are stable identifiers: they never change, whatever language the interface is in.

Each event's code goes inside the hash that chains the evidence record together, and a database trigger stops anyone from renaming one: that is why a code never changes, not even when the language of the interface does. Some of the words in them are Spanish because the product started that way; read them as identifiers, not as text. So map them once, like you would map an OID or a PREMIS eventType, and they will still mean the same thing in ten years. What changes with the language is the readable description: every webhook carries it in English as event_label, and GET /api/v1/event-types serves it for each code. The keys of the body are in English too (event, event_label, occurred_at, account, workflow, document, data); the Spanish keys it used before (evento, ocurrido_en, cuenta, circuito, instancia, datos) travel alongside for one more version, with payload_version: 2, so you can move over without breaking anything.

EventWhat it means for your system
circuito.despachado It left draft. The people were invited and the clock started.
documento.abierto Somebody opened the document. Useful to tell “did not see it” from “saw it and did not sign”.
firma.aplicada One person signed. Carries who, with what kind of signature, and the hash of the document before and after.
firma.rechazada Somebody declined, with their reason. The flow stops.
circuito.completo Everyone signed. This is the moment the completion report exists, and it carries the instance id you ask the delivery package for.
documento.preservado The document now carries inside itself what is needed to validate its signatures years from now: the certificate chain, the revocation answers and, where a timestamp authority answers, a document timestamp.
circuito.cancelado The sender called it off.

The seven above are the ones an integration usually listens to. The complete, authoritative vocabulary — every code the evidence record can carry, with its category and its description in three languages — is served at GET /api/v1/event-types, so your system can read it instead of hard-coding it.