{"openapi":"3.1.0","info":{"title":"Signing Flows — Integration API","version":"1.0.0","description":"To run the whole life of a document from your own systems: upload it, build the flow, dispatch it, follow it and archive it.\n\n**Send `Idempotency-Key` on anything that cannot be undone** — dispatching above all. If you retry with the same key and the same body you get the same response back, without the effect happening twice; the same key with a different body gives you a 409. On the other side of an integration there is almost always a queue that retries on its own, and without a key that sends the document twice.\n\nTo find out about changes without asking, add a webhook under Integrations: you get a signed POST every time something happens. The `circuito.completo` one carries the instance id, which is what you ask the delivery package for. Subscribe to `circuito.paquete` instead and the signed document and the completion report travel as attachments in that same POST, `multipart/form-data`, no second call needed."},"servers":[{"url":"/api/v1"}],"tags":[{"name":"Documents","description":"Get a PDF in, and get the results out: the signed document, its completion report, and the delivery package that archives the whole thing somewhere else."},{"name":"Workflows","description":"The life of a flow: build it while it is a draft, add who signs, dispatch it, and act on it afterwards — cancel it, or hold it so retention does not delete it."},{"name":"Templates","description":"A document already set up — the file, the fields and the shape of the flow — with roles instead of people. List them, see the roles of one, and start a draft workflow from it naming who plays each role."},{"name":"Contacts","description":"The account’s address book: people it sends documents to, outside of its own organization. It grows on its own — every recipient added to a document is saved or updated here too — and this is also where you manage it by hand."},{"name":"Evidence","description":"What happened and when, with the verdict on the hash chain. This is the family that answers a lawyer, and its vocabulary is the same one the webhooks speak."},{"name":"Webhooks","description":"Get told, instead of asking. Register an endpoint of yours and it receives a signed POST the moment anything happens to a document of this account — the same vocabulary as the evidence record. Every event is `application/json`, except `circuito.paquete`, which is `multipart/form-data` with three parts (`evento`, `documento`, `informe`) so the signed document and the completion report travel as attachments — the signature still covers the raw bytes of the whole body, the same HMAC scheme either way. ⚠ The signing secret is shown once, when you create the endpoint, and cannot be recovered afterwards."},{"name":"Agent","description":"The three calls of the resident agent (the program in `agente/` of the repository, which runs in the customer’s network and only connects out). It pairs with the one-time code of the company console, says it is alive, and tells the installation that the signed file was written back to the customer’s SharePoint library. Nothing here is for a general integration.\n\nEach agent has its own secret: pairing returns it once, and `heartbeat` and `filed` need it in `X-Signing-Flows-Agent-Secret` besides the API token. An agent paired before agents had a secret, switched off, or replaced by a new pairing gets 401 `agent_unauthorized` and has to be paired again."},{"name":"Account","description":"Who this token belongs to and what it is allowed to do."},{"name":"Service","description":"The two doors that answer without a credential: what this is, and this description. Point a health check at the first one — asking for a token to explain how tokens work is a circle."}],"components":{"securitySchemes":{"secretoDelAgente":{"type":"apiKey","in":"header","name":"X-Signing-Flows-Agent-Secret","description":"The secret of the resident agent (`sfa_…`), returned once by `POST /agent/pair`. Only the agent calls use it, and always together with the API token."},"tokenDeApi":{"type":"http","scheme":"bearer","description":"The token you created under Integrations, prefixed `sf_`. It acts on behalf of whoever created it: it cannot do anything that person could not do. It is created either with a list of scopes —and then it can do only those— or, said explicitly, with all of them: then it has no list (`scopes: null` in `GET /me`), and it can also use any scope added to this API later."}},"schemas":{"Circuito":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string","description":"The name given to it by whoever sent it."},"dossier_id":{"type":["string","null"],"format":"uuid","description":"The dossier this flow belongs to, or null. A document is sent alone as always; several documents of one matter are sent together as a dossier, and each one stays a flow of its own. Read only."},"dossier_order":{"type":["integer","null"],"minimum":1,"description":"Its place in the dossier (1 of N), fixed when the dossier is sent; null when it is not in one."},"status":{"type":"string","enum":["draft","sent","completed","cancelled","expired","declined","unknown"],"description":"Where it stands. `sent` = waiting for signatures. `completed` = everyone signed, and that is the moment the completion report exists — the `certificate` endpoint serves it, and the field keeps that name. `expired` = the deadline passed without everyone signing; what was already signed stays signed. `declined` = a signer said no and the flow ended that way (different from `cancelled`, which the sender does)."},"mode":{"type":"string","enum":["sequential","parallel","copies"],"description":"`sequential` = they sign in turns. `parallel` = everyone at once on the same document. `copies` = the same document to N recipients, each one with THEIR own document and THEIR own evidence record."},"signature_level":{"type":"string","enum":["simple","advanced","qualified"],"description":"What was CONTRACTED for this flow, which is what billing looks at. It is not a statement about the legal qualification of the signatures: that depends on the certificate, the provider holding it and the law of the document."},"signing":{"type":"string","enum":["certificate","consent","either"],"description":"How the signers sign, unless a signer has their own `signing`. `certificate` = with their own personal certificate, through a signature provider; without it they cannot sign. `consent` = they agree and the Platform seal signs on their behalf. `either` = each person chooses when signing. It is the mechanism, not a legal qualification: signing with a certificate does not make a signature advanced or qualified, and it does not change `signature_level`. With `certificate`, the key of the certificate decides the signature algorithm: RSA with SHA-256, or ECDSA P-256, P-384 or P-521 with SHA-256, SHA-384 or SHA-512. A certificate with any other key is skipped before the signer is asked to authorize."},"country":{"type":"string","description":"The legal framework it is signed under (ISO 3166-1 alpha-2)."},"language":{"type":"string"},"dispatched_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":"string","format":"date-time","description":"When the flow last changed: its status, its signers, its fields, a signature applied, a cancellation. Reading it does not change it. Use it with `since` on `GET /workflows`."},"expires_at":{"type":["string","null"],"format":"date-time"},"documents":{"type":"integer","description":"How many documents it has. In `copies` mode it is one per recipient."},"verification_qr":{"type":"string","enum":["final_page","placed","none"],"description":"Where the verification QR goes. It is stamped before the first signature, so every signature covers it, and it links to the public record of the document. `final_page` = an extra last page with the QR (the default, except when the account starts every document with «Only personal certificates»: then a new document starts with `none`, because that page is one more page the signer signs and the author did not write; you can still choose it). `placed` = on a page of the document, where the sender put it; see `verification_qr_placement`. `none` = no QR: the signed file can still be checked by uploading it to the validator. Chosen while the flow is a draft (`PATCH /workflows/{id}`, or the console); it does not change after dispatch."},"verification_qr_placement":{"type":["object","null"],"additionalProperties":false,"description":"Only when `verification_qr` is `placed`, null otherwise. A square in PDF points, measured from the page origin (bottom left). Set it with `PATCH /workflows/{id}`.","properties":{"page":{"type":"integer","minimum":1,"description":"1 is the first page."},"x":{"type":"number","description":"Left edge of the square."},"y":{"type":"number","description":"Bottom edge of the square."},"size":{"type":"number","minimum":60,"description":"Side of the square. At least 60 points."}}},"storage":{"type":"string","enum":["platform","own","unknown"],"description":"Where the current file of the document is stored. `platform` = the storage managed by the service. `own` = the organisation’s own storage, when its plan includes it and it is set in Account → Storage. Only new files go to the organisation’s storage: files stored before stay where they are and keep opening from there. `unknown` = the file record is not visible from the calling account, so nothing is said about where it is."}}},"Contacto":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]},"email":{"type":"string","format":"email"},"mobile":{"type":["string","null"],"description":"International format, e.g. +1 555 0100."},"language":{"type":["string","null"]},"tag":{"type":["string","null"],"description":"A company name or a free-form label."},"created_by":{"type":["string","null"],"format":"uuid"},"created_at":{"type":"string","format":"date-time"},"last_used_at":{"type":["string","null"],"format":"date-time","description":"The last time a document was sent to this contact. `null`: never, since it was added or imported."}}},"Ok":{"type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"Instancia":{"type":"object","additionalProperties":false,"description":"One document of the flow: the thing you download (`GET /documents/{id}/file`).","properties":{"id":{"type":"string","format":"uuid","description":"The `document_id`."},"number":{"type":"integer","description":"1, 2, 3… in the order they were created."},"status":{"type":"string","enum":["pending","in_progress","signed","sealed","declined","cancelled","expired","unknown"]}},"required":["id","number","status"]},"Participante":{"type":"object","additionalProperties":false,"description":"Somebody in the flow, whatever their `role`.","properties":{"id":{"type":"string","format":"uuid","description":"The `signerId` of the routes under `/workflows/{id}/signers`."},"document_id":{"type":"string","format":"uuid","description":"Their document (in `copies` mode, their own copy)."},"identity_id":{"type":["string","null"],"format":"uuid"},"email":{"type":["string","null"]},"name":{"type":["string","null"]},"role":{"type":"string","enum":["signer","reviewer","cc","approver"]},"order":{"type":"integer","description":"Their turn."},"position":{"type":["integer","null"],"description":"Their place: the `position` of `PUT .../roles/{position}`."},"status":{"type":"string","enum":["pending","notified","opened","signed","approved","declined","delegated","not_required","expired","cancelled","unknown"]},"minimum_assurance":{"type":"string","enum":["low","substantial","high"]},"assurance_obtained":{"type":["string","null"],"enum":["low","substantial","high",null]},"signing":{"type":["string","null"],"enum":["certificate","consent","either",null]},"effective_signing":{"type":["string","null"],"enum":["certificate","consent","either",null]},"effective_identification":{"type":["array","null"],"items":{"type":"string","enum":["email_code","password","oidc","wallet","local_token","provider"]}},"identification":{"type":["array","null"],"items":{"type":"string","enum":["email_code","password","oidc","wallet","local_token","provider"]}},"access_code_set":{"type":"boolean"},"may_download":{"type":"boolean"},"may_print":{"type":"boolean"},"signed_at":{"type":["string","null"],"format":"date-time"},"approved_at":{"type":["string","null"],"format":"date-time"},"decline_reason":{"type":["string","null"]},"notified_at":{"type":["string","null"],"format":"date-time"},"notify_error":{"type":["string","null"]},"opened_at":{"type":["string","null"],"format":"date-time"},"capacity":{"type":["string","null"],"enum":["personal","on_behalf",null]},"represented_account_id":{"type":["string","null"],"format":"uuid"},"occupant":{"type":"string","enum":["person","unassigned","group"]},"role_name":{"type":["string","null"]},"replaced_by_id":{"type":["string","null"],"format":"uuid"},"replacement_reason":{"type":["string","null"]},"assigned_at":{"type":["string","null"],"format":"date-time"},"assigned_via":{"type":["string","null"]},"group_id":{"type":["string","null"],"format":"uuid"},"group_name":{"type":["string","null"]},"group_required":{"type":["integer","null"],"description":"How many members have to sign."},"group_on_decline":{"type":["string","null"],"enum":["stop","when_unreachable",null]},"members":{"type":["array","null"],"description":"The frozen member list of a group place, with where each one stands.","items":{"type":"object","additionalProperties":false,"properties":{"email":{"type":"string"},"name":{"type":["string","null"]},"status":{"type":"string","enum":["enabled","signed","declined","closed","unknown"]}}}},"signed_by":{"type":["string","null"],"description":"Once a group place is signed, the member who signed it."},"reminders_sent":{"type":"integer","minimum":0,"description":"How many automatic reminders this person has been sent."},"transfer_request":{"type":["object","null"],"additionalProperties":false,"properties":{"id":{"type":"string","format":"uuid"},"reason":{"type":["string","null"]},"suggested_name":{"type":["string","null"]},"suggested_email":{"type":["string","null"]},"at":{"type":"string","format":"date-time"}}}},"required":["id","document_id","role","status"]},"DetalleDelFlujo":{"unevaluatedProperties":false,"description":"One flow with its documents and its people: what `GET /workflows/{id}` returns.","allOf":[{"$ref":"#/components/schemas/Circuito"},{"type":"object","properties":{"document_id":{"type":["string","null"],"format":"uuid","description":"The first document of the flow — the only one, except in `copies` mode. It exists from the upload on, before anybody is added. Ask `GET /documents/{id}/file` for it."},"document_list":{"type":"array","items":{"$ref":"#/components/schemas/Instancia"},"description":"Every document of the flow, in order. In `copies` mode, one per recipient once dispatched."},"closed_at":{"type":["string","null"],"format":"date-time","description":"When it ended, whatever the reason."},"validity_days":{"type":["integer","null"]},"decline_policy":{"type":"string","enum":["blocking","continue"]},"closure":{"type":"object","additionalProperties":false,"description":"How the flow closes (what was asked for) and when it did.","properties":{"method":{"type":"string","enum":["administrative","platform_seal","unknown"],"description":"`administrative` = it closes without a seal of the platform. `platform_seal` = the platform seals the closed document. New values can be added: ignore the ones you do not know."},"at":{"type":["string","null"],"format":"date-time","description":"When it closed; null while it is open (the same as `closed_at`)."}},"required":["method","at"]},"preservation":{"type":"object","additionalProperties":false,"description":"What was asked for the long-term validation of the signed file, and how many documents of the flow already have it.","properties":{"level":{"type":"string","enum":["B-T","B-LT","B-LTA"],"description":"The PAdES level asked for when it closes."},"preserved_documents":{"type":"integer","minimum":0,"description":"Documents of the flow already preserved at that level. In `copies` mode there is one document per recipient."}},"required":["level","preserved_documents"]},"pades_levels":{"type":"array","items":{"type":"string"},"description":"The PAdES levels the documents of the flow reached (more than one when copies reached different ones); empty until one is preserved. It is what was achieved; `preservation.level` is what was asked."},"signers":{"type":"array","items":{"$ref":"#/components/schemas/Participante"}},"represented_options":{"type":"array","description":"The accounts a signer of this flow may sign on behalf of.","items":{"type":"object","additionalProperties":false,"properties":{"identidad_id":{"type":"string"},"cuenta_id":{"type":"string"},"nombre":{"type":"string"}}}}},"required":["document_id","document_list","signers","closure","preservation","pades_levels"]}],"example":{"id":"7c9e6679-7425-40de-944b-e07fc1f90a11","title":"Lease agreement","status":"draft","mode":"sequential","signature_level":"simple","signing":"either","country":"ZZ","language":"en","dispatched_at":null,"updated_at":"2026-10-23T14:02:11.000Z","expires_at":null,"documents":1,"verification_qr":"final_page","verification_qr_placement":null,"storage":"platform","document_id":"7c9e6679-7425-40de-944b-e07fc1f90a10","document_list":[{"id":"7c9e6679-7425-40de-944b-e07fc1f90a10","number":1,"status":"pending"}],"closed_at":null,"validity_days":null,"decline_policy":"blocking","dossier_id":null,"dossier_order":null,"closure":{"method":"platform_seal","at":null},"preservation":{"level":"B-LTA","preserved_documents":0},"pades_levels":[],"signers":[{"id":"7c9e6679-7425-40de-944b-e07fc1f90a13","document_id":"7c9e6679-7425-40de-944b-e07fc1f90a10","identity_id":"7c9e6679-7425-40de-944b-e07fc1f90a17","email":"ana@example.com","name":"Ana Pérez","role":"signer","order":1,"position":1,"status":"pending","minimum_assurance":"low","assurance_obtained":null,"signing":null,"effective_signing":"either","effective_identification":null,"identification":null,"access_code_set":false,"may_download":true,"may_print":true,"signed_at":null,"approved_at":null,"decline_reason":null,"notified_at":null,"notify_error":null,"opened_at":null,"capacity":null,"represented_account_id":null,"occupant":"person","role_name":null,"replaced_by_id":null,"replacement_reason":null,"assigned_at":null,"assigned_via":null,"transfer_request":null,"group_id":null,"group_name":null,"group_required":null,"group_on_decline":null,"members":null,"signed_by":null,"reminders_sent":0},{"id":"7c9e6679-7425-40de-944b-e07fc1f90a14","document_id":"7c9e6679-7425-40de-944b-e07fc1f90a10","identity_id":"7c9e6679-7425-40de-944b-e07fc1f90a18","email":"luis@example.com","name":"Luis Gómez","role":"signer","order":2,"position":2,"status":"pending","minimum_assurance":"low","assurance_obtained":null,"signing":null,"effective_signing":"either","effective_identification":null,"identification":null,"access_code_set":false,"may_download":true,"may_print":true,"signed_at":null,"approved_at":null,"decline_reason":null,"notified_at":null,"notify_error":null,"opened_at":null,"capacity":null,"represented_account_id":null,"occupant":"person","role_name":null,"replaced_by_id":null,"replacement_reason":null,"assigned_at":null,"assigned_via":null,"transfer_request":null,"group_id":null,"group_name":null,"group_required":null,"group_on_decline":null,"members":null,"signed_by":null,"reminders_sent":0}],"represented_options":[]}},"Evento":{"type":"object","description":"One fact of the evidence record.","properties":{"order":{"type":"integer","description":"1, 2, 3…, gapless."},"code":{"type":"string","description":"From the event vocabulary (`GET /event-types`). Never renamed."},"category":{"type":"string"},"weight":{"type":"string","enum":["normal","high"]},"occurred_at":{"type":"string","format":"date-time"},"recorded_at":{"type":["string","null"],"format":"date-time"},"actor":{"type":"object","properties":{"type":{"type":"string"},"identity":{"type":["string","null"],"format":"uuid"},"name":{"type":["string","null"]},"email":{"type":["string","null"]}}},"ip":{"type":["string","null"]},"user_agent":{"type":["string","null"]},"channel":{"type":["string","null"]},"timestamped":{"type":["boolean","null"]},"document_sha256":{"type":["string","null"]},"own_hash":{"type":["string","null"]},"previous_hash":{"type":["string","null"]},"description":{"type":["string","null"],"description":"Human text: not a contract."},"data":{"type":["object","null"],"description":"Free-form, different per event type; not a contract (see the operation)."}},"required":["order","code","occurred_at"]},"Cadena":{"type":["object","null"],"description":"The verdict on the hash chain of the evidence record.","properties":{"events":{"type":"integer"},"gaps":{"type":"integer","minimum":0,"description":"How many events break the sequence (a missing order number). 0 when there are none; never null."},"broken":{"type":"integer","minimum":0,"description":"How many events were altered (their hash does not close). 0 when there are none; never null."},"intact":{"type":"boolean","description":"False means the record stopped being proof: somebody has to look at it."}}},"Servicio":{"type":"object","properties":{"api":{"type":"string"},"version":{"type":"string"},"documentation":{"type":"string"}},"required":["api","version","documentation"],"example":{"api":"Signing Flows","version":"v1","documentation":"/api/v1/openapi.json"}},"Yo":{"type":"object","properties":{"account":{"type":"string","format":"uuid"},"token":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"scopes":{"type":["array","null"],"items":{"type":"string"},"description":"`null`: created with all scopes."},"scopes_note":{"type":["string","null"]}}}},"required":["account","token"],"example":{"account":"7c9e6679-7425-40de-944b-e07fc1f90a21","token":{"id":"7c9e6679-7425-40de-944b-e07fc1f90a22","name":"Integration","scopes":null,"scopes_note":"Created with all scopes: this token can do everything the person who created it can do, including anything added to the API later."}}},"PaginaDeFlujos":{"type":"object","properties":{"workflows":{"type":"array","items":{"$ref":"#/components/schemas/Circuito"}},"next_before":{"type":["string","null"],"format":"date-time"}},"required":["workflows","next_before"],"example":{"workflows":[{"id":"7c9e6679-7425-40de-944b-e07fc1f90a16","title":"contract.pdf","status":"draft","mode":"sequential","signature_level":"simple","country":"ZZ","language":"en","dispatched_at":null,"expires_at":null,"updated_at":"2026-10-23T14:02:11.000Z","documents":1,"dossier_id":null,"dossier_order":null,"verification_qr":"final_page","verification_qr_placement":null},{"id":"7c9e6679-7425-40de-944b-e07fc1f90a11","title":"Lease agreement","status":"draft","mode":"sequential","signature_level":"simple","country":"ZZ","language":"en","dispatched_at":null,"expires_at":null,"updated_at":"2026-10-23T14:02:11.000Z","documents":1,"dossier_id":null,"dossier_order":null,"verification_qr":"final_page","verification_qr_placement":null}],"next_before":"2026-10-23T14:02:11.000Z"}},"Plantilla":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"mode":{"type":"string","enum":["sequential","parallel","copies"]},"roles":{"type":"integer"},"fields":{"type":"integer"},"uses":{"type":"integer"},"archived":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"}}},"PaginaDePlantillas":{"type":"object","properties":{"templates":{"type":"array","items":{"$ref":"#/components/schemas/Plantilla"}},"next_after":{"type":["string","null"]}},"required":["templates","next_after"]},"PlantillaConPapeles":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"mode":{"type":"string","enum":["sequential","parallel","copies"]},"archived":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"pages":{"type":["integer","null"]},"verification_qr":{"type":"string","enum":["final_page","placed","none"]},"roles":{"type":"array","items":{"type":"object","properties":{"position":{"type":"integer","description":"The key for this role in `people`."},"name":{"type":"string","description":"What the template calls this role, e.g. “The client”."},"role":{"type":"string","enum":["signer","reviewer","cc","approver"]},"order":{"type":["integer","null"]},"fixed_email":{"type":["string","null"],"description":"Always this address; null when you name them."},"minimum_assurance":{"type":"string","enum":["low","substantial","high"]},"signing":{"type":["string","null"],"enum":["certificate","consent","either",null]},"may_download":{"type":"boolean"},"may_print":{"type":"boolean"},"occupancy":{"type":"string","enum":["person","to_be_assigned","group"],"description":"Who holds the place: a person (named in `people` unless `fixed_email`), nobody yet (`to_be_assigned`: do not send it in `people`), or a group (`group`: `group_minimum` of its members sign)."},"group_minimum":{"type":["integer","null"],"description":"With `group`: how many of its members have to sign."},"named_by_position":{"type":["integer","null"],"description":"With `to_be_assigned`: the place whose person names this one."}}}},"has_document":{"type":"boolean","description":"false = the template keeps only the flow, with no document: using it answers 409 `plantilla_sin_documento`."},"fields":{"type":"integer","description":"How many fields the template places."}},"required":["id","name","mode","roles"]},"FlujoDesdePlantilla":{"type":"object","properties":{"ok":{"type":"boolean"},"workflow_id":{"type":"string","format":"uuid"},"document_id":{"type":"string","format":"uuid"},"signers":{"type":"integer","description":"How many sign."},"approvers":{"type":"integer","description":"How many approve, apart."},"fields":{"type":"integer"}},"required":["workflow_id","document_id"]},"Recordatorios":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Send reminders automatically."},"first_reminder_days":{"type":"integer","minimum":1,"maximum":365,"description":"The first reminder goes this many days after someone’s turn starts."},"every_days":{"type":"integer","minimum":1,"maximum":365,"description":"Then one every this many days."},"until_day":{"type":"integer","minimum":1,"maximum":365,"description":"Until this day, or the deadline, whichever comes first."},"notice_before_deadline_hours":{"type":"integer","minimum":1,"maximum":720,"description":"A notice this many hours before the deadline."},"is_default":{"type":"boolean","description":"The account never saved it: these are the defaults."},"can_change":{"type":"boolean","description":"Whether the person behind this token can change it."}},"required":["enabled","first_reminder_days","every_days","until_day","notice_before_deadline_hours","is_default","can_change"]},"PlanDeLaCuenta":{"type":"object","properties":{"period":{"type":"string","description":"`YYYY-MM`: the period the per-period quotas are counting."},"plan_code":{"type":["string","null"]},"quotas":{"type":"array","description":"One line per concept, with what this account has used.","items":{"type":"object","properties":{"concept":{"type":"string","enum":["users","signatures","workflows_dispatched","documents_completed","sms","whatsapp","timestamps","identity_checks","stored_documents","stored_mb","conversions"]},"nature":{"type":"string","enum":["snapshot","per_period","stock"],"description":"`per_period` restarts every month; `snapshot` is the state right now; `stock` is what is kept and only grows."},"used":{"type":"number","description":"Always a number: no usage is 0."},"limit":{"type":["number","null"],"description":"`null`: the plan sets no ceiling. It is not zero."},"on_reach":{"type":["string","null"],"enum":["warn","charge_overage","block",null]},"warn_at_pct":{"type":["integer","null"]},"source":{"type":["string","null"],"description":"Where the limit comes from: `plan`, `account`, `storage`, `exception`…"}},"required":["concept","nature","used","limit","on_reach","warn_at_pct","source"]}},"prices":{"type":"array","items":{"type":"object","properties":{"metric":{"type":"string","description":"What is charged: `signatures`, `sms`, `whatsapp`, `timestamps`, `identity_checks`… (the names of `quotas[].concept`)."},"signature_level":{"type":["string","null"],"enum":["simple","advanced",null],"description":"For signatures, the level the price is for."},"price":{"type":"string","description":"Per unit, as a decimal string so no digit is lost."},"currency":{"type":"string","description":"The currency of the subscription."},"included_quantity":{"type":"string","description":"Units included before this price applies."},"list_name":{"type":"string","description":"The price list it comes from."},"scope":{"type":"string","enum":["account","country","region","everywhere"],"description":"Where the list is bound: this very account, its country, its region, or everywhere."}},"required":["metric","signature_level","price","currency","included_quantity","list_name","scope"]},"description":"The prices that apply to this account. Empty without a plan or a price list."},"currency_without_list":{"type":["string","null"],"description":"The currency when NO price list reaches the account: everything is measured at 0. `null` if there is one."},"sheet":{"type":"object","description":"What the plan includes, section by section — the console’s *What your plan includes*, in English.","properties":{"sections":{"type":"array","items":{"type":"object","properties":{"area":{"type":"string","enum":["Prepare","Sign","Close","Verify","Operate","Integrate"]},"title":{"type":"string"},"items":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"origin":{"type":"string","enum":["feature","stored","basic","policy"]},"name":{"type":"string"},"status":{"type":"string","enum":["included","not_included","limited","in_every_plan","on_request","policy","not_enabled"],"description":"`not_enabled`: the installation has not switched this feature on (a grey row, with that cause). `in_every_plan`: a basic capability, in every plan and never turned off. `on_request`: the plan brings it but it is switched on only on request (a Preview, or something not built yet). `policy`: the plan allows a policy that the operator can switch on for an account (the certificate-only policy)."},"stage":{"type":["string","null"],"enum":["beta","preview",null],"description":"The stage of the capability: `beta` (works, may change) or `preview` (switched on on request); `null` if it is stable."},"status_label":{"type":"string"},"quota":{"type":["string","null"],"description":"The limit or condition, in words: «up to 500 each month»."},"metric":{"type":["string","null"]},"signature_level":{"type":["string","null"],"enum":["simple","advanced",null]},"price":{"anyOf":[{"type":"object","properties":{"metric":{"type":"string","description":"What is charged: `signatures`, `sms`, `whatsapp`, `timestamps`, `identity_checks`… (the names of `quotas[].concept`)."},"signature_level":{"type":["string","null"],"enum":["simple","advanced",null],"description":"For signatures, the level the price is for."},"price":{"type":"string","description":"Per unit, as a decimal string so no digit is lost."},"currency":{"type":"string","description":"The currency of the subscription."},"included_quantity":{"type":"string","description":"Units included before this price applies."},"list_name":{"type":"string","description":"The price list it comes from."},"scope":{"type":"string","enum":["account","country","region","everywhere"],"description":"Where the list is bound: this very account, its country, its region, or everywhere."}},"required":["metric","signature_level","price","currency","included_quantity","list_name","scope"]},{"type":"null"}],"description":"The price that applies to this line; `null` if nothing charges it."}},"required":["key","origin","name","status","status_label","stage","quota","metric","signature_level","price"]}}},"required":["area","title","items"]}}},"required":["sections"]}},"required":["period","plan_code","quotas","prices","currency_without_list","sheet"]},"PaginaDeContactos":{"type":"object","properties":{"contacts":{"type":"array","items":{"$ref":"#/components/schemas/Contacto"}},"next_after":{"type":["string","null"],"description":"Pass it as `after` to get the next page; `null` when there are no more."}},"required":["contacts","next_after"]},"GrupoDeFirma":{"type":"object","description":"A signing group. Lists carry `member_count`; the single-group routes carry `members` instead.","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"description":{"type":["string","null"]},"required":{"type":"integer","description":"How many members have to sign (n)."},"on_decline":{"type":"string","enum":["stop","when_unreachable"]},"archived_at":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"member_count":{"type":"integer","description":"Only in the list."},"members":{"type":"array","description":"Only in the single-group routes.","items":{"type":"object","properties":{"email":{"type":"string"},"name":{"type":["string","null"]}},"required":["email","name"]}}},"required":["id","name","description","required","on_decline","archived_at","created_at"]},"ListaDeGruposDeFirma":{"type":"object","properties":{"signing_groups":{"type":"array","items":{"$ref":"#/components/schemas/GrupoDeFirma"}}},"required":["signing_groups"]},"GrupoArchivado":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"archived":{"type":"boolean","const":true}},"required":["ok","archived"]},"AgenteEmparejado":{"type":"object","properties":{"paired":{"type":"boolean","const":true},"agent_id":{"type":"string","format":"uuid"},"agent_secret":{"type":"string","pattern":"^sfa_[A-Za-z0-9_-]{43}$","description":"The agent secret: 32 random bytes, shown ONCE (the installation keeps only its SHA-256 and cannot show it again). The agent stores it in its state file, readable only by its service account (mode 600), and sends it in the `X-Signing-Flows-Agent-Secret` header of `/agent/heartbeat` and `/agent/filed`. Pairing again issues a new one and the old one stops working."}},"required":["paired","agent_id","agent_secret"]},"AgenteVisto":{"type":"object","properties":{"ok":{"type":"boolean","const":true}},"required":["ok"]},"AgenteArchivo":{"type":"object","properties":{"recorded":{"type":"boolean","description":"`true` if this call wrote the `entrega.archivada` event; `false` if the same document and hash were already recorded (a retry)."}},"required":["recorded"]},"Expediente":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/Evento"}},"chain":{"$ref":"#/components/schemas/Cadena"}},"required":["events","chain"]},"Paquete":{"type":"object","properties":{"schema":{"type":"string","description":"The version of this package format."},"document":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"number":{"type":"integer"},"status":{"type":"string"},"fully_signed":{"type":"boolean"}}},"workflow":{"$ref":"#/components/schemas/DetalleDelFlujo"},"files":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string","enum":["signed_document","certificate"]},"url":{"type":"string"},"mime":{"type":"string"},"bytes":{"type":["integer","null"],"description":"Size in bytes; null only when the platform could not read it."},"sha256":{"type":["string","null"],"description":"Hex SHA-256 of the file; null only when the platform could not read it. The one of the completion report is the one of the PDF `GET …/certificate` serves."},"name":{"type":"string"},"pades_level":{"type":["string","null"]}}}},"evidence":{"type":"object","properties":{"chain":{"$ref":"#/components/schemas/Cadena"},"events":{"type":"array","items":{"$ref":"#/components/schemas/Evento"}}}}},"required":["schema","document","workflow","files","evidence"]},"DocumentoSubido":{"type":"object","description":"The document that came in, and the draft flow it is in.","properties":{"workflow_id":{"type":"string","format":"uuid"},"document_id":{"type":"string","format":"uuid","description":"What `GET /documents/{id}/file` asks for."},"file_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"sha256":{"type":"string"},"bytes":{"type":"integer"},"duplicate":{"type":"boolean","description":"The same content was already in the account: the file is reused."},"storage_key":{"type":["string","null"]},"conversion":{"type":"object","description":"Only when a conversion to PDF/A was asked for or applied: see the operation."}},"required":["workflow_id","document_id"],"example":{"document_id":"7c9e6679-7425-40de-944b-e07fc1f90a15","workflow_id":"7c9e6679-7425-40de-944b-e07fc1f90a16","file_id":"7c9e6679-7425-40de-944b-e07fc1f90a12","title":"Lease agreement.pdf","sha256":"88170b90b03e9647231550da3698e76150fa8b9572f9735ca941f7b7c0ece3dc","bytes":583,"duplicate":false,"storage_key":"YuN2n9UDhDToOARouS7RkqnpHyCaSqcJRPcsmR9Y6mk"}},"FirmanteAgregado":{"type":"object","properties":{"signer_id":{"type":"string","format":"uuid","description":"The `signerId` of the routes under `.../signers`."},"identity_id":{"type":["string","null"],"format":"uuid"},"email":{"type":["string","null"]},"role":{"type":"string","enum":["signer","reviewer","cc","approver"]},"order":{"type":"integer"},"occupant":{"type":"string","enum":["person","unassigned"]},"role_name":{"type":["string","null"]}},"required":["signer_id","role","order"],"example":{"signer_id":"7c9e6679-7425-40de-944b-e07fc1f90a19","identity_id":"7c9e6679-7425-40de-944b-e07fc1f90a20","email":"carla@example.com","role":"signer","order":3,"occupant":"person","role_name":null}},"LugarAsignado":{"type":"object","additionalProperties":false,"properties":{"action":{"type":"string","enum":["assigned","reassigned","set_in_draft"]},"signer_id":{"type":"string","format":"uuid","description":"The new one."},"previous_signer_id":{"type":["string","null"],"format":"uuid"},"position":{"type":"integer"},"email":{"type":"string"},"event":{"type":["string","null"],"enum":["lugar.asignado","lugar.reasignado",null]}},"required":["action","signer_id","position"]},"QuienNombraElLugar":{"type":"object","properties":{"position":{"type":"integer","minimum":1},"named_by_position":{"type":["integer","null"],"minimum":1,"description":"The place whose signer names this one, or null when nobody was chosen."}},"required":["position","named_by_position"]},"CambioDelFirmante":{"type":"object","properties":{"ok":{"type":"boolean"},"signer_id":{"type":"string","format":"uuid"},"changed":{"type":"array","items":{"type":"string","enum":["signing","minimum_assurance","identification","access_code","may_download","may_print"]}}},"required":["ok","signer_id","changed"],"example":{"ok":true,"signer_id":"7c9e6679-7425-40de-944b-e07fc1f90a13","changed":["may_print"]}},"Marcas":{"type":"object","properties":{"ok":{"type":"boolean"},"marks":{"type":"integer"},"placed_by_tag":{"type":"array","description":"Only when something was placed by a tag: where each one landed (page from 1, PDF points).","items":{"type":"object","properties":{"code":{"type":"string"},"tag":{"type":"string"},"page":{"type":"integer"},"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["tag","page","x","y","width","height"]}},"ignored_tags":{"type":"array","description":"Only with tags: the ones left out because of `if_missing: ignore`.","items":{"type":"object","properties":{"tag":{"type":"string"},"reason":{"type":"string","enum":["not_found"]}},"required":["tag","reason"]}}},"required":["ok","marks"]},"EnlaceDeFirma":{"type":"object","properties":{"url":{"type":"string","description":"A credential: whoever holds it can sign as that person."},"email":{"type":"string"},"name":{"type":["string","null"]}},"required":["url"],"example":{"url":"https://sflows.example/firmar#t=eyJhbGciOiJIUzI1NiJ9.eyJ...","email":"ana@example.com","name":"Ana Pérez"}},"Despacho":{"type":"object","additionalProperties":false,"properties":{"ok":{"type":"boolean"},"notified":{"type":"integer","description":"How many invitations went out."},"failed":{"type":"array","description":"The invitations that did not go out. `error` is a fixed code; the detail is in `notify_error` of that signer (`GET /workflows/{id}`).","items":{"type":"object","additionalProperties":false,"properties":{"email":{"type":["string","null"]},"error":{"type":"string","enum":["delivery_failed"]}},"required":["email","error"]}}},"required":["ok"],"example":{"ok":true,"notified":2,"failed":[]}},"Retencion":{"type":"object","properties":{"ok":{"type":"boolean"},"on_hold":{"type":"boolean"},"reason":{"type":["string","null"]}},"required":["ok","on_hold"],"example":{"ok":true,"on_hold":true,"reason":"Legal hold: dispute pending"}},"Cancelacion":{"type":"object","properties":{"ok":{"type":"boolean"},"cancelled_documents":{"type":"integer","description":"How many documents were cancelled."},"closed_signers":{"type":"integer","description":"How many signers had their turn closed."},"notified":{"type":"integer","description":"How many people were told."},"instancias_canceladas":{"type":"integer","deprecated":true,"description":"Deprecated: use `cancelled_documents`. Still sent for one more version (it goes in v0.5)."},"participaciones_cerradas":{"type":"integer","deprecated":true,"description":"Deprecated: use `closed_signers`. Still sent for one more version (it goes in v0.5)."},"avisados":{"type":"integer","deprecated":true,"description":"Deprecated: use `notified`. Still sent for one more version (it goes in v0.5)."}},"required":["ok"],"example":{"ok":true,"cancelled_documents":1,"closed_signers":3,"notified":0,"instancias_canceladas":1,"participaciones_cerradas":3,"avisados":0}},"Suscripcion":{"type":"object","description":"An endpoint that receives the webhooks of this account. The secret is never here.","properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":["array","null"],"items":{"type":"string"},"description":"`null` means ALL of them, not none."},"events_note":{"type":["string","null"]},"active":{"type":"boolean","description":"The switch you set by hand."},"consecutive_failures":{"type":"integer"},"paused_since":{"type":["string","null"],"format":"date-time","description":"It paused itself after eight failures in a row."},"undelivered_since_pause":{"type":["integer","null"]}},"required":["id","url","events","active"]},"ListaDeSuscripciones":{"type":"object","properties":{"webhooks":{"type":"array","items":{"$ref":"#/components/schemas/Suscripcion"}}},"required":["webhooks"]},"SuscripcionCreada":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"secret":{"type":"string","description":"Shown this once. Every POST is signed with it."},"secret_note":{"type":"string"}},"required":["id","secret"]},"DatosDeLosEventos":{"type":"object","description":"The keys of `data` in the webhook envelope, per event code, for the events people map the most. `data` has no schema by contract: keys can be ADDED to an event at any time, so ignore the ones you do not know. A key marked optional is absent, not null, when it does not apply. This object is never sent as is: the webhook carries the one that matches its `event`.","properties":{"circuito.despachado":{"type":"object","description":"The document went out for signature. One event per document (per copy, in a copies send-out).","properties":{"modo":{"type":"string","enum":["serie","paralelo","copias"],"description":"Send-out mode, as the domain names it (`mode` in the API)."},"nivel_firma":{"type":"string","enum":["simple","avanzada","cualificada"]},"firmantes":{"type":"integer","description":"How many people sign."},"aprobadores":{"type":"integer","description":"Optional. How many people approve first; absent when nobody does."},"dias_vigencia":{"type":"integer","nullable":true,"description":"Days it stays open; null = no deadline."},"reenvio_de":{"type":"object","description":"Optional. Present when this document is a copy of a declined one sent again: `circuito_id`, `titulo`, `persona` (who declined, by the name declared for that place, or null) and `cuando`."}}},"documento.abierto":{"type":"object","description":"A participant opened the document.","properties":{"papel":{"type":"string","description":"The role of who opened it (`firmante`, `aprobador`…)."},"qr_ubicado":{"type":"object","description":"Optional. Where the verification QR sits on the page the person saw."}}},"firma.aplicada":{"type":"object","description":"A participant signed. One event per signature.","properties":{"nivel_firma":{"type":"string","description":"The level the send-out ASKED for."},"nivel_firma_obtenido":{"type":"string","description":"The level this signature PRODUCED."},"mecanismo_exigido":{"type":"string","description":"The mechanism the person was asked to use."},"mecanismo_usado":{"type":"string","description":"The mechanism the person used."},"representacion_visual":{"type":"string","nullable":true,"description":"The name the person typed for the visible signature; not the signature."},"sello":{"type":"string","description":"Which seal key signed (code)."},"proveedor_codigo":{"type":"string","description":"Code of the provider that signed."},"titular_certificado":{"type":"string","nullable":true,"description":"Holder of the certificate that signed."},"sellado_pades":{"type":"boolean"},"subfiltro":{"type":"string","description":"PDF signature sub-filter, e.g. `ETSI.CAdES.detached`."},"firmas_en_el_documento":{"type":"integer","description":"Signatures the document has with this one."},"campos_precargados":{"type":"array","items":{"type":"object"},"description":"Optional. Fields your system pre-filled that this signature fixed: `{codigo, bloqueado, cambiado}`."}}},"participacion.aprobada":{"type":"object","description":"An approver approved. See the description of `POST /webhooks`.","properties":{"participacion_id":{"type":"string","format":"uuid","description":"The `signer_id` of the API."},"email":{"type":"string","description":"Optional. Masked, `jo***@example.com`."},"papel":{"type":"string","enum":["aprobador"]}}},"revision.leida":{"type":"object","description":"A reviewer (a person who reads without signing) confirmed they read the document. Tied to the version of the document they opened. The browser measures it (the last page was in view): it is not proof that the person understood it.","properties":{"participacion_id":{"type":"string","format":"uuid","description":"The `signer_id` of the API."},"email":{"type":"string","description":"Optional. Masked, `jo***@example.com`."},"papel":{"type":"string","enum":["veedor"]},"documento_sha256":{"type":"string","description":"The SHA-256 (hex) of the version of the document the reviewer opened."},"medida":{"type":"boolean","description":"False when the viewer could not measure which pages were seen: then no page counts are given."},"paginas":{"type":"integer","description":"Optional. Pages of the document, as the viewer counted them."},"paginas_vistas":{"type":"integer","description":"Optional. Pages that were in view."},"ultima_pagina_vista":{"type":"boolean","description":"Optional. The last page was in view."},"leida_en":{"type":"string","format":"date-time"},"idioma":{"type":"string","description":"The language of the screen (two letters)."},"version":{"type":"integer"}}},"revision.nota":{"type":"object","description":"A reviewer left a note for the sender. `texto` is plain text written by an outside person: show it as text, never as HTML. Tied to the version of the document they opened. The SIEM stream gets only `largo` and `nota_n`, never the text.","properties":{"participacion_id":{"type":"string","format":"uuid","description":"The `signer_id` of the API."},"email":{"type":"string","description":"Optional. Masked, `jo***@example.com`."},"papel":{"type":"string","enum":["veedor"]},"documento_sha256":{"type":"string","description":"The SHA-256 (hex) of the version of the document the note refers to."},"texto":{"type":"string","description":"The note, as written (plain text, up to 1000 characters)."},"largo":{"type":"integer","description":"Characters in `texto`."},"nota_n":{"type":"integer","description":"The order of this note among the reviewer’s notes on this version, from 1."},"nota_id":{"type":"string","format":"uuid","description":"Optional. The identifier the screen generated before sending."},"enviada_en":{"type":"string","format":"date-time"},"idioma":{"type":"string","description":"The language of the screen (two letters)."},"version":{"type":"integer"}}},"instancia.rechazada":{"type":"object","description":"A participant declined and the document closed as declined.","properties":{"politica":{"type":"string","description":"The decline policy that applied (`bloqueante`, `continua`)."},"firmaron":{"type":"integer","description":"How many had signed already."},"motivo":{"type":"string","description":"The reason the person wrote."},"papel":{"type":"string","enum":["aprobador"],"description":"Optional. Present only when an approver declined."}}},"circuito.completo":{"type":"object","description":"The send-out finished. For `circuito.paquete` this same `data` travels in its `evento` part.","properties":{"titulo":{"type":"string","description":"Optional. Absent when a decline closed it by the decline policy."},"firmas":{"type":"integer","description":"Optional. Signatures collected; absent in the same case as `titulo`."},"politica":{"type":"string","description":"Optional. The decline policy, present when a decline closed it."},"cerrado_por":{"type":"string","description":"Optional. Present only when it closed because of a decline (`rechazo`, `rechazo con politica continua`)."}}},"circuito.cancelado":{"type":"object","description":"The sender cancelled it while it waited for signatures.","properties":{"motivo":{"type":"string","description":"The reason the sender gave."}}},"circuito.prorrogado":{"type":"object","description":"The sender extended the deadline.","properties":{"dias":{"type":"integer","description":"Days added."},"vencia_en":{"type":"string","format":"date-time","description":"The deadline before."},"vence_en":{"type":"string","format":"date-time","description":"The deadline now."},"prorrogas_usadas":{"type":"integer","description":"Extensions used so far."}}},"entrega.archivada":{"type":"object","description":"The resident agent wrote the signed file back to SharePoint.","properties":{"destino":{"type":"string"},"sitio":{"type":"string"},"ruta":{"type":"string"},"sha256":{"type":"string"},"agente_id":{"type":"string","format":"uuid"},"agente":{"type":"string"},"huella":{"type":"string"},"version":{"type":"string"},"archivado_en":{"type":"string","format":"date-time"}}},"enlace.apertura_rechazada":{"type":"object","description":"The link was not opened: the signer email address is already linked to another person.","properties":{"motivo":{"type":"string"}}},"documento.campo_completado":{"type":"object","description":"A document field was filled. The value itself is not here: only its fingerprint (`valor` appears only where the field allows it).","properties":{"campo":{"type":"string"},"automatico":{"type":"boolean"},"valor":{"type":"string"},"sha256_valor":{"type":"string"},"huella_v":{"type":"integer"},"kid":{"type":"string"}}},"documento.campos_congelados":{"type":"object","description":"The fields were frozen before signing.","properties":{"campos":{"type":"integer","description":"How many fields were frozen."}}},"campo.precargado":{"type":"object","description":"The integrator system pre-filled field values through the API. Only fingerprints of the values travel, never the values.","properties":{"canal":{"type":"string"},"token":{"type":"string","format":"uuid","nullable":true},"cantidad":{"type":"integer"},"campos":{"type":"array","description":"One `{ codigo, huella, … }` per field."}}},"certificado.emitido":{"type":"object","description":"The completion certificate (the completion report) was issued.","properties":{"sha256":{"type":"string"},"version_plantilla":{"type":"integer"},"eventos_incluidos":{"description":"The shape varies."},"cadena_ok":{"type":"boolean"},"sello":{"type":"object"}}},"documento.copiado":{"type":"object","description":"A copy of the document was created for a recipient.","properties":{"titulo":{"type":"string"},"para":{"type":"string","description":"Masked email of the recipient."}}},"grupo.congelado":{"type":"object","description":"The list of the group holding a place was frozen when the document went out.","properties":{"grupo":{"type":"string","format":"uuid"},"grupo_nombre":{"type":"string"},"posicion":{"type":"integer"},"nombre_papel":{"type":"string","nullable":true},"cantidad":{"type":"integer"},"minimo":{"type":"integer"},"al_rechazar":{"type":"string"},"huella":{"type":"string"}}},"pedido.atendido":{"type":"object","description":"A request that was waiting on the sender was taken care of: the declined document was sent again.","properties":{"nuevo_circuito_id":{"type":"string","format":"uuid"},"titulo":{"type":"string","nullable":true}}},"seguimiento.aviso_reenviado":{"type":"object","description":"The sender resent the notice to this person.","properties":{"canal":{"type":"string"},"papel":{"type":"string"}}},"enlace.obtenido_por_el_emisor":{"type":"object","description":"The sender obtained the personal signing link to deliver it themselves.","properties":{"canal":{"type":"string"},"metodo":{"type":"string"},"destino":{"type":"string","description":"Masked email."},"advertencia":{"type":"string"},"firma_propia":{"type":"boolean","description":"Only when the sender is the one who signs."}}},"documento.codigo_de_acceso_reiniciado":{"type":"object","description":"The sender set a new access code. Its `data` carries no keys (the code itself is never recorded).","properties":{}},"notificacion.enviada":{"type":"object","description":"A notification was sent.","properties":{"canal":{"type":"string"},"destino":{"type":"string","description":"Masked."},"message_id":{"type":"string","nullable":true},"error":{"type":"string","nullable":true},"en_su_turno":{"type":"boolean"},"dosier":{"type":"boolean"},"junto_con_su_otro_papel":{"type":"boolean"},"motivo":{"type":"string"},"adjunto":{"type":"boolean"},"certificado_adjunto":{"type":"boolean"},"sin_adjunto_porque":{"type":"string","nullable":true},"politica_rechazo":{"type":"string"},"instancia_estado":{"type":"string"},"participacion_rechazada_id":{"type":"string","format":"uuid"},"participacion_id":{"type":"string","format":"uuid"},"nota_n":{"type":"integer"},"respaldo":{"type":"boolean"},"respaldo_de":{"type":"string","format":"uuid"},"respaldo_motivo":{"type":"string"}}},"notificacion.fallida":{"type":"object","description":"A notification could not be delivered.","properties":{"canal":{"type":"string"},"destino":{"type":"string","description":"Masked."},"message_id":{"type":"string","nullable":true},"error":{"type":"string","nullable":true},"en_su_turno":{"type":"boolean"},"dosier":{"type":"boolean"},"junto_con_su_otro_papel":{"type":"boolean"},"motivo":{"type":"string"},"adjunto":{"type":"boolean"},"certificado_adjunto":{"type":"boolean"},"sin_adjunto_porque":{"type":"string","nullable":true},"politica_rechazo":{"type":"string"},"instancia_estado":{"type":"string"},"participacion_rechazada_id":{"type":"string","format":"uuid"},"participacion_id":{"type":"string","format":"uuid"},"nota_n":{"type":"integer"},"respaldo":{"type":"boolean"},"respaldo_de":{"type":"string","format":"uuid"},"respaldo_motivo":{"type":"string"}}},"circuito.paquete":{"type":"object","description":"Completion package: the signed document and the completion report travel next to this JSON.","properties":{"titulo":{"type":"string"},"firmas":{"type":"integer"}}},"retencion.acortada":{"type":"object","description":"The retention period for this document was shortened.","properties":{"dias_antes":{"type":"integer"},"dias_ahora":{"type":"integer"},"dias_plan":{"type":"integer"}}},"documento.compartido":{"type":"object","description":"The document was shared by link.","properties":{"expira_en":{"type":"string","format":"date-time"},"dias":{"type":"integer"},"motivo":{"type":"string","nullable":true}}},"documento.abierto_por_enlace":{"type":"object","description":"Somebody opened the shared link.","properties":{"aviso":{"type":"string"}}},"documento.descargado":{"type":"object","description":"The document was downloaded.","properties":{"archivo":{"type":"string"},"firmado":{"type":"boolean"},"antes_de_su_turno":{"type":"boolean","description":"Only when it was downloaded before the signer’s turn."}}},"circuito.copiado_de":{"type":"object","description":"Created as a copy of an earlier document (a declined one sent again).","properties":{"circuito_id":{"type":"string","format":"uuid"},"instancia_id":{"type":"string","format":"uuid"},"titulo":{"type":"string"},"persona":{"type":"string","nullable":true},"papel":{"type":"string","nullable":true},"motivo":{"type":"string","nullable":true},"cuando":{"type":"string","format":"date-time","nullable":true}}},"persona.registrada":{"type":"object","description":"A person registered.","properties":{"email":{"type":"string","description":"Masked."},"rol":{"type":"string"},"como":{"type":"string"}}},"dosier.conformado":{"type":"object","description":"The dossier was formed: the closed list of its documents.","properties":{"dosier_id":{"type":"string","format":"uuid"},"n":{"type":"integer"},"orden":{"type":"integer"},"hermanos":{"type":"array","description":"One `{ orden, sha256_base }` per document."}}},"campos.ubicados_por_etiqueta":{"type":"object","description":"Fields and signatures were placed by the tags written in the document.","properties":{"token":{"type":"string","format":"uuid","nullable":true},"huella_archivo_base":{"type":"string"},"encontradas":{"type":"integer"},"ignoradas":{"type":"integer"},"ubicadas":{"type":"array","description":"One `{ codigo, etiqueta, hoja, x, y, ancho, alto, … }` per field placed."},"ignoradas_etiquetas":{"type":"array","description":"The tags that did not match."}}},"documento.codigo_de_acceso_verificado":{"type":"object","description":"The person entered the correct access code.","properties":{"intentos":{"type":"integer","description":"Attempts it took, this one included."}}},"documento.codigo_de_acceso_trabado":{"type":"object","description":"The access code was locked after failed attempts.","properties":{"intentos":{"type":"integer"}}},"grupo.firmo_por_todos":{"type":"object","description":"A member signed on behalf of the group: the place is signed.","properties":{"grupo":{"type":"string","format":"uuid"},"grupo_nombre":{"type":"string"},"posicion":{"type":"integer"},"nombre_papel":{"type":"string","nullable":true},"minimo":{"type":"integer"},"miembros_al_enviar":{"description":"The shape varies."},"huella":{"type":"string"},"firmaron":{"type":"array","description":"One `{ quien, email, asiento }` per member who signed."}}},"firma.grupo_ya_resuelto":{"type":"object","description":"A group member arrived after the place was already resolved.","properties":{"posicion":{"type":"integer"},"pedido":{"type":"string"}}},"proceso.fallido":{"type":"object","description":"A processing step failed.","properties":{"etapa":{"type":"string"},"motivo":{"type":"string"}}},"identidad.probada":{"type":"object","description":"The signer’s identity was proven.","properties":{"metodo":{"type":"string"},"nivel_garantia":{"type":"string"},"nivel_exigido":{"type":"string","nullable":true},"proveedor":{"type":"string","description":"Only when an identity provider proved it."}}},"consentimiento.dado":{"type":"object","description":"The signer gave consent to sign electronically.","properties":{"texto_aceptado":{"type":"string","description":"The exact text the person accepted."},"idioma":{"type":"string"},"version":{"type":"integer"}}},"documento.procesado_por_agente":{"type":"object","description":"The document was processed by the company resident agent.","properties":{"agente_id":{"type":"string","format":"uuid","nullable":true},"agente":{"type":"string","nullable":true},"huella":{"type":"string","nullable":true},"version":{"type":"string","nullable":true},"simulado":{"type":"boolean"},"sede":{"type":"string"}}},"firma.sellada":{"type":"object","description":"The signature was timestamped by an external authority.","properties":{"autoridad":{"type":"string"},"politica":{"type":"string"},"numero_serie":{"type":"string"},"cualificado":{"type":"boolean"},"autoridad_de_prueba":{"type":"boolean"},"sellado_en":{"type":"string","format":"date-time"},"desvio_segundos":{"type":"integer","nullable":true},"hueco_usado":{"description":"The shape varies."}}},"sello.fallido":{"type":"object","description":"The timestamp could not be obtained.","properties":{"motivo":{"type":"string"},"intentos":{"type":"array"},"consecuencia":{"type":"string"}}},"firma.no_requerida":{"type":"object","description":"Their signature was no longer needed: the step got the signatures it required.","properties":{"cerrado_por":{"type":"string","format":"uuid","description":"The participation whose signature closed the step."},"paso":{"type":"integer"}}},"grupo.rechazo_de_miembro":{"type":"object","description":"A group member declined to sign.","properties":{"motivo":{"type":"string"},"grupo_nombre":{"type":"string"},"posicion":{"type":"integer"},"lugar_rechazado":{"type":"boolean"},"faltan":{"type":"integer"},"pueden":{"type":"integer"}}},"firma.rechazada":{"type":"object","description":"The signature was refused.","properties":{"motivo":{"type":"string"},"papel":{"type":"string","description":"Only for an approver."}}},"circuito.rechazado":{"type":"object","description":"The signing workflow ended as declined.","properties":{"politica":{"type":"string"},"cerrado_por":{"type":"string"}}},"firma.traspaso_pedido":{"type":"object","description":"The person asked for someone else to sign.","properties":{"motivo":{"type":"string"},"sugerido_nombre":{"type":"string","nullable":true},"sugerido_email":{"type":"string","nullable":true,"description":"Masked."}}},"firma.caracter_declarado":{"type":"object","description":"The signer declared the capacity in which they sign.","properties":{"caracter":{"type":"string"},"cuenta_representada_id":{"type":"string","format":"uuid","nullable":true},"fundamento":{"type":"string","nullable":true},"caracter_origen":{"type":"string"}}},"firma.fuera_de_turno":{"type":"object","description":"A request to sign before their turn was rejected.","properties":{"motivo":{"type":"string"},"pedido":{"type":"string"},"orden":{"type":"integer"},"turno_actual":{"type":"integer"}}},"firma.mecanismo_rechazado":{"type":"object","description":"A request to sign with a mechanism the policy does not allow was rejected.","properties":{"mecanismo_pedido":{"type":"string"},"mecanismo_exigido":{"type":"string"},"motivo":{"type":"string"}}},"lugar.asignado":{"type":"object","description":"The person for a reserved place was named.","properties":{"posicion":{"type":"integer"},"nombre_papel":{"type":"string","nullable":true},"para":{"type":"string","description":"Masked."},"quien":{"type":"string","format":"uuid"},"canal":{"type":"string"},"momento":{"type":"string"},"por_posicion":{"type":"integer","description":"Only when another place named them."}}},"lugar.reasignado":{"type":"object","description":"The place went to another person; the previous link stopped working.","properties":{"posicion":{"type":"integer"},"nombre_papel":{"type":"string","nullable":true},"antes":{"type":"string","nullable":true},"despues":{"type":"string"},"antes_participacion_id":{"type":"string","format":"uuid"},"despues_participacion_id":{"type":"string","format":"uuid"},"quien":{"type":"string","format":"uuid"},"canal":{"type":"string"},"motivo":{"type":"string","nullable":true},"traspaso_pedido":{"description":"The shape varies."},"codigo_de_acceso":{"type":"string","nullable":true}}},"lugar.espera_asignacion":{"type":"object","description":"The turn reached a place with nobody named: it waits for someone to be named.","properties":{"posicion":{"type":"integer"},"nombre_papel":{"type":"string","nullable":true},"turno":{"type":"integer"}}},"firma.marca_movida":{"type":"object","description":"The signer moved where their signature is stamped.","properties":{"tipo_marca":{"type":"string"},"pagina":{"type":"integer"},"desde":{"type":"object","description":"`{ x, y }`."},"hasta":{"type":"object","description":"`{ x, y }`."}}},"firma.marca_redimensionada":{"type":"object","description":"The signer changed the size of their signature.","properties":{"tipo_marca":{"type":"string"},"pagina":{"type":"integer"},"desde":{"type":"object","description":"`{ ancho, alto }`."},"hasta":{"type":"object","description":"`{ ancho, alto }`."}}},"firma.marca_agregada":{"type":"object","description":"A signature mark was added to the document.","properties":{"tipo_marca":{"type":"string"},"pagina":{"type":"integer"},"x":{"description":"The shape varies."},"y":{"description":"The shape varies."},"modo":{"type":"string","description":"Only when it was put on every page."},"hojas":{"type":"integer"},"pedidas":{"type":"integer"}}},"firma.marca_quitada":{"type":"object","description":"A signature mark was removed from the document.","properties":{"tipo_marca":{"type":"string"},"pagina":{"type":"integer"},"modo":{"type":"string"},"hojas":{"type":"integer"}}},"circuito.desde_plantilla":{"type":"object","description":"The document was created from a template.","properties":{"plantilla_id":{"type":"string","format":"uuid"},"plantilla":{"type":"string"}}},"documento.preservado":{"type":"object","description":"The material needed to validate the signatures in the future was stored inside the document.","properties":{"conservacion":{"type":"string"},"nivel_pades":{"type":"string"},"certificados":{"description":"The shape varies."},"respuestas_ocsp":{"description":"The shape varies."},"listas_de_revocacion":{"description":"The shape varies."},"sello_de_documento":{"description":"The shape varies."},"sello_de_cierre":{"description":"The shape varies."},"politica":{"type":"object"},"sha256_firmado":{"type":"string","nullable":true},"sha256_preservado":{"type":"string"},"archivo_id":{"type":"string","format":"uuid"},"bytes":{"type":"integer"},"notas":{"description":"The shape varies."},"certificado_revocado":{"type":"boolean"},"confianza":{"description":"The shape varies."}}},"documento.preservacion_renovada":{"type":"object","description":"The preservation of the document was renewed: a new document timestamp over the material that validates the previous one.","properties":{"nivel_pades":{"type":"string"},"regla_del_nivel":{"type":"string"},"por_que":{"type":"string","nullable":true},"autoridad_anterior":{"type":"object"},"autoridad_nueva":{"type":"object"},"extendido_por":{"type":"string"},"material_agregado":{"description":"The shape varies."},"agregado_por_la_anterior":{"description":"The shape varies."},"agregado_por_la_nueva":{"description":"The shape varies."},"proxima_renovacion":{"type":"string","format":"date-time","nullable":true},"sha256_anterior":{"type":"string"},"sha256_preservado":{"type":"string"},"archivo_anterior_id":{"type":"string","format":"uuid"},"archivo_id":{"type":"string","format":"uuid"},"bytes":{"type":"integer"},"notas":{"description":"The shape varies."}}},"documento.subido":{"type":"object","description":"The document was uploaded.","properties":{"titulo":{"type":"string"},"nombre_archivo":{"type":"string"},"bytes":{"type":"integer"},"reutilizo_archivo":{"type":"boolean","description":"The same content was already in the account: the file was reused."},"proposito":{"type":"string","description":"Only for a document uploaded to be sealed."}}},"documento.convertido":{"type":"object","description":"The document was converted to PDF/A (Beta): the copy is the document to sign.","properties":{"beta":{"type":"boolean"},"perfil":{"type":"string"},"de":{"type":"string"},"herramienta":{"type":"string"},"version":{"type":"string"},"por":{"type":"string"},"ms":{"type":"integer"},"sha256_original":{"type":"string"},"bytes_original":{"type":"integer"},"nombre_original":{"type":"string"},"archivo_original_id":{"type":"string","format":"uuid"},"sha256_copia":{"type":"string"},"perdido":{"type":"array"},"verificacion":{"type":"object","description":"Only when the result was checked."}}},"documento.conversion_fallida":{"type":"object","description":"Conversion to PDF/A was requested and not done (Beta).","properties":{"beta":{"type":"boolean"},"perfil":{"type":"string"},"de":{"type":"string"},"por":{"type":"string"},"motivo":{"type":"string"},"detalle":{"type":"string","nullable":true}}},"documento.visto":{"type":"object","description":"The document was viewed in full.","properties":{"firmado":{"type":"boolean"},"antes_de_su_turno":{"type":"boolean","description":"Only when it was viewed before the signer’s turn."}}},"documento.sellado":{"type":"object","description":"The document was timestamped by an authority (no signature was made).","properties":{"autoridad":{"type":"string"},"politica":{"type":"string"},"serie":{"type":"string"},"sellado_en":{"type":"string","format":"date-time"},"cualificado":{"type":"boolean"},"alcance":{"type":"string"}}},"firma.viaje_rechazado":{"type":"object","description":"A return from the provider that reached another browser was rejected.","properties":{"motivo":{"type":"string"},"viaje":{"type":"string"},"proveedor":{"type":"string","nullable":true}}},"documento.purgado":{"type":"object","description":"The document was deleted under the retention policy.","properties":{"archivo":{"type":"string","format":"uuid"},"sha256":{"type":"string"},"motivo":{"type":"string"}}},"circuito.vencido":{"type":"object","description":"The deadline expired.","properties":{"instancias_vencidas":{"type":"integer"},"participaciones_cerradas":{"type":"integer"},"a_pedido_del_emisor":{"type":"boolean","description":"Only when the sender asked for it."}}},"identidad.por_billetera":{"type":"object","description":"The signer identified by presenting attributes from their digital identity wallet (here, the attempt was refused).","properties":{"identidad":{"type":"string"},"rechazada":{"type":"boolean"},"motivo":{"type":"string"},"sesion":{"type":"string"}}},"correo.baja_del_destinatario":{"type":"object","description":"The recipient unsubscribed from emails (the provider reported it; it lives next to the delivery of the same message).","properties":{"canal":{"type":"string"},"proveedor":{"type":"string"},"message_id":{"type":"string"},"destino":{"type":"string","nullable":true,"description":"Masked."},"motivo_proveedor":{"type":"string"}}},"notificacion.entregada":{"type":"object","description":"The notification reached its destination (the provider said so). For SMS and WhatsApp it carries the provider’s state and, if any, its error code.","properties":{"canal":{"type":"string"},"proveedor":{"type":"string"},"message_id":{"type":"string"},"destino":{"type":"string","nullable":true,"description":"Masked."},"estado_twilio":{"type":"string","description":"Only SMS and WhatsApp."},"respaldo":{"type":"boolean","description":"Only when it was the SMS backup of another notification."},"codigo_de_error":{"type":"string","description":"Only SMS and WhatsApp, when the provider gave one."}}},"notificacion.no_entregada":{"type":"object","description":"The notification was sent but the provider could not deliver it (a definitive failure: hard bounce, blocked, invalid address).","properties":{"canal":{"type":"string"},"proveedor":{"type":"string"},"message_id":{"type":"string"},"destino":{"type":"string","nullable":true,"description":"Masked."},"motivo_proveedor":{"type":"string","description":"Only email: the provider’s name for the event (`hard_bounce`, `blocked`…)."},"detalle":{"type":"string","nullable":true,"description":"Only email: the provider’s explanation, if any."},"estado_twilio":{"type":"string","description":"Only SMS and WhatsApp."},"respaldo":{"type":"boolean","description":"Only when it was the SMS backup of another notification."},"codigo_de_error":{"type":"string","description":"Only SMS and WhatsApp, when the provider gave one."}}},"retencion.congelada":{"type":"object","description":"The document was put on hold: it will not be deleted when the retention period ends.","properties":{"motivo":{"type":"string","description":"Why, as the sender wrote it."}}},"retencion.descongelada":{"type":"object","description":"The hold was lifted: the document is subject to the retention period again. Its `data` carries no keys.","properties":{}},"seguimiento.recordado":{"type":"object","description":"By the follow-up rule, a reminder was emailed to someone who had not opened the link.","properties":{"regla":{"type":"string"},"dias":{"type":"integer"},"canal":{"type":"string"},"sin_destinatario":{"type":"boolean","description":"Only when there was nobody to write to."}}},"seguimiento.emisor_avisado":{"type":"object","description":"By the follow-up rule, the sender was told this person had not acted.","properties":{"regla":{"type":"string"},"dias":{"type":"integer"},"canal":{"type":"string"},"sin_destinatario":{"type":"boolean","description":"Only when the sender had no address to write to."}}},"firma.identificado_con_certificado":{"type":"object","description":"The signer identified with their certificate at the provider. Never their document number.","properties":{"proveedor_codigo":{"type":"string"},"conector":{"type":"string"},"via":{"type":"string"},"titular":{"type":"string","nullable":true,"description":"The certificate holder (its CN) or the name the provider stated."},"nivel_garantia_afirmado":{"type":"string"},"huella_certificado":{"type":"string","description":"Fingerprint of the certificate: it ties this event to the signature."},"identificado_en":{"type":"string","format":"date-time"}}},"firma.uso_de_clave_autorizado":{"type":"object","description":"The signer authorised the use of their key for this signature at the provider.","properties":{"proveedor_codigo":{"type":"string"},"conector":{"type":"string"},"via":{"type":"string"},"credencial":{"type":"string","description":"The provider’s id of the credential whose use was authorised; not a secret."},"scal":{"type":"string","nullable":true},"autorizado_en":{"type":"string","format":"date-time"}}},"firma.representacion_visual":{"type":"object","description":"Visual representation of the signature was stamped (or why it was not). Only the fingerprint of each image travels, never the image.","properties":{"estampada":{"type":"boolean"},"motivo":{"type":"string","description":"Only when nothing was stamped: why."},"aclaracion":{"type":"string","description":"Only when nothing was stamped."},"marcas":{"type":"integer","description":"How many marks were drawn."},"paginas":{"type":"array","description":"The pages (1-based) that carry a mark."},"imagenes":{"type":"array","description":"One `{ tipo, id, sha256 }` per image used."},"estampa":{"type":"object","nullable":true,"description":"What the visible signature carried (`estilo`, `lleva`, `omitidas`, `sueltos`, `logo_sha256`, `qr`, `notas`…), or null."},"detalle":{"type":"array","description":"One `{ tipo, pagina, dibujada, lleva?, nota? }` per mark."},"invisibles":{"description":"The shape varies."},"error_de_dibujo":{"type":"string","nullable":true},"nombre_escrito":{"type":"string","nullable":true,"description":"What the person typed, if anything; not the signature."}}},"documento.abierto_por_la_cuenta_madre":{"type":"object","description":"Opened by the parent account (written by the database when a parent account reads a child’s document).","properties":{"proposito":{"type":"string","description":"`ver` or `descargar`."},"cuenta_madre_id":{"type":"string","format":"uuid"},"cuenta_madre":{"type":"string","nullable":true,"description":"The parent account’s name, as a snapshot."},"quien":{"type":"string","nullable":true,"description":"Who opened it, as a snapshot."},"firmado":{"type":"boolean"}}}}},"Entregas":{"type":"object","properties":{"deliveries":{"type":"array","items":{"type":"object","properties":{"sent_at":{"type":"string","format":"date-time"},"event":{"type":"string"},"event_id":{"type":["string","null"]},"attempt":{"type":"integer"},"ok":{"type":"boolean"},"http_status":{"type":["integer","null"]},"ms":{"type":["integer","null"]},"response":{"type":["string","null"]},"error":{"type":["string","null"]},"test":{"type":"boolean"},"skipped":{"type":"boolean"}}}}},"required":["deliveries"]},"Reanudada":{"type":"object","properties":{"resumed":{"type":"boolean"},"was_paused":{"type":"boolean"},"test":{"type":"object","properties":{"ok":{"type":"boolean"},"http_status":{"type":["integer","null"]},"ms":{"type":["integer","null"]},"response":{"type":["string","null"]},"error":{"type":["string","null"],"description":"Why it did not get through, in one closed sentence per `cause`; null when it did."},"cause":{"type":["string","null"],"enum":[null,"destination_refused","dns","unreachable","timeout","tls_certificate","redirect","http_status","other","not_recorded","not_sent"],"description":"Why it did not get through, as a name to compare (null when it did): `destination_refused` (the address is not a public https one), `dns` (the name does not resolve), `unreachable` (connection refused or cut), `timeout`, `tls_certificate` (expired, self-signed or for another name), `redirect` (webhooks do not follow redirects), `http_status` (it answered outside 2xx: see `http_status`), `other`; `not_recorded` (it was sent but could not be logged) and `not_sent` (resumed, but the test event did not go out)."}}}},"required":["resumed","was_paused","test"]},"EventosSuscribibles":{"type":"object","properties":{"events":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":["string","null"]},"description":{"type":["string","null"]},"category":{"type":["string","null"]},"type":{"type":"string","description":"The same as `code`, for one more version."},"what":{"type":["string","null"],"description":"The same as `label`, for one more version."}}}}},"required":["events"]},"EventoDelCatalogo":{"type":"object","properties":{"name":{"type":"string","description":"The stable name of the event, the same as `event` in the webhook body."},"version":{"type":"integer","description":"The version of this schema."},"versions":{"type":"array","items":{"type":"integer"},"description":"Every version the catalogue still keeps for this event."},"retired_after":{"type":"string","nullable":true,"description":"If this version is not the current one: the date (YYYY-MM-DD) until which it is kept."},"description":{"type":"string"},"schema":{"type":"object","description":"A JSON Schema (draft-07) for the whole body that a webhook receiver gets for this event."},"example":{"type":"object","description":"An example of that body, built by the same code that builds the real one. `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`); for the rest it is `{}`: its keys are free by contract."}},"required":["name","version","versions","description","schema","example"]},"CatalogoDeEventos":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/EventoDelCatalogo"}},"version_policy":{"type":"string"}},"required":["events","version_policy"]},"Vocabulario":{"type":"object","properties":{"event_types":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"label":{"type":["string","null"]},"category":{"type":["string","null"]},"weight":{"type":["string","null"]},"contractual":{"type":["boolean","null"]},"description":{"type":["string","null"]}}}}},"required":["event_types"]},"CamposDelFlujo":{"type":"object","description":"The fields of a flow, as defined, with the value the sender or your system put.","properties":{"fields":{"type":"array","items":{"$ref":"#/components/schemas/FieldDefinition"}}},"required":["fields"]},"CamposDefinidos":{"type":"object","description":"The fields as saved. `values_kept`: how many values already written survived (same `code`).","properties":{"ok":{"type":"boolean","const":true},"fields":{"type":"integer","description":"How many fields were saved."},"values_kept":{"type":"integer"},"placed_by_tag":{"type":"array","description":"Only when something was placed by a tag: where each one landed (page from 1, PDF points).","items":{"type":"object","properties":{"code":{"type":"string"},"tag":{"type":"string"},"page":{"type":"integer"},"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["tag","page","x","y","width","height"]}},"ignored_tags":{"type":"array","description":"Only with tags: the ones left out because of `if_missing: ignore`.","items":{"type":"object","properties":{"tag":{"type":"string"},"reason":{"type":"string","enum":["not_found"]}},"required":["tag","reason"]}}},"required":["ok","fields"]},"ValoresPrecargados":{"type":"object","description":"The fields with their values after the pre-fill, and the documents it reached.","properties":{"ok":{"type":"boolean","const":true},"fields":{"type":"integer","description":"How many fields were written."},"documents":{"type":"integer","description":"In how many documents."}},"required":["ok","fields"]},"FlujoArmado":{"type":"object","description":"The flow created in one call: the upload (`workflow_id`, `document_id`, `sha256`…) plus what was set up.","properties":{"workflow_id":{"type":"string","format":"uuid"},"document_id":{"type":"string","format":"uuid","description":"What `GET /documents/{id}/file` asks for."},"file_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"sha256":{"type":"string"},"bytes":{"type":"integer"},"duplicate":{"type":"boolean","description":"The same content was already in the account: the file is reused."},"storage_key":{"type":["string","null"]},"dispatched":{"type":"boolean"},"status":{"type":"string"},"fields":{"type":["integer","array"],"description":"The fields set up (a count, or the list)."},"values":{"type":"integer","description":"How many values were pre-filled (0 when none were sent)."},"copies":{"type":["integer","array","object","null"]},"signers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"position":{"type":"integer"},"role":{"type":"string"},"occupant":{"type":"string"},"role_name":{"type":["string","null"]}}}},"dispatch":{"type":"object","description":"Only when the flow was dispatched."}},"required":["workflow_id","document_id","dispatched","status"],"example":{"document_id":"7c9e6679-7425-40de-944b-e07fc1f90a10","workflow_id":"7c9e6679-7425-40de-944b-e07fc1f90a11","file_id":"7c9e6679-7425-40de-944b-e07fc1f90a12","title":"Lease agreement","sha256":"88170b90b03e9647231550da3698e76150fa8b9572f9735ca941f7b7c0ece3dc","bytes":583,"duplicate":false,"storage_key":"YuN2n9UDhDToOARouS7RkqnpHyCaSqcJRPcsmR9Y6mk","dispatched":false,"status":"draft","fields":0,"values":0,"copies":0,"signers":[{"id":"7c9e6679-7425-40de-944b-e07fc1f90a13","position":1,"role":"signer","occupant":"person","role_name":null},{"id":"7c9e6679-7425-40de-944b-e07fc1f90a14","position":2,"role":"signer","occupant":"person","role_name":null}]}},"SelloSuelto":{"type":"object","description":"A loose document sealed with a timestamp.","properties":{"workflow_id":{"type":"string","format":"uuid"},"document_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"sealed_at":{"type":["string","null"],"format":"date-time"},"authority":{"type":["string","null"]},"qualified":{"type":"boolean"},"bytes":{"type":"integer"},"original_sha256":{"type":"string","description":"The hash of the file you sent, before the seal."},"scope":{"type":"string","description":"What the seal proves."}},"required":["workflow_id","document_id"]},"FirmaPropia":{"type":"object","description":"The document uploaded to be signed by the token’s owner: where to sign it.","properties":{"workflow_id":{"type":"string","format":"uuid"},"signer_id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"conversion":{"type":"object","description":"Only when the file was converted."}},"required":["workflow_id","signer_id","url"]},"PasosDefinidos":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"steps":{"type":"integer","description":"How many steps."}},"required":["ok"]},"CopiasAgregadas":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"copies":{"type":"integer"},"with_values":{"type":"integer","description":"How many of them carry values."}},"required":["ok","copies"]},"CopiasDesdeCsv":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"copies":{"type":"integer"},"with_values":{"type":"integer"},"mapped_columns":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"field":{"type":"string"}}}},"ignored_columns":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"reason":{"type":"string"}}}}},"required":["ok","copies"]},"FieldDefinition":{"type":"object","properties":{"code":{"type":"string","maxLength":60,"description":"Your name for the field: what `values` and `recipients[].fields` use."},"type":{"type":"string","enum":["text","paragraph","number","date","amount","checkbox","list","fixed_text","initials"]},"label":{"description":"What the signer reads: a text, or `{es, en, pt}`. The signer sees theirs.","anyOf":[{"type":"string"},{"type":"object","properties":{"es":{"type":"string"},"en":{"type":"string"},"pt":{"type":"string"}}}]},"options":{"type":["array","null"],"items":{"type":"string"},"description":"For `list`."},"who":{"type":"string","enum":["sender","signer","anyone"],"description":"Who fills it in. `signer` (the default) needs `position`."},"position":{"type":["integer","null"],"minimum":1,"description":"The signer’s place (`position` of `GET /workflows/{id}`)."},"required":{"type":"boolean"},"visible_to":{"type":"string","enum":["everyone","completer"]},"locked_for_signer":{"type":"boolean","description":"The value you pre-fill is not changeable by the signer: it shows with a padlock on the signing page and the evidence says so; the PDF carries no mark. Only for a manual field of a signer or of anyone."},"validation":{"type":["object","null"],"description":"The same on the server and in the browser. `pattern` is a NAME, never a regular expression.","properties":{"pattern":{"type":["string","null"],"enum":["email","phone","id_number","letters_only","digits_only",null]},"min":{"type":["number","null"]},"max":{"type":["number","null"]},"from":{"type":["string","null"],"description":"`YYYY-MM-DD` or `today`."},"to":{"type":["string","null"]}}},"source":{"type":"string","enum":["manual","platform","certificate"],"description":"Filled in by nobody (`platform`, `certificate`): no value can be pre-filled."},"source_field":{"type":["string","null"]},"font_size":{"type":["number","null"]},"color":{"type":["string","null"],"description":"`#rrggbb`."},"order":{"type":"integer"},"placement":{"type":"object","description":"Where it goes: PDF points from the bottom left corner; `page` starts at 1.","properties":{"page":{"type":"integer","minimum":1},"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["page","x","y","width","height"]},"mirrors":{"type":["array","null"],"items":{"type":"object"},"description":"The same value in other places (text and paragraph)."},"help":{"description":"Help for the signer under the field, in up to three languages (see `FieldHelp`). Optional; `null` or `{}` is no help. More than 300 characters in a language, a language other than `es`, `en` or `pt`, or text that is not plain (control or direction characters) is a 422 that says which.","oneOf":[{"$ref":"#/components/schemas/FieldHelp"},{"type":"null"}]},"default_value":{"type":["string","null"],"maxLength":500,"description":"The value that stays put in the field as a SUGGESTION the signer accepts or changes (it is not signed until they pass through the field). Only for a field the signer fills in by hand: with fixed text, initials, `who: sender` or a `source` other than `manual` it is a 422. Not the same as `PUT .../fields/values`, which pre-fills a value in this one document. `GET` returns it as `default_value`."}},"required":["code","type","label","placement"]},"FieldHelp":{"type":"object","description":"The help the signer reads under the field, by language. Plain text, up to 300 characters in each language; only `es`, `en` and `pt`. It is shown as text, never as HTML. A language that is missing falls back to the installation’s language and then to English.","properties":{"es":{"type":"string","maxLength":300},"en":{"type":"string","maxLength":300},"pt":{"type":"string","maxLength":300}},"additionalProperties":false},"TagPlacement":{"type":"object","description":"Where it goes, by a tag written in the PDF text: `[[TIPO_QUIEN:code]]`. TIPO is `SIG` (signature), `INI` (initials), `TXT`, `PAR`, `NUM`, `DATE`, `AMT`, `CHK` or `LIST`; QUIEN is the signer’s place (1 to 99), `S` (the sender) or `A` (anyone); the `code` after the colon is required except in `SIG` and `INI`, and is lowercase letters, digits and underscore (1 to 40). Examples: `[[SIG_1]]`, `[[INI_2]]`, `[[TXT_1:phone]]`, `[[DATE_S:contract_date]]`. The tag only places: the label, validation and who sees it come from the field you send. It is found in the base file, which is never changed; the box starts at the tag’s left edge and baseline, with a minimum size by type, moved and resized by the optional numbers (PDF points). Write the tag in white. A tag split in pieces by the word processor is found.","properties":{"tag":{"type":"string","minLength":1,"maxLength":80,"examples":["[[TXT_1:phone]]"]},"if_missing":{"type":"string","enum":["error","ignore"],"description":"`error` (the default): a tag that is not in the document is a 422 `etiquetas_ausentes` listing every missing tag. `ignore`: the field (or mark) is left out and the evidence says so. In `PUT .../marks`, if EVERY mark of the request is ignored the answer is a 422 `etiquetas_ausentes` and nothing changes (send `marks: []` to remove a signer’s marks on purpose)."},"offset_x":{"type":"number","minimum":-2000,"maximum":2000,"description":"PDF points, to the right of the tag’s left edge. The resulting `x` must stay from 0 to 20000, or it is a 400 `ubicacion_invalida`."},"offset_y":{"type":"number","minimum":-2000,"maximum":2000,"description":"PDF points, up from the tag’s baseline. The resulting `y` must stay from 0 to 20000, or it is a 400 `ubicacion_invalida`."},"width":{"type":"number","minimum":8,"maximum":2000},"height":{"type":"number","minimum":8,"maximum":2000}},"required":["tag"]},"FieldDefinitionByTag":{"type":"object","properties":{"code":{"type":"string","maxLength":60,"description":"Your name for the field: what `values` and `recipients[].fields` use."},"type":{"type":"string","enum":["text","paragraph","number","date","amount","checkbox","list","fixed_text","initials"]},"label":{"description":"What the signer reads: a text, or `{es, en, pt}`. The signer sees theirs.","anyOf":[{"type":"string"},{"type":"object","properties":{"es":{"type":"string"},"en":{"type":"string"},"pt":{"type":"string"}}}]},"options":{"type":["array","null"],"items":{"type":"string"},"description":"For `list`."},"who":{"type":"string","enum":["sender","signer","anyone"],"description":"Who fills it in. `signer` (the default) needs `position`."},"position":{"type":["integer","null"],"minimum":1,"description":"The signer’s place (`position` of `GET /workflows/{id}`)."},"required":{"type":"boolean"},"visible_to":{"type":"string","enum":["everyone","completer"]},"locked_for_signer":{"type":"boolean","description":"The value you pre-fill is not changeable by the signer: it shows with a padlock on the signing page and the evidence says so; the PDF carries no mark. Only for a manual field of a signer or of anyone."},"validation":{"type":["object","null"],"description":"The same on the server and in the browser. `pattern` is a NAME, never a regular expression.","properties":{"pattern":{"type":["string","null"],"enum":["email","phone","id_number","letters_only","digits_only",null]},"min":{"type":["number","null"]},"max":{"type":["number","null"]},"from":{"type":["string","null"],"description":"`YYYY-MM-DD` or `today`."},"to":{"type":["string","null"]}}},"source":{"type":"string","enum":["manual","platform","certificate"],"description":"Filled in by nobody (`platform`, `certificate`): no value can be pre-filled."},"source_field":{"type":["string","null"]},"font_size":{"type":["number","null"]},"color":{"type":["string","null"],"description":"`#rrggbb`."},"order":{"type":"integer"},"placement":{"oneOf":[{"type":"object","description":"Where it goes: PDF points from the bottom left corner; `page` starts at 1.","properties":{"page":{"type":"integer","minimum":1},"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"required":["page","x","y","width","height"]},{"$ref":"#/components/schemas/TagPlacement"}]},"mirrors":{"type":["array","null"],"items":{"type":"object"},"description":"The same value in other places (text and paragraph)."},"help":{"description":"Help for the signer under the field, in up to three languages (see `FieldHelp`). Optional; `null` or `{}` is no help. More than 300 characters in a language, a language other than `es`, `en` or `pt`, or text that is not plain (control or direction characters) is a 422 that says which.","oneOf":[{"$ref":"#/components/schemas/FieldHelp"},{"type":"null"}]},"default_value":{"type":["string","null"],"maxLength":500,"description":"The value that stays put in the field as a SUGGESTION the signer accepts or changes (it is not signed until they pass through the field). Only for a field the signer fills in by hand: with fixed text, initials, `who: sender` or a `source` other than `manual` it is a 422. Not the same as `PUT .../fields/values`, which pre-fills a value in this one document. `GET` returns it as `default_value`."}},"required":["code","type","label","placement"]},"CuerpoDelWebhook":{"type":"object","description":"The body a webhook receiver gets: the envelope of an event. The keys `document_file`, `report`, `report_omitted_because`, `omitted` and `links` (and their Spanish pairs) come only in `circuito.paquete`.","properties":{"payload_version":{"const":2,"description":"Version of the envelope (not of the event)."},"event_label":{"type":["string","null"],"description":"The description of the event, in English."},"id":{"type":["string","null"],"description":"Id of the evidence entry; the receiver deduplicates by it."},"evento":{"type":"string"},"event":{"type":"string","description":"The stable name of the event."},"ocurrido_en":{"type":"string"},"occurred_at":{"type":"string","description":"When it happened (UTC)."},"cuenta":{"type":["string","null"]},"account":{"type":["string","null"]},"circuito":{"type":["string","null"]},"workflow":{"type":["string","null"]},"instancia":{"type":["string","null"]},"document":{"type":["string","null"]},"datos":{"type":"object","description":"The keys of this event. Free by contract: keys can be added at any time, so ignore the ones you do not know. The documented ones are in `DatosDeLosEventos`."},"data":{"type":"object","description":"The keys of this event. Free by contract: keys can be added at any time, so ignore the ones you do not know. The documented ones are in `DatosDeLosEventos`."},"documento":{"type":["object","array","string","null"]},"document_file":{"type":["object","array","string","null"]},"informe":{"type":["object","array","string","null"]},"report":{"type":["object","array","string","null"]},"informe_omitido_porque":{"type":["object","array","string","null"]},"report_omitted_because":{"type":["object","array","string","null"]},"omitidos":{"type":["object","array","string","null"]},"omitted":{"type":["object","array","string","null"]},"enlaces":{"type":["object","array","string","null"]},"links":{"type":["object","array","string","null"]}},"required":["payload_version","event","evento","occurred_at","ocurrido_en","data","datos"],"additionalProperties":false}}},"security":[{"tokenDeApi":[]}],"paths":{"/":{"get":{"tags":["Service"],"summary":"What this is and what version it speaks","security":[],"responses":{"200":{"description":"The version, and where this description lives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Servicio"}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/me":{"get":{"tags":["Account"],"summary":"Which account this token belongs to, and with what scopes","description":"The first thing worth trying when somebody hands you a token. `scopes: null` does not mean «none»: the token was created with all of them, and it can also use any scope added later (`scopes_note` says so).","responses":{"200":{"description":"The account and the token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Yo"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows":{"post":{"tags":["Workflows"],"summary":"Create the whole flow in one call","security":[{"tokenDeApi":["documento.crear","circuito.editar","circuito.enviar"]}],"description":"The document, how it is signed, the people, where each one signs, the fields, their values, the quorum and, if you ask, the dispatch — in ONE request, instead of five to eight. It is not a new path: it runs the same steps as the individual routes, in this order, with their same rules and refusals.\n\nSend `multipart/form-data` with the PDF in the field `file` and the flow as JSON in the field `workflow` (the order of the fields does not matter), or a JSON body with `url` (and optionally `authorization`) to fetch the document, as `POST /documents/from-url`.\n\n`workflow`: `title`, `folder_id`, `convert`; the same settings as `PATCH /workflows/{id}` (`mode`, `signature_level`, `validity_days`, `decline_policy`, `signing`, `verification_qr`); `roles`: one entry per person, in order, with what `POST .../signers` takes (`email`, `name`, `occupant`, `role_name`, `role`, `order`, `minimum_assurance`, `capacity`, `signing`, `access_code`, `may_download`, `may_print`) plus `marks` (as `PUT .../signers/{signerId}/marks`); `steps`: `[{positions: [1, 2], minimum: 1}]` — the quorum, naming places by `position`; `fields` and `values`: as `PUT .../fields` and `PUT .../fields/values`; `recipients`: instead of `roles`, one copy per person (the flow becomes `copies`), each with its own `fields`; and `dispatch` (default `false`: it stays a draft).\n\nA signer’s **position** is its place among the signers, 1, 2, 3… in the order they are listed in `roles` (approvers, reviewers and cc have none). `fields[].position`, `steps[].positions` and `PUT .../roles/{position}` all name it.\n\n**All or nothing.** If any step is refused, the draft that was created is deleted and you get the original error — you never end up with a half-built flow you did not know existed. With `Idempotency-Key` the same request (the JSON and the SHA-256 of the file) answers the same flow.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"workflow":{"type":"string","description":"The flow, as JSON (see above)."}},"required":["file"]}},"application/json":{"schema":{"type":"object","description":"The flow, as JSON, with `url` instead of a file.","properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string"},"roles":{"type":"array","items":{"type":"object"}},"fields":{"type":"array","items":{"$ref":"#/components/schemas/FieldDefinition"}},"values":{"type":"object","additionalProperties":{"type":["string","null"]}},"steps":{"type":"array","items":{"type":"object"}},"dispatch":{"type":"boolean"}}}}}},"responses":{"200":{"description":"The upload (`workflow_id`, `document_id`, `sha256`…) plus `dispatched`, `status`, `fields`, `values`, `copies` and `signers` (`id`, `position`, `role`, `occupant`, `role_name`); with `dispatch`, also `dispatch` (what `POST .../dispatch` answers).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlujoArmado"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`. A PDF with automatic actions — JavaScript that runs by itself (on open, document-level, or an additional action other than a form field’s calculation) or an action that opens files or sends data (`Launch`, `SubmitForm`, `ImportData`, `GoToR`, `GoToE`, `RichMedia`) — is refused with `code: contenido_activo` and `detail`: one entry per action, with `action`, `where` (`on_open`, `document`, `page`, `annotation`, `field`, `bookmark`) and, when known, `page` and `name`. Upload one without them; it is not rewritten for you. Attachments, XFA, links to websites and form calculations are not refused. Nothing is created.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one (`contenido_activo`). Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["enlace_no_publico","enlace_es_pagina","roles_y_destinatarios","pasos_en_copias","por_asignar_en_copias","por_asignar_solo_firmantes","por_asignar_con_persona","bloqueo_no_aplica","sin_valores","demasiados_valores","filas_invalidas","paso_sin_lugar"]},"detail":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"where":{"type":"string","enum":["on_open","document","page","annotation","field","bookmark"]},"page":{"type":"integer"},"name":{"type":"string"}},"required":["action","where"]}}},"required":["error"]},"examples":{"enlace_no_publico":{"summary":"enlace_no_publico","value":{"error":"The text varies; compare the `code`.","code":"enlace_no_publico"}},"enlace_es_pagina":{"summary":"enlace_es_pagina","value":{"error":"The text varies; compare the `code`.","code":"enlace_es_pagina"}},"roles_y_destinatarios":{"summary":"roles_y_destinatarios","value":{"error":"Use `roles` for a signing order, or `recipients` for one copy each: not both.","code":"roles_y_destinatarios"}},"pasos_en_copias":{"summary":"pasos_en_copias","value":{"error":"Steps (quorum) do not apply to separate copies: each copy has one signer.","code":"pasos_en_copias"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"This document has places to be assigned later, and in a separate-copies send-out each recipient is a row of the list. Name those people, or remove the places, and try again.","code":"por_asignar_en_copias"}},"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"bloqueo_no_aplica":{"summary":"bloqueo_no_aplica","value":{"error":"“…” cannot be locked for the signer: it is filled in by the sender or by the platform, so the signer never types it.","code":"bloqueo_no_aplica"}},"sin_valores":{"summary":"sin_valores","value":{"error":"Send at least one value, as {\"field_code\": \"value\"}.","code":"sin_valores"}},"demasiados_valores":{"summary":"demasiados_valores","value":{"error":"That is too many values for one call (200 maximum).","code":"demasiados_valores"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"paso_sin_lugar":{"summary":"paso_sin_lugar","value":{"error":"Step … names signer position …, and the workflow has no signer there.","code":"paso_sin_lugar"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`. And `convert` (or an account that always converts a file that is not a PDF) where the plan does not include that conversion is a 403 with `code: prestacion_no_incluida` and `feature`: `conversion_oficina` (Word, Excel, PowerPoint, OpenDocument or an image into a PDF) or `conversion_pdfa` (a PDF normalised to PDF/A). Nothing is uploaded.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","prestacion_no_incluida","medio_fuera_de_la_politica_de_la_cuenta","consentimiento_no_incluido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."},"feature":{"type":"string","enum":["conversion_oficina","conversion_pdfa"],"description":"With `prestacion_no_incluida`: the plan feature that is missing."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"consentimiento_no_incluido":{"summary":"consentimiento_no_incluido","value":{"error":"The text varies; compare the `code`.","code":"consentimiento_no_incluido"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}},"prestacion_no_incluida":{"summary":"prestacion_no_incluida","value":{"error":"The text varies; compare the `code`.","code":"prestacion_no_incluida"}}}}}},"404":{"description":"`code: grupo_inexistente` — a `roles[].group_id` that does not exist in this account, or is archived (a group of another account is not found either). Nothing was created."},"409":{"description":"Nothing was created (on any 4xx: if removing the half-built draft fails too, the error carries `draft_left` with its id, to delete it; if the dispatch already went out and something fails after it, there is no `draft_left`: the flow was sent, do not retry it). The refusals of each step keep their code: the same as uploading, adding a signer, choosing the QR and dispatching (`mecanismo_sin_prestador`, `nivel_sin_verificacion`, `primer_turno_sin_persona`, `aprueba_y_firma`, `aprobador_despues_de_firmante`, `limite_de_cuenta`, `qr_tapa_texto`, `qr_fuera_de_la_pagina`, `conversion_apagada_por_la_cuenta`, `lote_demasiado_grande`, `borrador_de_plantilla`, `documento_no_es_borrador`, and the group places: `grupo_no_alcanza`, `miembro_con_lugar_propio`, `miembro_en_dos_lugares`; and `ya_enviado` if the draft was already sent). With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["aprobador_despues_de_firmante","aprueba_y_firma","borrador_de_plantilla","conversion_apagada_por_la_cuenta","designacion_despues_del_lugar","documento_de_un_dosier","documento_no_es_borrador","grupo_no_alcanza","limite_de_cuenta","lote_demasiado_grande","mecanismo_sin_prestador","prestador_no_habilitado","miembro_con_lugar_propio","miembro_en_dos_lugares","nivel_sin_verificacion","primer_turno_sin_persona","qr_fuera_de_la_pagina","qr_tapa_texto","ya_enviado","envio_en_copias_con_varios_destinatarios"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"envio_en_copias_con_varios_destinatarios":{"summary":"envio_en_copias_con_varios_destinatarios","value":{"error":"This send-out already has one copy per recipient. To have everyone sign on the same document, remove the recipients first, or upload the document again.","code":"envio_en_copias_con_varios_destinatarios"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"“…” is not enabled for documents under ….","code":"prestador_no_habilitado"}},"qr_tapa_texto":{"summary":"qr_tapa_texto","value":{"error":"The text varies; compare the `code`.","code":"qr_tapa_texto"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"aprueba_y_firma":{"summary":"aprueba_y_firma","value":{"error":"The text varies; compare the `code`.","code":"aprueba_y_firma"}},"lote_demasiado_grande":{"summary":"lote_demasiado_grande","value":{"error":"At most … people can go in this batch (a document goes to at most …, and this one has …), and … has …. Split it; nobody was added.","code":"lote_demasiado_grande"}},"designacion_despues_del_lugar":{"summary":"designacion_despues_del_lugar","value":{"error":"The text varies; compare the `code`.","code":"designacion_despues_del_lugar"}},"documento_de_un_dosier":{"summary":"documento_de_un_dosier","value":{"error":"This document belongs to a dossier: send the whole dossier together.","code":"documento_de_un_dosier"}},"borrador_de_plantilla":{"summary":"borrador_de_plantilla","value":{"error":"This is a template being built, not a document: finish it with “Save as template”. To send it for signature, make a document from the template once it is saved.","code":"borrador_de_plantilla"}},"primer_turno_sin_persona":{"summary":"primer_turno_sin_persona","value":{"error":"Nobody is named in the first turn: name the person for that place (Assign) before sending it, or move a named signer to go first.","code":"primer_turno_sin_persona"}},"aprobador_despues_de_firmante":{"summary":"aprobador_despues_de_firmante","value":{"error":"… has to approve before anyone signs, and is at or after a signer in the order. Move them ahead of every signer, or make them a signer.","code":"aprobador_despues_de_firmante"}},"nivel_sin_verificacion":{"summary":"nivel_sin_verificacion","value":{"error":"… has to prove identity at … level to …, and …","code":"nivel_sin_verificacion"}},"ya_enviado":{"summary":"ya_enviado","value":{"error":"This document was already sent: somebody was given access to it, and a sent document is never deleted. Cancel it instead.","code":"ya_enviado"}},"conversion_apagada_por_la_cuenta":{"summary":"conversion_apagada_por_la_cuenta","value":{"error":"The text varies; compare the `code`.","code":"conversion_apagada_por_la_cuenta"}},"grupo_no_alcanza":{"summary":"grupo_no_alcanza","value":{"error":"The text varies; compare the `code`.","code":"grupo_no_alcanza"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"The text varies; compare the `code`.","code":"mecanismo_sin_prestador"}},"miembro_con_lugar_propio":{"summary":"miembro_con_lugar_propio","value":{"error":"The text varies; compare the `code`.","code":"miembro_con_lugar_propio"}},"miembro_en_dos_lugares":{"summary":"miembro_en_dos_lugares","value":{"error":"The text varies; compare the `code`.","code":"miembro_en_dos_lugares"}},"qr_fuera_de_la_pagina":{"summary":"qr_fuera_de_la_pagina","value":{"error":"The text varies; compare the `code`.","code":"qr_fuera_de_la_pagina"}}}}}},"422":{"description":"`code: valores_invalidos` — `errors` lists every value that cannot be used, by `field`. Nothing was created.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["valores_invalidos"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"valores_invalidos":{"summary":"valores_invalidos","value":{"error":"… value… cannot be used and none was saved: …….","code":"valores_invalidos"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}]},"get":{"tags":["Workflows"],"summary":"The flows in this account","security":[{"tokenDeApi":["documento.leer"]}],"description":"Cursor paginated: the response carries `next_before`, and you send it back as `before` to get the next batch. Absent or null means there are no more.\n\nBy cursor and not by page number because new flows arrive between two requests, and with numbered pages that shifts the rows down and skips some of them past you.","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["draft","sent","completed","cancelled","expired","declined"]}},{"name":"before","in":"query","schema":{"type":"string","format":"date-time"},"description":"The `next_before` from the previous batch."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"since","in":"query","schema":{"type":"string","format":"date-time"},"description":"ISO 8601. Only the flows that changed after this moment (`updated_at > since`): a new one, a new status, a signer or a field changed, a signature applied, a cancellation. Reading a flow is not a change. With `since` the list is ordered by `updated_at` ascending (then `id`), there is no `before` cursor (`next_before` is null) and you page by sending the last `updated_at` you got as the next `since`. **Ask with a margin:** a change is visible only once its transaction commits, and its `updated_at` is the moment it happened, so a slow commit can land just behind the last one you saw. Send the last `updated_at` minus 2 minutes as the next `since` and discard the duplicates by `id`."}],"responses":{"200":{"description":"The batch and the cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginaDeFlujos"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/templates":{"get":{"tags":["Templates"],"summary":"The templates in this account","security":[{"tokenDeApi":["plantilla.administrar"]}],"description":"A template is a document you already set up — the file, the fields and the shape of the flow — with roles instead of people.\n\nTo start a workflow from one: `GET /templates/{id}` says its roles and their `position`, and `POST /templates/{id}/use` creates the draft naming who plays each.\n\nOnly the active templates, ordered by name. Cursor paginated: the response carries `next_after` (the name of the last template in the batch), and you send it back as `after` to get the next batch. Null means there are no more. By cursor and not by page number for the same reason as `/workflows`: templates are created between two requests. Names are unique in an account, so no template is repeated or skipped; one renamed while you page may move to the part you already read.","parameters":[{"name":"after","in":"query","schema":{"type":"string","maxLength":120},"description":"The `next_after` from the previous batch."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"The batch and the cursor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginaDePlantillas"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/templates/{id}":{"get":{"tags":["Templates"],"summary":"One template, with its roles","security":[{"tokenDeApi":["plantilla.administrar"]}],"description":"What you need to start a workflow from it: its `roles`, each with the `position` you name them by in `people` when you use it. A role with `fixed_email` is always played by that address: whatever you send for its position is ignored.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The template and its roles.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlantillaConPapeles"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/templates/{id}/use":{"post":{"tags":["Templates"],"summary":"Start a draft workflow from a template","security":[{"tokenDeApi":["documento.crear"]}],"description":"The same thing the console does with *New from template*: the new workflow is a **draft** with the template’s file, fields, roles, signing mechanism and verification QR, and the people you name. Fields: `title` (required), `folder_id` (optional: without it the document goes to the root folder of the account, like `POST /documents`) and `people`, an object keyed by the `position` of each role (see `GET /templates/{id}`): `{\"1\": {\"email\": \"ana@example.com\", \"name\": \"Ana\"}}`. Every role without `fixed_email` needs somebody, or 400 names the role.\n\nIt needs the `documento.crear` scope, not the templates one: using a template creates a document. From there it is an ordinary draft: add or change people, `PATCH` it, dispatch it.\n\n**Send `Idempotency-Key`**: a retry without it creates the workflow twice.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"responses":{"200":{"description":"The draft workflow.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FlujoDesdePlantilla"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"The template is archived, or its base document is no longer available (no `code`); the template keeps only the flow and has no document of its own (`code: plantilla_sin_documento`: start the workflow from a document instead); somebody would both approve and sign (`code: aprueba_y_firma`); or the account requires each person’s own certificate and a role would sign by consent (`code: limite_de_cuenta`); or a role would sign by consent and the plan does not include it (`code: mecanismo_sin_prestador`, `missing: plan`); or the document the template points to has already been purged by its retention (`code: documento_vencido`: pick a current document). With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["aprueba_y_firma","documento_vencido","limite_de_cuenta","mecanismo_sin_prestador","plantilla_sin_documento","prestador_no_habilitado"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"plantilla_sin_documento":{"summary":"plantilla_sin_documento","value":{"error":"That template has no document of its own, only the flow: say which document it is for.","code":"plantilla_sin_documento"}},"documento_vencido":{"summary":"documento_vencido","value":{"error":"That document is past its retention period and is about to be removed: upload it again to use it.","code":"documento_vencido"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"… this account’s plan does not include signing by consent. Let them sign with their own certificate, or ask the platform to include signing by consent in your plan.","code":"mecanismo_sin_prestador"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"“…” is not enabled for documents under ….","code":"prestador_no_habilitado"}},"aprueba_y_firma":{"summary":"aprueba_y_firma","value":{"error":"The text varies; compare the `code`.","code":"aprueba_y_firma"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","maxLength":200,"minLength":1},"folder_id":{"type":"string","format":"uuid"},"people":{"type":"object","description":"By `position` of the role (see `GET /templates/{id}`).","additionalProperties":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":["string","null"],"maxLength":120}}}}}}}}}}},"/account/reminders":{"get":{"tags":["Account"],"summary":"The automatic reminders of this account","security":[{"tokenDeApi":["cuenta.administrar"]}],"description":"Whoever has not signed yet gets a reminder by email, with the same link as the invitation, and each one is recorded in the document’s evidence record. Nobody gets one before it is their turn to sign, and an `approver` never gets one.\n\nIt is a setting of the ACCOUNT — the console’s *Account → Reminders* — and it applies to every workflow, whether it was sent from the console or from this API. `is_default: true` means the account never saved it: what you read are the defaults (off; 5, 2, 30 days; 48 hours). `can_change` says whether the person behind this token can change it.","responses":{"200":{"description":"The reminder settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recordatorios"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"put":{"tags":["Account"],"summary":"Change the automatic reminders of this account","security":[{"tokenDeApi":["cuenta.administrar"]}],"description":"The whole setting, every field required — the same as the console saves it: `enabled`, `first_reminder_days` (the first reminder goes that many days after someone’s turn starts), `every_days` (then one every that many days), `until_day` (until that day, or the deadline), and `notice_before_deadline_hours` (a notice that many hours before the deadline). Days go from 1 to 365 and `until_day` cannot come before `first_reminder_days`; the notice goes from 1 to 720 hours: otherwise 400, and nothing changes.\n\nThe person behind the token has to administer the account (403 otherwise). The change is recorded in the account activity. Returns the setting as it stayed.","responses":{"200":{"description":"The reminder settings, saved.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recordatorios"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["enabled","first_reminder_days","every_days","until_day","notice_before_deadline_hours"],"description":"The five values, all of them. The body `GET` returns also carries `is_default` and `can_change`: those two are output only and are refused here.","properties":{"enabled":{"type":"boolean"},"first_reminder_days":{"type":"integer"},"every_days":{"type":"integer"},"until_day":{"type":"integer"},"notice_before_deadline_hours":{"type":"integer"}}}}}}}},"/plan":{"get":{"tags":["Account"],"summary":"The plan of this account, and its usage","security":[{"tokenDeApi":["plan.leer"]}],"description":"The same as the console’s *Plan and usage*, for the account of the token: what the plan includes and what it does not, the quotas with what has been used this period, the basic capabilities that are `in_every_plan`, and — next to each line that is charged — the price that applies, from the price lists bound to the plan.\n\nIt only shows what the account itself sees: no margin and no cost, and nothing of other accounts, not even its own child accounts. The person behind the token has to be allowed to see billing (403 otherwise). Text is in English.","responses":{"200":{"description":"The resolved plan sheet.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanDeLaCuenta"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/signing-groups":{"get":{"tags":["Contacts"],"summary":"The account’s signing groups","security":[{"tokenDeApi":["contacto.administrar"]}],"description":"Groups that can hold a signer’s place (`occupant: group`): n of their m members sign for all of them. Same scope as the address book. Archived groups only with `archived=true`.","parameters":[{"name":"archived","in":"query","required":false,"schema":{"type":"string","enum":["true","false"]}}],"responses":{"200":{"description":"`signing_groups`: id, name, description, required, on_decline, member_count.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListaDeGruposDeFirma"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Contacts"],"summary":"Create a signing group","security":[{"tokenDeApi":["contacto.administrar"]}],"description":"`required` (n, 1 by default: the first member who signs covers all) cannot exceed the members. `on_decline`: `when_unreachable` (default: a member’s decline stops the place only when the group can no longer reach `required`) or `stop` (any decline stops the place). Up to 50 members, each email once. A document already sent keeps the list it had when it was sent.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","maxLength":120,"example":"Legal team"},"description":{"type":["string","null"],"maxLength":500},"required":{"type":"integer","minimum":1,"maximum":20},"on_decline":{"type":"string","enum":["stop","when_unreachable"]},"members":{"type":"array","maxItems":50,"items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":["string","null"]}}}}}}}}},"responses":{"201":{"description":"Created, with its members.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrupoDeFirma"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"`code: grupo_nombre_repetido` — another group has that name.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["grupo_nombre_repetido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"grupo_nombre_repetido":{"summary":"grupo_nombre_repetido","value":{"error":"There is already a group with that name in this account.","code":"grupo_nombre_repetido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/signing-groups/{id}":{"get":{"tags":["Contacts"],"summary":"A signing group, with its members","security":[{"tokenDeApi":["contacto.administrar"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrupoDeFirma"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"patch":{"tags":["Contacts"],"summary":"Change a signing group","security":[{"tokenDeApi":["contacto.administrar"]}],"description":"Only what you send changes; `members`, when sent, replaces the whole list. Documents already sent keep their frozen list.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrupoDeFirma"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"`code: grupo_archivado` — the group is archived. `code: grupo_nombre_repetido` — another group has that name.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["grupo_archivado","grupo_nombre_repetido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"grupo_archivado":{"summary":"grupo_archivado","value":{"error":"That group is archived.","code":"grupo_archivado"}},"grupo_nombre_repetido":{"summary":"grupo_nombre_repetido","value":{"error":"There is already a group with that name in this account.","code":"grupo_nombre_repetido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":120},"description":{"type":["string","null"],"maxLength":500},"required":{"type":"integer","minimum":1,"maximum":20},"on_decline":{"type":"string","enum":["stop","when_unreachable"]},"members":{"type":"array","maxItems":50,"items":{"type":"object","required":["email"],"properties":{"email":{"type":"string","format":"email"},"name":{"type":["string","null"]}}}}}}}}}},"delete":{"tags":["Contacts"],"summary":"Archive a signing group","security":[{"tokenDeApi":["contacto.administrar"]}],"description":"It is archived, not deleted: sent documents name it. An archived group cannot be put in a new place.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"`{ ok: true, archived: true }`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrupoArchivado"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/contacts":{"get":{"tags":["Contacts"],"summary":"The account’s address book","security":[{"tokenDeApi":["contacto.administrar"]}],"description":"People this account sends documents to, outside of its own organization. It grows on its own — `POST /workflows/{id}/signers` and the console both save or update a contact for every recipient they add — and you can also manage it from here. Paginated by cursor, ordered by email: pass `next_after` from one page as `after` to get the next one.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":120},"description":"Only contacts whose email or name starts with this (case-insensitive)."},{"name":"after","in":"query","required":false,"schema":{"type":"string"},"description":"The `next_after` of the previous page."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"A page of contacts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginaDeContactos"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Contacts"],"summary":"Add a contact, or update the one with that email","security":[{"tokenDeApi":["contacto.administrar"]}],"description":"If the address book has no contact with this email, it is created (201). If it already has one, that contact is updated instead of duplicated (200): only the fields you send change, and `null` clears one.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"properties":{"name":{"type":["string","null"]},"email":{"type":"string","format":"email"},"mobile":{"type":["string","null"],"description":"International format, e.g. +1 555 0100."},"language":{"type":["string","null"],"description":"e.g. \"en\", \"pt-BR\"."},"tag":{"type":["string","null"],"description":"A company name or a free-form label."}}}}}},"responses":{"200":{"description":"A contact with that email already existed, and was updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contacto"}}}},"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contacto"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/contacts/{id}":{"patch":{"tags":["Contacts"],"summary":"Edit a contact","security":[{"tokenDeApi":["contacto.administrar"]}],"description":"Only the fields you send are changed; send `null` on one to clear it (not `email`, which is required).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":["string","null"]},"email":{"type":"string","format":"email"},"mobile":{"type":["string","null"]},"language":{"type":["string","null"]},"tag":{"type":["string","null"]}}}}}},"responses":{"200":{"description":"Changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Contacto"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"Another contact in the address book already has that email: nothing changes (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."}},"required":["error"]}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"delete":{"tags":["Contacts"],"summary":"Remove a contact","security":[{"tokenDeApi":["contacto.administrar"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}":{"get":{"tags":["Workflows"],"summary":"One flow, with its signers and where each of them stands","security":[{"tokenDeApi":["documento.leer"]}],"description":"The documents come at the top: `document_id` is the first one — the only one, except in `copies` mode — and `document_list` has all of them (`id`, `number`, `status`), one per recipient in `copies` mode once it is dispatched. That `id` is what `GET /documents/{id}/file`, `/certificate`, `/evidence` and `/package` ask for: you do not need to go through the signers.\n\nEvery participant comes in `signers`, whatever their `role`. A participant `status` is where that person stands: `pending` (not notified yet — their turn has not come, or the notice failed), `notified`, `opened`, `signed`, `approved` (an `approver` approved, and `approved_at` says when: an approval is not a signature), `declined`, `delegated`, `not_required` (their step already had the signatures it asked for, or the flow was declined before them), `expired` and `cancelled`.\n\nEach signer carries `signing` (their own, or null when they follow the workflow) and `effective_signing` (the one that applies), and `access_code_set` (`true`/`false`): whether that participation has an access code — never the code itself, which is write-only (see `POST .../signers`). It also carries `may_download` and `may_print` (both `true` unless set otherwise): whether the signing page offers that recipient a Download button, and whether the completion email attaches the signed PDF to them. These control the PLATFORM, not the file: a PDF is not encrypted or permission-locked, and any reader that ignores permissions bypasses them.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The flow, its documents, its participants and their states.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DetalleDelFlujo"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"patch":{"tags":["Workflows"],"summary":"Configure the flow before dispatching it","security":[{"tokenDeApi":["circuito.editar"]}],"description":"Draft only. Fields: `title`, `mode`, `signature_level`, `validity_days`, `decline_policy`, `signing`, `verification_qr`, `verification_qr_placement`. What you do not send is not touched.\n\n`verification_qr` (`final_page`, `placed` or `none`) and `verification_qr_placement` (`{page, x, y, size}`, page 1 is the first, a square in PDF points from the bottom left corner) are the same two fields `GET` returns. The placement is checked against the uploaded PDF: the page has to exist, the square has to measure at least 60 points and fit the visible part of the page (400 otherwise), and it cannot cover text of the document — it goes on an opaque white square — (409 `qr_tapa_texto`, with `pagina`, the page, counted from 1). `placed` without a placement, when none was set before, puts it in the first free corner of the last page; if the pages are too small for 60 points it answers 409 without `code`. A placement sent with `final_page` or `none` is remembered for when you switch to `placed`.\n\n`signing` (`certificate`, `consent` or `either`) is how the signers sign unless one has their own (see adding a signer); a signer without their own follows this one, also when it changes later in the draft. If the account requires every document to be signed with each person’s own certificate (*Account → Policy defaults*, console only), `consent` answers 409 `limite_de_cuenta` naming the `firma_con` cell — a new document already starts from the account’s own defaults, so this only comes up when a draft asks for less than the account allows.\n\nIt does not need an `Idempotency-Key`: it is an update with the same values, so repeating it produces nothing different.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The flow, configured.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"It is not a draft any more (`code: documento_no_es_borrador`), the account requires each person’s own certificate and `signing` asks for `consent` (`code: limite_de_cuenta`), `signing` asks for `consent` and the plan does not include signing by consent (`code: mecanismo_sin_prestador`, `missing: plan`), the verification QR placement would cover text of the document (`code: qr_tapa_texto`; `pagina` says on which page), or it cannot leave `copies` mode because it already has recipients (no `code`), or it belongs to a dossier and `mode` asks for `copies` (`code: dosier_sin_copias`: a document of a dossier is not sent as copies). Nothing changes.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["documento_no_es_borrador","dosier_sin_copias","envio_en_copias_con_varios_destinatarios","limite_de_cuenta","mecanismo_sin_prestador","prestador_no_habilitado","qr_tapa_texto"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"envio_en_copias_con_varios_destinatarios":{"summary":"envio_en_copias_con_varios_destinatarios","value":{"error":"This send-out already has one copy per recipient. To have everyone sign on the same document, remove the recipients first, or upload the document again.","code":"envio_en_copias_con_varios_destinatarios"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"“…” is not enabled for documents under ….","code":"prestador_no_habilitado"}},"qr_tapa_texto":{"summary":"qr_tapa_texto","value":{"error":"The text varies; compare the `code`.","code":"qr_tapa_texto"}},"dosier_sin_copias":{"summary":"dosier_sin_copias","value":{"error":"A document that belongs to a dossier cannot be sent as copies to many people: send it one by one.","code":"dosier_sin_copias"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"The text varies; compare the `code`.","code":"mecanismo_sin_prestador"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":200,"minLength":1},"mode":{"type":"string","enum":["sequential","parallel","copies"]},"signature_level":{"type":"string","enum":["simple","advanced"]},"validity_days":{"type":["integer","null"],"minimum":1,"maximum":3650},"decline_policy":{"type":"string","enum":["blocking","continue"]},"signing":{"type":"string","enum":["certificate","consent","either"]},"verification_qr":{"type":"string","enum":["final_page","placed","none"]},"verification_qr_placement":{"type":"object","required":["page","x","y","size"],"properties":{"page":{"type":"integer","minimum":1,"maximum":5001},"x":{"type":"number","minimum":-20000,"maximum":20000},"y":{"type":"number","minimum":-20000,"maximum":20000},"size":{"type":"number","exclusiveMinimum":0,"maximum":20000}}}}}}}}},"delete":{"tags":["Workflows"],"summary":"Delete a draft that was never sent","security":[{"tokenDeApi":["circuito.editar"]}],"description":"For when you build a flow in several calls — upload, add people, dispatch — and one of them fails: delete the draft that was left half done instead of leaving it in the account. It removes the flow with its document, its people and its fields; the file goes too unless another document, a template or the library still uses it. The same thing the console does with *Delete* on a draft.\n\n**A flow that was sent is never deleted**: 409 `ya_enviado`. It does not matter whether anybody signed — once somebody was given access, its evidence record is proof of what happened. Cancel it instead (`POST /workflows/{id}/cancel`).\n\nIt is idempotent without an `Idempotency-Key`: a flow this token cannot see — because it was already deleted, never existed or belongs to another account — answers 204 all the same, without saying which. A retry from your queue does not get an error for something it already did. A template being set up in the console (*Templates → New template*) is not a document and is not deleted from here (409 `borrador_de_plantilla`). The person behind the token needs to be allowed to organise the folder the draft is in (409 `borrador_no_se_puede_borrar` otherwise).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deleted, or nothing to delete for this token. No body."},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"It was already sent (`code: ya_enviado`): it is never deleted, cancel it instead. Or it is a template being set up in the console (`code: borrador_de_plantilla`). Or the person behind the token cannot organise the folder it is in (`code: borrador_no_se_puede_borrar`, the same code whatever the reason). Nothing is deleted.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["ya_enviado","borrador_de_plantilla","borrador_no_se_puede_borrar"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"ya_enviado":{"summary":"ya_enviado","value":{"error":"This document was already sent: somebody was given access to it, and a sent document is never deleted. Cancel it instead.","code":"ya_enviado"}},"borrador_de_plantilla":{"summary":"borrador_de_plantilla","value":{"error":"This is a template being set up in the console, not a document: it is not deleted from here.","code":"borrador_de_plantilla"}},"borrador_no_se_puede_borrar":{"summary":"borrador_no_se_puede_borrar","value":{"error":"This draft cannot be deleted.","code":"borrador_no_se_puede_borrar"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/documents/{id}/file":{"get":{"tags":["Documents"],"summary":"The signed PDF","security":[{"tokenDeApi":["documento.leer"]}],"description":"By INSTANCE and not by flow: in `copias` mode there is one document per recipient, each with its own signatures. The document ids are in `document_list` of `GET /workflows/{id}` (and the first one in its `document_id`). When the flow is complete and this copy reached a lower PAdES level than its preservation policy asked for, the response says so in two headers: `X-Signature-Level-Notice` and `X-Signature-Level-Reason`. Without them, the copy reached what was asked (or the flow is not complete yet).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The PDF.","headers":{"X-Signature-Level-Notice":{"description":"Present only when this copy reached a lower PAdES level than the policy asked for, in words: «This copy reached level B-T, not B-LTA. Reason: …» (or «Reason not determined.»). Nothing from the certificate goes in it.","schema":{"type":"string"}},"X-Signature-Level-Reason":{"description":"Present with `X-Signature-Level-Notice`: why, as a closed code. `desconocida` = not determined. New values can be added: treat the ones you do not know as `desconocida`.","schema":{"type":"string","enum":["certificado_autofirmado","sin_revocacion_en_el_dss","servicio_de_revocacion_inalcanzable","certificado_revocado","sin_sello_de_firma","sin_sello_de_documento","sello_de_tiempo_sin_cadena","desconocida"]}}},"content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/documents/{id}/certificate":{"get":{"tags":["Documents"],"summary":"The completion report","security":[{"tokenDeApi":["evidencia.leer"]}],"description":"The deliverable: one page with who signed, when, with what, and the root hash of the evidence record. It exists only once the flow is `completo`, and it is issued once — the one you download today and the one you download in a year are the same file.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The completion report PDF.","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"description":"The request was refused; `code` says why.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["estructura_no_firmable"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"estructura_no_firmable":{"summary":"estructura_no_firmable","value":{"error":"This PDF cannot be signed exactly as it was uploaded: ….","code":"estructura_no_firmable"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"Not every signature is there yet: the completion report exists once the flow is `completed` (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["sello_de_la_organizacion_ilegible"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"sello_de_la_organizacion_ilegible":{"summary":"sello_de_la_organizacion_ilegible","value":{"error":"The text varies; compare the `code`.","code":"sello_de_la_organizacion_ilegible"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/documents/{id}/evidence":{"get":{"tags":["Evidence"],"summary":"The full evidence record, with the verdict on the chain","security":[{"tokenDeApi":["evidencia.leer"]}],"description":"Every fact around that document, chained by hash. Each entry in `events` carries an `order` (1, 2, 3…, gapless) and a `code` from the event vocabulary (see `GET /event-types`) — the two you index or de-duplicate by. `chain` says whether the chain closes: if it ever said it does not, the record stopped being proof and somebody has to go and look at it.\n\nAn `id` this token cannot see (another account's) and an `id` that does not exist get the same 404, with the same body as `GET /documents/{id}/certificate`: never an empty record with an intact chain.\n\nEach event's `data` is free-form JSON, different per event type, and mostly not a stable contract — except `certificate`, which a `firma.aplicada` event carries from 27-09-2026 on: `{subject, issuer, valid_from, valid_to, serial, self_signed, signature_algorithm, digest_algorithm, key_usage[], extended_key_usage[], policies[{oid, name}], qc_statements{compliance, sscd, type[]} | null, chain[{subject, valid_to}], trusted: true | false | null, trust_source, trust_evaluation}`. `name` on a policy is filled in for the eIDAS ones (QCP-n, QCP-l, QCP-n-qscd, QCP-l-qscd, QCP-w) and `null` for the rest — the `oid` is always there. `qc_statements` is what the certificate itself claims under RFC 3739 / ETSI EN 319 412-5 (`QcCompliance`, `QcSSCD`, `QcType`): it is not a legal qualification. `chain` lists the issuers above the leaf as far as they travelled inside the same file — this does not reach out over the network while signing. `trusted` is what this installation’s trust check answered when the signature was made: `true` when the chain ends in a trust anchor the operator loaded with a provider («Trusted by this installation» — never a qualification), `false` when that anchor was retired or not valid at that date, `null` when no source knew the chain. `trust_evaluation` (signatures from 04-10-2026 on) is that answer whole: `{verdict: trusted | not_trusted | unknown, source{connector, name, version_or_date}, service, status, qualified, reason, evaluated_at, anchor{sha256, subject}, provider{code, name}}`; `null` before. `trust_source` says it in words, or how far the chain got and points at `/validar`. A signature from before 27-09-2026 carries none of this: `key_usage`, `extended_key_usage`, `policies` and `chain` come back `null`, and so does `qc_statements` — an empty array on the first four, or `null` on `qc_statements`, on a newer signature means the certificate was checked and simply does not declare that.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The events and the verdict.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Expediente"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/documents/{id}/package":{"get":{"tags":["Documents"],"summary":"The delivery package: everything needed to archive it in another system","security":[{"tokenDeApi":["documento.leer","evidencia.leer"]}],"description":"One single call with the flow metadata, the evidence record with its chain verdict, and a MANIFEST of the files — URL, type, size and fingerprint — instead of the bytes: a PDF as base64 inside a JSON triples the size and cannot be streamed. Meant for packaging at the destination (E-ARK/METS/PREMIS, OAIS), which is where it belongs: a SIP is built against each archive own submission agreement.\n\n**It is a contract.** Stable: `schema`, the field names, `evidence.events[].order` (1, 2, 3…, gapless) and — above all — `evidence.events[].code`, which is what you map to a PREMIS eventType: that vocabulary is ADDED to, never renamed and never removed. Not stable: `description` (human text, changes with the language) and `data` (free jsonb, different per event type).\n\nIt requires both the document scope AND the evidence scope: combining them into one response does not widen what a token can see.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The package.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Paquete"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/documents":{"post":{"tags":["Documents"],"summary":"Upload a PDF and keep the flow in draft","security":[{"tokenDeApi":["documento.crear"]}],"description":"As `multipart/form-data`, not as JSON with base64: base64 inflates by 33% and forces the whole file into memory twice.\n\nForm fields: the file, `folder_id` (optional) and `title` (optional). **`folder_id` is optional here and required in the console**, and the difference is real: a person is standing in a folder when they upload, a program has nowhere to be standing. Without it the document goes to the account drafts folder.\n\nReturns the workflow id, the document id, the `sha256` and whether it was a duplicate. **It does not need an `Idempotency-Key`**: it deduplicates by content within the account, which works even when the client sends no key at all.\n\nThe draft starts from the account’s own policy defaults (*Account → Policy defaults*, console only), when it set one: its chosen preset, and its own retention ceiling in days if it set one — tighter than the plan’s, never looser. `PATCH .../{id}` still lets you change any of it before dispatching, within what the account allows.\n\n**Convert to PDF/A (Beta).** `convert` (`true`/`false`, sent BEFORE the file): where the installation has LibreOffice and Ghostscript, a Word, Excel, PowerPoint, OpenDocument or image file, or a PDF, enters as a clean PDF/A-2b copy that becomes the document to sign; the original is kept as evidence. A file that is not a PDF is only accepted to be converted. The account policy decides too: `always` converts even without `convert` (or with `false`), `never` answers 409 to `convert: true`. And the plan: converting is a plan feature, in two (`conversion_oficina` for a file that is not a PDF, `conversion_pdfa` for a PDF); without it, `convert: true` is a 403 `prestacion_no_incluida` naming the `feature`, and `always` behaves as `never`. Each conversion that works is counted (`conversions` in `GET /plan`), and the plan may cap them per month. A PDF with a fillable form or with signatures is not converted; one with automatic actions or launchers is a 400 `contenido_activo` and never reaches the conversion tool. The response then carries `conversion`: `status` (`converted` | `not_converted`), `requested_by` (`request` | `account_policy`), `profile`, `tool`, `version`, `from`, `original_sha256`, `lost` (what the copy left out: `non_printing_annotations`, `metadata`, `original_format`), or the `reason` it was not converted (`form`, `signed`, `active_content`, `active_content_unreadable`, `not_available`, `timeout`, `tool_failed`, `invalid_output`) and a `notice`. When the installation has DSS-FS set up, a converted copy also carries `verification` (veraPDF, through DSS-FS): `status` (`conforming` | `not_conforming` | `not_declared` | `not_analyzed` | `error`), `declared` (the PDF/A level the copy declares), `passes` (true only for a conforming PDF/A-2 copy), `failures_total`, `first_failures` and `reason`; it informs and never blocks, and it is absent when DSS-FS is not set up. A PDF whose conversion fails enters as it is; a non-PDF that cannot be converted is a 400 with `code: conversion_fallida` and its `reason`.","responses":{"200":{"description":"The document and the draft flow.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentoSubido"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`. A PDF with automatic actions — JavaScript that runs by itself (on open, document-level, or an additional action other than a form field’s calculation) or an action that opens files or sends data (`Launch`, `SubmitForm`, `ImportData`, `GoToR`, `GoToE`, `RichMedia`) — is refused with `code: contenido_activo` and `detail`: one entry per action, with `action`, `where` (`on_open`, `document`, `page`, `annotation`, `field`, `bookmark`) and, when known, `page` and `name`. Upload one without them; it is not rewritten for you. Attachments, XFA, links to websites and form calculations are not refused. Nothing is created.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one (`contenido_activo`). Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["enlace_no_publico","enlace_es_pagina","roles_y_destinatarios","pasos_en_copias","por_asignar_en_copias","por_asignar_solo_firmantes","por_asignar_con_persona","bloqueo_no_aplica","sin_valores","demasiados_valores","filas_invalidas","paso_sin_lugar"]},"detail":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"where":{"type":"string","enum":["on_open","document","page","annotation","field","bookmark"]},"page":{"type":"integer"},"name":{"type":"string"}},"required":["action","where"]}}},"required":["error"]},"examples":{"enlace_no_publico":{"summary":"enlace_no_publico","value":{"error":"The text varies; compare the `code`.","code":"enlace_no_publico"}},"enlace_es_pagina":{"summary":"enlace_es_pagina","value":{"error":"The text varies; compare the `code`.","code":"enlace_es_pagina"}},"roles_y_destinatarios":{"summary":"roles_y_destinatarios","value":{"error":"Use `roles` for a signing order, or `recipients` for one copy each: not both.","code":"roles_y_destinatarios"}},"pasos_en_copias":{"summary":"pasos_en_copias","value":{"error":"Steps (quorum) do not apply to separate copies: each copy has one signer.","code":"pasos_en_copias"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"This document has places to be assigned later, and in a separate-copies send-out each recipient is a row of the list. Name those people, or remove the places, and try again.","code":"por_asignar_en_copias"}},"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"bloqueo_no_aplica":{"summary":"bloqueo_no_aplica","value":{"error":"“…” cannot be locked for the signer: it is filled in by the sender or by the platform, so the signer never types it.","code":"bloqueo_no_aplica"}},"sin_valores":{"summary":"sin_valores","value":{"error":"Send at least one value, as {\"field_code\": \"value\"}.","code":"sin_valores"}},"demasiados_valores":{"summary":"demasiados_valores","value":{"error":"That is too many values for one call (200 maximum).","code":"demasiados_valores"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"paso_sin_lugar":{"summary":"paso_sin_lugar","value":{"error":"Step … names signer position …, and the workflow has no signer there.","code":"paso_sin_lugar"}}}}}},"402":{"description":"The plan keeps a limited number of documents (or megabytes) and this one does not fit (`code: custodia_llena`; `limit` is `documents` or `megabytes`, with its `cap` and what is `used`). Nothing already stored is removed and nothing is created. Or the plan caps the conversions to PDF/A of the month and that cap is reached (`code: tope_de_conversiones`, `limit: conversion`, with its `cap` and what is `used`): nothing is uploaded."},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`. And `convert` (or an account that always converts a file that is not a PDF) where the plan does not include that conversion is a 403 with `code: prestacion_no_incluida` and `feature`: `conversion_oficina` (Word, Excel, PowerPoint, OpenDocument or an image into a PDF) or `conversion_pdfa` (a PDF normalised to PDF/A). Nothing is uploaded.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","prestacion_no_incluida","medio_fuera_de_la_politica_de_la_cuenta","consentimiento_no_incluido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."},"feature":{"type":"string","enum":["conversion_oficina","conversion_pdfa"],"description":"With `prestacion_no_incluida`: the plan feature that is missing."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"consentimiento_no_incluido":{"summary":"consentimiento_no_incluido","value":{"error":"The text varies; compare the `code`.","code":"consentimiento_no_incluido"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}},"prestacion_no_incluida":{"summary":"prestacion_no_incluida","value":{"error":"The text varies; compare the `code`.","code":"prestacion_no_incluida"}}}}}},"409":{"description":"The account’s policy defaults start documents with a preset that signs by consent and its plan no longer includes signing by consent (`code: mecanismo_sin_prestador`, `missing: plan`, and `preset` names it): change the defaults in the console, Account → Signing. Nothing is created. Or `convert: true` in an account whose policy never converts (`code: conversion_apagada_por_la_cuenta`, Beta).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["mecanismo_sin_prestador","prestador_no_habilitado","conversion_apagada_por_la_cuenta"]}},"required":["error"]},"examples":{"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"The text varies; compare the `code`.","code":"mecanismo_sin_prestador"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"The text varies; compare the `code`.","code":"prestador_no_habilitado"}},"conversion_apagada_por_la_cuenta":{"summary":"conversion_apagada_por_la_cuenta","value":{"error":"The text varies; compare the `code`.","code":"conversion_apagada_por_la_cuenta"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary"},"folder_id":{"type":"string","format":"uuid"},"title":{"type":"string","maxLength":200},"convert":{"type":"string","enum":["true","false"],"description":"Convert to PDF/A on the way in. A multipart field, so the text `true` or `false`."}}}}}}}},"/documents/seal":{"post":{"tags":["Documents"],"summary":"Seal a document without anyone signing it","security":[{"tokenDeApi":["documento.crear"]}],"description":"A trusted time on a file, and nothing else: `multipart/form-data` with the file in `file` and, optionally, `folder_id` and `title`. The document is born CLOSED — that is why it has its own route and not an option of `POST /documents` — and the seal says the file existed at that time, never that somebody signed it. The time is the one a timestamp authority states, not ours (`sealed_at`, `authority`, `qualified`). It counts like any other timestamp in the plan.\n\nOnly PDF. A PDF that already carries signatures or timestamps is accepted and not rewritten: the timestamp is added as an increment. `original_sha256` is the hash of the file you sent, before the seal, and `scope` says what the seal proves.\n\n**A retry seals again.** There is no `Idempotency-Key`: each call is a new seal, a new document, and each one is counted. Retry only when the call failed.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"folder_id":{"type":"string","format":"uuid"},"title":{"type":"string"}},"required":["file"]}}}},"responses":{"200":{"description":"`workflow_id`, `document_id`, `title`, `sealed_at`, `authority`, `qualified`, `bytes`, `original_sha256` and `scope`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelloSuelto"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`. A PDF with automatic actions — JavaScript that runs by itself (on open, document-level, or an additional action other than a form field’s calculation) or an action that opens files or sends data (`Launch`, `SubmitForm`, `ImportData`, `GoToR`, `GoToE`, `RichMedia`) — is refused with `code: contenido_activo` and `detail`: one entry per action, with `action`, `where` (`on_open`, `document`, `page`, `annotation`, `field`, `bookmark`) and, when known, `page` and `name`. Upload one without them; it is not rewritten for you. Attachments, XFA, links to websites and form calculations are not refused. Nothing is created.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one (`contenido_activo`). Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["enlace_no_publico","enlace_es_pagina","roles_y_destinatarios","pasos_en_copias","por_asignar_en_copias","por_asignar_solo_firmantes","por_asignar_con_persona","bloqueo_no_aplica","sin_valores","demasiados_valores","filas_invalidas","paso_sin_lugar"]},"detail":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"where":{"type":"string","enum":["on_open","document","page","annotation","field","bookmark"]},"page":{"type":"integer"},"name":{"type":"string"}},"required":["action","where"]}}},"required":["error"]},"examples":{"enlace_no_publico":{"summary":"enlace_no_publico","value":{"error":"The text varies; compare the `code`.","code":"enlace_no_publico"}},"enlace_es_pagina":{"summary":"enlace_es_pagina","value":{"error":"The text varies; compare the `code`.","code":"enlace_es_pagina"}},"roles_y_destinatarios":{"summary":"roles_y_destinatarios","value":{"error":"Use `roles` for a signing order, or `recipients` for one copy each: not both.","code":"roles_y_destinatarios"}},"pasos_en_copias":{"summary":"pasos_en_copias","value":{"error":"Steps (quorum) do not apply to separate copies: each copy has one signer.","code":"pasos_en_copias"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"This document has places to be assigned later, and in a separate-copies send-out each recipient is a row of the list. Name those people, or remove the places, and try again.","code":"por_asignar_en_copias"}},"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"bloqueo_no_aplica":{"summary":"bloqueo_no_aplica","value":{"error":"“…” cannot be locked for the signer: it is filled in by the sender or by the platform, so the signer never types it.","code":"bloqueo_no_aplica"}},"sin_valores":{"summary":"sin_valores","value":{"error":"Send at least one value, as {\"field_code\": \"value\"}.","code":"sin_valores"}},"demasiados_valores":{"summary":"demasiados_valores","value":{"error":"That is too many values for one call (200 maximum).","code":"demasiados_valores"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"paso_sin_lugar":{"summary":"paso_sin_lugar","value":{"error":"Step … names signer position …, and the workflow has no signer there.","code":"paso_sin_lugar"}}}}}},"402":{"description":"The plan’s storage is full (`code: custodia_llena`)."},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"Nothing was sealed: the account’s policy does not allow it (`conversion_apagada_por_la_cuenta`, `limite_de_cuenta`, `mecanismo_sin_prestador`), or the PDF cannot take it (`qr_tapa_texto`, `documento_no_es_borrador`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["conversion_apagada_por_la_cuenta","documento_no_es_borrador","envio_en_copias_con_varios_destinatarios","limite_de_cuenta","mecanismo_sin_prestador","prestador_no_habilitado","qr_tapa_texto"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"envio_en_copias_con_varios_destinatarios":{"summary":"envio_en_copias_con_varios_destinatarios","value":{"error":"This send-out already has one copy per recipient. To have everyone sign on the same document, remove the recipients first, or upload the document again.","code":"envio_en_copias_con_varios_destinatarios"}},"conversion_apagada_por_la_cuenta":{"summary":"conversion_apagada_por_la_cuenta","value":{"error":"The text varies; compare the `code`.","code":"conversion_apagada_por_la_cuenta"}},"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"The text varies; compare the `code`.","code":"documento_no_es_borrador"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"The text varies; compare the `code`.","code":"limite_de_cuenta"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"The text varies; compare the `code`.","code":"mecanismo_sin_prestador"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"The text varies; compare the `code`.","code":"prestador_no_habilitado"}},"qr_tapa_texto":{"summary":"qr_tapa_texto","value":{"error":"The text varies; compare the `code`.","code":"qr_tapa_texto"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/documents/sign-myself":{"post":{"tags":["Documents"],"summary":"Upload a PDF and sign it yourself, without inviting anyone","security":[{"tokenDeApi":["documento.crear","circuito.enviar"]}],"description":"A one-person flow where the only participant is whoever owns the token (their email and name come from the token, never from the request). `multipart/form-data`: `file`, `signing` (`certificate`, `consent` or `either`) and, optionally, `folder_id`, `title`, `provider`, `verification_qr` (`final_page` or `none`) and `convert`. It is dispatched at once and the answer carries `url`, the signing link of that person.\n\n**The link is a credential**: it can sign as that person. That is why it asks for `circuito.enviar` as well as `documento.crear`, and why the answer is never cached.\n\n**The evidence says it came through the API**: the record of the link (`enlace.obtenido_por_el_emisor`) is marked with the `api` channel and carries the **id** of the token (never its value) and its owner, and the signature record repeats it (`enlace_entregado_por_api`). It is noted, not restricted.","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"},"signing":{"type":"string","enum":["certificate","consent","either"]},"folder_id":{"type":"string","format":"uuid"},"title":{"type":"string"},"provider":{"type":"string"},"verification_qr":{"type":"string","enum":["final_page","none"]},"convert":{"type":"string","enum":["true","false"]}},"required":["file","signing"]}}}},"responses":{"200":{"description":"`workflow_id`, `signer_id`, `url` (and `conversion` when it applies).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmaPropia"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`. A PDF with automatic actions — JavaScript that runs by itself (on open, document-level, or an additional action other than a form field’s calculation) or an action that opens files or sends data (`Launch`, `SubmitForm`, `ImportData`, `GoToR`, `GoToE`, `RichMedia`) — is refused with `code: contenido_activo` and `detail`: one entry per action, with `action`, `where` (`on_open`, `document`, `page`, `annotation`, `field`, `bookmark`) and, when known, `page` and `name`. Upload one without them; it is not rewritten for you. Attachments, XFA, links to websites and form calculations are not refused. Nothing is created.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one (`contenido_activo`). Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["enlace_no_publico","enlace_es_pagina","roles_y_destinatarios","pasos_en_copias","por_asignar_en_copias","por_asignar_solo_firmantes","por_asignar_con_persona","bloqueo_no_aplica","sin_valores","demasiados_valores","filas_invalidas","paso_sin_lugar"]},"detail":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"where":{"type":"string","enum":["on_open","document","page","annotation","field","bookmark"]},"page":{"type":"integer"},"name":{"type":"string"}},"required":["action","where"]}}},"required":["error"]},"examples":{"enlace_no_publico":{"summary":"enlace_no_publico","value":{"error":"The text varies; compare the `code`.","code":"enlace_no_publico"}},"enlace_es_pagina":{"summary":"enlace_es_pagina","value":{"error":"The text varies; compare the `code`.","code":"enlace_es_pagina"}},"roles_y_destinatarios":{"summary":"roles_y_destinatarios","value":{"error":"Use `roles` for a signing order, or `recipients` for one copy each: not both.","code":"roles_y_destinatarios"}},"pasos_en_copias":{"summary":"pasos_en_copias","value":{"error":"Steps (quorum) do not apply to separate copies: each copy has one signer.","code":"pasos_en_copias"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"This document has places to be assigned later, and in a separate-copies send-out each recipient is a row of the list. Name those people, or remove the places, and try again.","code":"por_asignar_en_copias"}},"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"bloqueo_no_aplica":{"summary":"bloqueo_no_aplica","value":{"error":"“…” cannot be locked for the signer: it is filled in by the sender or by the platform, so the signer never types it.","code":"bloqueo_no_aplica"}},"sin_valores":{"summary":"sin_valores","value":{"error":"Send at least one value, as {\"field_code\": \"value\"}.","code":"sin_valores"}},"demasiados_valores":{"summary":"demasiados_valores","value":{"error":"That is too many values for one call (200 maximum).","code":"demasiados_valores"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"paso_sin_lugar":{"summary":"paso_sin_lugar","value":{"error":"Step … names signer position …, and the workflow has no signer there.","code":"paso_sin_lugar"}}}}}},"402":{"description":"The request was refused; `code` says why.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["cuota_del_mes"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"cuota_del_mes":{"summary":"cuota_del_mes","value":{"error":"Your plan sends up to … document… each month, and … … gone out in …. The count starts again on …. Nothing already sent is touched; ask the platform for a plan or a size that sends more.","code":"cuota_del_mes"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`. And `convert` (or an account that always converts a file that is not a PDF) where the plan does not include that conversion is a 403 with `code: prestacion_no_incluida` and `feature`: `conversion_oficina` (Word, Excel, PowerPoint, OpenDocument or an image into a PDF) or `conversion_pdfa` (a PDF normalised to PDF/A). Nothing is uploaded.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","prestacion_no_incluida","medio_fuera_de_la_politica_de_la_cuenta","consentimiento_no_incluido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."},"feature":{"type":"string","enum":["conversion_oficina","conversion_pdfa"],"description":"With `prestacion_no_incluida`: the plan feature that is missing."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"consentimiento_no_incluido":{"summary":"consentimiento_no_incluido","value":{"error":"The text varies; compare the `code`.","code":"consentimiento_no_incluido"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}},"prestacion_no_incluida":{"summary":"prestacion_no_incluida","value":{"error":"The text varies; compare the `code`.","code":"prestacion_no_incluida"}}}}}},"409":{"description":"The account’s policy does not allow signing that way (`mecanismo_sin_prestador`, `limite_de_cuenta`, `nivel_sin_verificacion`), or the document cannot be dispatched as it is (the dispatch refusals: `primer_turno_sin_persona`, `aprueba_y_firma`, `qr_tapa_texto`, `qr_fuera_de_la_pagina`, and the group-place refusals `grupo_no_alcanza`, `miembro_con_lugar_propio`, `miembro_en_dos_lugares`…).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["aprobador_despues_de_firmante","aprueba_y_firma","borrador_de_plantilla","conversion_apagada_por_la_cuenta","documento_de_un_dosier","documento_no_es_borrador","grupo_no_alcanza","limite_de_cuenta","lugar_reasignado","mecanismo_sin_prestador","prestador_no_habilitado","miembro_con_lugar_propio","miembro_en_dos_lugares","nivel_sin_verificacion","primer_turno_sin_persona","qr_fuera_de_la_pagina","qr_tapa_texto","envio_en_copias_con_varios_destinatarios"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"“…” is not enabled for documents under ….","code":"prestador_no_habilitado"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"The text varies; compare the `code`.","code":"mecanismo_sin_prestador"}},"envio_en_copias_con_varios_destinatarios":{"summary":"envio_en_copias_con_varios_destinatarios","value":{"error":"This send-out already has one copy per recipient. To have everyone sign on the same document, remove the recipients first, or upload the document again.","code":"envio_en_copias_con_varios_destinatarios"}},"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"aprueba_y_firma":{"summary":"aprueba_y_firma","value":{"error":"The text varies; compare the `code`.","code":"aprueba_y_firma"}},"lugar_reasignado":{"summary":"lugar_reasignado","value":{"error":"That person was replaced in this place: there is no signing link to give.","code":"lugar_reasignado"}},"aprobador_despues_de_firmante":{"summary":"aprobador_despues_de_firmante","value":{"error":"The text varies; compare the `code`.","code":"aprobador_despues_de_firmante"}},"borrador_de_plantilla":{"summary":"borrador_de_plantilla","value":{"error":"The text varies; compare the `code`.","code":"borrador_de_plantilla"}},"conversion_apagada_por_la_cuenta":{"summary":"conversion_apagada_por_la_cuenta","value":{"error":"The text varies; compare the `code`.","code":"conversion_apagada_por_la_cuenta"}},"documento_de_un_dosier":{"summary":"documento_de_un_dosier","value":{"error":"The text varies; compare the `code`.","code":"documento_de_un_dosier"}},"grupo_no_alcanza":{"summary":"grupo_no_alcanza","value":{"error":"The text varies; compare the `code`.","code":"grupo_no_alcanza"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"The text varies; compare the `code`.","code":"limite_de_cuenta"}},"miembro_con_lugar_propio":{"summary":"miembro_con_lugar_propio","value":{"error":"The text varies; compare the `code`.","code":"miembro_con_lugar_propio"}},"miembro_en_dos_lugares":{"summary":"miembro_en_dos_lugares","value":{"error":"The text varies; compare the `code`.","code":"miembro_en_dos_lugares"}},"nivel_sin_verificacion":{"summary":"nivel_sin_verificacion","value":{"error":"The text varies; compare the `code`.","code":"nivel_sin_verificacion"}},"primer_turno_sin_persona":{"summary":"primer_turno_sin_persona","value":{"error":"The text varies; compare the `code`.","code":"primer_turno_sin_persona"}},"qr_fuera_de_la_pagina":{"summary":"qr_fuera_de_la_pagina","value":{"error":"The text varies; compare the `code`.","code":"qr_fuera_de_la_pagina"}},"qr_tapa_texto":{"summary":"qr_tapa_texto","value":{"error":"The text varies; compare the `code`.","code":"qr_tapa_texto"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/documents/from-url":{"post":{"tags":["Documents"],"summary":"Bring the document from where it already lives","security":[{"tokenDeApi":["documento.crear"]}],"description":"Instead of uploading bytes, hand over a URL and the platform fetches it: a SharePoint or OneDrive item, a Google Drive file, a document manager of your own — anything that can serve a PDF over HTTPS. You get back the same thing an upload gives you: a workflow in draft.\n\nFields: `url` (required), `title`, `folder_id`, and `authorization` — whatever the source needs to hand the file over, for example a Microsoft Graph bearer token. `convert` (boolean, Beta): convert to PDF/A on the way in, exactly as in `POST /documents`.\n\n**The credential is borrowed, not kept.** It is used for this one download and never stored, logged or returned.\n\nRedirects are followed up to three times and **every hop is checked**, so the URL cannot be used to reach anything private. The file is capped at 30 MB while it is being read, not by trusting the `content-length` the other server sends.\n\nSend `Idempotency-Key`: without it, a retry from your queue creates the workflow twice.","responses":{"200":{"description":"The workflow, in draft, with the document in it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentoSubido"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`. A PDF with automatic actions — JavaScript that runs by itself (on open, document-level, or an additional action other than a form field’s calculation) or an action that opens files or sends data (`Launch`, `SubmitForm`, `ImportData`, `GoToR`, `GoToE`, `RichMedia`) — is refused with `code: contenido_activo` and `detail`: one entry per action, with `action`, `where` (`on_open`, `document`, `page`, `annotation`, `field`, `bookmark`) and, when known, `page` and `name`. Upload one without them; it is not rewritten for you. Attachments, XFA, links to websites and form calculations are not refused. Nothing is created.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one (`contenido_activo`). Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["enlace_no_publico","enlace_es_pagina","roles_y_destinatarios","pasos_en_copias","por_asignar_en_copias","por_asignar_solo_firmantes","por_asignar_con_persona","bloqueo_no_aplica","sin_valores","demasiados_valores","filas_invalidas","paso_sin_lugar"]},"detail":{"type":"array","items":{"type":"object","properties":{"action":{"type":"string"},"where":{"type":"string","enum":["on_open","document","page","annotation","field","bookmark"]},"page":{"type":"integer"},"name":{"type":"string"}},"required":["action","where"]}}},"required":["error"]},"examples":{"enlace_no_publico":{"summary":"enlace_no_publico","value":{"error":"The text varies; compare the `code`.","code":"enlace_no_publico"}},"enlace_es_pagina":{"summary":"enlace_es_pagina","value":{"error":"The text varies; compare the `code`.","code":"enlace_es_pagina"}},"roles_y_destinatarios":{"summary":"roles_y_destinatarios","value":{"error":"Use `roles` for a signing order, or `recipients` for one copy each: not both.","code":"roles_y_destinatarios"}},"pasos_en_copias":{"summary":"pasos_en_copias","value":{"error":"Steps (quorum) do not apply to separate copies: each copy has one signer.","code":"pasos_en_copias"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"This document has places to be assigned later, and in a separate-copies send-out each recipient is a row of the list. Name those people, or remove the places, and try again.","code":"por_asignar_en_copias"}},"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"bloqueo_no_aplica":{"summary":"bloqueo_no_aplica","value":{"error":"“…” cannot be locked for the signer: it is filled in by the sender or by the platform, so the signer never types it.","code":"bloqueo_no_aplica"}},"sin_valores":{"summary":"sin_valores","value":{"error":"Send at least one value, as {\"field_code\": \"value\"}.","code":"sin_valores"}},"demasiados_valores":{"summary":"demasiados_valores","value":{"error":"That is too many values for one call (200 maximum).","code":"demasiados_valores"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"paso_sin_lugar":{"summary":"paso_sin_lugar","value":{"error":"Step … names signer position …, and the workflow has no signer there.","code":"paso_sin_lugar"}}}}}},"402":{"description":"The same as in `POST /documents`: the plan’s storage is full (`code: custodia_llena`), or its cap of conversions to PDF/A this month is reached (`code: tope_de_conversiones`)."},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`. And `convert` (or an account that always converts a file that is not a PDF) where the plan does not include that conversion is a 403 with `code: prestacion_no_incluida` and `feature`: `conversion_oficina` (Word, Excel, PowerPoint, OpenDocument or an image into a PDF) or `conversion_pdfa` (a PDF normalised to PDF/A). Nothing is uploaded.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","prestacion_no_incluida","medio_fuera_de_la_politica_de_la_cuenta","consentimiento_no_incluido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."},"feature":{"type":"string","enum":["conversion_oficina","conversion_pdfa"],"description":"With `prestacion_no_incluida`: the plan feature that is missing."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"consentimiento_no_incluido":{"summary":"consentimiento_no_incluido","value":{"error":"The text varies; compare the `code`.","code":"consentimiento_no_incluido"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}},"prestacion_no_incluida":{"summary":"prestacion_no_incluida","value":{"error":"The text varies; compare the `code`.","code":"prestacion_no_incluida"}}}}}},"409":{"description":"With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`). Or the account’s policy defaults sign by consent and its plan no longer includes it (`code: mecanismo_sin_prestador`, `missing: plan`). Or `convert: true` where the account never converts (`code: conversion_apagada_por_la_cuenta`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["mecanismo_sin_prestador","prestador_no_habilitado","conversion_apagada_por_la_cuenta"]}},"required":["error"]},"examples":{"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"The text varies; compare the `code`.","code":"mecanismo_sin_prestador"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"The text varies; compare the `code`.","code":"prestador_no_habilitado"}},"conversion_apagada_por_la_cuenta":{"summary":"conversion_apagada_por_la_cuenta","value":{"error":"The text varies; compare the `code`.","code":"conversion_apagada_por_la_cuenta"}}}}}},"413":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}},"502":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri"},"title":{"type":"string","maxLength":200},"folder_id":{"type":"string","format":"uuid"},"authorization":{"type":"string","maxLength":4096,"description":"Sent to the source for this download only; never stored."},"convert":{"type":"boolean"}}}}}},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}]}},"/workflows/{id}/signers":{"post":{"tags":["Workflows"],"summary":"Add somebody to the flow","security":[{"tokenDeApi":["circuito.editar"]}],"description":"Draft only. Fields: `email` (required), `name`, `role` (`signer`/`reviewer`/`cc`/`approver`), `order`, `minimum_assurance`, `capacity`, `signing`, `access_code`, `may_download`, `may_print`.\n\n`order` is the turn. In `sequential` mode a signer added without `order` takes the next free turn (right after the last signer or approver already in the flow), so signers added one by one sign in the order they were added: 1, 2, 3… In `parallel` mode every signer without `order` shares one turn. Somebody whose turn has not come yet cannot sign, nor start the signature with a provider: the signing page answers 409 (`no_es_su_turno`), and the first attempt is recorded as `firma.fuera_de_turno`.\n\nIn `copies` mode every recipient gets a document of their own and is its only signer, so `order` does not apply there: it is stored as 1, and every copy is sent when the flow is dispatched.\n\nA `reviewer` WITHOUT `order` has no turn: they are invited when the flow is dispatched. A `reviewer` WITH `order` has that turn: they are invited when it arrives, together with the signers of that step, and the step does not wait for them nor count them (behaviour change: before, `order` meant nothing for a reviewer; to keep the old behaviour, do not send it). When the same person is also a signer (or an approver) in the same turn (or at dispatch), they get ONE invitation that says both roles, with the link that lets them sign (or approve), which also lets them review — and never a second one for the reviewer role. A `copy` ignores `order` (it is always sent on completion).\n\n`approver` approves the document without signing it, **before anyone signs**: nobody can sign until every approver has approved, and an approver who declines ends the flow as `declined`, whatever `decline_policy` says. Approving adds nothing to the PDF. Without `order`, an approver goes ahead of every signer on its own (the signers move one turn back, in their order), and a signer goes after the last approver (see `order` above), whichever you add first; with an explicit `order` that puts an approver in a signer’s turn or after it, the dispatch answers 409 (`aprobador_despues_de_firmante`) naming them. The same person cannot approve and sign the same flow: adding them in the other role answers 409 (`aprueba_y_firma`). Not available in `copies` mode. Reading the flow, an approver has `role: approver`, `status: approved` once they approved, and `approved_at`; the webhook event is `participacion.aprobada`.\n\n`signing` (`certificate`, `consent` or `either`) is how THIS signer signs. When it is missing or null, the signer follows the workflow `signing` (by default `either`), also if that changes later in the draft. `certificate`: only with their own personal certificate, through a signature provider; signing by consent is refused (403), and the flow is not dispatched (409 `mecanismo_sin_prestador`, see dispatch) while this account cannot offer them a signature provider under the flow country. `consent`: the Platform seal signs on their behalf, and their own certificate is refused. `either`: they choose, even if the workflow asks for one. Signers only, and it cannot change once the flow is dispatched. **It does not prove the person has a certificate**, only that without one they do not sign; and it does not change `signature_level`. Reading the workflow, each signer carries `signing` (null when they follow the workflow) and `effective_signing`, the one that applies.\n\n`minimum_assurance` (`low`, `substantial` or `high`; `low` when omitted) is the identity level this signer has to prove before signing. Opening the emailed link proves `low`; a higher level needs a verification with an identity provider. Below it, the signature is refused and the signing page offers the verification; and the flow is not dispatched (409 `nivel_sin_verificacion`) while this account cannot offer one. It cannot change once the flow is dispatched. **It is not tied to a person:** whoever holds the signing link meets it by proving their own identity at that level.\n\n`access_code` (optional, 4 to 12 characters, no leading or trailing space) is a second factor for OPENING the document: the signing link is not enough on its own, and the page asks for this code before it shows anything. **It is write-only:** reading the flow returns `access_code_set` (`true`/`false`) on that signer, never the code. It never travels in an email — you tell it to the recipient another way (phone, in person). Five wrong tries lock that signer’s link; set a new code with `POST .../signers/{signerId}/access-code/reset`, also after dispatch. It is an access factor, not proof of identity: it does not change `minimum_assurance` or what the signer proves.\n\n`may_download` and `may_print` (both `true` when omitted, which is today’s behaviour: the signed PDF reaches every signer by email once the flow completes) control what THIS platform does: without `may_download`, the signing page does not offer a Download button and `GET .../documents/{id}/file`-style access to that copy is refused; without `may_print`, the signing page hides printing and the completion email does not attach the PDF to this recipient — they get a link to view it instead. Neither field touches the PDF itself: it carries no permission lock, and a reader that ignores one would print or save it all the same. **They also do not change what the signer already downloaded through another channel.**\n\n`identification` (optional, a list of `email_code`, `password`, `oidc`, `wallet`, `local_token` and `provider`) fixes the ways THIS person may prove who they are. Omitted or `null`, it follows the workflow and then the account; with nothing set anywhere, any way that reaches `minimum_assurance` counts. A value outside the list is a 400. The account policy is a FLOOR: per person you can only narrow it down; a method the account does not allow is refused with 403 `medio_fuera_de_la_politica_de_la_cuenta` unless the token’s user can administer the account, and is never cut down in silence. Reading the flow, each signer carries `identification` (what was set) and `effective_identification` (the one that applies). **The wallet identifies; it does not replace a document proof:** when the invitation asks for a document, the wallet counts only if the identifier it presents is that document’s. It cannot change once the flow is dispatched.\n\nTo change `signing`, `minimum_assurance`, `identification`, `access_code`, `may_download` or `may_print` of somebody already added, while the flow is a draft: `PATCH .../signers/{signerId}`.\n\n**To be assigned later** (`occupant: unassigned`, no `email`, no `name`): reserves a signer’s place with nobody in it yet, optionally named by `role_name` (for example `The customer`). Its fields and signature boxes are set as for anybody else. Name the person later with `PUT .../roles/{position}`, before or after dispatch. Signers only (400 `por_asignar_solo_firmantes`), and not in `copies` mode (400 `por_asignar_en_copias`). A flow with empty places can be dispatched, except when its FIRST turn has nobody named (409 `primer_turno_sin_persona`). When the turn reaches an empty place, the flow waits there — nobody is skipped — and records `lugar.espera_asignacion` (also as a webhook, so your system can answer with the PUT). Reading the flow, each signer carries `occupant` (`person` or `unassigned`) and `role_name`; an unassigned place has `identity_id`, `name` and `email` null.\n\n**A group** (`occupant: group`, `group_id`, no `email`, no `name`; encargo 165): a group of your account (`/signing-groups`) holds the place. `group_required` (n, default the group’s) of its members must sign — with n > 1 the place has n seats, each with its own signature box (`seats` in the answer) — and `group_on_decline` says what a member’s decline does: `when_unreachable` (default, the group’s own rule: the place is declined only when not enough members are left to reach `group_required`) or `stop` (the place is declined, and the flow’s decline policy applies). The member list is frozen at dispatch (`grupo.congelado`, with a SHA-256 of the list); each member gets their own link. Each signature is the PERSON’s; `grupo.firmo_por_todos` and the completion report say it was for the group. Once the place is signed, the other members keep read access and lose signing. A person holds one place per document: a member already in the flow under their own name, or in another group of it, makes the dispatch answer 409 `miembro_con_lugar_propio` / `miembro_en_dos_lugares`. Not in `copies` mode (400 `grupo_en_copias`) and without an access code (400 `grupo_sin_codigo_de_acceso`). Reading the flow, a group place carries `group_name`, `group_required`, `group_on_decline`, `members` (with each one’s `status`) and, once signed, `signed_by`.\n\n**Send an `Idempotency-Key`.** Adding twice looks harmless and is not: the same address repeated is a duplicated signer in the order, and the flow asks the same person to sign twice.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"responses":{"200":{"description":"The participation that was created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FirmanteAgregado"}}}},"400":{"description":"The request was refused; `code` says why.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"Nobody is added. `code: documento_no_es_borrador` — it was already dispatched. `code: aprueba_y_firma` — that person already takes part in the other role (approving and signing the same flow is not allowed). `code: limite_de_cuenta` — the account requires each person’s own certificate and this signer’s `signing` is `consent`. `code: mecanismo_sin_prestador` with `missing: plan` — someone would sign by consent and this account’s plan does not include signing by consent (253). Without `code`: that address is already on the list (in `copies` mode, or with that role), or two additions collided. With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["documento_no_es_borrador","aprueba_y_firma","limite_de_cuenta","mecanismo_sin_prestador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"… this account’s plan does not include signing by consent. Let them sign with their own certificate, or ask the platform to include signing by consent in your plan.","code":"mecanismo_sin_prestador"}},"aprueba_y_firma":{"summary":"aprueba_y_firma","value":{"error":"The text varies; compare the `code`.","code":"aprueba_y_firma"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"One person of the flow. `email` is needed unless `occupant` is `unassigned`.","example":{"email":"person@example.com","name":"Sam Rivera"},"properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","maxLength":120},"occupant":{"type":"string","enum":["person","unassigned","group"]},"group_id":{"type":"string","format":"uuid"},"group_required":{"type":"integer","minimum":1,"maximum":20},"group_on_decline":{"type":"string","enum":["stop","when_unreachable"]},"role_name":{"type":"string","maxLength":120},"role":{"type":"string","enum":["signer","reviewer","cc","approver"]},"order":{"type":"integer","minimum":1,"maximum":99},"minimum_assurance":{"type":"string","enum":["low","substantial","high"]},"identification":{"type":["array","null"],"minItems":1,"maxItems":6,"items":{"type":"string","enum":["email_code","password","oidc","wallet","local_token","provider"]}},"capacity":{"type":["string","null"],"enum":["personal","on_behalf",null]},"signing":{"type":["string","null"],"enum":["certificate","consent","either",null]},"access_code":{"type":"string","minLength":4,"maxLength":12,"description":"Write-only (4 to 12 characters, no leading or trailing space): reading the flow says `access_code_set`, never the code."},"may_download":{"type":"boolean"},"may_print":{"type":"boolean"}}}}}}}},"/workflows/{id}/roles/{position}":{"put":{"tags":["Workflows"],"summary":"Name or replace the person of a signer’s place","security":[{"tokenDeApi":["circuito.editar","circuito.enviar"]}],"description":"One action for three things, by the place’s `position` (the signer’s `position` when you read the flow):\n\n1. **Name the person of a place to be assigned later** (`occupant: unassigned`), in a draft: the place gets its person; nothing is sent yet.\n2. **The same after dispatch**: the person gets their link and, if it is already their turn, the invitation. Records `lugar.asignado`.\n3. **Replace the person of a dispatched place that has not signed** (`reason` required): the previous signer becomes `delegated` (`replaced_by_id` points to the new one) and **their link stops working**; a new signer takes the SAME place, with its fields; the signature boxes the sender placed are copied. Records `lugar.reasignado` with before, after, who, the channel (`api` here, `consola` from the console), the reason and, when it answers one, the `transfer_request_id` (the `firma.traspaso_pedido` the previous signer filed with “Pass it to someone else”; reading the flow it is that signer’s `transfer_request.id`).\n\nBody: `email` (required), `name`, `signing`, `minimum_assurance`, `access_code` (the same rules as adding a signer; when you replace somebody, the place keeps its access code unless you send a new one), `reason`, `transfer_request_id`.\n\n**Scopes:** `circuito.editar` in a draft; once the flow is dispatched, also `circuito.enviar` (as dispatch, the signing link and the access-code reset).\n\n**How the place signs does not go down after dispatch.** Naming the person of a dispatched place keeps its `signing` and `minimum_assurance`; replacing somebody may only RAISE them (a higher level, or `certificate`), checked as at dispatch (409 `nivel_sin_verificacion` or `mecanismo_sin_prestador` when this account cannot offer it). Anything else answers 422 `lugar_conserva_como_se_firma`.\n\nNot allowed when the place already signed (409 `lugar_ya_firmo`), when the place or the flow is closed (409 `lugar_cerrado`, `circuito_cerrado`), when that person already holds the place (409 `misma_persona`) or approves this flow (409 `aprueba_y_firma`), when the account’s signing limits refuse how they would sign (409 `limite_de_cuenta`, `mecanismo_sin_prestador`, as when adding a signer), or another place in the flow, now or before a replacement (409 `ya_tiene_lugar`), or in `copies` mode (400). If the signer is signing at that very moment, only one of the two wins: either the signature is recorded and this answers 409 `lugar_ya_firmo`, or the replacement is and their signature answers 409.\n\n**Send an `Idempotency-Key`**: a retried replacement without one answers 409 `misma_persona`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"position","in":"path","required":true,"schema":{"type":"integer","minimum":1}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"responses":{"200":{"description":"`action` (`assigned`, `reassigned` or `set_in_draft`), `signer_id` (the new one), `previous_signer_id`, `position`, `email`, `event`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LugarAsignado"}}}},"400":{"description":"The request was refused; `code` says why.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["medio_invalido","por_asignar_en_copias","motivo_requerido","traspaso_ajeno"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to assign.","code":"por_asignar_en_copias"}},"motivo_requerido":{"summary":"motivo_requerido","value":{"error":"Say why the place goes to someone else: it goes into the evidence record.","code":"motivo_requerido"}},"traspaso_ajeno":{"summary":"traspaso_ajeno","value":{"error":"That transfer request is not from the person in this place.","code":"traspaso_ajeno"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"No signer in that position (`code: lugar_inexistente`), or no such workflow.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["lugar_inexistente"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"lugar_inexistente":{"summary":"lugar_inexistente","value":{"error":"This document has no signer in place ….","code":"lugar_inexistente"}}}}}},"409":{"description":"Nobody is named or replaced. With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["lugar_ya_firmo","lugar_cerrado","circuito_cerrado","misma_persona","ya_tiene_lugar","aprueba_y_firma","limite_de_cuenta","mecanismo_sin_prestador","prestador_no_habilitado","nivel_sin_verificacion","documento_no_es_borrador","lugar_cambio"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"circuito_cerrado":{"summary":"circuito_cerrado","value":{"error":"This document is closed: nobody can be named or replaced on it.","code":"circuito_cerrado"}},"lugar_ya_firmo":{"summary":"lugar_ya_firmo","value":{"error":"That place already signed: a signature is not reassigned.","code":"lugar_ya_firmo"}},"lugar_cerrado":{"summary":"lugar_cerrado","value":{"error":"That place is closed: it can no longer be assigned or reassigned.","code":"lugar_cerrado"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"… this account’s plan does not include signing by consent. Let them sign with their own certificate, or ask the platform to include signing by consent in your plan.","code":"mecanismo_sin_prestador"}},"misma_persona":{"summary":"misma_persona","value":{"error":"That person already holds this place.","code":"misma_persona"}},"aprueba_y_firma":{"summary":"aprueba_y_firma","value":{"error":"… already approves this document, and the same person does not sign it too.","code":"aprueba_y_firma"}},"ya_tiene_lugar":{"summary":"ya_tiene_lugar","value":{"error":"… already has a place in this document (now or before a reassignment).","code":"ya_tiene_lugar"}},"nivel_sin_verificacion":{"summary":"nivel_sin_verificacion","value":{"error":"… would have to prove a higher identity level, and this account cannot offer that verification.","code":"nivel_sin_verificacion"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"The text varies; compare the `code`.","code":"prestador_no_habilitado"}},"lugar_cambio":{"summary":"lugar_cambio","value":{"error":"That place changed while you were naming its person. Reload and try again.","code":"lugar_cambio"}}}}}},"422":{"description":"`code: lugar_conserva_como_se_firma` — after dispatch, `signing` and `minimum_assurance` of the place stay as sent (when replacing, they may only go up).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["lugar_de_grupo","lugar_conserva_como_se_firma"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"lugar_de_grupo":{"summary":"lugar_de_grupo","value":{"error":"A group holds this place: it is not assigned to a person. Change the group, or remove the place and add another.","code":"lugar_de_grupo"}},"lugar_conserva_como_se_firma":{"summary":"lugar_conserva_como_se_firma","value":{"error":"After sending, how this place signs and the identity level it asks for stay as they were sent. When you reassign it you may only raise them (a higher level, or their own certificate).","code":"lugar_conserva_como_se_firma"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email"],"additionalProperties":false,"properties":{"email":{"type":"string","format":"email"},"name":{"type":"string","maxLength":120},"signing":{"type":["string","null"],"enum":["certificate","consent","either",null]},"minimum_assurance":{"type":"string","enum":["low","substantial","high"]},"access_code":{"type":"string","minLength":4,"maxLength":12},"reason":{"type":"string","maxLength":500},"transfer_request_id":{"type":"string","format":"uuid"}}}}}}}},"/workflows/{id}/roles/{position}/named-by":{"put":{"tags":["Workflows"],"summary":"Choose which signer names the person of a place to be assigned later","security":[{"tokenDeApi":["circuito.editar"]}],"description":"In a draft, the place `position` (`occupant: unassigned`) gets the signer whose place is `position` in the body as the one who names its person: during their turn, from their signing page. `{\"position\": null}` removes it. The sender and your system can still name the person with `PUT .../roles/{position}`: the first one wins. When the signer names somebody, the flow records `lugar.asignado` with `channel: participante`.\n\nThe naming place must be another signer of the flow, not a group, with the same turn or an earlier one (422 `designacion_invalida`). After dispatch it does not change (409 `circuito_no_es_borrador`).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"position","in":"path","required":true,"schema":{"type":"integer","minimum":1}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["position"],"properties":{"position":{"type":["integer","null"],"minimum":1}}}}}},"responses":{"200":{"description":"`position` and `named_by_position`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuienNombraElLugar"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"No place to be assigned later in that position (`code: lugar_inexistente`), or no such workflow.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["lugar_inexistente"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"lugar_inexistente":{"summary":"lugar_inexistente","value":{"error":"This document has no reserved place ….","code":"lugar_inexistente"}}}}}},"409":{"description":"Nothing changes.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["circuito_no_es_borrador","documento_no_es_borrador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"circuito_no_es_borrador":{"summary":"circuito_no_es_borrador","value":{"error":"Who names the person of a place is decided while you prepare the document, not after sending it.","code":"circuito_no_es_borrador"}},"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}}}}}},"422":{"description":"`code: designacion_invalida` — the naming place is not another signer of the flow with the same turn or an earlier one.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["designacion_invalida"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"designacion_invalida":{"summary":"designacion_invalida","value":{"error":"The place that names the person must be another signer of this document.","code":"designacion_invalida"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/fields":{"get":{"tags":["Workflows"],"summary":"The fields of a flow, with the value the sender put","security":[{"tokenDeApi":["circuito.editar"]}],"description":"Every field as it was defined (`code`, `type`, `label` in each language, `who`, `position`, `required`, `validation`, `help`, `default_value`, `locked_for_signer`, `placement`…) plus `value` (what the sender or your system put), `value_origin` (`manual`, `spreadsheet`, `api`) and `prefilled_at`. It carries the sender’s values, so it asks for the same scope as preparing the flow (`circuito.editar`), not just reading it.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"`fields`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CamposDelFlujo"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"put":{"tags":["Workflows"],"summary":"Define the fields of a draft","security":[{"tokenDeApi":["circuito.editar"]}],"description":"Sends the COMPLETE set of fields, as the console’s “Save fields”: it replaces what was there. Values already written to a field that keeps its `code` are kept, with their origin. Draft only (409 `documento_no_es_borrador`). A field with a key this API does not know, or that makes no sense (a lock on a field the sender fills in, `code: bloqueo_no_aplica`), is a 400 and none is saved.\n\nA field is for one signer’s place (`who: signer`, with `position`), for the sender (`who: sender`) or for whoever signs first (`who: anyone`). `label` is the text the signer reads, in up to three languages. `placement` is by coordinates, or by a **tag written in the PDF** (`{\"tag\": \"[[TXT_1:phone]]\"}`, see `TagPlacement`): the file is searched once, the tag becomes the coordinates, and the field is saved as any other. The tag must say the same as the field (type, place, `code`). A tag that is missing is a 422 `etiquetas_ausentes` with every missing tag listed, unless that field says `if_missing: ignore`. A text or paragraph tag that appears twice puts the value in both places (the second becomes a mirror); any other type twice is a 422 `etiqueta_repetida`. A scan with no text layer is a 422 `sin_texto`. `POST /workflows` does not take tags yet: define the fields here after creating the draft.\n\n`help` (what the signer reads under the field) and `default_value` (a suggestion that stays put in a field the signer fills in by hand) are optional: a client that does not send them keeps working. One that does not fit is a 422 with the cause in `error`.\n\n**Pre-filled values.** Write them with `PUT .../fields/values`. A pre-filled value in a signer’s field is a suggestion the signer can correct, unless the field is `locked_for_signer`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"fields":{"type":"array","maxItems":200,"items":{"$ref":"#/components/schemas/FieldDefinitionByTag"}}},"required":["fields"]}}}},"responses":{"200":{"description":"`fields` (how many) and `values_kept`; with tags, `placed_by_tag` and `ignored_tags`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CamposDefinidos"}}}},"400":{"description":"Something did not work. `code`: `etiqueta_mal_formada` (the tag does not follow `[[TIPO_QUIEN:code]]`; `tags` has it with `reason: malformed`), `etiqueta_no_coincide` (the tag says something different from its field or mark: type, place or `code`; `reason: mismatch`) or `ubicacion_invalida` (with the offsets and size the box would fall outside the limits; `reason: out_of_bounds`). Any other 400 carries `error` as usual. Nothing is saved.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["etiqueta_mal_formada","etiqueta_no_coincide","ubicacion_invalida","bloqueo_no_aplica"],"description":"Present for the three above; other 400s may carry other codes. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"tags":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"reason":{"type":"string","enum":["malformed","mismatch","out_of_bounds"]}},"required":["tag","reason"]}}},"required":["error"]},"examples":{"etiqueta_mal_formada":{"summary":"etiqueta_mal_formada","value":{"error":"The text varies; compare the `code`.","code":"etiqueta_mal_formada"}},"etiqueta_no_coincide":{"summary":"etiqueta_no_coincide","value":{"error":"The tag … does not match its field: …","code":"etiqueta_no_coincide"}},"ubicacion_invalida":{"summary":"ubicacion_invalida","value":{"error":"The tag … would be placed outside the page limits (x and y from 0 to 20000, width and height from 8 to 2000 points): check offset_x, offset_y, width and height.","code":"ubicacion_invalida"}},"bloqueo_no_aplica":{"summary":"bloqueo_no_aplica","value":{"error":"“…” cannot be locked for the signer: it is filled in by the sender or by the platform, so the signer never types it.","code":"bloqueo_no_aplica"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"It was already dispatched (`code: documento_no_es_borrador`): the fields do not change afterwards.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["documento_no_es_borrador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}}}}}},"422":{"description":"422. `code`: `etiquetas_ausentes` (`tags` lists ALL the missing ones, `reason: not_found`), `etiqueta_repetida` (`tags` with `pages`; only a text or paragraph field may repeat, its other places become mirrors; a signer has one mark per page), `lugar_inexistente` (the tag names a place the flow does not have), `sin_texto` (the file has no text layer, a scan, or its text could not be read) or `documento_demasiado_grande` (the file is over a limit of the search: `limit` says which, `pages` (more than 500 pages), `bytes` (over 20 MB) or `time` (reading it took longer than the server allows); place those fields by coordinates instead). The file is read AFTER the 409 of an already dispatched flow, never before.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["etiquetas_ausentes","etiqueta_repetida","lugar_inexistente","sin_texto","documento_demasiado_grande"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"limit":{"type":"string","enum":["pages","bytes","time"],"description":"Only with `documento_demasiado_grande`."},"tags":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"reason":{"type":"string"},"pages":{"type":"array","items":{"type":"integer"}}},"required":["tag","reason"]}}},"required":["error"]},"examples":{"sin_texto":{"summary":"sin_texto","value":{"error":"The text of the document could not be read, so no tag can be found. Place the fields by coordinates instead.","code":"sin_texto"}},"lugar_inexistente":{"summary":"lugar_inexistente","value":{"error":"The tag… … name… a signer’s place this document does not have.","code":"lugar_inexistente"}},"etiquetas_ausentes":{"summary":"etiquetas_ausentes","value":{"error":"… tag… not in the document: …….","code":"etiquetas_ausentes"}},"etiqueta_repetida":{"summary":"etiqueta_repetida","value":{"error":"… appear… more than once and only a text field can repeat (the other places become mirrors). Keep one.","code":"etiqueta_repetida"}},"documento_demasiado_grande":{"summary":"documento_demasiado_grande","value":{"error":"The text varies; compare the `code`.","code":"documento_demasiado_grande"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/fields/values":{"put":{"tags":["Workflows"],"summary":"Pre-fill fields from your own system","security":[{"tokenDeApi":["circuito.editar"]}],"description":"`{\"values\": {\"customer_name\": \"Ana Pérez\", \"amount\": \"1200\"}}`, by field `code`. A `null` clears the value. Draft only.\n\n**All or nothing**: every value is judged first — with the rules the signer would meet: type, options, pattern, length, range, characters the document can write — and if any fails, NONE is saved and the 422 lists them all by `field` (`unknown_field`, `automatic_field`, `invalid_value`). Fields the platform or the certificate fill in when signing cannot be pre-filled.\n\nThe value is written with `origin: api`, with when and by which token (the signer never sees the token), and the evidence records `campo.precargado` with the codes and a fingerprint of each value — not the value. In a field of a signer, it is a suggestion the signer may correct (both stay); with `locked_for_signer` it shows with a padlock on the signing page and cannot be changed (403 `campo_bloqueado` if they try); the signed PDF carries no mark. For separate copies the same value goes to every copy: per-person values go in `POST .../recipients/batch`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","example":{"values":{"company_name":"Acme Corp"}},"properties":{"values":{"type":"object","additionalProperties":{"type":["string","null"]}}},"required":["values"]}}}},"responses":{"200":{"description":"`fields` (how many were written) and `documents` (in how many documents).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValoresPrecargados"}}}},"400":{"description":"The request was refused; `code` says why.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["sin_valores","demasiados_valores"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"sin_valores":{"summary":"sin_valores","value":{"error":"Send at least one value, as {\"field_code\": \"value\"}.","code":"sin_valores"}},"demasiados_valores":{"summary":"demasiados_valores","value":{"error":"That is too many values for one call (200 maximum).","code":"demasiados_valores"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"It was already dispatched (`code: documento_no_es_borrador`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["documento_no_es_borrador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}}}}}},"422":{"description":"`code: valores_invalidos`, with `errors`: `[{field, problem, reason}]`. Nothing was saved.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["valores_invalidos"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"valores_invalidos":{"summary":"valores_invalidos","value":{"error":"… value… cannot be used and none was saved: …….","code":"valores_invalidos"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/steps":{"put":{"tags":["Workflows"],"summary":"Set the quorum: who signs together and how many are needed","security":[{"tokenDeApi":["circuito.editar"]}],"description":"The same as the console’s flow editor: the COMPLETE list of steps, each with the `signers` (ids from `GET /workflows/{id}`) and a `minimum` — “2 of 3”; `null` or absent means all of them. When a step reaches its minimum, the others in it become `not_required` and the flow moves on. Every signer must be in a step (400 otherwise). A step can also name `reviewers` (ids of people who only review): they get their notice when that step’s turn arrives, together with its signers, never hold the step up and do not count for the minimum. If ANY step carries the `reviewers` key (an empty list included) the reviewers are replaced as a whole: one that is in no step loses its turn and is notified when the flow is dispatched, as before. If NO step carries the key, the reviewers’ turns are left as they were (a client that does not know about reviewers does not wipe them). Draft only.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"steps":{"type":"array","minItems":1,"maxItems":30,"items":{"type":"object","properties":{"signers":{"type":"array","minItems":1,"items":{"type":"string","format":"uuid"}},"minimum":{"type":["integer","null"],"minimum":1},"reviewers":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["signers"]}}},"required":["steps"]}}}},"responses":{"200":{"description":"`steps`: how many.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasosDefinidos"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"It was already dispatched.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["designacion_despues_del_lugar","documento_no_es_borrador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"designacion_despues_del_lugar":{"summary":"designacion_despues_del_lugar","value":{"error":"The text varies; compare the `code`.","code":"designacion_despues_del_lugar"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/recipients/batch":{"post":{"tags":["Workflows"],"summary":"Add many recipients at once, one copy each, with their own data","security":[{"tokenDeApi":["circuito.editar"]}],"description":"Bulk sending from your system: `recipients` is a list of `{email, name, row, fields}`, where `fields` is `{field_code: value}` for that person’s copy. With `mode: copies` the flow becomes “a copy of their own for each one” in the same transaction. All or nothing, up to 50 per document; the values are judged like `PUT .../fields/values` (400 naming row and column), enter with `origin: api` and each copy records `campo.precargado`. It needs the bulk-sending permission when there is more than one. **Send an `Idempotency-Key`.**","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","example":{"mode":"copies","recipients":[{"email":"person@example.com","name":"Sam Rivera"}]},"properties":{"mode":{"type":"string","enum":["copies"]},"recipients":{"type":"array","minItems":1,"maxItems":500,"items":{"type":"object","properties":{"email":{"type":"string","example":"person@example.com"},"name":{"type":["string","null"]},"row":{"type":"integer","minimum":1},"fields":{"type":"object","additionalProperties":{"type":"string"}}},"required":["email"]}}},"required":["recipients"]}}}},"responses":{"200":{"description":"`copies` and `with_values`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopiasAgregadas"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"Nobody was added: the batch does not fit (`code: lote_demasiado_grande`), a person is already on the document (no `code`), it was dispatched (`documento_no_es_borrador`), or the account’s signing limits refuse how they would sign (`limite_de_cuenta`, `mecanismo_sin_prestador`, `aprueba_y_firma`). With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["aprueba_y_firma","documento_no_es_borrador","limite_de_cuenta","lote_demasiado_grande","mecanismo_sin_prestador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"lote_demasiado_grande":{"summary":"lote_demasiado_grande","value":{"error":"At most … people can go in this batch (a document goes to at most …, and this one has …), and … has …. Split it; nobody was added.","code":"lote_demasiado_grande"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"… this account’s plan does not include signing by consent. Let them sign with their own certificate, or ask the platform to include signing by consent in your plan.","code":"mecanismo_sin_prestador"}},"aprueba_y_firma":{"summary":"aprueba_y_firma","value":{"error":"The text varies; compare the `code`.","code":"aprueba_y_firma"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/recipients/csv":{"post":{"tags":["Workflows"],"summary":"The same batch, from a CSV or an Excel file","security":[{"tokenDeApi":["circuito.editar"]}],"description":"`multipart/form-data`: the file in `file` (.csv, .tsv or .xlsx, up to 2 MB) and, optionally, `mode=copies`. The first row has the titles: a column of email addresses, one of names (optional) and one per field, whose title is the field’s `code` or its label. What does not match a field is not written and comes back in `ignored_columns`, with its reason, together with `mapped_columns`. Then it is `POST .../recipients/batch`.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","example":"recipients.csv"},"mode":{"type":"string","enum":["copies"],"example":"copies"}},"required":["file"]}}}},"responses":{"200":{"description":"`copies`, `with_values`, `mapped_columns`, `ignored_columns`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CopiasDesdeCsv"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"Nobody was added: as `POST .../recipients/batch`. With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["aprueba_y_firma","documento_no_es_borrador","limite_de_cuenta","lote_demasiado_grande","mecanismo_sin_prestador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"lote_demasiado_grande":{"summary":"lote_demasiado_grande","value":{"error":"At most … people can go in this batch (a document goes to at most …, and this one has …), and … has …. Split it; nobody was added.","code":"lote_demasiado_grande"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"… this account’s plan does not include signing by consent. Let them sign with their own certificate, or ask the platform to include signing by consent in your plan.","code":"mecanismo_sin_prestador"}},"aprueba_y_firma":{"summary":"aprueba_y_firma","value":{"error":"The text varies; compare the `code`.","code":"aprueba_y_firma"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/signers/{signerId}":{"patch":{"tags":["Workflows"],"summary":"Change how somebody already added takes part, while the flow is a draft","security":[{"tokenDeApi":["circuito.editar"]}],"description":"Draft only. The same fields as adding them, with the same meaning: `signing`, `minimum_assurance`, `access_code`, `may_download`, `may_print`. What you do not send is not touched. `signing: null` makes the signer follow the workflow `signing` again; `access_code: null` removes their access code (a new one replaces the old one, and is write-only as always). `signing` only for a `signer` (400 otherwise). The `role` does not change here: remove them and add them again (any other field answers 400).\n\nThe same rules as adding them apply, at the same moment: whether this account can offer the certificate or the identity verification is answered by the dispatch (409 `mecanismo_sin_prestador` or `nivel_sin_verificacion`), with what the signer has then.\n\nThe response says what actually changed, in `changed` (a value equal to the current one does not count). Once the flow is dispatched: 409 with `code: documento_no_es_borrador`, and nothing changes. The `signerId` is the id you got back when you added them.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"signerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"What changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CambioDelFirmante"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"It was already dispatched (`code: documento_no_es_borrador`), the account requires each person’s own certificate and `signing` asks for `consent` (`code: limite_de_cuenta`), or `signing` asks for `consent` and the plan does not include signing by consent (`code: mecanismo_sin_prestador`, `missing: plan`). Nothing changes.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["documento_no_es_borrador","grupo_asiento_con_campos","limite_de_cuenta","mecanismo_sin_prestador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, not by consent.","code":"limite_de_cuenta"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"… this account’s plan does not include signing by consent. Let them sign with their own certificate, or ask the platform to include signing by consent in your plan.","code":"mecanismo_sin_prestador"}},"grupo_asiento_con_campos":{"summary":"grupo_asiento_con_campos","value":{"error":"Lowering how many must sign would remove … seat(s) that have … field(s) assigned. Move or delete those fields first.","code":"grupo_asiento_con_campos"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"signing":{"type":["string","null"],"enum":["certificate","consent","either",null]},"minimum_assurance":{"type":"string","enum":["low","substantial","high"]},"identification":{"type":["array","null"],"minItems":1,"maxItems":6,"items":{"type":"string","enum":["email_code","password","oidc","wallet","local_token","provider"]}},"access_code":{"type":["string","null"],"minLength":4,"maxLength":12},"may_download":{"type":"boolean"},"may_print":{"type":"boolean"}}}}}}}},"/workflows/{id}/signers/{signerId}/marks":{"put":{"tags":["Workflows"],"summary":"Where somebody’s signature is stamped, and whether it shows","security":[{"tokenDeApi":["circuito.editar"]}],"description":"Draft only. Replaces ALL the marks of that person with the ones you send (an empty list removes them): the same thing the console’s mark editor saves. Each mark: `type` (`signature` or `initials`), `page` (1 is the first; ignored with `all_pages: true`, which repeats it on every page), `x`, `y`, `width`, `height` (PDF points from the bottom left corner), and `visible`.\n\n`visible: false` is an **invisible signature**: it goes in the file and not on the page — the PAdES signature is the same, a validator sees it just like a visible one. Only a `signature` can be invisible: invisible `initials` answer 400. Without `visible`, it shows. What a visible signature shows — name, date, reason, the account logo — is the account’s signature appearance, set in the console.\n\n**By a tag written in the PDF.** Instead of `page`, `x`, `y`, `width` and `height`, a mark can say `{\"type\": \"signature\", \"tag\": \"[[SIG_1]]\"}` (`[[INI_1]]` for initials): the number is that signer’s place (`position`), and a tag for another place is a 400 `etiqueta_no_coincide`. It takes the optional `offset_x`, `offset_y`, `width`, `height` and `if_missing` of `TagPlacement`. The same tag on two different pages makes two marks; twice on the same page is a 422 `etiqueta_repetida` (a signer has one mark per page). A tag that is not in the document is a 422 `etiquetas_ausentes`; if every mark of the request is ignored with `if_missing: ignore`, that is also a 422 `etiquetas_ausentes` and the signer keeps the marks saved (send `marks: []` to remove them on purpose). A file over the limits of the search (more than 500 pages, 20 MB or too slow to read) is a 422 `documento_demasiado_grande`.\n\nWithout any mark a person signs wherever the signing page lets them, and the document ends up signed just the same. A page that does not exist answers 400; once dispatched, 409.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"signerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"marks":{"type":"array","maxItems":1000,"items":{"oneOf":[{"type":"object","description":"A mark by coordinates.","properties":{"type":{"type":"string","enum":["signature","initials"]},"page":{"type":"integer","minimum":1,"maximum":5001,"description":"From 1. Ignored with `all_pages: true`."},"x":{"type":"number","minimum":0,"maximum":20000},"y":{"type":"number","minimum":0,"maximum":20000},"width":{"type":"number","minimum":8,"maximum":2000},"height":{"type":"number","minimum":8,"maximum":2000},"all_pages":{"type":"boolean"},"visible":{"type":"boolean","description":"`false` is an invisible signature (only for `signature`)."}},"required":["type","x","y","width","height"],"additionalProperties":false},{"type":"object","description":"A mark by a tag written in the PDF: `{\"type\": \"signature\", \"tag\": \"[[SIG_1]]\"}` (`[[INI_1]]` for initials). The tag fields are those of `TagPlacement`.","allOf":[{"$ref":"#/components/schemas/TagPlacement"}],"properties":{"type":{"type":"string","enum":["signature","initials"]},"visible":{"type":"boolean"}},"required":["type","tag"]}]}}},"required":["marks"],"additionalProperties":false}}}},"responses":{"200":{"description":"How many marks that person has now.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Marcas"}}}},"400":{"description":"Something did not work. `code`: `etiqueta_mal_formada` (the tag does not follow `[[TIPO_QUIEN:code]]`; `tags` has it with `reason: malformed`), `etiqueta_no_coincide` (the tag says something different from its field or mark: type, place or `code`; `reason: mismatch`) or `ubicacion_invalida` (with the offsets and size the box would fall outside the limits; `reason: out_of_bounds`). Any other 400 carries `error` as usual. Nothing is saved.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["etiqueta_mal_formada","etiqueta_no_coincide","ubicacion_invalida","bloqueo_no_aplica"],"description":"Present for the three above; other 400s may carry other codes. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"tags":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"reason":{"type":"string","enum":["malformed","mismatch","out_of_bounds"]}},"required":["tag","reason"]}}},"required":["error"]},"examples":{"etiqueta_mal_formada":{"summary":"etiqueta_mal_formada","value":{"error":"The text varies; compare the `code`.","code":"etiqueta_mal_formada"}},"etiqueta_no_coincide":{"summary":"etiqueta_no_coincide","value":{"error":"The tag … does not match its field: …","code":"etiqueta_no_coincide"}},"ubicacion_invalida":{"summary":"ubicacion_invalida","value":{"error":"The tag … would be placed outside the page limits (x and y from 0 to 20000, width and height from 8 to 2000 points): check offset_x, offset_y, width and height.","code":"ubicacion_invalida"}},"bloqueo_no_aplica":{"summary":"bloqueo_no_aplica","value":{"error":"“…” cannot be locked for the signer: it is filled in by the sender or by the platform, so the signer never types it.","code":"bloqueo_no_aplica"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"It was already dispatched (or cancelled) (`code: documento_no_es_borrador`): the marks do not change afterwards, because the signers already saw where they go.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["documento_no_es_borrador"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}}}}}},"422":{"description":"422. `code`: `etiquetas_ausentes` (`tags` lists ALL the missing ones, `reason: not_found`), `etiqueta_repetida` (`tags` with `pages`; only a text or paragraph field may repeat, its other places become mirrors; a signer has one mark per page), `lugar_inexistente` (the tag names a place the flow does not have), `sin_texto` (the file has no text layer, a scan, or its text could not be read) or `documento_demasiado_grande` (the file is over a limit of the search: `limit` says which, `pages` (more than 500 pages), `bytes` (over 20 MB) or `time` (reading it took longer than the server allows); place those fields by coordinates instead). The file is read AFTER the 409 of an already dispatched flow, never before.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["etiquetas_ausentes","etiqueta_repetida","lugar_inexistente","sin_texto","documento_demasiado_grande"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"limit":{"type":"string","enum":["pages","bytes","time"],"description":"Only with `documento_demasiado_grande`."},"tags":{"type":"array","items":{"type":"object","properties":{"tag":{"type":"string"},"reason":{"type":"string"},"pages":{"type":"array","items":{"type":"integer"}}},"required":["tag","reason"]}}},"required":["error"]},"examples":{"sin_texto":{"summary":"sin_texto","value":{"error":"The text of the document could not be read, so no tag can be found. Place the fields by coordinates instead.","code":"sin_texto"}},"lugar_inexistente":{"summary":"lugar_inexistente","value":{"error":"The tag… … name… a signer’s place this document does not have.","code":"lugar_inexistente"}},"etiquetas_ausentes":{"summary":"etiquetas_ausentes","value":{"error":"… tag… not in the document: …….","code":"etiquetas_ausentes"}},"etiqueta_repetida":{"summary":"etiqueta_repetida","value":{"error":"… appear… more than once and only a text field can repeat (the other places become mirrors). Keep one.","code":"etiqueta_repetida"}},"documento_demasiado_grande":{"summary":"documento_demasiado_grande","value":{"error":"The text varies; compare the `code`.","code":"documento_demasiado_grande"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/signers/{signerId}/access-code/reset":{"post":{"tags":["Workflows"],"summary":"Set a new access code for somebody who has one","security":[{"tokenDeApi":["circuito.enviar"]}],"description":"Field: `access_code` (4 to 12 characters, no leading or trailing space). It replaces the code of that participant and unlocks their link after five wrong tries — also AFTER dispatch, which is what it is for. Whoever had already opened the document with the old code has to type the new one. Like any access code it is write-only, it never travels in an email, and the evidence record says it was reset, not what it is.\n\nOnly for somebody who already has a code (409 otherwise): the first one is set when adding them, or with `PATCH .../signers/{signerId}` while the flow is a draft.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"signerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Reset.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"That person does not have an access code yet (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."}},"required":["error"]}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["access_code"],"additionalProperties":false,"properties":{"access_code":{"type":"string","minLength":4,"maxLength":12,"example":"4821Qx"}}}}}}}},"/workflows/{id}/signers/{signerId}/link":{"get":{"tags":["Workflows"],"summary":"The signing link for one person — embedded signing","security":[{"tokenDeApi":["circuito.enviar"]}],"description":"Your application already has the person authenticated and on screen. Instead of emailing them so they can leave, open their inbox and come back, open the signing page right there, in an iframe or a new tab. The drop-off between *the email went out* and *they opened it* is one of the most expensive things a signing process has.\n\n**The link is a credential**: whoever holds it can sign as that person. It is never cached, it needs the dispatch scope rather than a read scope, and it is refused if the workflow has not been dispatched, or if that person has already signed or declined.\n\nThe `signerId` is the id you got back when you added them.","responses":{"200":{"description":"The URL, and who it belongs to.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnlaceDeFirma"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"There is no link to hand over: the flow was not dispatched, that person has no signing grant in force, they already signed, approved or declined, or they only get a copy (`role: cc`), which reaches them by email once the flow completes (no `code`). `code: lugar_reasignado` — that person was replaced in their place (`PUT .../roles/{position}`): their link no longer signs.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["lugar_reasignado"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"lugar_reasignado":{"summary":"lugar_reasignado","value":{"error":"That person was replaced in this place: there is no signing link to give.","code":"lugar_reasignado"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"parameters":[{"name":"signerId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}]}},"/workflows/{id}/dispatch":{"post":{"tags":["Workflows"],"summary":"Dispatch: the emails go out and the clock starts","security":[{"tokenDeApi":["circuito.enviar"]}],"description":"**The least undoable thing in the whole API, and where the `Idempotency-Key` matters most.** A retry without a key sends the document twice to every signer and bills it twice — and on the other side there is almost always a queue retrying on its own.\n\nWith the same key and the same body you get the same response back, without the effect happening twice. With the same key and a **different** body you get a 409: that is not a retry.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"responses":{"200":{"description":"Dispatched.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Despacho"}}}},"402":{"description":"The plan sends a number of documents each month and this month is full (`code: cuota_del_mes`; `limit: documents_per_month`, its `cap`, how many are `used`, the `period` and `renews_on`, the day the count starts again). Nothing is dispatched and nothing already sent is touched; the flow stays a draft.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["cuota_del_mes"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"cuota_del_mes":{"summary":"cuota_del_mes","value":{"error":"Your plan sends up to … document… each month, and … … gone out in …. The count starts again on …. Nothing already sent is touched; ask the platform for a plan or a size that sends more.","code":"cuota_del_mes"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"It is not a draft, something it needs is missing, or the idempotency key was reused with a different body (or its first request is still being processed; neither of those two carries `code`). Nothing is dispatched. When something is missing the body names it:\n\n- `code: documento_no_es_borrador` — it was already dispatched (or cancelled).\n- `code: qr_fuera_de_la_pagina` — the verification QR was placed (`verification_qr: placed`) outside the page.\n- `code: qr_tapa_texto` — the placed verification QR would cover text of the document; `pagina` says on which page.\n- `code: primer_turno_sin_persona` — the first turn has only places to be assigned later (`occupant: unassigned`): name somebody for one of them with `PUT .../roles/{position}`, or move a named signer to go first.\n- `code: miembro_con_lugar_propio` — a member of a group place is already in this workflow under their own name: a person holds one place per document.\n- `code: miembro_en_dos_lugares` — the same person is in two groups of this workflow.\n- `code: grupo_no_alcanza` — a group place cannot be held: its group was archived, or has fewer members than the signatures it asks for.\n- `code: mecanismo_sin_prestador` — someone has to sign with their own certificate (their `signing`, or the workflow’s, is `certificate`) and this account cannot offer it under the workflow country. `missing` says what: `plan` (the plan does not include signing with the holder’s own certificate), `provider` (no signature provider is enabled, or the enabled one cannot be used yet), or `identity_provider` (the signing page offers the personal certificate together with identity verification, and no identity provider is enabled). `signers` lists who. The same code, with `missing: plan`, when someone would sign by consent (their `signing`, or the workflow’s, is `consent`) and this account’s plan does not include signing by consent.\n- `code: prestador_no_habilitado` — the signature provider chosen for the workflow is not enabled for the workflow country. Choose another one, or clear the choice. `missing: provider` and `signers` say what and who. The same code answers at upload (`provider`).\n- `code: nivel_sin_verificacion` — someone has to prove identity above `low` (`level`) and this account cannot offer the verification. `missing`: `plan` or `provider`. `signers` lists who.\n- `code: aprobador_despues_de_firmante` — someone who approves (`role: approver`) is in the same turn as a signer, or after one: an approver goes before every signer. `approvers` lists who. Without `order` this does not happen (see `POST .../signers`).\n- `code: documento_de_un_dosier`: the document belongs to a dossier: a dossier is sent whole, never one document of it (a dossier is read-only here: see `dossier_id`).\n- `code: borrador_de_plantilla` — it is not a document but a template being built in the console (Templates → New template). It is never dispatched and it does not appear in `GET /workflows`.\n- `code: limite_de_cuenta` — the account requires every document to be signed with each person’s own certificate, and someone would still sign by consent (their `signing`, or the workflow’s). `signers` lists who.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["documento_de_un_dosier","documento_no_es_borrador","qr_fuera_de_la_pagina","qr_tapa_texto","mecanismo_sin_prestador","prestador_no_habilitado","nivel_sin_verificacion","aprobador_despues_de_firmante","limite_de_cuenta","borrador_de_plantilla","primer_turno_sin_persona","miembro_con_lugar_propio","miembro_en_dos_lugares","grupo_no_alcanza"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"pagina":{"type":"integer","minimum":1,"description":"With `qr_tapa_texto`: the page where the QR covers text."},"missing":{"type":"string","enum":["plan","provider","identity_provider"]},"level":{"type":"string","enum":["substantial","high"]},"signers":{"type":"array","items":{"type":"string","format":"email"}},"approvers":{"type":"array","items":{"type":"string","format":"email"}}},"required":["error"]},"examples":{"documento_de_un_dosier":{"summary":"documento_de_un_dosier","value":{"error":"This document belongs to a dossier: send the whole dossier together.","code":"documento_de_un_dosier"}},"documento_no_es_borrador":{"summary":"documento_no_es_borrador","value":{"error":"This document has already been sent: the signing route cannot be changed.","code":"documento_no_es_borrador"}},"borrador_de_plantilla":{"summary":"borrador_de_plantilla","value":{"error":"This is a template being built, not a document: finish it with “Save as template”. To send it for signature, make a document from the template once it is saved.","code":"borrador_de_plantilla"}},"qr_fuera_de_la_pagina":{"summary":"qr_fuera_de_la_pagina","value":{"error":"… Open “Fields to fill in” and move it before sending, or choose to add it as a final page.","code":"qr_fuera_de_la_pagina"}},"qr_tapa_texto":{"summary":"qr_tapa_texto","value":{"error":"The text varies; compare the `code`.","code":"qr_tapa_texto"}},"primer_turno_sin_persona":{"summary":"primer_turno_sin_persona","value":{"error":"Nobody is named in the first turn: name the person for that place (Assign) before sending it, or move a named signer to go first.","code":"primer_turno_sin_persona"}},"limite_de_cuenta":{"summary":"limite_de_cuenta","value":{"error":"This account requires every document to be signed with each person’s own certificate, and … would sign by consent. Change how they sign, or turn the requirement off in Account → Policy defaults.","code":"limite_de_cuenta"}},"aprobador_despues_de_firmante":{"summary":"aprobador_despues_de_firmante","value":{"error":"… has to approve before anyone signs, and is at or after a signer in the order. Move them ahead of every signer, or make them a signer.","code":"aprobador_despues_de_firmante"}},"nivel_sin_verificacion":{"summary":"nivel_sin_verificacion","value":{"error":"… has to prove identity at … level to …, and …","code":"nivel_sin_verificacion"}},"mecanismo_sin_prestador":{"summary":"mecanismo_sin_prestador","value":{"error":"… this account’s plan does not include signing by consent. Let them sign with their own certificate, or ask the platform to include signing by consent in your plan.","code":"mecanismo_sin_prestador"}},"prestador_no_habilitado":{"summary":"prestador_no_habilitado","value":{"error":"The text varies; compare the `code`.","code":"prestador_no_habilitado"}},"miembro_con_lugar_propio":{"summary":"miembro_con_lugar_propio","value":{"error":"The text varies; compare the `code`.","code":"miembro_con_lugar_propio"}},"miembro_en_dos_lugares":{"summary":"miembro_en_dos_lugares","value":{"error":"The text varies; compare the `code`.","code":"miembro_en_dos_lugares"}},"grupo_no_alcanza":{"summary":"grupo_no_alcanza","value":{"error":"The text varies; compare the `code`.","code":"grupo_no_alcanza"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/workflows/{id}/hold":{"post":{"tags":["Workflows"],"summary":"Hold a document so it is not deleted, or release the hold","security":[{"tokenDeApi":["circuito.administrar"]}],"description":"While it is held, the retention sweep does NOT delete the bytes, whatever deadline passes. This is the *legal hold*: you set it when the document is in litigation or under a production order.\n\nFields: `hold` (boolean, required) and `reason` (required when holding, because a hold with no reason never gets released: nobody lifts something when they do not know why it was put there). Both movements go into the evidence record.\n\nIt is in the API and not only in the console because a hold usually arrives from OUTSIDE — a legal system, a case manager — and asking those people to go into a screen by hand guarantees it arrives late. Requires the `circuito.administrar` scope: **releasing a hold enables deletion**.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"responses":{"200":{"description":"The state of the hold.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Retencion"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."}},"required":["error"]}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["hold"],"example":{"hold":true,"reason":"Legal hold: dispute pending"},"properties":{"hold":{"type":"boolean"},"reason":{"type":["string","null"],"maxLength":500}}}}}}}},"/workflows/{id}/cancel":{"post":{"tags":["Workflows"],"summary":"Cancel a flow that was already dispatched","security":[{"tokenDeApi":["circuito.cancelar"]}],"description":"`reason` is **required**: it goes into the evidence record, and a flow cancelled with no reason is a hole in the proof. What was already signed stays signed.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Your own unique value for each intended effect; a retry sends the same one. The same key and the same body answer the same response without the effect happening twice; the same key with a different body is a 409. Between 8 and 255 characters. It is not required, and without it a retry that already took effect answers its own 409 or does it again.","schema":{"type":"string","minLength":8,"maxLength":255}}],"responses":{"200":{"description":"Cancelled.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Cancelacion"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"It is not waiting for signatures (it was already cancelled, or it is complete): nothing is cancelled (`code: circuito_no_se_puede_cancelar`, the same code whatever the reason). If the flow belongs to a dossier (`dossier_id` is not null) that was already sent, one document of it cannot be cancelled alone: `code: dosier_cancelar_entero`, with `dossier_id` and `editable_in: dossier`; nothing changes. Cancel the dossier, or wait until it completes. With `Idempotency-Key`: the same key was already used for a different request, or the first request with that key is still being processed. Neither has a name (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["circuito_no_se_puede_cancelar","dosier_cancelar_entero"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"dosier_cancelar_entero":{"summary":"dosier_cancelar_entero","value":{"error":"This document belongs to a dossier that was already sent: cancel the dossier, or wait until it completes.","code":"dosier_cancelar_entero"}},"circuito_no_se_puede_cancelar":{"summary":"circuito_no_se_puede_cancelar","value":{"error":"This document can no longer be cancelled.","code":"circuito_no_se_puede_cancelar"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"description":"Why. It goes into the evidence record."}}}}}}}},"/webhooks":{"get":{"tags":["Webhooks"],"summary":"The endpoints this account gets notified on","security":[{"tokenDeApi":["integracion.administrar"]}],"description":"`events: null` is not «no events»: it means **all of them**. An endpoint with an empty list receives everything, which is what you want while you are finding out which ones you care about.","responses":{"200":{"description":"The list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListaDeSuscripciones"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"post":{"tags":["Webhooks"],"summary":"Get notified instead of polling","security":[{"tokenDeApi":["integracion.administrar","documento.leer"]}],"description":"Registers an endpoint of yours. Every time something happens to a document of this account, it gets a signed POST — the same vocabulary as the evidence record, so you can build your mapping from `GET /event-types`.\n\n**A webhook is a read that arrives on its own, so it takes the scopes to read what it delivers.** Every event carries data of a document, so creating or changing an endpoint takes `documento.leer` besides `integracion.administrar`; `circuito.paquete` carries the signed document AND the completion report, so asking for it also takes `evidencia.leer` — the same two scopes `GET /documents/{id}/package` asks for. A token without them gets the 403 with `code: insufficient_scope` and the `scope` it is missing.\n\n⚠ **The secret comes back once and never again.** It is stored encrypted and nobody can read it back, not even the operator. Store it when you create the endpoint: it is what lets you check that a POST really came from us.\n\nLeave `events` out to receive all of them — **except `circuito.paquete`**, which is opt-in even then: it carries the signed document, not just a small JSON, so an empty list never includes it. Add it by name to get it. The URL has to be reachable from outside and cannot point into a private network — that is checked when you create it, and again on every delivery, not just once.\n\nAdd `circuito.paquete` and the completion document and report travel attached to that POST, `multipart/form-data`, instead of only their identifiers, once per document that completes (once per copy, in a copies send-out). Above 25 MB combined neither one is attached, and the body says so with `omitidos` and links back to `GET /documents/{id}/file` and `/certificate`.\n\n**The codes are stable identifiers, not text:** `firma.aplicada` stays `firma.aplicada` whatever language your interface speaks (the code goes inside the hash that chains the evidence record, and a database trigger stops anyone renaming one). The readable description is what you read: `event_label`, in English, and `GET /event-types` serves it for every code.\n\nEvery event carries the same envelope, with keys in English: `payload_version` (2), `event` (the code), `event_label`, `id`, `occurred_at`, `account`, `workflow`, `document` and `data` (for `circuito.paquete`, inside its `evento` part, which also carries `document_file`, `report`, `report_omitted_because`, `omitted` and `links`; `document` is always the document, and the file is always `document_file`, also in `omitted` and `links`). The names of the multipart parts (`evento`, `documento`, `informe`) and the keys inside `data` do not change in this version: they are part of the format and of the evidence, not of the envelope. **The Spanish keys it carried before travel alongside for one more version**, with the same values: `evento`, `ocurrido_en`, `cuenta`, `circuito`, `instancia`, `datos` (and `documento`, `informe`, `informe_omitido_porque`, `omitidos`, `enlaces`). Move to the English ones; the Spanish will be removed in the next version (`payload_version: 3`). The signature covers the body as sent. For example `participacion.aprobada`, when an `approver` approves, carries in `datos` who (`participacion_id`, the `signer_id` you got when you added them, and their `email` masked the way every event of the evidence masks it, `jo***@example.com`), when (`aprobada_en`) and how they identified themselves (`metodo`, `nivel_garantia`, `nivel_exigido`). To know who by their full address, match `participacion_id` with the `signers` of `GET /workflows/{id}`.\n\nThe keys of `data` for the events people map the most (`circuito.despachado`, `documento.abierto`, `firma.aplicada`, `participacion.aprobada`, `instancia.rechazada`, `circuito.completo`, `circuito.cancelado`, `circuito.prorrogado`) are in the schema `DatosDeLosEventos`. It documents; it does not promise: keys can be added, so ignore the ones you do not know.\n\n**Every name in `events` has to exist:** a name that is not in `GET /webhooks/events` answers 400 with `code: evento_desconocido`, `unknown_events` and `valid_events`, and nothing is saved (a typo used to be accepted and then nothing ever arrived).","responses":{"200":{"description":"Created. Carries the secret, once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuscripcionCreada"}}}},"400":{"description":"Invalid data. An event name that does not exist answers `code: evento_desconocido`, with `unknown_events` (the names that do not exist) and `valid_events` (the ones you can subscribe to, the same as `GET /webhooks/events`); nothing is saved. Other invalid data answers 400 without that code.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, written for a person."},"code":{"type":"string","enum":["evento_desconocido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"unknown_events":{"type":"array","items":{"type":"string"}},"valid_events":{"type":"array","items":{"type":"string"}}},"required":["error"]},"examples":{"evento_desconocido":{"summary":"evento_desconocido","value":{"error":"Unknown event…: …. Subscribe only to the events listed by GET /api/v1/webhooks/events (they are also in valid_events).","code":"evento_desconocido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"409":{"description":"That URL is already set up for this account: delete the old one first, or edit it (no `code`).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."}},"required":["error"]}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","example":"https://example.com/signing-flows-webhook"},"description":{"type":["string","null"],"maxLength":200},"events":{"type":"array","maxItems":50,"items":{"type":"string","maxLength":80}}}}}}}}},"/webhooks/{id}":{"get":{"tags":["Webhooks"],"summary":"One endpoint","security":[{"tokenDeApi":["integracion.administrar"]}],"description":"The same row `GET /webhooks` lists, for one id, with the same scope and the same visibility: an endpoint the list would not show you answers 404. Useful to check, when your side starts again, that its endpoint is still there, active and not paused. **The secret is not here**: it is shown once, when the endpoint is created.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Suscripcion"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}},"patch":{"tags":["Webhooks"],"summary":"Switch one off, or change what it listens to","security":[{"tokenDeApi":["integracion.administrar","documento.leer"]}],"description":"Switching an endpoint off keeps it and its secret: it is what you do while your receiver is down, instead of deleting it and losing the secret.\n\nLike creating one, it takes `documento.leer` besides `integracion.administrar`, and adding `circuito.paquete` to `events` also takes `evidencia.leer`: deciding what an endpoint listens to is deciding what gets read. To stop receiving without those scopes, `DELETE` it.\n\n`active` is the pause you set by hand. An endpoint that **paused itself** after eight failed attempts in a row (`paused_since` in `GET /webhooks`) stays paused after `active: true`: bring it back with `POST /webhooks/{id}/resume`, which also sends a test event.\n\nSending `events` checks every name, as creating does (400 `evento_desconocido`). An endpoint saved before that check with a name that does not exist keeps it: it is listed as it was saved, nothing is ever delivered for that name, and changing `active` or `description`, resuming, rotating the secret or deleting it work as always; only sending `events` again has to use names that exist.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"400":{"description":"Invalid data. An event name that does not exist answers `code: evento_desconocido`, with `unknown_events` (the names that do not exist) and `valid_events` (the ones you can subscribe to, the same as `GET /webhooks/events`); nothing is saved. Other invalid data answers 400 without that code.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, written for a person."},"code":{"type":"string","enum":["evento_desconocido"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"unknown_events":{"type":"array","items":{"type":"string"}},"valid_events":{"type":"array","items":{"type":"string"}}},"required":["error"]},"examples":{"evento_desconocido":{"summary":"evento_desconocido","value":{"error":"Unknown event…: …. Subscribe only to the events listed by GET /api/v1/webhooks/events (they are also in valid_events).","code":"evento_desconocido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"active":{"type":"boolean"},"description":{"type":["string","null"],"maxLength":200},"events":{"type":"array","maxItems":50,"items":{"type":"string","maxLength":80}}}}}}}},"delete":{"tags":["Webhooks"],"summary":"Stop notifying this endpoint","security":[{"tokenDeApi":["integracion.administrar"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Deleted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Ok"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/webhooks/{id}/deliveries":{"get":{"tags":["Webhooks"],"summary":"The latest deliveries to one endpoint","security":[{"tokenDeApi":["integracion.administrar"]}],"description":"One row per delivery attempt, and per test, newest first: the last 100 (kept 30 days). Each one says which event (`event`, and `event_id`, the `X-Signing-Flows-Event-Id` it carried), which `attempt` it was (each event is tried up to 5 times, with growing waits: 4 s, 16 s, 64 s, 4 min), what your endpoint answered (`http_status`, `response` cut at 500 characters, or `error` when there was no answer) and how long it took (`ms`). `test: true` is a `signingflows.test` event sent by a test or by `POST .../resume`. `skipped: true` was already queued when the endpoint paused: it was not sent and did not count as a failure.\n\n**Eight failed attempts in a row pause the endpoint on its own** (`paused_since` in `GET /webhooks`): while it is paused nothing is queued for it, so nothing piles up, and what happened in between is NOT sent later. `POST .../resume` brings it back.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The deliveries.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Entregas"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/webhooks/{id}/resume":{"post":{"tags":["Webhooks"],"summary":"Resume an endpoint that paused itself, and send it a test event","security":[{"tokenDeApi":["integracion.administrar","documento.leer"]}],"description":"An endpoint pauses itself after eight failed delivery attempts in a row. Resuming it clears the failures and sends a `signingflows.test` event right away; the answer says what your endpoint replied (`test`). Events that happened while it was paused are not sent: they were never queued. When the test event does not get through, `test.cause` names why (`dns`, `unreachable`, `timeout`, `tls_certificate`, `redirect`, `http_status`…) and `test.error` says it in one sentence; the status of your endpoint is in `test.http_status`.\n\nNo body: send none, or `{}`. A `Content-Type: application/json` with no body is fine too.\n\nLike switching one back on, it takes `documento.leer` besides `integracion.administrar`, and an endpoint that listens to `circuito.paquete` also takes `evidencia.leer`. Resuming one that is not paused only sends the test event.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Resumed; carries the answer to the test event (`test`). If the test event could not be sent, the endpoint is resumed all the same and `test.ok` is false, with `test.error` reading \"Resumed, but the test event was not sent: ...\".","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Reanudada"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/webhooks/{id}/rotate-secret":{"post":{"tags":["Webhooks"],"summary":"Get a new secret for an endpoint","security":[{"tokenDeApi":["integracion.administrar","documento.leer"]}],"description":"Replaces the secret of the endpoint and returns the new one, **once**, in the same shape as the answer of `POST /webhooks` (`id`, `secret`, `secret_note`). Deliveries that start from now on are signed with the new secret, queued ones included; a delivery already in flight may still go out signed with the previous one. Nothing else about the endpoint changes (URL, events, active or paused). No body: send none, or `{}` (a `Content-Type: application/json` with no body is fine too). Use it when the secret was lost, or when a copy of your automation that should not have it does. The audit log records that the secret changed, never the secret.\n\n**There is no grace period:** until your receiver has the new secret, deliveries fail its signature check, and after eight failed attempts in a row the endpoint pauses itself (`POST /webhooks/{id}/resume` brings it back). Update the receiver right after rotating.\n\nLike creating or resuming one, it takes `documento.leer` besides `integracion.administrar`, and an endpoint that listens to `circuito.paquete` also takes `evidencia.leer` (and a role that can read documents and evidence). An id that does not exist, or that is not in this account, answers 404 (no `code`).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"The new secret, shown once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SuscripcionCreada"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/webhooks/events":{"get":{"tags":["Webhooks"],"summary":"What you can subscribe to","security":[{"tokenDeApi":["integracion.administrar"]}],"description":"The same catalogue as `GET /event-types`, from the point of view of a subscription. It comes from the evidence record, not from a list kept next to it: an event that exists in a document shows up here on its own. Each entry carries `code`, `label` and `description` (the two are the same English description, the one webhooks send as `event_label`) and `category`; `type` and `what` repeat `code` and `label` for one more version.","responses":{"200":{"description":"The catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventosSuscribibles"}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/agent/pair":{"post":{"tags":["Agent"],"summary":"The agent presents itself with its one-time pairing code","security":[],"description":"The company console shows a pairing code once (Integrations → Resident agent). The agent sends it here with its own fingerprint (`sha256:` and 64 hexadecimal characters, derived from an id that only the agent keeps) and its version. The code is the credential: this is the only call of the API that takes no token, because the agent has none yet. It works once and for 60 minutes; after that, and for a code that never existed, the answer is the same 409. At most 10 calls every 15 minutes per address. The fingerprint `sandbox:…` is the in-process agent of the sandbox and is refused here.\n\nThe answer carries the agent secret (`agent_secret`), once and with `Cache-Control: no-store`. Pairing an agent that was already paired (a new code from the console) issues a new secret, and the previous one stops working at once.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["code","fingerprint","version"],"properties":{"code":{"type":"string","maxLength":200,"example":"PAIR-7K2M-9QX4"},"fingerprint":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$","example":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"version":{"type":"string","maxLength":40,"example":"1.4.2"},"name":{"type":"string","maxLength":120}}}}}},"responses":{"200":{"description":"Paired; the body carries the agent secret, once.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenteEmparejado"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"The code does not exist, expired or was already used (without `code`: the answer is the same for all three).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."}},"required":["error"]}}}},"429":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}}}}},"/agent/heartbeat":{"post":{"tags":["Agent"],"summary":"The agent says it is alive","security":[{"tokenDeApi":["circuito.editar"],"secretoDelAgente":[]}],"description":"Updates the «last seen» of the paired agent in the company console. It needs the API token AND the agent secret (`X-Signing-Flows-Agent-Secret`), and the fingerprint of the paired agent: the secret is checked against that agent’s. Without the secret, with a wrong one, with another fingerprint, or for an agent switched off or paired before agents had a secret, the answer is the same 401 `code: agent_unauthorized`: pair the agent again. At most 120 calls a minute per address.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["fingerprint","version"],"properties":{"fingerprint":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$","example":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"version":{"type":"string","maxLength":40,"example":"1.4.2"}}}}}},"responses":{"200":{"description":"Noted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenteVisto"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"The API token is not valid (no `code`), or this agent is not accepted (`code: agent_unauthorized`): no secret, a wrong secret, another fingerprint, switched off, or paired before agents had a secret. The answer does not say which. Pair the agent again.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["agent_unauthorized"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"agent_unauthorized":{"summary":"agent_unauthorized","value":{"error":"This agent is not paired with this installation, or its agent secret is not valid. Pair it again from the company console.","code":"agent_unauthorized"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"429":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}}}}},"/agent/filed":{"post":{"tags":["Agent"],"summary":"The signed file was written back to SharePoint","security":[{"tokenDeApi":["circuito.editar"],"secretoDelAgente":[]}],"description":"Records the event `entrega.archivada` («Filed back to SharePoint») in the evidence record of the document, with the destination (`sharepoint`), the site, the path in the library, the SHA-256 of the file written, and the paired agent.\n\nNothing is recorded that is not true: the agent has to be the paired one, with its fingerprint and its secret in `X-Signing-Flows-Agent-Secret` (otherwise 401 `agent_unauthorized`, the same answer whatever the reason), the document has to be of this account and completed (409 `not_completed`), and the hash has to be the SHA-256 of the signed file this installation serves (409 `hash_mismatch`). The same document and hash are recorded once: a retry answers `recorded: false`. The event is visible to the account that owns the document, in the document and in Follow up; a signer never sees it, and it is not in the completion report, which is issued once, when the document completes.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["document_id","destination","site","path","sha256","fingerprint"],"properties":{"document_id":{"type":"string","format":"uuid","description":"The `document_id` of the workflow."},"destination":{"type":"string","enum":["sharepoint"]},"site":{"type":"string","maxLength":300,"example":"https://tenant.sharepoint.example/sites/legal"},"path":{"type":"string","maxLength":500,"example":"Shared Documents/Contracts/Lease agreement.pdf"},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$","example":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"fingerprint":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$","example":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}}}}}},"responses":{"200":{"description":"Recorded, or already recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgenteArchivo"}}}},"400":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"401":{"description":"The API token is not valid (no `code`), or this agent is not accepted (`code: agent_unauthorized`): no secret, a wrong secret, another fingerprint, switched off, or paired before agents had a secret. The answer does not say which. Pair the agent again.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["agent_unauthorized"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"agent_unauthorized":{"summary":"agent_unauthorized","value":{"error":"This agent is not paired with this installation, or its agent secret is not valid. Pair it again from the company console.","code":"agent_unauthorized"}}}}}},"403":{"description":"The token is not allowed to do this. When it lacks the scope this operation asks for, the body carries `code: insufficient_scope` and `scope` with the one that is missing (`GET /me` lists the ones it has). When the person behind the token lacks the permission in the account (their role), it carries `code: sin_permiso` and `permission` with the one that is missing. A token that has no owner any more is refused with a 403 too, without `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What the token cannot do, and which scopes it has, written for a person."},"code":{"type":"string","enum":["insufficient_scope","sin_permiso","medio_fuera_de_la_politica_de_la_cuenta","descarga_no_permitida","paquete_sin_lectura"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."},"scope":{"type":"string","description":"The scope that is missing, as `resource.action` — e.g. `circuito.enviar`."},"permission":{"type":"string","description":"With `sin_permiso`: the permission of the role that is missing, as `resource.action` — e.g. `circuito.enviar`."}},"required":["error"]},"examples":{"medio_fuera_de_la_politica_de_la_cuenta":{"summary":"medio_fuera_de_la_politica_de_la_cuenta","value":{"error":"The account policy does not allow this method.","code":"medio_fuera_de_la_politica_de_la_cuenta"}},"descarga_no_permitida":{"summary":"descarga_no_permitida","value":{"error":"The sender did not allow you to download this document. You can still view it.","code":"descarga_no_permitida"}},"paquete_sin_lectura":{"summary":"paquete_sin_lectura","value":{"error":"The text varies; compare the `code`.","code":"paquete_sin_lectura"}},"insufficient_scope":{"summary":"insufficient_scope","value":{"error":"This API token is not allowed to cancel circuito. Its scopes are: documento.leer.","code":"insufficient_scope"}},"sin_permiso":{"summary":"sin_permiso","value":{"error":"The text varies; compare the `code`.","code":"sin_permiso"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"409":{"description":"Nothing was recorded: the document is not completed, or the hash is not the signed file’s.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What stops it, and what to do, written for a person."},"code":{"type":"string","enum":["not_completed","hash_mismatch"],"description":"Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal."}},"required":["error"]},"examples":{"not_completed":{"summary":"not_completed","value":{"error":"The document is not completed yet: there is no signed file to file back.","code":"not_completed"}},"hash_mismatch":{"summary":"hash_mismatch","value":{"error":"The hash does not match the signed document of this installation. Nothing was recorded.","code":"hash_mismatch"}}}}}},"429":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}}}}},"/event-types":{"get":{"tags":["Evidence"],"summary":"The event vocabulary of the evidence record","description":"The codes that can show up in `evidencia.eventos[].codigo`, with their category and their weight. It is there so you can build your mapping BEFORE the first document, instead of discovering the rare ones — a rejection, an extension — months later and in production.\n\nThe ones marked `contractual` are never renamed and never removed, and their `categoria` does not change: a database trigger enforces that, not a convention. **New codes DO get added**, so a consumer has to IGNORE the ones it does not know instead of failing — if it fails, every new fact we record breaks its integration.","responses":{"200":{"description":"The vocabulary.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vocabulario"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/events":{"get":{"tags":["Webhooks"],"summary":"The catalogue of events, as a contract","description":"Every event the product sends out (webhooks and the SIEM feed), each with its stable `name`, the `version` of its schema, a description and the JSON Schema of the body a receiver gets. It is the same for every account and carries no data of yours: it needs a valid token and no scope.\n\nVersion policy: adding optional keys does not change the version, so ignore the keys you do not know. Removing or renaming a key, or changing its type, publishes a new version; the previous one stays here, marked with `retired_after`, for at least 12 months. `GET /event-types` is the evidence vocabulary with categories and weights; this one is the schema of what travels.","responses":{"200":{"description":"The catalogue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogoDeEventos"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}},"/events/{name}":{"get":{"tags":["Webhooks"],"summary":"The schema of one event","description":"The schema of one event by its stable name (for example `firma.aplicada`). Without `version` you get the current one; with `?version=` you get that one, while the catalogue still keeps it. Same rules as `GET /events`: a valid token, no scope, nothing of any account.","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"name":"version","in":"query","required":false,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"The event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventoDelCatalogo"}}}},"401":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"403":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"404":{"description":"Something did not work. The body carries `error` with the explanation, written for a person; a refusal a program can act on also carries `code`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"What went wrong, and usually what to do about it."},"code":{"type":"string","description":"The name of the refusal, when it has one. Compare it; do not parse `error`. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal. Stable: compare it, do not parse `error`. A later version can add codes: treat an unknown one like a plain refusal.","enum":["por_asignar_solo_firmantes","por_asignar_en_copias","por_asignar_con_persona","filas_invalidas","sin_tabla","grupo_sin_codigo_de_acceso","grupo_minimo_solo_en_grupo","medio_invalido"]}},"required":["error"]},"examples":{"por_asignar_solo_firmantes":{"summary":"por_asignar_solo_firmantes","value":{"error":"Only a signer’s place can be reserved without a person.","code":"por_asignar_solo_firmantes"}},"por_asignar_en_copias":{"summary":"por_asignar_en_copias","value":{"error":"In a separate-copies send-out each recipient is a row of the list: there is no place to reserve.","code":"por_asignar_en_copias"}},"por_asignar_con_persona":{"summary":"por_asignar_con_persona","value":{"error":"A place to be assigned later has no email or name yet: name the person with Assign.","code":"por_asignar_con_persona"}},"filas_invalidas":{"summary":"filas_invalidas","value":{"error":"These rows cannot go in: …. Nobody was added.","code":"filas_invalidas"}},"sin_tabla":{"summary":"sin_tabla","value":{"error":"The first row needs titles, with a column of email addresses.","code":"sin_tabla"}},"grupo_sin_codigo_de_acceso":{"summary":"grupo_sin_codigo_de_acceso","value":{"error":"An access code is for one person; a group place cannot share one among its members.","code":"grupo_sin_codigo_de_acceso"}},"grupo_minimo_solo_en_grupo":{"summary":"grupo_minimo_solo_en_grupo","value":{"error":"How many must sign is set on a group place; this place is not a group.","code":"grupo_minimo_solo_en_grupo"}},"medio_invalido":{"summary":"medio_invalido","value":{"error":"Unknown way of identifying. Choose among email code, password, digital identity, wallet, local token and provider.","code":"medio_invalido"}}}}}},"429":{"description":"Too many requests. Either this token went over its limit (300 requests a minute) or the address the requests come from went over its own (600 a minute). `Retry-After` says how many seconds to wait; `GET /me` and the other reads are counted like any other call. The body carries `error` and, for now, no `code`.","headers":{"Retry-After":{"description":"Seconds until the window opens again.","schema":{"type":"integer","minimum":1}}},"content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}},"required":["error"]}}}}}}}},"webhooks":{"campos.ubicados_por_etiqueta":{"post":{"tags":["Webhooks"],"summary":"Fields and signatures were placed by the tags written in the document","description":"What your endpoint receives when `campos.ubicados_por_etiqueta` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/campos.ubicados_por_etiqueta`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Fields and signatures were placed by the tags written in the document","event":"campos.ubicados_por_etiqueta","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"token":"7c9e6679-7425-40de-944b-e07fc1f90a32","huella_archivo_base":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","encontradas":1,"ignoradas":0,"ubicadas":[{"codigo":"sig_1","etiqueta":"[[sig_1]]","hoja":1,"x":72,"y":640,"ancho":160,"alto":48}],"ignoradas_etiquetas":[]},"evento":"campos.ubicados_por_etiqueta","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"token":"7c9e6679-7425-40de-944b-e07fc1f90a32","huella_archivo_base":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","encontradas":1,"ignoradas":0,"ubicadas":[{"codigo":"sig_1","etiqueta":"[[sig_1]]","hoja":1,"x":72,"y":640,"ancho":160,"alto":48}],"ignoradas_etiquetas":[]}}}}},"responses":{"2XX":{"description":"Received."}}}},"certificado.emitido":{"post":{"tags":["Webhooks"],"summary":"Completion certificate issued","description":"What your endpoint receives when `certificado.emitido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/certificado.emitido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Completion certificate issued","event":"certificado.emitido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","version_plantilla":19,"cadena_ok":true},"evento":"certificado.emitido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","version_plantilla":19,"cadena_ok":true}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.cancelado":{"post":{"tags":["Webhooks"],"summary":"Circuit cancelled","description":"What your endpoint receives when `circuito.cancelado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.cancelado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Circuit cancelled","event":"circuito.cancelado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"Superseded by a new version."},"evento":"circuito.cancelado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"Superseded by a new version."}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.copiado_de":{"post":{"tags":["Webhooks"],"summary":"Created as a copy of an earlier document","description":"What your endpoint receives when `circuito.copiado_de` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.copiado_de`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Created as a copy of an earlier document","event":"circuito.copiado_de","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"circuito_id":"7c9e6679-7425-40de-944b-e07fc1f90a35","instancia_id":"7c9e6679-7425-40de-944b-e07fc1f90a36","titulo":"Lease agreement","persona":"Ana Pérez","papel":"firmante","motivo":"The amount is wrong.","cuando":"2026-10-23T14:02:11Z"},"evento":"circuito.copiado_de","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"circuito_id":"7c9e6679-7425-40de-944b-e07fc1f90a35","instancia_id":"7c9e6679-7425-40de-944b-e07fc1f90a36","titulo":"Lease agreement","persona":"Ana Pérez","papel":"firmante","motivo":"The amount is wrong.","cuando":"2026-10-23T14:02:11Z"}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.completo":{"post":{"tags":["Webhooks"],"summary":"Workflow completed","description":"What your endpoint receives when `circuito.completo` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.completo`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Workflow completed","event":"circuito.completo","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"titulo":"Lease agreement","firmas":2,"politica":"bloqueante","cerrado_por":"firmas"},"evento":"circuito.completo","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"titulo":"Lease agreement","firmas":2,"politica":"bloqueante","cerrado_por":"firmas"}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.despachado":{"post":{"tags":["Webhooks"],"summary":"Sent for signature","description":"What your endpoint receives when `circuito.despachado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.despachado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Sent for signature","event":"circuito.despachado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"modo":"paralelo","nivel_firma":"simple","firmantes":2,"dias_vigencia":30},"evento":"circuito.despachado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"modo":"paralelo","nivel_firma":"simple","firmantes":2,"dias_vigencia":30}}}}},"responses":{"2XX":{"description":"Received."}}}},"dosier.conformado":{"post":{"tags":["Webhooks"],"summary":"The dossier was formed: the closed list of its documents","description":"What your endpoint receives when `dosier.conformado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/dosier.conformado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The dossier was formed: the closed list of its documents","event":"dosier.conformado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"dosier_id":"7c9e6679-7425-40de-944b-e07fc1f90a37","n":2,"orden":1,"hermanos":[{"orden":1,"sha256_base":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"orden":2,"sha256_base":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}]},"evento":"dosier.conformado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"dosier_id":"7c9e6679-7425-40de-944b-e07fc1f90a37","n":2,"orden":1,"hermanos":[{"orden":1,"sha256_base":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"orden":2,"sha256_base":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}]}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.paquete":{"post":{"tags":["Webhooks"],"summary":"Completion package: the signed document and the completion report","description":"What your endpoint receives when `circuito.paquete` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. This event is sent as `multipart/form-data`: the JSON below is its `evento` part, next to the files. The whole schema is `GET /events/circuito.paquete`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Completion package: the signed document and the completion report","event":"circuito.paquete","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"titulo":"Lease agreement","firmas":2},"document_file":{"name":"Lease agreement.pdf","mime":"application/pdf","bytes":583,"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"report":{"name":"Lease agreement - completion report.pdf","mime":"application/pdf","bytes":1204,"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"report_omitted_because":null,"evento":"circuito.paquete","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"titulo":"Lease agreement","firmas":2},"documento":{"nombre":"Lease agreement.pdf","mime":"application/pdf","bytes":583,"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"informe":{"nombre":"Lease agreement - completion report.pdf","mime":"application/pdf","bytes":1204,"sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"informe_omitido_porque":null}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.prorrogado":{"post":{"tags":["Webhooks"],"summary":"Deadline extended","description":"What your endpoint receives when `circuito.prorrogado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.prorrogado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Deadline extended","event":"circuito.prorrogado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"dias":7,"vencia_en":"2026-11-22T00:00:00Z","vence_en":"2026-11-29T00:00:00Z","prorrogas_usadas":1},"evento":"circuito.prorrogado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"dias":7,"vencia_en":"2026-11-22T00:00:00Z","vence_en":"2026-11-29T00:00:00Z","prorrogas_usadas":1}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.rechazado":{"post":{"tags":["Webhooks"],"summary":"Signing workflow ended as declined","description":"What your endpoint receives when `circuito.rechazado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.rechazado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Signing workflow ended as declined","event":"circuito.rechazado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"politica":"bloqueante","cerrado_por":"rechazo"},"evento":"circuito.rechazado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"politica":"bloqueante","cerrado_por":"rechazo"}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.vencido":{"post":{"tags":["Webhooks"],"summary":"Deadline expired","description":"What your endpoint receives when `circuito.vencido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.vencido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Deadline expired","event":"circuito.vencido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"instancias_vencidas":1,"participaciones_cerradas":2},"evento":"circuito.vencido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"instancias_vencidas":1,"participaciones_cerradas":2}}}}},"responses":{"2XX":{"description":"Received."}}}},"consentimiento.dado":{"post":{"tags":["Webhooks"],"summary":"Consent to sign electronically","description":"What your endpoint receives when `consentimiento.dado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/consentimiento.dado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Consent to sign electronically","event":"consentimiento.dado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"texto_aceptado":"I agree to sign this document electronically. My signature is recorded with the evidence of this process.","idioma":"en","version":2},"evento":"consentimiento.dado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"texto_aceptado":"I agree to sign this document electronically. My signature is recorded with the evidence of this process.","idioma":"en","version":2}}}}},"responses":{"2XX":{"description":"Received."}}}},"correo.baja_del_destinatario":{"post":{"tags":["Webhooks"],"summary":"The recipient unsubscribed from emails","description":"What your endpoint receives when `correo.baja_del_destinatario` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/correo.baja_del_destinatario`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The recipient unsubscribed from emails","event":"correo.baja_del_destinatario","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"email","proveedor":"brevo","message_id":"msg-20261023140211-7f3a91","destino":"an***@example.com","motivo_proveedor":"unsubscribed"},"evento":"correo.baja_del_destinatario","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"email","proveedor":"brevo","message_id":"msg-20261023140211-7f3a91","destino":"an***@example.com","motivo_proveedor":"unsubscribed"}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.abierto":{"post":{"tags":["Webhooks"],"summary":"Document opened","description":"What your endpoint receives when `documento.abierto` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.abierto`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Document opened","event":"documento.abierto","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"papel":"firmante"},"evento":"documento.abierto","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"papel":"firmante"}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.abierto_por_enlace":{"post":{"tags":["Webhooks"],"summary":"Somebody opened the shared link","description":"What your endpoint receives when `documento.abierto_por_enlace` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.abierto_por_enlace`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Somebody opened the shared link","event":"documento.abierto_por_enlace","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"aviso":"A link preview from a messaging or mail client counts as an opening."},"evento":"documento.abierto_por_enlace","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"aviso":"A link preview from a messaging or mail client counts as an opening."}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.abierto_por_la_cuenta_madre":{"post":{"tags":["Webhooks"],"summary":"Opened by the parent account","description":"What your endpoint receives when `documento.abierto_por_la_cuenta_madre` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.abierto_por_la_cuenta_madre`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Opened by the parent account","event":"documento.abierto_por_la_cuenta_madre","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"proposito":"ver","cuenta_madre_id":"7c9e6679-7425-40de-944b-e07fc1f90a47","cuenta_madre":"Purple Corp Global","quien":"Ana Pérez","firmado":false},"evento":"documento.abierto_por_la_cuenta_madre","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"proposito":"ver","cuenta_madre_id":"7c9e6679-7425-40de-944b-e07fc1f90a47","cuenta_madre":"Purple Corp Global","quien":"Ana Pérez","firmado":false}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.campo_completado":{"post":{"tags":["Webhooks"],"summary":"A document field was filled","description":"What your endpoint receives when `documento.campo_completado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.campo_completado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A document field was filled","event":"documento.campo_completado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"campo":"company_name","automatico":false,"sha256_valor":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","huella_v":2,"kid":"k-2026-10"},"evento":"documento.campo_completado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"campo":"company_name","automatico":false,"sha256_valor":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","huella_v":2,"kid":"k-2026-10"}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.campos_congelados":{"post":{"tags":["Webhooks"],"summary":"Fields were frozen before signing","description":"What your endpoint receives when `documento.campos_congelados` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.campos_congelados`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Fields were frozen before signing","event":"documento.campos_congelados","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"campos":3},"evento":"documento.campos_congelados","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"campos":3}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.codigo_de_acceso_reiniciado":{"post":{"tags":["Webhooks"],"summary":"The sender set a new access code","description":"What your endpoint receives when `documento.codigo_de_acceso_reiniciado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.codigo_de_acceso_reiniciado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The sender set a new access code","event":"documento.codigo_de_acceso_reiniciado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{},"evento":"documento.codigo_de_acceso_reiniciado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.codigo_de_acceso_trabado":{"post":{"tags":["Webhooks"],"summary":"The access code was locked after failed attempts","description":"What your endpoint receives when `documento.codigo_de_acceso_trabado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.codigo_de_acceso_trabado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The access code was locked after failed attempts","event":"documento.codigo_de_acceso_trabado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"intentos":5},"evento":"documento.codigo_de_acceso_trabado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"intentos":5}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.codigo_de_acceso_verificado":{"post":{"tags":["Webhooks"],"summary":"Entered the correct access code","description":"What your endpoint receives when `documento.codigo_de_acceso_verificado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.codigo_de_acceso_verificado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Entered the correct access code","event":"documento.codigo_de_acceso_verificado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"intentos":2},"evento":"documento.codigo_de_acceso_verificado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"intentos":2}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.compartido":{"post":{"tags":["Webhooks"],"summary":"Document shared by link","description":"What your endpoint receives when `documento.compartido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.compartido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Document shared by link","event":"documento.compartido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"expira_en":"2026-10-30T14:02:11Z","dias":7,"motivo":null},"evento":"documento.compartido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"expira_en":"2026-10-30T14:02:11Z","dias":7,"motivo":null}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.conversion_fallida":{"post":{"tags":["Webhooks"],"summary":"Conversion to PDF/A was requested and not done (Beta)","description":"What your endpoint receives when `documento.conversion_fallida` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.conversion_fallida`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Conversion to PDF/A was requested and not done (Beta)","event":"documento.conversion_fallida","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"beta":true,"perfil":"PDF/A-2b","de":"docx","por":"platform","motivo":"conversion_apagada_por_la_cuenta","detalle":null},"evento":"documento.conversion_fallida","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"beta":true,"perfil":"PDF/A-2b","de":"docx","por":"platform","motivo":"conversion_apagada_por_la_cuenta","detalle":null}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.convertido":{"post":{"tags":["Webhooks"],"summary":"Converted to PDF/A (Beta): the copy is the document to sign","description":"What your endpoint receives when `documento.convertido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.convertido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Converted to PDF/A (Beta): the copy is the document to sign","event":"documento.convertido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"beta":true,"perfil":"PDF/A-2b","de":"docx","herramienta":"libreoffice","version":"7.6","por":"platform","ms":1840,"sha256_original":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","bytes_original":4120,"nombre_original":"Lease agreement.docx","archivo_original_id":"7c9e6679-7425-40de-944b-e07fc1f90a45","sha256_copia":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","perdido":[]},"evento":"documento.convertido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"beta":true,"perfil":"PDF/A-2b","de":"docx","herramienta":"libreoffice","version":"7.6","por":"platform","ms":1840,"sha256_original":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","bytes_original":4120,"nombre_original":"Lease agreement.docx","archivo_original_id":"7c9e6679-7425-40de-944b-e07fc1f90a45","sha256_copia":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","perdido":[]}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.copiado":{"post":{"tags":["Webhooks"],"summary":"A copy was created for a recipient","description":"What your endpoint receives when `documento.copiado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.copiado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A copy was created for a recipient","event":"documento.copiado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"titulo":"Lease agreement","para":"an***@example.com"},"evento":"documento.copiado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"titulo":"Lease agreement","para":"an***@example.com"}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.descargado":{"post":{"tags":["Webhooks"],"summary":"Document downloaded","description":"What your endpoint receives when `documento.descargado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.descargado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Document downloaded","event":"documento.descargado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"archivo":"original","firmado":false},"evento":"documento.descargado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"archivo":"original","firmado":false}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.procesado_por_agente":{"post":{"tags":["Webhooks"],"summary":"The document was processed by the company resident agent","description":"What your endpoint receives when `documento.procesado_por_agente` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.procesado_por_agente`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The document was processed by the company resident agent","event":"documento.procesado_por_agente","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"agente_id":"7c9e6679-7425-40de-944b-e07fc1f90a31","agente":"Legal team agent","huella":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","version":"1.4.2","simulado":false,"sede":"agente"},"evento":"documento.procesado_por_agente","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"agente_id":"7c9e6679-7425-40de-944b-e07fc1f90a31","agente":"Legal team agent","huella":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","version":"1.4.2","simulado":false,"sede":"agente"}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.sellado":{"post":{"tags":["Webhooks"],"summary":"Document timestamped by an authority","description":"What your endpoint receives when `documento.sellado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.sellado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Document timestamped by an authority","event":"documento.sellado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"autoridad":"Example TSA","politica":"1.2.3.4.1","serie":"4F2A91","sellado_en":"2026-10-23T14:02:11Z","cualificado":false,"alcance":"Existence of the file at that time. No signature was made."},"evento":"documento.sellado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"autoridad":"Example TSA","politica":"1.2.3.4.1","serie":"4F2A91","sellado_en":"2026-10-23T14:02:11Z","cualificado":false,"alcance":"Existence of the file at that time. No signature was made."}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.subido":{"post":{"tags":["Webhooks"],"summary":"Document uploaded","description":"What your endpoint receives when `documento.subido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.subido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Document uploaded","event":"documento.subido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"titulo":"Lease agreement","nombre_archivo":"Lease agreement.pdf","bytes":583,"reutilizo_archivo":false},"evento":"documento.subido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"titulo":"Lease agreement","nombre_archivo":"Lease agreement.pdf","bytes":583,"reutilizo_archivo":false}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.visto":{"post":{"tags":["Webhooks"],"summary":"Document viewed in full","description":"What your endpoint receives when `documento.visto` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.visto`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Document viewed in full","event":"documento.visto","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"firmado":false},"evento":"documento.visto","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"firmado":false}}}}},"responses":{"2XX":{"description":"Received."}}}},"enlace.obtenido_por_el_emisor":{"post":{"tags":["Webhooks"],"summary":"The sender obtained the personal signing link to deliver it themselves","description":"What your endpoint receives when `enlace.obtenido_por_el_emisor` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/enlace.obtenido_por_el_emisor`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The sender obtained the personal signing link to deliver it themselves","event":"enlace.obtenido_por_el_emisor","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"manual","metodo":"enlace_entregado_por_el_emisor","destino":"an***@example.com","advertencia":"el emisor obtuvo el enlace personal de firma"},"evento":"enlace.obtenido_por_el_emisor","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"manual","metodo":"enlace_entregado_por_el_emisor","destino":"an***@example.com","advertencia":"el emisor obtuvo el enlace personal de firma"}}}}},"responses":{"2XX":{"description":"Received."}}}},"entrega.archivada":{"post":{"tags":["Webhooks"],"summary":"Filed back to SharePoint","description":"What your endpoint receives when `entrega.archivada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/entrega.archivada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Filed back to SharePoint","event":"entrega.archivada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"destino":"sharepoint","sitio":"https://tenant.sharepoint.example/sites/legal","ruta":"Shared Documents/Contracts/Lease agreement.pdf","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","agente_id":"7c9e6679-7425-40de-944b-e07fc1f90a31","agente":"Legal team agent","huella":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","version":"1.4.2","archivado_en":"2026-10-23T14:02:11Z"},"evento":"entrega.archivada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"destino":"sharepoint","sitio":"https://tenant.sharepoint.example/sites/legal","ruta":"Shared Documents/Contracts/Lease agreement.pdf","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","agente_id":"7c9e6679-7425-40de-944b-e07fc1f90a31","agente":"Legal team agent","huella":"sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","version":"1.4.2","archivado_en":"2026-10-23T14:02:11Z"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.aplicada":{"post":{"tags":["Webhooks"],"summary":"Signature applied","description":"What your endpoint receives when `firma.aplicada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.aplicada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Signature applied","event":"firma.aplicada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"nivel_firma":"simple","nivel_firma_obtenido":"simple","mecanismo_exigido":"consentimiento","mecanismo_usado":"consentimiento","representacion_visual":"Ana Pérez","sello":"plataforma","proveedor_codigo":"plataforma","titular_certificado":null,"sellado_pades":true,"subfiltro":"ETSI.CAdES.detached","firmas_en_el_documento":1},"evento":"firma.aplicada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"nivel_firma":"simple","nivel_firma_obtenido":"simple","mecanismo_exigido":"consentimiento","mecanismo_usado":"consentimiento","representacion_visual":"Ana Pérez","sello":"plataforma","proveedor_codigo":"plataforma","titular_certificado":null,"sellado_pades":true,"subfiltro":"ETSI.CAdES.detached","firmas_en_el_documento":1}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.fuera_de_turno":{"post":{"tags":["Webhooks"],"summary":"A request to sign before their turn was rejected","description":"What your endpoint receives when `firma.fuera_de_turno` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.fuera_de_turno`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A request to sign before their turn was rejected","event":"firma.fuera_de_turno","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"no_es_su_turno","pedido":"firmar","orden":2,"turno_actual":1},"evento":"firma.fuera_de_turno","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"no_es_su_turno","pedido":"firmar","orden":2,"turno_actual":1}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.grupo_ya_resuelto":{"post":{"tags":["Webhooks"],"summary":"A group member arrived after the place was already resolved","description":"What your endpoint receives when `firma.grupo_ya_resuelto` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.grupo_ya_resuelto`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A group member arrived after the place was already resolved","event":"firma.grupo_ya_resuelto","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"posicion":2,"pedido":"firmar"},"evento":"firma.grupo_ya_resuelto","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"posicion":2,"pedido":"firmar"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.identificado_con_certificado":{"post":{"tags":["Webhooks"],"summary":"The signer identified with their certificate at the provider","description":"What your endpoint receives when `firma.identificado_con_certificado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.identificado_con_certificado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The signer identified with their certificate at the provider","event":"firma.identificado_con_certificado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"proveedor_codigo":"trident","conector":"trident-uat","via":"certificado","titular":"ANA PEREZ","nivel_garantia_afirmado":"sustancial","huella_certificado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","identificado_en":"2026-10-23T14:02:11Z"},"evento":"firma.identificado_con_certificado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"proveedor_codigo":"trident","conector":"trident-uat","via":"certificado","titular":"ANA PEREZ","nivel_garantia_afirmado":"sustancial","huella_certificado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","identificado_en":"2026-10-23T14:02:11Z"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.marca_movida":{"post":{"tags":["Webhooks"],"summary":"The signer moved where their signature is stamped","description":"What your endpoint receives when `firma.marca_movida` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.marca_movida`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The signer moved where their signature is stamped","event":"firma.marca_movida","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"tipo_marca":"signature","pagina":1,"desde":{"x":72,"y":640},"hasta":{"x":96,"y":612}},"evento":"firma.marca_movida","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"tipo_marca":"signature","pagina":1,"desde":{"x":72,"y":640},"hasta":{"x":96,"y":612}}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.marca_redimensionada":{"post":{"tags":["Webhooks"],"summary":"The signer changed the size of their signature","description":"What your endpoint receives when `firma.marca_redimensionada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.marca_redimensionada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The signer changed the size of their signature","event":"firma.marca_redimensionada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"tipo_marca":"signature","pagina":1,"desde":{"ancho":160,"alto":48},"hasta":{"ancho":200,"alto":60}},"evento":"firma.marca_redimensionada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"tipo_marca":"signature","pagina":1,"desde":{"ancho":160,"alto":48},"hasta":{"ancho":200,"alto":60}}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.mecanismo_rechazado":{"post":{"tags":["Webhooks"],"summary":"A request to sign with a mechanism the policy does not allow was rejected","description":"What your endpoint receives when `firma.mecanismo_rechazado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.mecanismo_rechazado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A request to sign with a mechanism the policy does not allow was rejected","event":"firma.mecanismo_rechazado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"mecanismo_pedido":"consentimiento","mecanismo_exigido":"certificado","motivo":"politica_exige_otro_mecanismo"},"evento":"firma.mecanismo_rechazado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"mecanismo_pedido":"consentimiento","mecanismo_exigido":"certificado","motivo":"politica_exige_otro_mecanismo"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.rechazada":{"post":{"tags":["Webhooks"],"summary":"Signature refused","description":"What your endpoint receives when `firma.rechazada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.rechazada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Signature refused","event":"firma.rechazada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"The amount is wrong."},"evento":"firma.rechazada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"The amount is wrong."}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.representacion_visual":{"post":{"tags":["Webhooks"],"summary":"Visual representation of the signature was stamped","description":"What your endpoint receives when `firma.representacion_visual` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.representacion_visual`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Visual representation of the signature was stamped","event":"firma.representacion_visual","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"estampada":true,"marcas":1,"paginas":[1],"imagenes":[{"tipo":"firma","id":"7c9e6679-7425-40de-944b-e07fc1f90a46","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}],"estampa":{"estilo":"clasico","lleva":["trazo","nombre"],"omitidas":[],"sueltos":[],"logo_sha256":null,"motivo_sin_logo":null,"qr":null,"motivo_sin_qr":null,"notas":[]},"detalle":[{"tipo":"firma","pagina":1,"dibujada":true,"lleva":["trazo","nombre"]}],"error_de_dibujo":null,"nombre_escrito":"Ana Pérez"},"evento":"firma.representacion_visual","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"estampada":true,"marcas":1,"paginas":[1],"imagenes":[{"tipo":"firma","id":"7c9e6679-7425-40de-944b-e07fc1f90a46","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}],"estampa":{"estilo":"clasico","lleva":["trazo","nombre"],"omitidas":[],"sueltos":[],"logo_sha256":null,"motivo_sin_logo":null,"qr":null,"motivo_sin_qr":null,"notas":[]},"detalle":[{"tipo":"firma","pagina":1,"dibujada":true,"lleva":["trazo","nombre"]}],"error_de_dibujo":null,"nombre_escrito":"Ana Pérez"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.sellada":{"post":{"tags":["Webhooks"],"summary":"Signature timestamped by an external authority","description":"What your endpoint receives when `firma.sellada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.sellada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Signature timestamped by an external authority","event":"firma.sellada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"autoridad":"Example TSA","politica":"1.2.3.4.1","numero_serie":"4F2A91","cualificado":false,"autoridad_de_prueba":true,"sellado_en":"2026-10-23T14:02:11Z","desvio_segundos":0},"evento":"firma.sellada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"autoridad":"Example TSA","politica":"1.2.3.4.1","numero_serie":"4F2A91","cualificado":false,"autoridad_de_prueba":true,"sellado_en":"2026-10-23T14:02:11Z","desvio_segundos":0}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.traspaso_pedido":{"post":{"tags":["Webhooks"],"summary":"Asked for someone else to sign","description":"What your endpoint receives when `firma.traspaso_pedido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.traspaso_pedido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Asked for someone else to sign","event":"firma.traspaso_pedido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"I am on leave.","sugerido_nombre":"Luis Gómez","sugerido_email":"lu***@example.com"},"evento":"firma.traspaso_pedido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"I am on leave.","sugerido_nombre":"Luis Gómez","sugerido_email":"lu***@example.com"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.uso_de_clave_autorizado":{"post":{"tags":["Webhooks"],"summary":"The signer authorised the use of their key for this signature at the provider","description":"What your endpoint receives when `firma.uso_de_clave_autorizado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.uso_de_clave_autorizado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The signer authorised the use of their key for this signature at the provider","event":"firma.uso_de_clave_autorizado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"proveedor_codigo":"trident","conector":"trident-uat","via":"certificado","credencial":"cred-7f3a91","scal":"SCAL2","autorizado_en":"2026-10-23T14:02:11Z"},"evento":"firma.uso_de_clave_autorizado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"proveedor_codigo":"trident","conector":"trident-uat","via":"certificado","credencial":"cred-7f3a91","scal":"SCAL2","autorizado_en":"2026-10-23T14:02:11Z"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.viaje_rechazado":{"post":{"tags":["Webhooks"],"summary":"A return from the provider that reached another browser was rejected","description":"What your endpoint receives when `firma.viaje_rechazado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.viaje_rechazado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A return from the provider that reached another browser was rejected","event":"firma.viaje_rechazado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"otro_navegador","viaje":"signing","proveedor":"trident"},"evento":"firma.viaje_rechazado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"otro_navegador","viaje":"signing","proveedor":"trident"}}}}},"responses":{"2XX":{"description":"Received."}}}},"grupo.congelado":{"post":{"tags":["Webhooks"],"summary":"The list of the group holding a place was frozen","description":"What your endpoint receives when `grupo.congelado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/grupo.congelado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The list of the group holding a place was frozen","event":"grupo.congelado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"grupo":"7c9e6679-7425-40de-944b-e07fc1f90a33","grupo_nombre":"Legal team","posicion":2,"nombre_papel":"Legal review","cantidad":3,"minimo":1,"al_rechazar":"detener","huella":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},"evento":"grupo.congelado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"grupo":"7c9e6679-7425-40de-944b-e07fc1f90a33","grupo_nombre":"Legal team","posicion":2,"nombre_papel":"Legal review","cantidad":3,"minimo":1,"al_rechazar":"detener","huella":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}}}}},"responses":{"2XX":{"description":"Received."}}}},"grupo.firmo_por_todos":{"post":{"tags":["Webhooks"],"summary":"Signed on behalf of the group: the place is signed","description":"What your endpoint receives when `grupo.firmo_por_todos` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/grupo.firmo_por_todos`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Signed on behalf of the group: the place is signed","event":"grupo.firmo_por_todos","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"grupo":"7c9e6679-7425-40de-944b-e07fc1f90a33","grupo_nombre":"Legal team","posicion":2,"nombre_papel":"Legal review","minimo":1,"huella":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","firmaron":[{"quien":"7c9e6679-7425-40de-944b-e07fc1f90a38","email":"lu***@example.com","asiento":1}]},"evento":"grupo.firmo_por_todos","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"grupo":"7c9e6679-7425-40de-944b-e07fc1f90a33","grupo_nombre":"Legal team","posicion":2,"nombre_papel":"Legal review","minimo":1,"huella":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","firmaron":[{"quien":"7c9e6679-7425-40de-944b-e07fc1f90a38","email":"lu***@example.com","asiento":1}]}}}}},"responses":{"2XX":{"description":"Received."}}}},"grupo.rechazo_de_miembro":{"post":{"tags":["Webhooks"],"summary":"A group member declined to sign","description":"What your endpoint receives when `grupo.rechazo_de_miembro` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/grupo.rechazo_de_miembro`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A group member declined to sign","event":"grupo.rechazo_de_miembro","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"I am not the right person.","grupo_nombre":"Legal team","posicion":2,"lugar_rechazado":false,"faltan":1,"pueden":2},"evento":"grupo.rechazo_de_miembro","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"I am not the right person.","grupo_nombre":"Legal team","posicion":2,"lugar_rechazado":false,"faltan":1,"pueden":2}}}}},"responses":{"2XX":{"description":"Received."}}}},"identidad.por_billetera":{"post":{"tags":["Webhooks"],"summary":"The signer identified by presenting attributes from their digital identity wallet","description":"What your endpoint receives when `identidad.por_billetera` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/identidad.por_billetera`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The signer identified by presenting attributes from their digital identity wallet","event":"identidad.por_billetera","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"identidad":"por_billetera","rechazada":true,"motivo":"identificador_distinto","sesion":"ses-4f2a91"},"evento":"identidad.por_billetera","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"identidad":"por_billetera","rechazada":true,"motivo":"identificador_distinto","sesion":"ses-4f2a91"}}}}},"responses":{"2XX":{"description":"Received."}}}},"identidad.probada":{"post":{"tags":["Webhooks"],"summary":"Signer identity proven","description":"What your endpoint receives when `identidad.probada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/identidad.probada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Signer identity proven","event":"identidad.probada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"metodo":"verificacion_email","nivel_garantia":"bajo","nivel_exigido":"bajo"},"evento":"identidad.probada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"metodo":"verificacion_email","nivel_garantia":"bajo","nivel_exigido":"bajo"}}}}},"responses":{"2XX":{"description":"Received."}}}},"instancia.rechazada":{"post":{"tags":["Webhooks"],"summary":"Document declined: a signer refused to sign","description":"What your endpoint receives when `instancia.rechazada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/instancia.rechazada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Document declined: a signer refused to sign","event":"instancia.rechazada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"politica":"bloqueante","firmaron":1,"motivo":"The amount is wrong."},"evento":"instancia.rechazada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"politica":"bloqueante","firmaron":1,"motivo":"The amount is wrong."}}}}},"responses":{"2XX":{"description":"Received."}}}},"lugar.asignado":{"post":{"tags":["Webhooks"],"summary":"The person for a reserved place was named","description":"What your endpoint receives when `lugar.asignado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/lugar.asignado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The person for a reserved place was named","event":"lugar.asignado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"posicion":2,"nombre_papel":"Legal review","para":"lu***@example.com","quien":"7c9e6679-7425-40de-944b-e07fc1f90a38","canal":"api","momento":"despues_del_envio"},"evento":"lugar.asignado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"posicion":2,"nombre_papel":"Legal review","para":"lu***@example.com","quien":"7c9e6679-7425-40de-944b-e07fc1f90a38","canal":"api","momento":"despues_del_envio"}}}}},"responses":{"2XX":{"description":"Received."}}}},"lugar.espera_asignacion":{"post":{"tags":["Webhooks"],"summary":"The turn reached a place with nobody named: it waits for someone to be named","description":"What your endpoint receives when `lugar.espera_asignacion` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/lugar.espera_asignacion`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The turn reached a place with nobody named: it waits for someone to be named","event":"lugar.espera_asignacion","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"posicion":2,"nombre_papel":"Legal review","turno":2},"evento":"lugar.espera_asignacion","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"posicion":2,"nombre_papel":"Legal review","turno":2}}}}},"responses":{"2XX":{"description":"Received."}}}},"notificacion.entregada":{"post":{"tags":["Webhooks"],"summary":"Notification delivered","description":"What your endpoint receives when `notificacion.entregada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/notificacion.entregada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Notification delivered","event":"notificacion.entregada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"email","proveedor":"brevo","message_id":"msg-20261023140211-7f3a91","destino":"an***@example.com"},"evento":"notificacion.entregada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"email","proveedor":"brevo","message_id":"msg-20261023140211-7f3a91","destino":"an***@example.com"}}}}},"responses":{"2XX":{"description":"Received."}}}},"notificacion.enviada":{"post":{"tags":["Webhooks"],"summary":"Notification sent","description":"What your endpoint receives when `notificacion.enviada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/notificacion.enviada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Notification sent","event":"notificacion.enviada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"email","destino":"an***@example.com","message_id":"msg-7f3a91","error":null,"en_su_turno":true},"evento":"notificacion.enviada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"email","destino":"an***@example.com","message_id":"msg-7f3a91","error":null,"en_su_turno":true}}}}},"responses":{"2XX":{"description":"Received."}}}},"notificacion.fallida":{"post":{"tags":["Webhooks"],"summary":"Notification could not be delivered","description":"What your endpoint receives when `notificacion.fallida` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/notificacion.fallida`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Notification could not be delivered","event":"notificacion.fallida","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"email","destino":"an***@example.com","message_id":null,"error":"There is no active email connection."},"evento":"notificacion.fallida","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"email","destino":"an***@example.com","message_id":null,"error":"There is no active email connection."}}}}},"responses":{"2XX":{"description":"Received."}}}},"notificacion.no_entregada":{"post":{"tags":["Webhooks"],"summary":"The notification was sent but the provider could not deliver it","description":"What your endpoint receives when `notificacion.no_entregada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/notificacion.no_entregada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The notification was sent but the provider could not deliver it","event":"notificacion.no_entregada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"email","proveedor":"brevo","message_id":"msg-20261023140211-7f3a91","destino":"an***@example.com","motivo_proveedor":"hard_bounce","detalle":"Mailbox does not exist."},"evento":"notificacion.no_entregada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"email","proveedor":"brevo","message_id":"msg-20261023140211-7f3a91","destino":"an***@example.com","motivo_proveedor":"hard_bounce","detalle":"Mailbox does not exist."}}}}},"responses":{"2XX":{"description":"Received."}}}},"participacion.aprobada":{"post":{"tags":["Webhooks"],"summary":"Approved the document, without signing it","description":"What your endpoint receives when `participacion.aprobada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/participacion.aprobada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Approved the document, without signing it","event":"participacion.aprobada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a25","email":"an***@example.com","papel":"aprobador"},"evento":"participacion.aprobada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a25","email":"an***@example.com","papel":"aprobador"}}}}},"responses":{"2XX":{"description":"Received."}}}},"pedido.atendido":{"post":{"tags":["Webhooks"],"summary":"A request that was waiting on the sender was taken care of: the declined document was sent again","description":"What your endpoint receives when `pedido.atendido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/pedido.atendido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A request that was waiting on the sender was taken care of: the declined document was sent again","event":"pedido.atendido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"nuevo_circuito_id":"7c9e6679-7425-40de-944b-e07fc1f90a34","titulo":"Lease agreement"},"evento":"pedido.atendido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"nuevo_circuito_id":"7c9e6679-7425-40de-944b-e07fc1f90a34","titulo":"Lease agreement"}}}}},"responses":{"2XX":{"description":"Received."}}}},"persona.registrada":{"post":{"tags":["Webhooks"],"summary":"A person registered","description":"What your endpoint receives when `persona.registrada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/persona.registrada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A person registered","event":"persona.registrada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"email":"an***@example.com","rol":"firmante","como":"firma"},"evento":"persona.registrada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"email":"an***@example.com","rol":"firmante","como":"firma"}}}}},"responses":{"2XX":{"description":"Received."}}}},"proceso.fallido":{"post":{"tags":["Webhooks"],"summary":"A processing step failed","description":"What your endpoint receives when `proceso.fallido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/proceso.fallido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A processing step failed","event":"proceso.fallido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"etapa":"firma_en_prestador","motivo":"The provider did not answer in time."},"evento":"proceso.fallido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"etapa":"firma_en_prestador","motivo":"The provider did not answer in time."}}}}},"responses":{"2XX":{"description":"Received."}}}},"revision.leida":{"post":{"tags":["Webhooks"],"summary":"Confirmed they read the document in full, without signing it","description":"What your endpoint receives when `revision.leida` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/revision.leida`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Confirmed they read the document in full, without signing it","event":"revision.leida","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a25","email":"lu***@example.com","papel":"veedor","documento_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","medida":true,"paginas":3,"paginas_vistas":3,"ultima_pagina_vista":true,"leida_en":"2026-10-23T14:02:11Z","idioma":"en","version":1},"evento":"revision.leida","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a25","email":"lu***@example.com","papel":"veedor","documento_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","medida":true,"paginas":3,"paginas_vistas":3,"ultima_pagina_vista":true,"leida_en":"2026-10-23T14:02:11Z","idioma":"en","version":1}}}}},"responses":{"2XX":{"description":"Received."}}}},"revision.nota":{"post":{"tags":["Webhooks"],"summary":"Left a note for the sender","description":"What your endpoint receives when `revision.nota` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/revision.nota`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Left a note for the sender","event":"revision.nota","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a25","email":"lu***@example.com","papel":"veedor","documento_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","texto":"Clause 4 needs the new rate.","largo":29,"nota_n":1,"nota_id":"7c9e6679-7425-40de-944b-e07fc1f90a26","enviada_en":"2026-10-23T14:02:11Z","idioma":"en","version":1},"evento":"revision.nota","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a25","email":"lu***@example.com","papel":"veedor","documento_sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","texto":"Clause 4 needs the new rate.","largo":29,"nota_n":1,"nota_id":"7c9e6679-7425-40de-944b-e07fc1f90a26","enviada_en":"2026-10-23T14:02:11Z","idioma":"en","version":1}}}}},"responses":{"2XX":{"description":"Received."}}}},"sello.fallido":{"post":{"tags":["Webhooks"],"summary":"Could not obtain the timestamp","description":"What your endpoint receives when `sello.fallido` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/sello.fallido`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Could not obtain the timestamp","event":"sello.fallido","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"no authority answered","intentos":[],"consecuencia":"The signature is valid but no external authority states the time."},"evento":"sello.fallido","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"no authority answered","intentos":[],"consecuencia":"The signature is valid but no external authority states the time."}}}}},"responses":{"2XX":{"description":"Received."}}}},"seguimiento.aviso_reenviado":{"post":{"tags":["Webhooks"],"summary":"The sender resent the notice to this person","description":"What your endpoint receives when `seguimiento.aviso_reenviado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/seguimiento.aviso_reenviado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The sender resent the notice to this person","event":"seguimiento.aviso_reenviado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"correo","papel":"firmante"},"evento":"seguimiento.aviso_reenviado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"correo","papel":"firmante"}}}}},"responses":{"2XX":{"description":"Received."}}}},"seguimiento.emisor_avisado":{"post":{"tags":["Webhooks"],"summary":"By the follow-up rule, the sender was told this person had not acted","description":"What your endpoint receives when `seguimiento.emisor_avisado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/seguimiento.emisor_avisado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"By the follow-up rule, the sender was told this person had not acted","event":"seguimiento.emisor_avisado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"regla":"no_actuo","dias":7,"canal":"correo"},"evento":"seguimiento.emisor_avisado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"regla":"no_actuo","dias":7,"canal":"correo"}}}}},"responses":{"2XX":{"description":"Received."}}}},"seguimiento.recordado":{"post":{"tags":["Webhooks"],"summary":"By the follow-up rule, a reminder was emailed to someone who had not opened the link","description":"What your endpoint receives when `seguimiento.recordado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/seguimiento.recordado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"By the follow-up rule, a reminder was emailed to someone who had not opened the link","event":"seguimiento.recordado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"regla":"no_abrio","dias":3,"canal":"correo"},"evento":"seguimiento.recordado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"regla":"no_abrio","dias":3,"canal":"correo"}}}}},"responses":{"2XX":{"description":"Received."}}}},"campo.precargado":{"post":{"tags":["Webhooks"],"summary":"The integrator system pre-filled field values through the API","description":"What your endpoint receives when `campo.precargado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/campo.precargado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The integrator system pre-filled field values through the API","event":"campo.precargado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"canal":"api","token":"7c9e6679-7425-40de-944b-e07fc1f90a32","cantidad":1,"campos":[{"codigo":"company_name","huella":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}]},"evento":"campo.precargado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"canal":"api","token":"7c9e6679-7425-40de-944b-e07fc1f90a32","cantidad":1,"campos":[{"codigo":"company_name","huella":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"}]}}}}},"responses":{"2XX":{"description":"Received."}}}},"circuito.desde_plantilla":{"post":{"tags":["Webhooks"],"summary":"The document was created from a template","description":"What your endpoint receives when `circuito.desde_plantilla` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/circuito.desde_plantilla`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The document was created from a template","event":"circuito.desde_plantilla","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"plantilla_id":"7c9e6679-7425-40de-944b-e07fc1f90a42","plantilla":"Standard lease"},"evento":"circuito.desde_plantilla","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"plantilla_id":"7c9e6679-7425-40de-944b-e07fc1f90a42","plantilla":"Standard lease"}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.preservacion_renovada":{"post":{"tags":["Webhooks"],"summary":"The preservation of the document was renewed: a new document timestamp over the material that validates the previous one","description":"What your endpoint receives when `documento.preservacion_renovada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.preservacion_renovada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The preservation of the document was renewed: a new document timestamp over the material that validates the previous one","event":"documento.preservacion_renovada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"nivel_pades":"B-LTA","por_que":null,"extendido_por":"renovacion","proxima_renovacion":"2027-10-23T14:02:11Z","sha256_anterior":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha256_preservado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","archivo_anterior_id":"7c9e6679-7425-40de-944b-e07fc1f90a43","archivo_id":"7c9e6679-7425-40de-944b-e07fc1f90a44","bytes":612},"evento":"documento.preservacion_renovada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"nivel_pades":"B-LTA","por_que":null,"extendido_por":"renovacion","proxima_renovacion":"2027-10-23T14:02:11Z","sha256_anterior":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha256_preservado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","archivo_anterior_id":"7c9e6679-7425-40de-944b-e07fc1f90a43","archivo_id":"7c9e6679-7425-40de-944b-e07fc1f90a44","bytes":612}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.preservado":{"post":{"tags":["Webhooks"],"summary":"The material needed to validate the signatures in the future was stored inside the document","description":"What your endpoint receives when `documento.preservado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.preservado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The material needed to validate the signatures in the future was stored inside the document","event":"documento.preservado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"nivel_pades":"B-LTA","politica":{"cierre":"sello_de_plataforma","preservacion":"al_cerrar"},"sha256_firmado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha256_preservado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","archivo_id":"7c9e6679-7425-40de-944b-e07fc1f90a43","bytes":583,"certificado_revocado":false},"evento":"documento.preservado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"nivel_pades":"B-LTA","politica":{"cierre":"sello_de_plataforma","preservacion":"al_cerrar"},"sha256_firmado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","sha256_preservado":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","archivo_id":"7c9e6679-7425-40de-944b-e07fc1f90a43","bytes":583,"certificado_revocado":false}}}}},"responses":{"2XX":{"description":"Received."}}}},"documento.purgado":{"post":{"tags":["Webhooks"],"summary":"The document was deleted under the retention policy","description":"What your endpoint receives when `documento.purgado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/documento.purgado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The document was deleted under the retention policy","event":"documento.purgado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"archivo":"7c9e6679-7425-40de-944b-e07fc1f90a43","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","motivo":"politica_de_retencion"},"evento":"documento.purgado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"archivo":"7c9e6679-7425-40de-944b-e07fc1f90a43","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","motivo":"politica_de_retencion"}}}}},"responses":{"2XX":{"description":"Received."}}}},"enlace.apertura_rechazada":{"post":{"tags":["Webhooks"],"summary":"The link was not opened: the signer email address is already linked to another person","description":"What your endpoint receives when `enlace.apertura_rechazada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/enlace.apertura_rechazada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The link was not opened: the signer email address is already linked to another person","event":"enlace.apertura_rechazada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"correo_anclado_a_otra_identidad"},"evento":"enlace.apertura_rechazada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"correo_anclado_a_otra_identidad"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.caracter_declarado":{"post":{"tags":["Webhooks"],"summary":"The signer declared the capacity in which they sign","description":"What your endpoint receives when `firma.caracter_declarado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.caracter_declarado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The signer declared the capacity in which they sign","event":"firma.caracter_declarado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"caracter":"representante","cuenta_representada_id":"7c9e6679-7425-40de-944b-e07fc1f90a39","fundamento":"Power of attorney 2026/114","caracter_origen":"declarado"},"evento":"firma.caracter_declarado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"caracter":"representante","cuenta_representada_id":"7c9e6679-7425-40de-944b-e07fc1f90a39","fundamento":"Power of attorney 2026/114","caracter_origen":"declarado"}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.marca_agregada":{"post":{"tags":["Webhooks"],"summary":"A signature mark was added to the document","description":"What your endpoint receives when `firma.marca_agregada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.marca_agregada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A signature mark was added to the document","event":"firma.marca_agregada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"tipo_marca":"signature","pagina":1,"x":72,"y":640},"evento":"firma.marca_agregada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"tipo_marca":"signature","pagina":1,"x":72,"y":640}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.marca_quitada":{"post":{"tags":["Webhooks"],"summary":"A signature mark was removed from the document","description":"What your endpoint receives when `firma.marca_quitada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.marca_quitada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"A signature mark was removed from the document","event":"firma.marca_quitada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"tipo_marca":"signature","pagina":1},"evento":"firma.marca_quitada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"tipo_marca":"signature","pagina":1}}}}},"responses":{"2XX":{"description":"Received."}}}},"firma.no_requerida":{"post":{"tags":["Webhooks"],"summary":"Their signature was no longer needed: the step got the signatures it required","description":"What your endpoint receives when `firma.no_requerida` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/firma.no_requerida`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Their signature was no longer needed: the step got the signatures it required","event":"firma.no_requerida","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"cerrado_por":"7c9e6679-7425-40de-944b-e07fc1f90a38","paso":1},"evento":"firma.no_requerida","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"cerrado_por":"7c9e6679-7425-40de-944b-e07fc1f90a38","paso":1}}}}},"responses":{"2XX":{"description":"Received."}}}},"lugar.reasignado":{"post":{"tags":["Webhooks"],"summary":"The place went to another person; the previous link stopped working","description":"What your endpoint receives when `lugar.reasignado` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/lugar.reasignado`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The place went to another person; the previous link stopped working","event":"lugar.reasignado","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"posicion":2,"nombre_papel":"Legal review","antes":"an***@example.com","despues":"lu***@example.com","antes_participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a38","despues_participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a40","quien":"7c9e6679-7425-40de-944b-e07fc1f90a41","canal":"api","motivo":"The person left the company.","codigo_de_acceso":null},"evento":"lugar.reasignado","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"posicion":2,"nombre_papel":"Legal review","antes":"an***@example.com","despues":"lu***@example.com","antes_participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a38","despues_participacion_id":"7c9e6679-7425-40de-944b-e07fc1f90a40","quien":"7c9e6679-7425-40de-944b-e07fc1f90a41","canal":"api","motivo":"The person left the company.","codigo_de_acceso":null}}}}},"responses":{"2XX":{"description":"Received."}}}},"retencion.acortada":{"post":{"tags":["Webhooks"],"summary":"The retention period for this document was shortened","description":"What your endpoint receives when `retencion.acortada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/retencion.acortada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The retention period for this document was shortened","event":"retencion.acortada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"dias_antes":3650,"dias_ahora":1825,"dias_plan":1825},"evento":"retencion.acortada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"dias_antes":3650,"dias_ahora":1825,"dias_plan":1825}}}}},"responses":{"2XX":{"description":"Received."}}}},"retencion.congelada":{"post":{"tags":["Webhooks"],"summary":"The document was put on hold: it will not be deleted when the retention period ends","description":"What your endpoint receives when `retencion.congelada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/retencion.congelada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The document was put on hold: it will not be deleted when the retention period ends","event":"retencion.congelada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{"motivo":"Legal hold: dispute pending"},"evento":"retencion.congelada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{"motivo":"Legal hold: dispute pending"}}}}},"responses":{"2XX":{"description":"Received."}}}},"retencion.descongelada":{"post":{"tags":["Webhooks"],"summary":"The hold was lifted: the document is subject to the retention period again","description":"What your endpoint receives when `retencion.descongelada` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/retencion.descongelada`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"The hold was lifted: the document is subject to the retention period again","event":"retencion.descongelada","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":"7c9e6679-7425-40de-944b-e07fc1f90a22","document":"7c9e6679-7425-40de-944b-e07fc1f90a23","data":{},"evento":"retencion.descongelada","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":"7c9e6679-7425-40de-944b-e07fc1f90a22","instancia":"7c9e6679-7425-40de-944b-e07fc1f90a23","datos":{}}}}},"responses":{"2XX":{"description":"Received."}}}},"signingflows.test":{"post":{"tags":["Webhooks"],"summary":"Test event: what the Test button of a webhook sends","description":"What your endpoint receives when `signingflows.test` happens: a POST with this JSON (`payload_version` 2). Answer any 2xx to say it arrived. The example is built by the same code that builds the real body; `data` is filled only for the events whose keys are documented (`DatosDeLosEventos`), and is `{}` for the rest: its keys are free by contract. The whole schema is `GET /events/signingflows.test`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuerpoDelWebhook"},"example":{"payload_version":2,"event_label":"Test event: what the Test button of a webhook sends","event":"signingflows.test","occurred_at":"2026-10-23T14:02:11Z","account":"7c9e6679-7425-40de-944b-e07fc1f90a21","workflow":null,"document":null,"data":{"test":true},"evento":"signingflows.test","id":"7c9e6679-7425-40de-944b-e07fc1f90a24","ocurrido_en":"2026-10-23T14:02:11Z","cuenta":"7c9e6679-7425-40de-944b-e07fc1f90a21","circuito":null,"instancia":null,"datos":{"test":true}}}}},"responses":{"2XX":{"description":"Received."}}}}}}