Signing Flows

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_… — a token you create under Integrations. 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 identifiers, and they are in Spanish on purpose — they never change.

Each event's code goes inside the hash that chains the evidence record together. Renaming one would not be a cosmetic change: it would break the chain of every record ever written, and a database trigger stops anyone from trying. 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. The readable description is what changes with the language; the code does not change at all.

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 certificate of completion 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.