{"id":29999,"date":"2026-10-25T13:15:58","date_gmt":"2026-10-25T12:15:58","guid":{"rendered":"https:\/\/www.e-signature.eu\/?page_id=29999"},"modified":"2026-10-25T21:47:58","modified_gmt":"2026-10-25T20:47:58","slug":"documentacion-de-la-api-v3-para-correo-certificado","status":"publish","type":"page","link":"https:\/\/www.e-signature.eu\/es\/correo-certificado-eidas\/documentacion-de-la-api-v3-para-correo-certificado\/","title":{"rendered":"Documentaci\u00f3n de la API v3 para correo certificado"},"content":{"rendered":"<style>\n.esig-api{--ink:#1f2937;--muted:#6b7280;--line:#e5e7eb;--soft:#f8fafc;--brand:#1d4ed8;--code:#0f172a;\n font-family:inherit;color:var(--ink);line-height:1.6;max-width:1100px;margin:0 auto;font-size:16px}\n.esig-api h2{font-size:1.6em;margin:2.2em 0 .6em;padding-top:.6em;border-top:1px solid var(--line)}\n.esig-api h3{font-size:1.2em;margin:1.8em 0 .5em}\n.esig-api h4{font-size:1em;margin:1.4em 0 .4em;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}\n.esig-api p,.esig-api li{max-width:820px}\n.esig-api code{font-family:SFMono-Regular,Consolas,Menlo,monospace;font-size:.88em;background:#eef2ff;color:#1e3a8a;padding:.1em .35em;border-radius:4px;word-break:break-word}\n.esig-api pre{background:var(--code);color:#e2e8f0;padding:16px 18px;border-radius:8px;overflow-x:auto;font-size:13.5px;line-height:1.5;margin:.8em 0 1.4em}\n.esig-api pre code{background:none;color:inherit;padding:0;font-size:inherit;word-break:normal}\n.esig-api table{border-collapse:collapse;width:100%;margin:.8em 0 1.4em;font-size:.94em;display:block;overflow-x:auto}\n.esig-api th,.esig-api td{border:1px solid var(--line);padding:8px 10px;text-align:left;vertical-align:top}\n.esig-api th{background:var(--soft);font-weight:600}\n.esig-api{display:grid;grid-template-columns:230px minmax(0,1fr);gap:40px;max-width:1240px}\n.esig-api-main{min-width:0}\n.esig-api-nav{position:relative}\n.esig-api-nav-in{position:sticky;top:var(--esig-top,110px);z-index:20}\n.esig-api-nav-in.is-fixed{position:fixed}\n.esig-api-toc{max-height:calc(100vh - var(--esig-top,110px) - 20px);overflow-y:auto;background:var(--soft);border:1px solid var(--line);border-radius:8px;padding:14px 16px;font-size:.92em}\n.esig-api-toc strong{display:block;margin-bottom:.4em}\n.esig-api-toc ol{margin:0;padding-left:1.3em}.esig-api-toc li{margin:.3em 0;max-width:none}\n.esig-api-main a{color:var(--brand)!important;text-decoration:underline!important;text-underline-offset:2px;text-decoration-thickness:1px}.esig-api-main a:hover{text-decoration-thickness:2px}\n.esig-api-details{border:1px solid var(--line);border-radius:8px;padding:10px 16px;margin:.8em 0 1.4em;background:var(--soft)}.esig-api-details summary{cursor:pointer;font-weight:600;color:var(--brand)}.esig-api-details[open] summary{margin-bottom:.6em}.esig-api-details h4{margin:1em 0 .3em;text-transform:none;letter-spacing:0;color:var(--ink)}.esig-api-details ul{margin:.2em 0 .6em}\n.esig-api-toc a{text-decoration:none;color:var(--ink)}.esig-api-toc a:hover{color:var(--brand);text-decoration:underline}\n.esig-api-toc a.is-active{color:var(--brand);font-weight:600;background:#e8efff;border-radius:4px;padding:1px 5px;margin-left:-5px}.esig-api-toc li.is-active::marker{color:var(--brand);font-weight:600}\n.esig-api-toggle{position:absolute;opacity:0;pointer-events:none}\n.esig-api-toc-btn{display:none}\n.esig-api h2{scroll-margin-top:calc(var(--esig-top,110px) + 10px)}\n@media (max-width:900px){\n .esig-api{display:block}\n .esig-api-nav{margin:0 0 1.2em}\n .esig-api-nav-in{top:var(--esig-top,0px)}\n .esig-api-toc-btn{display:flex;align-items:center;justify-content:space-between;background:var(--soft);border:1px solid var(--line);border-radius:8px;padding:10px 14px;font-weight:600;cursor:pointer}\n .esig-api-toc-btn::after{content:\"\u25be\";font-size:1.1em}\n .esig-api-toggle:checked + .esig-api-toc-btn::after{content:\"\u25b4\"}\n .esig-api-toc{display:none;position:static;max-height:60vh;margin-top:6px;box-shadow:0 6px 16px rgba(0,0,0,.08);background:#fff}\n .esig-api-toc strong{display:none}\n .esig-api-toggle:checked ~ .esig-api-toc{display:block}\n .esig-api h2{scroll-margin-top:calc(var(--esig-top,0px) + 60px)}\n}\n.esig-api .ep{display:flex;flex-wrap:wrap;align-items:center;gap:10px;background:var(--soft);border:1px solid var(--line);border-radius:8px;padding:10px 14px;margin:.6em 0 1em;font-family:SFMono-Regular,Consolas,Menlo,monospace;font-size:.95em}\n.esig-api .m{font-weight:700;color:#fff;border-radius:4px;padding:2px 8px;font-size:.85em}\n.esig-api .GET{background:#059669}.esig-api .POST{background:#1d4ed8}.esig-api .PATCH{background:#d97706}.esig-api .DELETE{background:#dc2626}\n.esig-api .note{border-left:4px solid var(--brand);background:#eff6ff;padding:10px 14px;border-radius:0 6px 6px 0;margin:1em 0}\n.esig-api .warn{border-left:4px solid #d97706;background:#fffbeb;padding:10px 14px;border-radius:0 6px 6px 0;margin:1em 0}\n.esig-api .badge{display:inline-block;font-size:.75em;font-weight:700;background:#dbeafe;color:#1e40af;border-radius:999px;padding:1px 8px;margin-left:4px;vertical-align:middle}\n.esig-api .req{color:#dc2626;font-weight:700}\n<\/style>\n<div class=\"esig-api\">\n<nav class=\"esig-api-nav\" aria-label=\"\u00cdndice\">\n<div class=\"esig-api-nav-in\"><input type=\"checkbox\" id=\"esig-api-toc\" class=\"esig-api-toggle\"><label for=\"esig-api-toc\" class=\"esig-api-toc-btn\">\u00cdndice<\/label><\/p>\n<div class=\"esig-api-toc\"><strong>\u00cdndice<\/strong><\/p>\n<ol>\n<li><a href=\"#overview\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Presentaci\u00f3n<\/a><\/li>\n<li><a href=\"#auth\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Autenticaci\u00f3n<\/a><\/li>\n<li><a href=\"#conventions\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Convenciones<\/a><\/li>\n<li><a href=\"#credits\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Cr\u00e9ditos<\/a><\/li>\n<li><a href=\"#flow\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">C\u00f3mo funciona un correo certificado<\/a><\/li>\n<li><a href=\"#sender\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Direcci\u00f3n del remitente<\/a><\/li>\n<li><a href=\"#request\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Enviar un correo certificado<\/a><\/li>\n<li><a href=\"#object\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">El objeto correo certificado<\/a><\/li>\n<li><a href=\"#endpoints\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Otros endpoints<\/a><\/li>\n<li><a href=\"#callbacks\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Callbacks (webhooks)<\/a><\/li>\n<li><a href=\"#errors\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Errores<\/a><\/li>\n<li><a href=\"#retention\" onclick=\"var t=document.getElementById('esig-api-toc');if(t)t.checked=false;\">Conservaci\u00f3n<\/a><\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/nav>\n<div class=\"esig-api-main\">\n<p style=\"color:#6b7280;margin-top:0\">API REST de e-Signature.eu \u2014 correo certificado electr\u00f3nico<\/p>\n<h2 id=\"overview\">1. Presentaci\u00f3n<\/h2>\n<p>La API REST de e-Signature.eu permite a su aplicaci\u00f3n enviar correos certificados electr\u00f3nicos sin pasar por nuestra web. Usted env\u00eda el PDF, una direcci\u00f3n de remitente verificada y el destinatario; el documento recibe un sello de tiempo electr\u00f3nico cualificado y el destinatario firma un acuse de recibo tras verificar su identidad. Usted recibe el resultado mediante la API o un callback.<\/p>\n<table style=\"display:table;width:100%\">\n<tbody>\n<tr>\n<td style=\"width:180px;min-width:140px;white-space:nowrap\">URL base<\/td>\n<td><code>https:\/\/api.e-signature.eu\/v3\/regis\/<\/code><\/td>\n<\/tr>\n<tr>\n<td style=\"width:180px;min-width:140px;white-space:nowrap\">Postman<\/td>\n<td><a href=\"https:\/\/documenter.getpostman.com\/view\/10230512\/2sBYHUSKry\" target=\"_blank\" rel=\"noopener\">Documentaci\u00f3n y colecci\u00f3n de Postman<\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"note\">La URL base anterior <code>https:\/\/www.e-signature.eu\/wp-json\/esig\/v3\/regis\/<\/code> sigue siendo v\u00e1lida. Recomendamos utilizar la URL de <code>api.e-signature.eu<\/code>.<\/p>\n<h2 id=\"auth\">2. Autenticaci\u00f3n<\/h2>\n<p>Sus credenciales est\u00e1n en <strong>Mi cuenta &gt; Firmas API<\/strong> una vez conectado en e-signature.eu:<\/p>\n<ul>\n<li><strong>User ID<\/strong>: en la URL, como par\u00e1metro <code>userid<\/code> de cada llamada;<\/li>\n<li><strong>API token<\/strong>: en la cabecera HTTP <code>x-api-key<\/code> de cada llamada.<\/li>\n<\/ul>\n<pre><code>curl -X GET \"https:\/\/api.e-signature.eu\/v3\/regis\/requestBalance?userid=123\" \\\n  -H \"x-api-key: YOUR_API_TOKEN\"<\/code><\/pre>\n<p>Mantenga su token en secreto: da acceso completo a su cuenta mediante la API. Las llamadas deben hacerse desde su servidor, nunca desde un navegador o una app m\u00f3vil.<\/p>\n<h2 id=\"conventions\">3. Convenciones<\/h2>\n<h3>Peticiones y respuestas<\/h3>\n<ul>\n<li>Solo HTTPS. Los cuerpos de las peticiones son JSON (<code>Content-Type: application\/json<\/code>).<\/li>\n<li>Cada respuesta es JSON, en una de estas dos formas:<\/li>\n<\/ul>\n<pre><code>{ \"success\": true,  \"result\": { ... } }\n{ \"success\": false, \"error\": \"Readable error message\" }<\/code><\/pre>\n<h3>L\u00edmites<\/h3>\n<table>\n<thead>\n<tr>\n<th>L\u00edmite<\/th>\n<th>Valor<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Peticiones<\/td>\n<td>10 por minuto por cuenta y direcci\u00f3n IP (por encima, HTTP 403; reintente tras un minuto)<\/td>\n<\/tr>\n<tr>\n<td>Documento<\/td>\n<td>Un PDF por solicitud, 30 MB como m\u00e1ximo, sin cifrar \/ sin contrase\u00f1a<\/td>\n<\/tr>\n<tr>\n<td>Descarga de documentos firmados<\/td>\n<td>30 d\u00edas tras la finalizaci\u00f3n (ver <a href=\"#retention\">Conservaci\u00f3n<\/a>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"credits\">4. Cr\u00e9ditos<\/h2>\n<p>Las solicitudes se pagan con sus cr\u00e9ditos prepago de e-signature.eu. El precio de un m\u00e9todo se obtiene con <a href=\"#getMethods\"><code>getMethods<\/code><\/a> (tiene en cuenta sus precios espec\u00edficos). Su saldo lo devuelven <a href=\"#requestBalance\"><code>requestBalance<\/code><\/a> y cada objeto solicitud (<code>credits_balance<\/code>).<\/p>\n<h3 id=\"auto-recharge\">Recarga autom\u00e1tica de cr\u00e9ditos<\/h3>\n<p>Para no quedarse nunca sin cr\u00e9ditos, su cuenta puede recargarse autom\u00e1ticamente. Se configura una vez en <strong>Mi cuenta &gt; Firmas API<\/strong>, no mediante la API:<\/p>\n<ol>\n<li>Elija un <strong>umbral<\/strong> (en cr\u00e9ditos) y el <strong>paquete de cr\u00e9ditos<\/strong> que se pedir\u00e1.<\/li>\n<li>Guarde un m\u00e9todo de pago con nuestro proveedor de pagos Mollie (tarjeta, o adeudo directo SEPA mediante Bancontact, iDEAL\u2026). Se solicita una sola vez un pago de verificaci\u00f3n de 0,01 \u20ac.<\/li>\n<li>Cada vez que se descuentan cr\u00e9ditos y su saldo baja del umbral, se crea un pedido del paquete elegido y se paga autom\u00e1ticamente con el m\u00e9todo de pago guardado. La factura se le env\u00eda por email.<\/li>\n<\/ol>\n<table>\n<thead>\n<tr>\n<th><\/th>\n<th>Recarga autom\u00e1tica<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Activaci\u00f3n<\/td>\n<td>Un cargo de cr\u00e9ditos (p. ej. una nueva solicitud) que hace bajar el saldo por debajo del umbral<\/td>\n<\/tr>\n<tr>\n<td>Abono de los cr\u00e9ditos<\/td>\n<td>En cuanto se confirma el pago: inmediatamente con tarjeta, tras unos d\u00edas h\u00e1biles con adeudo directo SEPA<\/td>\n<\/tr>\n<tr>\n<td>Recargas en curso<\/td>\n<td>Una a la vez<\/td>\n<\/tr>\n<tr>\n<td>L\u00edmite de seguridad<\/td>\n<td>Un n\u00famero m\u00e1ximo de recargas autom\u00e1ticas por 30 d\u00edas<\/td>\n<\/tr>\n<tr>\n<td>Pago fallido<\/td>\n<td>El pedido se marca como fallido, la recarga autom\u00e1tica se desactiva y se le informa por email<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"note\">La recarga se activa con un cargo. Una solicitud que cuesta m\u00e1s que su saldo actual se rechaza (HTTP 403, <code>You do not have enough credits<\/code>) y no activa ninguna recarga: elija un umbral superior al coste de sus solicitudes m\u00e1s grandes y mantenga un margen si paga con adeudo directo SEPA. Su saldo est\u00e1 disponible en todo momento con <a href=\"#requestBalance\"><code>requestBalance<\/code><\/a> y <code>credits_balance<\/code>.<\/div>\n<h2 id=\"flow\">5. C\u00f3mo funciona un correo certificado<\/h2>\n<ol>\n<li>Usted env\u00eda el PDF, una direcci\u00f3n de remitente <strong>verificada<\/strong> y el destinatario. El documento recibe un sello de tiempo electr\u00f3nico cualificado y se descuentan los cr\u00e9ditos.<\/li>\n<li>El destinatario recibe un email con dos enlaces: uno para firmar el acuse de recibo y acceder al documento, otro para rechazarlo.<\/li>\n<li>Para firmar, el destinatario verifica su identidad con uno de los m\u00e9todos aceptados (itsme\u00ae, Evrotrust, OTP\u2026).<\/li>\n<li>El correo certificado pasa a <code>finished<\/code> (firmado), <code>declined<\/code> (rechazado) o <code>expired<\/code> si no ocurre nada en 14 d\u00edas.<\/li>\n<\/ol>\n<p>Un remitente y un destinatario por correo certificado. Como en la web, se env\u00eda un recordatorio autom\u00e1tico cada 4 d\u00edas (no configurable); no hay recordatorio manual ni cancelaci\u00f3n.<\/p>\n<h2 id=\"sender\">6. Direcci\u00f3n del remitente<\/h2>\n<p>Como en la web, la direcci\u00f3n del remitente (<code>sender_email<\/code>) debe estar <strong>verificada<\/strong> antes de usarla:<\/p>\n<ol>\n<li>Llame a <code>verifySender<\/code>: se env\u00eda a la direcci\u00f3n un email con un enlace de verificaci\u00f3n (respuesta <code>202<\/code>). Si la direcci\u00f3n ya est\u00e1 verificada, la respuesta es <code>200<\/code> con <code>\"verified\": true<\/code>.<\/li>\n<li>El titular de la direcci\u00f3n hace clic en el enlace.<\/li>\n<li>La direcci\u00f3n puede entonces usarse en <code>request<\/code>.<\/li>\n<\/ol>\n<div class=\"ep\"><span class=\"m POST\">POST<\/span><span>\/v3\/regis\/verifySender?userid={userid}<\/span><\/div>\n<pre><code>{ \"email\": \"contact@example.com\", \"lang\": \"en\" }<\/code><\/pre>\n<pre><code>{\n  \"success\": true,\n  \"result\": {\n    \"email\": \"contact@example.com\",\n    \"verified\": false,\n    \"message\": \"A verification email has been sent to contact@example.com. The address can be used as sender_email once the link in this email has been clicked.\"\n  }\n}<\/code><\/pre>\n<div class=\"ep\"><span class=\"m GET\">GET<\/span><span>\/v3\/regis\/senders?userid={userid}<\/span><\/div>\n<p>Lista las direcciones de remitente de su cuenta con su estado.<\/p>\n<pre><code>{\n  \"success\": true,\n  \"result\": [\n    {\n      \"email\": \"contact@example.com\",\n      \"verified\": true\n    },\n    {\n      \"email\": \"legal@example.com\",\n      \"verified\": false\n    }\n  ]\n}<\/code><\/pre>\n<h2 id=\"request\">7. Enviar un correo certificado<\/h2>\n<div class=\"ep\"><span class=\"m POST\">POST<\/span><span>\/v3\/regis\/request?userid={userid}<\/span><\/div>\n<pre><code>{\n  \"title\": \"Formal notice rent October\",\n  \"lang\": \"en\",\n  \"sender_email\": \"contact@example.com\",\n  \"recipient\": {\n    \"firstname\": \"Ann\",\n    \"lastname\": \"Peeters\",\n    \"email\": \"ann.peeters@example.com\",\n    \"phone\": \"+32475111222\"\n  },\n  \"methods\": [\n    \"itsme-qes-signature\",\n    \"evrotrust-signature\"\n  ],\n  \"send_email\": true,\n  \"note_html\": \"Please acknowledge receipt.\",\n  \"signature_redirect\": \"https:\/\/www.example.com\/thank-you\",\n  \"external_reference\": \"INV-2026-0042\",\n  \"metadata\": {\n    \"customer_id\": 311\n  },\n  \"pdf_file_base64\": \"JVBERi0xLjcKJeLjz9MK...\"\n}<\/code><\/pre>\n<table>\n<thead>\n<tr>\n<th>Campo<\/th>\n<th>Obligatorio<\/th>\n<th>Tipo<\/th>\n<th>Descripci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>title<\/code><\/td>\n<td><span class=\"req\">s\u00ed<\/span><\/td>\n<td>string<\/td>\n<td>Nombre del documento. Se conservan letras, cifras y guiones; si el nombre ya existe, se a\u00f1ade <code>-1<\/code>, <code>-2<\/code>\u2026<\/td>\n<\/tr>\n<tr>\n<td><code>lang<\/code><\/td>\n<td><span class=\"req\">s\u00ed<\/span><\/td>\n<td>string<\/td>\n<td>Idioma de los emails y las p\u00e1ginas: <code>fr<\/code>, <code>nl<\/code>, <code>en<\/code>, <code>de<\/code>, <code>es<\/code>.<\/td>\n<\/tr>\n<tr>\n<td><code>sender_email<\/code><\/td>\n<td><span class=\"req\">s\u00ed<\/span><\/td>\n<td>string<\/td>\n<td>Direcci\u00f3n de remitente <strong>verificada<\/strong>, ver <a href=\"#sender\">Direcci\u00f3n del remitente<\/a>.<\/td>\n<\/tr>\n<tr>\n<td><code>recipient.lastname<\/code>, <code>recipient.email<\/code><\/td>\n<td><span class=\"req\">s\u00ed<\/span><\/td>\n<td>string<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>recipient.firstname<\/code><\/td>\n<td>no<\/td>\n<td>string<\/td>\n<td><\/td>\n<\/tr>\n<tr>\n<td><code>recipient.phone<\/code><\/td>\n<td>no<\/td>\n<td>string<\/td>\n<td>Formato internacional (<code>+32\u2026<\/code>). Un n\u00famero no v\u00e1lido se ignora.<\/td>\n<\/tr>\n<tr>\n<td><code>methods<\/code><\/td>\n<td><span class=\"req\">s\u00ed<\/span><\/td>\n<td>array<\/td>\n<td>M\u00e9todos aceptados para firmar el acuse de recibo, ver <a href=\"#getMethods\"><code>getMethods<\/code><\/a>.<\/td>\n<\/tr>\n<tr>\n<td><code>pdf_file_base64<\/code><\/td>\n<td><span class=\"req\">s\u00ed<\/span><\/td>\n<td>string<\/td>\n<td>El PDF, codificado en base64. Un solo archivo, 30 MB como m\u00e1ximo, sin cifrar.<\/td>\n<\/tr>\n<tr>\n<td><code>send_email<\/code><\/td>\n<td>no<\/td>\n<td>boolean<\/td>\n<td>Por defecto <code>true<\/code>. Con <code>false<\/code>, no se env\u00eda ning\u00fan email al destinatario ni al remitente: env\u00ede usted <code>signature_link<\/code> y <code>declined_link<\/code>.<\/td>\n<\/tr>\n<tr>\n<td><code>note_html<\/code><\/td>\n<td>no<\/td>\n<td>string<\/td>\n<td>Mensaje a\u00f1adido al email enviado al destinatario.<\/td>\n<\/tr>\n<tr>\n<td><code>signature_redirect<\/code><\/td>\n<td>no<\/td>\n<td>string (URL)<\/td>\n<td>P\u00e1gina mostrada al destinatario tras la firma.<\/td>\n<\/tr>\n<tr>\n<td><code>external_reference<\/code><\/td>\n<td>no<\/td>\n<td>string<\/td>\n<td>Su propio identificador (factura, expediente\u2026), 255 caracteres como m\u00e1ximo.<\/td>\n<\/tr>\n<tr>\n<td><code>metadata<\/code><\/td>\n<td>no<\/td>\n<td>object<\/td>\n<td>Objeto JSON libre, 4 KB como m\u00e1ximo, devuelto tal cual.<\/td>\n<\/tr>\n<tr>\n<td><code>callback_url<\/code><\/td>\n<td>no<\/td>\n<td>string (URL)<\/td>\n<td>URL de callback solo para este correo certificado (HTTPS p\u00fablico). Por defecto: la URL de su cuenta.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Coste<\/h3>\n<p>Precio del m\u00e9todo m\u00e1s caro de <code>methods<\/code>, para un destinatario. Se descuenta al crear el correo certificado.<\/p>\n<h3>Respuesta <code>201 Created<\/code><\/h3>\n<pre><code>{\n  \"success\": true,\n  \"result\": {\n    \"type\": \"regis\",\n    \"id_sign\": 123,\n    \"doc_name\": \"Formal-notice-rent-October\",\n    \"lang\": \"en\",\n    \"sender_email\": \"contact@example.com\",\n    \"status_id\": \"pending\",\n    \"date_added\": \"2026-10-20 11:50:00\",\n    \"date_status\": \"2026-10-20 11:50:00\",\n    \"date_expired\": \"2026-11-03 11:50:00\",\n    \"timezone\": \"Europe\/Brussels\",\n    \"methods\": [\n      \"itsme-qes-signature\",\n      \"evrotrust-signature\"\n    ],\n    \"reminder\": 4,\n    \"last_reminder\": null,\n    \"send_email\": true,\n    \"from_api\": true,\n    \"credits\": 1,\n    \"credits_balance\": 41,\n    \"recipient\": {\n      \"firstname\": \"Ann\",\n      \"lastname\": \"Peeters\",\n      \"email\": \"ann.peeters@example.com\",\n      \"phone\": \"+32475111222\",\n      \"status\": \"pending\",\n      \"signing_time\": \"\",\n      \"signing_method\": \"\",\n      \"verified_firstname\": \"\",\n      \"verified_lastname\": \"\",\n      \"signature_link\": \"https:\/\/www.e-signature.eu\/en\/sign-regis\/?key=\u2026\",\n      \"declined_link\": \"https:\/\/www.e-signature.eu\/en\/sign-regis\/?key=\u2026\"\n    },\n    \"external_reference\": \"INV-2026-0042\",\n    \"metadata\": {\n      \"customer_id\": 311\n    }\n  }\n}<\/code><\/pre>\n<h2 id=\"object\">8. El objeto correo certificado<\/h2>\n<p>Devuelto por <code>request<\/code>, <code>getRequest<\/code>, <code>modifyRecipient<\/code>, <code>delete<\/code> y enviado en los callbacks. El campo <code>\"type\": \"regis\"<\/code> lo distingue de una solicitud de firma cuando ambos usan la misma URL de callback.<\/p>\n<table>\n<thead>\n<tr>\n<th>Campo<\/th>\n<th>Descripci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>id_sign<\/code><\/td>\n<td>Identificador del correo certificado<\/td>\n<\/tr>\n<tr>\n<td><code>status_id<\/code><\/td>\n<td><code>pending<\/code> pendiente del destinatario \u00b7 <code>finished<\/code> acuse firmado \u00b7 <code>declined<\/code> rechazado por el destinatario \u00b7 <code>expired<\/code> sin firmar tras 14 d\u00edas \u00b7 <code>deleted<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>date_added<\/code>, <code>date_status<\/code>, <code>date_expired<\/code><\/td>\n<td>Creaci\u00f3n, \u00faltimo cambio de estado, caducidad (zona horaria del correo certificado)<\/td>\n<\/tr>\n<tr>\n<td><code>sender_email<\/code>, <code>lang<\/code>, <code>methods<\/code>, <code>reminder<\/code>, <code>send_email<\/code><\/td>\n<td>Tal como se definieron al crear<\/td>\n<\/tr>\n<tr>\n<td><code>last_reminder<\/code><\/td>\n<td>Fecha del \u00faltimo recordatorio, o <code>null<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>credits<\/code>, <code>credits_balance<\/code><\/td>\n<td>Cr\u00e9ditos del correo certificado, saldo actual de su cuenta<\/td>\n<\/tr>\n<tr>\n<td><code>recipient<\/code><\/td>\n<td><code>firstname<\/code>, <code>lastname<\/code>, <code>email<\/code>, <code>phone<\/code>, <code>status<\/code>; tras la firma <code>signing_time<\/code>, <code>signing_method<\/code>, <code>verified_firstname<\/code>, <code>verified_lastname<\/code>; mientras est\u00e1 pendiente <code>signature_link<\/code> y <code>declined_link<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>pdf_file_base64<\/code><\/td>\n<td>Documento con sello de tiempo, cuando el correo certificado ya no est\u00e1 pendiente<\/td>\n<\/tr>\n<tr>\n<td><code>receipt_file_base64<\/code><\/td>\n<td>Acuse de recibo firmado, cuando <code>finished<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>external_reference<\/code>, <code>metadata<\/code><\/td>\n<td>Tal como se enviaron al crear<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"endpoints\">9. Otros endpoints<\/h2>\n<p>Todos los endpoints reciben <code>userid<\/code> en la URL y <code>x-api-key<\/code> en las cabeceras. <code>id_sign<\/code> se pasa en la URL.<\/p>\n<h3 id=\"list\">Listar los correos certificados<\/h3>\n<div class=\"ep\"><span class=\"m GET\">GET<\/span><span>\/v3\/regis\/list?userid={userid}&amp;status_id=pending<\/span><\/div>\n<p><code>status_id<\/code> (opcional): <code>pending<\/code>, <code>finished<\/code>, <code>declined<\/code> o <code>expired<\/code>. <code>external_reference<\/code> (opcional): solo los correos certificados con esta referencia.<\/p>\n<pre><code>{\n  \"success\": true,\n  \"result\": [\n    {\n      \"id_sign\": 123,\n      \"status_id\": \"pending\",\n      \"doc_name\": \"Formal-notice-rent-October\",\n      \"date_added\": \"2026-10-20 11:50:00\",\n      \"external_reference\": \"INV-2026-0042\"\n    }\n  ]\n}<\/code><\/pre>\n<h3 id=\"getRequest\">Obtener un correo certificado<\/h3>\n<div class=\"ep\"><span class=\"m GET\">GET<\/span><span>\/v3\/regis\/getRequest?userid={userid}&amp;id_sign=123<\/span><\/div>\n<h3 id=\"modifyRecipient\">Modificar el destinatario<\/h3>\n<div class=\"ep\"><span class=\"m PATCH\">PATCH<\/span><span>\/v3\/regis\/modifyRecipient?userid={userid}&amp;id_sign=123<\/span><\/div>\n<pre><code>{ \"email\": \"a.peeters@example.org\", \"phone\": \"+32475333444\" }<\/code><\/pre>\n<p>Solo correos certificados <code>pending<\/code>. Env\u00ede solo los campos que cambian entre <code>firstname<\/code>, <code>lastname<\/code>, <code>email<\/code>, <code>phone<\/code>. Si cambia el email, se informa al destinatario anterior de la cancelaci\u00f3n y el nuevo recibe el correo certificado.<\/p>\n<h3 id=\"delete\">Eliminar un correo certificado<\/h3>\n<div class=\"ep\"><span class=\"m DELETE\">DELETE<\/span><span>\/v3\/regis\/delete?userid={userid}&amp;id_sign=123<\/span><\/div>\n<p>Solo estado <code>finished<\/code>, <code>declined<\/code> o <code>expired<\/code>. Elimina los archivos y el historial; la respuesta contiene el correo certificado una \u00faltima vez (<code>status_id: deleted<\/code>): descargue los documentos antes de eliminar.<\/p>\n<h3 id=\"requestAuditTrail\">Descargar el audit trail<\/h3>\n<div class=\"ep\"><span class=\"m GET\">GET<\/span><span>\/v3\/regis\/requestAuditTrail?userid={userid}&amp;id_sign=123<\/span><\/div>\n<p>No disponible mientras est\u00e1 pendiente. Devuelve el correo certificado con <code>audit_trail_base64<\/code>: un PDF con sello de tiempo y el historial completo.<\/p>\n<h3 id=\"requestBalance\">Obtener el saldo de cr\u00e9ditos<\/h3>\n<div class=\"ep\"><span class=\"m GET\">GET<\/span><span>\/v3\/regis\/requestBalance?userid={userid}<\/span><\/div>\n<h3 id=\"getMethods\">Listar los m\u00e9todos<\/h3>\n<div class=\"ep\"><span class=\"m GET\">GET<\/span><span>\/v3\/regis\/getMethods?userid={userid}&amp;lang=en<\/span><\/div>\n<p>M\u00e9todos aceptados en <code>methods<\/code> para correo certificado, con el precio <strong>para su cuenta<\/strong>. La lista puede diferir de la de la API de firmas.<\/p>\n<pre><code>{\n  \"success\": true,\n  \"result\": [\n    {\n      \"id\": \"itsme-qes-signature\",\n      \"label\": \"itsme\u00ae | QES\",\n      \"credits\": 1\n    },\n    {\n      \"id\": \"otp-email-non-qualified\",\n      \"label\": \"OTP by Email\/SMS | SES\",\n      \"credits\": 0.4\n    }\n  ]\n}<\/code><\/pre>\n<h2 id=\"callbacks\">10. Callbacks (webhooks)<\/h2>\n<p>Defina su URL de callback en <strong>Mi cuenta &gt; Firmas API<\/strong> (HTTPS, accesible p\u00fablicamente). Tambi\u00e9n puede indicar una <code>callback_url<\/code> por solicitud. El callback es un <code>POST<\/code> con un cuerpo JSON que contiene el estado completo actual de la solicitud (mismo formato que <code>getRequest<\/code>), enviado para las solicitudes creadas mediante la API.<\/p>\n<h3>Campos del evento<\/h3>\n<table>\n<thead>\n<tr>\n<th>Campo<\/th>\n<th>Descripci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>event<\/code><\/td>\n<td>Tipo de evento (ver m\u00e1s abajo)<\/td>\n<\/tr>\n<tr>\n<td><code>event_id<\/code><\/td>\n<td>Identificador \u00fanico del evento (<code>evt_\u2026<\/code>). <strong>Id\u00e9ntico en cada reintento<\/strong> del mismo evento: \u00faselo para ignorar duplicados.<\/td>\n<\/tr>\n<tr>\n<td><code>event_at<\/code><\/td>\n<td>Fecha del evento (UTC, ISO 8601)<\/td>\n<\/tr>\n<tr>\n<td><code>changes<\/code><\/td>\n<td>Cambio de estado del destinatario, p. ej. <code>[{\"signer_key\": 1, \"from\": \"pending\", \"to\": \"signed\"}]<\/code> (solo si hay un cambio)<\/td>\n<\/tr>\n<tr>\n<td><code>changes<\/code> (<code>signer.email_failed<\/code>)<\/td>\n<td>Email no entregado, p. ej. <code>[{\"signer_key\": 2, \"email\": \"marc.dubois@example.com\", \"bounce_type\": \"permanent\", \"reason\": \"smtp; 550 5.1.1 user unknown\"}]<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>external_reference<\/code>, <code>metadata<\/code><\/td>\n<td>Tal como se enviaron al crear la solicitud<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Tipos de eventos<\/h3>\n<table>\n<thead>\n<tr>\n<th>Evento<\/th>\n<th>Cu\u00e1ndo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>signer.signed<\/code><\/td>\n<td>Un firmante ha firmado, la solicitud sigue en curso<\/td>\n<\/tr>\n<tr>\n<td><code>signer.declined<\/code>, <code>signer.skipped<\/code>, <code>signer.expired<\/code><\/td>\n<td>Un firmante rechaz\u00f3, fue omitido o expir\u00f3<\/td>\n<\/tr>\n<tr>\n<td><code>request.completed<\/code><\/td>\n<td>Todos los firmantes han firmado: el PDF firmado est\u00e1 incluido (<code>pdf_file_base64<\/code>)<\/td>\n<\/tr>\n<tr>\n<td><code>request.stopped<\/code><\/td>\n<td>La solicitud se detuvo: el PDF firmado parcialmente est\u00e1 incluido<\/td>\n<\/tr>\n<tr>\n<td><code>request.cancelled<\/code><\/td>\n<td>La solicitud fue cancelada<\/td>\n<\/tr>\n<tr>\n<td><code>request.deleted<\/code><\/td>\n<td>La solicitud fue eliminada<\/td>\n<\/tr>\n<tr>\n<td><code>request.expired<\/code><\/td>\n<td>La solicitud expir\u00f3<\/td>\n<\/tr>\n<tr>\n<td><code>request.declined<\/code><\/td>\n<td>Correo certificado rechazado por el destinatario<\/td>\n<\/tr>\n<tr>\n<td><code>signer.email_failed<\/code><\/td>\n<td>Un email enviado a un firmante no se ha podido entregar, ver <a href=\"#undelivered\">Emails no entregados<\/a><\/td>\n<\/tr>\n<tr>\n<td><code>request.updated<\/code><\/td>\n<td>Cualquier otro cambio: recordatorio enviado, firmante modificado, nuevos enlaces de firma\u2026<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>El cuerpo contiene siempre el estado completo actual: su integraci\u00f3n puede basarse en <code>status_id<\/code> y en el estado de cada firmante en lugar de solo en el tipo de evento.<\/p>\n<h3 id=\"undelivered\">Emails no entregados<\/h3>\n<p>Cuando el servidor de correo de un firmante (o del destinatario de un correo certificado) devuelve un email enviado por e-Signature.eu (direcci\u00f3n desconocida, buz\u00f3n lleno, servidor que rechaza el mensaje\u2026), recibe el callback <code>signer.email_failed<\/code>. El estado de la solicitud y del firmante no cambia.<\/p>\n<table>\n<thead>\n<tr>\n<th>Campo de <code>changes<\/code><\/th>\n<th>Descripci\u00f3n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>signer_key<\/code><\/td>\n<td>Clave del firmante en <code>signers<\/code> (siempre 1 para un correo certificado)<\/td>\n<\/tr>\n<tr>\n<td><code>email<\/code><\/td>\n<td>Direcci\u00f3n con error<\/td>\n<\/tr>\n<tr>\n<td><code>bounce_type<\/code><\/td>\n<td><code>permanent<\/code>: la direcci\u00f3n no existe o rechaza los mensajes \u00b7 <code>transient<\/code>: problema temporal (buz\u00f3n lleno, servidor no disponible), entrega abandonada tras varios intentos \u00b7 <code>undetermined<\/code>: motivo desconocido<\/td>\n<\/tr>\n<tr>\n<td><code>reason<\/code><\/td>\n<td>Mensaje t\u00e9cnico del servidor de correo del destinatario, si est\u00e1 disponible<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Corrija la direcci\u00f3n con <code>modifySigner<\/code> (solicitud de firma) o <code>modifyRecipient<\/code> (correo certificado): la invitaci\u00f3n se env\u00eda a la nueva direcci\u00f3n y no se env\u00eda ning\u00fan email de cancelaci\u00f3n a la direcci\u00f3n con error. El titular de la cuenta tambi\u00e9n es informado por email, y el firmante aparece como <strong>Email no entregado<\/strong> en el panel en l\u00ednea.<\/p>\n<p><code>permanent<\/code>: no se env\u00eda ning\u00fan email m\u00e1s a esta direcci\u00f3n para esta solicitud (recordatorios incluidos) hasta que se corrija. <code>transient<\/code> o <code>undetermined<\/code>: los emails no se bloquean; el siguiente recordatorio se env\u00eda normalmente y, si vuelve a fallar, recibe un nuevo callback <code>signer.email_failed<\/code>.<\/p>\n<p class=\"note\">Solo afecta a las solicitudes en curso y a los firmantes que a\u00fan no han firmado. Con <code>send_email: false<\/code>, e-Signature.eu no env\u00eda ning\u00fan email a los firmantes, por lo que este evento no se produce.<\/p>\n<h3>Cabeceras<\/h3>\n<table>\n<thead>\n<tr>\n<th>Cabecera<\/th>\n<th>Ejemplo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>X-Esig-Api-Version<\/code><\/td>\n<td><code>3<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>X-Esig-Event<\/code><\/td>\n<td><code>signer.signed<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>X-Esig-Event-Id<\/code><\/td>\n<td><code>evt_4f0c2b9e1d7a3c55e8b1a2f0<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>X-Esig-Delivery-Attempt<\/code><\/td>\n<td><code>1<\/code>, <code>2<\/code>, \u2026<\/td>\n<\/tr>\n<tr>\n<td><code>X-Esig-Signature<\/code><\/td>\n<td><code>t=1792407600,v1=5d41402abc4b2a76b9719d911017c592\u2026<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Verificar la firma<\/h3>\n<p>Su secreto de firma aparece en <strong>Mi cuenta &gt; Firmas API<\/strong>, donde tambi\u00e9n puede regenerarlo. <code>v1<\/code> es el HMAC-SHA256 de <code>\"&lt;t&gt;.&lt;raw request body&gt;\"<\/code> con su secreto, codificado en hexadecimal. Use el cuerpo <strong>bruto<\/strong>, antes de cualquier lectura JSON, y rechace los callbacks de m\u00e1s de 5 minutos.<\/p>\n<h4>PHP<\/h4>\n<pre><code>$body   = file_get_contents( 'php:\/\/input' );\n$header = $_SERVER['HTTP_X_ESIG_SIGNATURE'] ?? '';\npreg_match( '\/t=(\\d+),v1=([a-f0-9]{64})\/', $header, $m );\n$valid = $m\n    &amp;&amp; abs( time() - (int) $m[1] ) &lt;= 300\n    &amp;&amp; hash_equals( hash_hmac( 'sha256', $m[1] . '.' . $body, $secret ), $m[2] );<\/code><\/pre>\n<h4>Node.js<\/h4>\n<pre><code>const crypto = require('crypto');\nfunction verify(rawBody, header, secret) {\n  const m = \/t=(\\d+),v1=([a-f0-9]{64})\/.exec(header || '');\n  if (!m || Math.abs(Date.now() \/ 1000 - Number(m[1])) &gt; 300) return false;\n  const expected = crypto.createHmac('sha256', secret).update(`${m[1]}.${rawBody}`).digest('hex');\n  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(m[2]));\n}<\/code><\/pre>\n<h4>C# (.NET)<\/h4>\n<pre><code>using System.Security.Cryptography; using System.Text; using System.Text.RegularExpressions;\nstatic bool Verify(string rawBody, string header, string secret) {\n    var m = Regex.Match(header ?? \"\", @\"t=(\\d+),v1=([a-f0-9]{64})\");\n    if (!m.Success || Math.Abs(DateTimeOffset.UtcNow.ToUnixTimeSeconds() - long.Parse(m.Groups[1].Value)) &gt; 300) return false;\n    using var h = new HMACSHA256(Encoding.UTF8.GetBytes(secret));\n    var expected = Convert.ToHexString(h.ComputeHash(Encoding.UTF8.GetBytes(m.Groups[1].Value + \".\" + rawBody))).ToLowerInvariant();\n    return CryptographicOperations.FixedTimeEquals(Encoding.ASCII.GetBytes(expected), Encoding.ASCII.GetBytes(m.Groups[2].Value));\n}<\/code><\/pre>\n<h3>Respuestas y reintentos<\/h3>\n<ul>\n<li>Responda <strong>HTTP 2xx<\/strong> en cuanto reciba el callback y tr\u00e1telo de forma as\u00edncrona si es necesario.<\/li>\n<li>En caso de error de red, tiempo agotado (30 s), HTTP 429 o 5xx, el callback se reenv\u00eda cada hora con el mismo <code>event_id<\/code>, hasta 24 intentos. Las dem\u00e1s respuestas 4xx se consideran definitivas. Si la solicitud vuelve a cambiar antes de una entrega correcta, el siguiente callback lleva un nuevo evento y el estado completo actual. El estado actual sigue disponible en todo momento con <code>getRequest<\/code>.<\/li>\n<li>Se siguen las redirecciones (se mantiene el m\u00e9todo <code>POST<\/code>). No se pueden usar <code>localhost<\/code> ni direcciones privadas.<\/li>\n<\/ul>\n<p>Para el correo certificado, el callback se env\u00eda cuando el acuse se firma, se rechaza o expira, en cada recordatorio autom\u00e1tico y cuando se modifica el destinatario (en la web o mediante la API). El destinatario es <code>signer_key<\/code> 1 en <code>changes<\/code>.<\/p>\n<h2 id=\"errors\">11. Errores<\/h2>\n<p>Los errores se devuelven con <code>\"success\": false<\/code> y un mensaje <code>error<\/code> legible. Base su l\u00f3gica en el c\u00f3digo HTTP: los mensajes pueden mejorar con el tiempo.<\/p>\n<table>\n<thead>\n<tr>\n<th>C\u00f3digo HTTP<\/th>\n<th>Significado<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>200 \/ 201 \/ 202<\/td>\n<td>OK \/ correo certificado creado \/ email de verificaci\u00f3n enviado<\/td>\n<\/tr>\n<tr>\n<td>400<\/td>\n<td>Campo ausente o no v\u00e1lido (el mensaje indica el campo)<\/td>\n<\/tr>\n<tr>\n<td>401<\/td>\n<td><code>userid<\/code> o <code>x-api-key<\/code> no v\u00e1lidos<\/td>\n<\/tr>\n<tr>\n<td>403<\/td>\n<td>Cr\u00e9ditos insuficientes, o l\u00edmite de peticiones alcanzado (10 por minuto)<\/td>\n<\/tr>\n<tr>\n<td>404<\/td>\n<td>Falta <code>id_sign<\/code> o es desconocido para esta cuenta<\/td>\n<\/tr>\n<tr>\n<td>412<\/td>\n<td>Acci\u00f3n no posible en el estado actual (direcci\u00f3n de remitente no verificada, estado incorrecto)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"retention\">12. Conservaci\u00f3n<\/h2>\n<p>El documento con sello de tiempo y el acuse de recibo firmado pueden descargarse durante <strong>30 d\u00edas<\/strong>, con <code>getRequest<\/code> o el callback. El audit trail se conserva durante el periodo definido en nuestro <a href=\"https:\/\/www.e-signature.eu\/es\/dpa\/\">DPA<\/a>. Archive los documentos por su parte en un plazo de 30 d\u00edas.<\/p>\n<\/div>\n<\/div>\n<p><script data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\" data-cfasync=\"false\" nowprocket>\n(function(){\n  var root=document.querySelector('.esig-api'); if(!root) return;\n  var nav=root.querySelector('.esig-api-nav'), box=root.querySelector('.esig-api-nav-in');\n  function headerBottom(){\n    \/* empile les \u00e9l\u00e9ments fixes du haut (barre d'admin WordPress, en-t\u00eate collant\u2026) *\/\n    var b=0, xs=[Math.round(window.innerWidth\/2), 40, window.innerWidth-40];\n    for(var k=0; k<6; k++){\n      var y=b+2, found=0;\n      xs.forEach(function(x){\n        (document.elementsFromPoint?document.elementsFromPoint(x,y):[]).forEach(function(el){\n          for(var n=el; n; n=n.parentElement){\n            if(n===document.body||n===document.documentElement||n===root) break;\n            var p=getComputedStyle(n).position;\n            if(p==='fixed'||p==='sticky'){\n              var r=n.getBoundingClientRect();\n              if(r.top<=y){ if(r.bottom>b){ if(r.bottom<window.innerHeight\/2){ b=r.bottom; found=1; } } }\n              break;\n            }\n          }\n        });\n      });\n      if(!found) break;\n    }\n    return Math.round(b);\n  }\n  \/* section en cours de lecture surlign\u00e9e dans le sommaire *\/\n  var toc=root.querySelector('.esig-api-toc'), links=[].slice.call(root.querySelectorAll('.esig-api-toc a'));\n  var heads=links.map(function(a){ return document.getElementById((a.getAttribute('href')||'').slice(1)); });\n  var current=-1;\n  function spy(top){\n    var cur=0;\n    var line=top+(window.innerHeight-top)*0.3; \/* titre pass\u00e9 au-dessus du premier tiers de l'\u00e9cran *\/\n    heads.forEach(function(h,i){ if(h){ if(h.getBoundingClientRect().top<=line) cur=i; } });\n    if(window.innerHeight+window.scrollY>=document.documentElement.scrollHeight-2) cur=links.length-1;\n    if(cur===current) return;\n    current=cur;\n    links.forEach(function(a,i){ a.classList.toggle('is-active',i===cur); a.parentNode.classList.toggle('is-active',i===cur); });\n    var a=links[cur];\n    if(a){ if(toc.scrollHeight>toc.clientHeight){\n      var y=a.getBoundingClientRect().top-toc.getBoundingClientRect().top+toc.scrollTop;\n      if(y<toc.scrollTop+20) toc.scrollTop=y-20;\n      else if(y>toc.scrollTop+toc.clientHeight-40) toc.scrollTop=y-toc.clientHeight+40;\n    } }\n  }\n  function reset(){box.classList.remove('is-fixed');box.style.left=box.style.width=box.style.top='';nav.style.minHeight='';}\n  var ticking=false;\n  function update(){\n    ticking=false;\n    var mobile=window.innerWidth<=900, gap=mobile?0:20, top=headerBottom()+gap;\n    root.style.setProperty('--esig-top',top+'px');\n    spy(top);\n    reset();\n    var n=nav.getBoundingClientRect(), b=box.getBoundingClientRect(), end=root.getBoundingClientRect().bottom;\n    if(n.top>=top) return;                       \/* pas encore atteint : position normale *\/\n    if(mobile) nav.style.minHeight=b.height+'px'; \/* garde la place du bouton *\/\n    var y=Math.min(top, end-b.height);           \/* s'arr\u00eate en bas de la documentation *\/\n    box.classList.add('is-fixed'); box.style.top=y+'px'; box.style.left=n.left+'px'; box.style.width=n.width+'px';\n    \/* parent avec transform (animations Elementor\u2026) : position:fixed relative \u00e0 ce parent \u2192 correction *\/\n    var f=box.getBoundingClientRect(), dy=f.top-y, dx=f.left-n.left;\n    if(Math.abs(dy)>1||Math.abs(dx)>1){ box.style.top=(y-dy)+'px'; box.style.left=(n.left-dx)+'px'; }\n  }\n  function req(){ if(!ticking){ticking=true;requestAnimationFrame(update);} }\n  window.addEventListener('scroll',req,{passive:true}); window.addEventListener('resize',req);\n  document.addEventListener('change',function(e){ if(e.target){ if(e.target.id==='esig-api-toc') req(); } });\n  update(); window.addEventListener('load',update); setTimeout(update,1500);\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00cdndice \u00cdndice Presentaci\u00f3n Autenticaci\u00f3n Convenciones Cr\u00e9ditos C\u00f3mo funciona un correo certificado Direcci\u00f3n del remitente Enviar un correo certificado El objeto&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":24185,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-29999","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/pages\/29999","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/comments?post=29999"}],"version-history":[{"count":2,"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/pages\/29999\/revisions"}],"predecessor-version":[{"id":30021,"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/pages\/29999\/revisions\/30021"}],"up":[{"embeddable":true,"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/pages\/24185"}],"wp:attachment":[{"href":"https:\/\/www.e-signature.eu\/es\/wp-json\/wp\/v2\/media?parent=29999"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}