Přejít na hlavní obsah
Certyneo
Veřejné API v1

Integrujte elektronický podpis do svého stacku

Odesílejte obálky, sledujte podpisy, přijímejte webhooky. Jednoduché REST API, OpenAPI 3.0, příklady curl/Node/Python — vše, co potřebujete k připojení Certyneo k vašemu HRIS, CRM nebo obchodnímu software během několika hodin.

Rychlý start

Tři kroky : vytvořte klíč API z nastavení, zakódujte PDF v base64, odešlete. Odpověď obsahuje `signUrl`, který můžete sdílet přímo s příjemcem.

cURLbash
# 1. Upload the PDF (multipart) and capture the returned document id.
DOC_ID=$(curl -s -X POST https://certyneo.com/api/v1/documents \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@contrat.pdf" | jq -r .id)

# 2. Create a DRAFT envelope referencing the uploaded document.
ENV_ID=$(curl -s -X POST https://certyneo.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d "{
    \"subject\": \"Contrat de prestation\",
    \"documentIds\": [\"$DOC_ID\"],
    \"recipients\": [
      { \"email\": \"client@example.com\", \"name\": \"Marie Dubois\", \"role\": \"SIGNER\" }
    ]
  }" | jq -r .id)

# 3. Dispatch the envelope — this sends the invitation email/SMS.
curl -X POST https://certyneo.com/api/v1/envelopes/$ENV_ID/send \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"
JavaScript / Nodets
// Plain fetch, no SDK to install.
const auth = { Authorization: `Bearer ${process.env.CERTYNEO_API_KEY}` };

// 1. Upload the PDF (multipart).
const fd = new FormData();
fd.append("file", new Blob([pdfBuffer], { type: "application/pdf" }), "contrat.pdf");
const doc = await fetch("https://certyneo.com/api/v1/documents", {
  method: "POST", headers: auth, body: fd,
}).then((r) => r.json());

// 2. Create the DRAFT envelope.
const envelope = await fetch("https://certyneo.com/api/v1/envelopes", {
  method: "POST",
  headers: { ...auth, "Content-Type": "application/json" },
  body: JSON.stringify({
    subject: "Contrat de prestation",
    documentIds: [doc.id],
    recipients: [
      { email: "client@example.com", name: "Marie Dubois", role: "SIGNER" },
    ],
  }),
}).then((r) => r.json());

// 3. Dispatch — this triggers the invitation channel for every recipient.
await fetch(`https://certyneo.com/api/v1/envelopes/${envelope.id}/send`, {
  method: "POST", headers: auth,
});
console.log(envelope.id);
Pythonpython
import os, requests

auth = {"Authorization": f"Bearer {os.environ['CERTYNEO_API_KEY']}"}

# 1. Upload the PDF (multipart).
with open("contrat.pdf", "rb") as f:
    doc = requests.post(
        "https://certyneo.com/api/v1/documents",
        headers=auth,
        files={"file": ("contrat.pdf", f, "application/pdf")},
    ).json()

# 2. Create the DRAFT envelope.
envelope = requests.post(
    "https://certyneo.com/api/v1/envelopes",
    headers={**auth, "Content-Type": "application/json"},
    json={
        "subject": "Contrat de prestation",
        "documentIds": [doc["id"]],
        "recipients": [
            {"email": "client@example.com", "name": "Marie Dubois", "role": "SIGNER"},
        ],
    },
).json()

# 3. Dispatch — this triggers the invitation channel for every recipient.
requests.post(
    f"https://certyneo.com/api/v1/envelopes/{envelope['id']}/send",
    headers=auth,
)
print(envelope["id"])

Vyzkoušejte API ze svých nástrojů

Kolekce Postman a list RapidAPI jsou generovány ze specifikace OpenAPI, která také dokumentuje tuto stránku. Všechny tři zůstávají v souladu s reálným API, endpoint po endpointu, místo aby se rozcházely při prvním přidání.

Kolekce Postman

25 požadavků seřazených podle domény — obálky, dokumenty, šablony, pečetě, webhooky — s příkladem textu a odpovědi pro každý. Vložte svůj klíč do proměnné apiKey kolekce a spusťte GET /health: nevyžaduje žádné ověření a potvrdí, že je vaše konfigurace správná před prvním ověřeným voláním.

List RapidAPI

Stejný katalog endpointů, testovatelný přímo z prohlížeče. Testovací prostředí očekává dva odlišné záhlaví: klíč RapidAPI, který vám platforma přidělila, a váš klíč Certyneo v Authorization — druhý skutečně autorizuje volání.

Obálky

Vytváření, odesílání, sledování stavu, zrušení. Obálka může obsahovat více dokumentů a více signatářů (paralelně nebo postupně).

Webhooky

Všechny události obálky a příjemce (`envelope.sent`, `recipient.signed`, `envelope.completed`…) doručené na vámi zvolenou URL — úplný seznam na /developers/webhooks. HMAC SHA-256 na každé užitečné zatížení pro ověření původu.

Jednoduché ověření

Bearer token. Jeden klíč na prostředí (test / prod). Okamžitě zrušitelný. Limit 100 req/min/klíč, burst 200, čistý 429 s hlavičkou Retry-After.

Dostupné endpointy

52 veřejných tras: účet, dokumenty, obálky, šablony, webhooky, elektronické pečetě, klíče API a fakturace. Všechny přijímají token Bearer a vrací JSON.

MetodaCestaPopis
GET/api/v1/account/meIdentita ověřeného volajícího (id, e-mail, plán) : test identifikátorů bez požadovaného scope
GET/api/v1/sandboxSpočítat data vytvořená testovacími klíči (automaticky mazaná po 30 dnech)
DELETE/api/v1/sandboxSmazat všechna data vytvořená testovacími klíči, aniž by se dotklo skutečných dat
POST/api/v1/documentsNahrát PDF (multipart) : vrátí id dokumentu
GET/api/v1/documentsVypsat dokumenty
GET/api/v1/documents/{id}Číst metadata dokumentu
DELETE/api/v1/documents/{id}Smazat dokument
GET/api/v1/envelopesVypsat obálky (filtrovat pomocí ?status= a ?limit=)
POST/api/v1/envelopesVytvořit obálku (stav DRAFT) : z templateId, nebo z documentIds s volitelným polem fields
GET/api/v1/envelopes/{id}Číst stav obálky
PATCH/api/v1/envelopes/{id}Upravit obálku DRAFT
DELETE/api/v1/envelopes/{id}Smazat obálku DRAFT (409 jakmile je odeslána : zrušit místo toho)
POST/api/v1/envelopes/{id}/sendOdeslat obálku DRAFT : pošle pozvánky
POST/api/v1/envelopes/{id}/voidZrušit odeslané obálky, které nejsou ještě zcela podepsány : čekající podepsané osoby jsou upozorněny
GET/api/v1/envelopes/{id}/audit-trailStáhnout PDF deníku eIDAS dokladu
POST/api/v1/envelopes/{id}/embed-urlVrací adresu URL podpisu příjemce s autorizací pro správu požadovaného původu. Volejte v okamžiku kliknutí: autorizace platí dvě hodiny.
GET/api/v1/audit-anchors/{root}Public : metadata kotveného auditního balíčku, nebo soubor dokladu .ots s ?format=ots (bez ověření)
POST/api/v1/audit-anchors/verifyPublic : ověřit auditní záznam a jeho doklad vůči kotvené kořeni Merkle stromu (bez ověření, neodhaluje nic)
GET/api/v1/envelopes/{id}/signed-documentStáhnout podepsaný PDF (jakmile COMPLETED)
GET/api/v1/envelopes/bulkVypsat vaše hromadné odeslání
POST/api/v1/envelopes/bulkHromadné odeslání: vytvoření N obálek ze šablony a CSV (pouze Standard/Business)
GET/api/v1/envelopes/bulk/{id}Pokrok hromadného odeslání: čítače, selhání na řádek, vytvořené obálky
GET/api/v1/templatesVypsat opakovaně použitelné šablony obálek
POST/api/v1/templatesVytvořit šablonu (dokumenty, role, umístěná pole)
GET/api/v1/workspacesVypsat pracovní prostory, ve kterých můžete vytvořit obálku
POST/api/v1/sepa-mandatesVygenerovat PDF mandátu SEPA a jeho obálku DRAFT, pole již umístěna
POST/api/v1/payroll-adapters/normalizeNormalizovat CSV mezd (Silae, Sage Paie, PayFit, Lucca) do formátu hromadného odeslání
POST/api/v1/ag-coproprieteVytvořit obálku valné hromady vlastníků jednotek (usnesení a podíly)
POST/api/v1/ag-copropriete/{envelopeId}/votesZaznamenat hlasy vlastníka jednotky na usneseních valné hromady
POST/api/v1/ag-copropriete/{envelopeId}/tallySečíst valnou hromadu: výsledek podle usnesení, vážený podíly
GET/api/v1/videos/{videoId}Stáhnout uloženou identifikační video: právo přístupu RGPD (čl. 15)
GET/api/v1/webhooksVypsat webhooky
POST/api/v1/webhooksZaregistrovat webhook: vrací tajný klíč pro podpis pouze jednou
GET/api/v1/webhooks/{id}Přečíst webhook odběr
PATCH/api/v1/webhooks/{id}Upravit adresu URL, události nebo aktivní stav
DELETE/api/v1/webhooks/{id}Odhlásit webhook
POST/api/v1/sealsPřipevnit kvalifikovanou elektronickou pečeť k dokumentu
GET/api/v1/seals/{id}Přečíst stav pečeti
GET/api/v1/seals/{id}/certificateStáhnout certifikát pečeti
GET/api/v1/payslips/workspacesVýplatní pásky: prostory, pro které tento klíč distribuuje, dérženy nebo delegovány klientem (účetní kanceláře, správci mezd)
GET/api/v1/payslips/employeesVýplatní pásky: registr zaměstnanců, s těmi, kteří odmítli elektronickou doručku (splatný papírový bulletin)
PUT/api/v1/payslips/employeesVýplatní pásky: přidání nebo aktualizace zaměstnanců z registru (nikdy je neodebírejte)
POST/api/v1/payslipsUložení výplatní pásky (PDF) do trezoru zaměstnance: zapečetěno, uchovávání 50 let, opakování bez duplicit
GET/api/v1/payslipsVýpis vydaných výplatních pásk s jejich důkazem konzultace
GET/api/v1/keysVypsat klíče API
POST/api/v1/keysVytvořit klíč API: tajemství se zobrazí pouze jednou
PATCH/api/v1/keys/{id}Přejmenování nebo zrušení klíče
DELETE/api/v1/keys/{id}Smazání klíče
GET/api/v1/billing/usageSpotřeba v aktuálním období a projektované náklady
GET/api/v1/statusStav služby
GET/api/v1/healthKontrola stavu: databáze, fronta čekání a objektové úložiště
GET/api/v1/openapiSpecifikace OpenAPI čitelná strojem

Šablony obálky

Šablona zaznamenává jednou provždy PDF, role a umístění podpisových polí, pak se opakovaně používá při každém odeslání: předejte její identifikátor v templateId místo documentIds a umístěná pole jsou zkopírována do vytvořené obálky.

  • • Šablony se vytváří z ovládacího panelu (Šablony → Nová šablona), kde umístíte dokument a poté umístíte pole myší — to je nejjednodušší způsob. API umožňuje je také vytvářet pomocí POST /api/v1/templates poskytnutím dokumentů, rolí a polí; pozor, pole jsou v něm umístěna v absolutních souřadnicích (stránka, x, y, šířka, výška), takže musíte znát rozvržení PDF.
  • • Na účtu, který dosud neregistroval žádnou šablonu, GET /api/v1/templates vrátí prázdný seznam. Toto je normální chování, nikoli selhání ověřování.
  • • Seznam obsahuje pouze šablony patřící uživateli vlastnícímu klíč API. Šablona vytvořená kolegou se zde neobjevuje, ani v rámci sdíleného pracovního prostoru: vygenerujte klíč z účtu, který šablonu vlastní.
  • • templateId a documentIds se vzájemně vylučují: odešlete jeden nebo druhý, nikdy oba ani žádný.
  • • Poskytněte alespoň tolik příjemců SIGNER, kolik má šablona rolí podepisujících, jinak je vytváření odmítnuto s kódem 400. Pole signerCount vrácené seznamem označuje očekávaný počet.
  • • Úroveň podpisu šablony je dědí obálka, pokud požadavek výslovně neprojde signatureLevel.
cURLbash
# 1. Discover the templates saved on this account.
curl -s https://certyneo.com/api/v1/templates \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"

# {
#   "data": [
#     { "id": "cmdq7f4k80001s6y2h1xa9pl3", "name": "Contrat de prestation",
#       "signerCount": 2, "documentCount": 1, "signatureLevel": "SIMPLE" }
#   ],
#   "pagination": { "page": 1, "pageSize": 20, "total": 1, "pages": 1 }
# }
#
# An empty "data" array means no template exists on this account yet —
# create one from the dashboard, it is not an authentication problem.

# 2. Create the envelope FROM the template: no documentIds and no field
#    coordinates, both are carried by the template. Pass one SIGNER
#    recipient per signer role, in the template's role order.
curl -X POST https://certyneo.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Contrat de prestation",
    "templateId": "cmdq7f4k80001s6y2h1xa9pl3",
    "recipients": [
      { "email": "client@example.com", "name": "Marie Dubois", "role": "SIGNER" },
      { "email": "legal@example.com", "name": "Paul Martin", "role": "SIGNER" }
    ]
  }'

# 3. The envelope is DRAFT at this point — POST /envelopes/{id}/send
#    dispatches it, exactly as in the quick-start above.

Z Power Automate nebo Zapier

Akce "Vytvořit obálku" našich no-code konektorů zahrnuje pouze cestu přes šablonu: pole Šablona je povinné. Pro ad hoc dokument, který se při každém spuštění mění, použijte akci "Nahrát dokument" a poté raw HTTP akci na POST /api/v1/envelopes předáním vrácené hodnoty documentIds.

Odeslání dokumentu: dvě přijaté formy

POST /api/v1/documents přijímá soubor dvěma způsoby, podle výběru. Ve obou případech se vztahují stejné kontroly: povolené typy, limit 50 MB, ověření binárního podpisu a antivirová analýza.

  • • V multipart/form-data s částí pojmenovanou file. Toto je klasická forma, forma curl -F a většiny knihoven.
  • • V nezpracovaném těle: bajty souboru tvoří tělo požadavku a hlavička Content-Type určuje jeho typ (například application/pdf). Užitečné z nástroje, který přenáší obsah tak, jak je, bez zabalení požadavku — to dělá konektor Power Automate.
  • • V nezpracovaném těle nemá název souboru místo v těle: uveďte jej prostřednictvím hlavičky X-File-Name nebo parametru ?fileName=. Bez něj je dokument pojmenován podle svého typu.
  • • Nepodporovaný typ reaguje 415 a pojmenuje dvě přijaté formy a tělo oznámené jako multipart, které je nečitelné, reaguje 400. Ani jedno není chyba serveru.
cURLbash
# a. multipart/form-data — the classic shape.
curl -X POST https://certyneo.com/api/v1/documents \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@contrat.pdf;type=application/pdf"

# b. raw body — the file bytes ARE the body, typed by Content-Type.
#    The filename has nowhere to live in the body, so pass it as a header
#    (or ?fileName=). Without it the document is named after its type.
curl -X POST https://certyneo.com/api/v1/documents \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/pdf" \
  -H "X-File-Name: contrat.pdf" \
  --data-binary "@contrat.pdf"

# Both return the same 201 with the document id to pass as documentIds.

Umístění polí pro podpis

Bez šablony se obálka vytvořená z documentIds nemá žádné předem umístěné pole: podepisující obdrží dokument bez místa pro podpis. Pole array fields, předané ve stejném volání vytvoření, umístí každé pole na přesný bod — je to ekvivalent na straně API toho, co šablona zaznamenává jednou provždy.

  • • Souřadnice jsou v bodech PDF, počátek v levém horním rohu stránky a osa Y směřuje dolů (stránka A4 měří 595 × 842 bodů). x a y označují levý horní roh pole, width a height jeho velikost.
  • • pageNumber začíná na 1, documentIndex začíná na 0. Číslo stránky mimo dokument není při vytváření zamítnuto: pole je ignorováno v době podpisu a nikde se neobjevuje — je to první věc, kterou je třeba zkontrolovat, když pole chybí ve volání.
  • • recipientEmail musí odpovídat jednomu z příjemců stejného volání bez rozlišení velikosti písmen. Jinak vytvoření selže vypsáním všech chybných řádků, což se vyhne jejich opravě jeden po druhém.
  • • fields a templateId se vzájemně vylučují: šablona již nese svůj vlastní rozvržení. Pole fields se tedy používá pouze s documentIds.
  • • Přijaté typy: SIGNATURE, INITIALS, DATE_SIGNED, TEXT, CHECKBOX a RADIO_GROUP. required má ve výchozím nastavení hodnotu true; placeholder a dateFormat jsou volitelné a options se bere v úvahu pouze pro RADIO_GROUP.
  • • Obálka přijímá maximálně 100 polí, 20 dokumentů a 50 příjemců — limity vašeho plánu mohou být nižší.
cURLbash
# Ad-hoc envelope WITH pre-placed fields — no template involved.
# Coordinates are PDF points, origin TOP-LEFT of the page, +Y downwards
# (A4 = 595 x 842 pt). x / y are the field box's top-left corner.
#
# The last field is positioned by ANCHOR instead of by eye: the server
# locates "Signature du client" in the PDF and computes the spot. x / y
# stay required there — they are the fallback if the text is not found.
curl -X POST https://certyneo.com/api/v1/envelopes \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": "Contrat de prestation",
    "documentIds": ["cmdq7f4k80001s6y2h1xa9pl3"],
    "recipients": [
      { "email": "client@example.com", "name": "Marie Dubois", "role": "SIGNER" }
    ],
    "fields": [
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "SIGNATURE",
        "x": 90, "y": 640, "width": 180, "height": 44 },
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "DATE_SIGNED",
        "x": 320, "y": 640, "width": 140, "height": 30,
        "dateFormat": "DD/MM/YYYY" },
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "TEXT",
        "x": 90, "y": 700, "width": 200, "height": 30,
        "placeholder": "Fonction", "required": false },
      { "recipientEmail": "client@example.com", "documentIndex": 0,
        "pageNumber": 2, "fieldType": "SIGNATURE",
        "anchorText": "Signature du client", "anchorPlacement": "below",
        "anchorIndex": 0,
        "x": 90, "y": 640, "width": 180, "height": 44 }
    ]
  }'

# The envelope is DRAFT at this point — POST /envelopes/{id}/send
# dispatches it, exactly as in the quick-start above.

Textové kotvy: umístění pole bez znalosti souřadnic

Místo souřadnic může pole citovat text vytištěný v dokumentu: anchorText jej vyhledá v PDF a server vypočítá polohu při vytvoření. Toto je preferovaný režim, když je dokument regenerován při každém odeslání — hromadná korespondence, generátor smluv — protože se rozvržení posouvá, zatímco zmínka „Podpis zákazníka" zůstává. anchorPlacement určuje, na které straně textu se pole umístí (ve výchozím nastavení right, jinak below, above nebo left) a anchorIndex vybere výskyt, když se text objeví vícekrát.

x a y zůstávají povinné i s kotvou: slouží jako základ. Nenalezená kotva nezpůsobí selhání vytvoření — pole si zachovává doslova uvedenou polohu bez chyby ani upozornění v odpovědi. Uveďte tedy věrohodný základ spíše než 0,0 a ověřte vykreslení při prvním odeslání.

Integrovaný podpis: podepisování bez opuštění vaší aplikace

Váš klient si prohlédne a podepíše svůj dokument z vašeho vlastního rozhraní. Ceremoniál se otevře v okně nad vaší stránkou a automaticky se vrátí k vám po dokončení. Na straně serveru nic nového: vytvoříte obálku jako obvykle vyplněním redirectUrl a potom předáte SDK adresu URL podpisu příjemce.

  • • Zavolejte Certyneo.sign() přímo v obslužné rutině kliknutí a předejte volání serveru přes getUrl. Await před sign() vypadá z gesta uživatele: Safari a Firefox pak okno blokují. SDK je otevře okamžitě a načte je, když se váš promise vyřeší.
  • • redirectUrl je zpáteční kanál. Zašleme tam podepisuvatele a přidáme certyneo_status (completed nebo declined) a certyneo_envelope. Načtěte stejný skript na tuto zpátečnou stránku: je to ten, který upozorní okno portálu, které zůstalo otevřené vzadu.
  • • V integrovaném režimu jsou naše vlastní výzvy k akci potlačeny. Váš klient nikdy neuvidí pozvánku k vytvoření účtu Certyneo.
  • • Pokud prohlížeč odmítne okno, SDK se automaticky přepne na úplné přesměrování stránky. Cesta je pro podepisuvatele identická a vaše zpáteční stránka obdrží přesně stejné parametry.
  • • Záměrně neexistuje callback "uživatel opustil": stav okna není čitelný z vaší stránky a takový callback by se spustil omylem. Podpis, který se nedostaví, zůstane čekající až do webhooku.
JavaScriptjavascript
// 1. Your server creates and sends the envelope, then hands the browser the
//    recipient's signing URL. Nothing new on the API side:
//      POST /api/v1/envelopes        { …, "redirectUrl": "https://your-app.com/quote/42/signed" }
//      POST /api/v1/envelopes/{id}/send   → recipients[].accessToken
//      signingUrl = "https://certyneo.com/sign/" + accessToken

// 2. On your quote page — load the SDK once:
//      <script src="https://certyneo.com/embed.js"></script>

document.querySelector("#sign").addEventListener("click", () => {
  Certyneo.sign({
    // Called AFTER the window is already open, so no popup blocker ever
    // sees a delay between the click and window.open.
    getUrl: () =>
      fetch("/api/quote/42/signature", { method: "POST" })
        .then((r) => r.json())
        .then((d) => d.signingUrl),

    onCompleted: (e) => showConfirmation(e.envelopeId),
    onDeclined: () => showDeclined(),
    onError: (e) => showError(e),
  });
});

// 3. On https://your-app.com/quote/42/signed — your return page — load the
//    same script and render a short confirmation. It relays the outcome to
//    the portal window behind it, then closes itself.

Událost prohlížeče není důkazem podpisu

onCompleted je signál zobrazení vydaný prohlížečem, a tedy falšovatelný kýmkoliv z jeho konzoly. Nikdy neměňte složku na "podepsáno" na základě tohoto: použijte jej k aktualizaci obrazovky a spoléhejte se na webhook s podepsaným envelope.completed přijatým vaším serverem pro skutečný stav. Toto je klasická past integracích plateb a zde se reprodukuje stejně.

Vývoj na vaší stanici

S testovacím klíčem redirectUrl akceptuje http://localhost (a 127.0.0.1): celý průběh připravíte na vaší stanici před nasazením. Skutečný klíč to odmítá, aby se žádná produkční obálka nevracela ke skutečnému podepisuvateli na stroj, který není jeho.

Zobrazit ceremonii na vaší stránce

Režim vložený zobrazuje podpis uvnitř vašeho rozhraní bez okna. Vyžaduje jeden krok navíc oproti režimu okna: prokázat, že vám patří web, který jej zobrazí. To brání třetím stranám v tom, aby vnořily naše ceremonie a oklamaly vaše zákazníky.

  • • Deklarujte svůj web v Nastavení → Vložený podpis a poté publikujte uvedený záznam DNS. Přesná adresa: subdoména nebo jiný port se počítá jako další web.
  • • Při každém podpisu si vyžádejte novou adresu URL na POST /api/v1/envelopes/{id}/embed-url. Obsahuje oprávnění k zobrazení a je platná dvě hodiny, což odpovídá okamžiku kliknutí, ne vytvoření obálky.
  • • Dva procesy se nemohou odehrávat v rámci vloženého zobrazení: kvalifikovaný podpis, jehož ověření identity odmítá být vnořeno, a platba při podpisu. V obou případech je podpisující veden do úplného okna.
  • • Poznámka „Powered by Certyneo" zmizí z vloženého zobrazení od plánu Business. Samotný režim vložený je obsažen již v plánu Standard.
JavaScriptjavascript
// Mode cadre : la cérémonie s'affiche DANS votre page.
//
// 1. Déclarez votre site une fois pour toutes dans Réglages → Signature
//    intégrée, et publiez l'enregistrement DNS qu'on vous y donne.
//
// 2. À chaque signature, votre serveur demande une URL fraîche. Elle porte
//    l'autorisation qui permet au navigateur d'afficher la cérémonie chez
//    vous, et vaut deux heures :
//
//      POST /api/v1/envelopes/{id}/embed-url
//      { "origin": "https://portail.exemple.fr" }
//      -> { "signingUrl": "…", "expiresAt": "…" }

Certyneo.sign({
  mode: "iframe",
  el: "#zone-signature",        // sélecteur ou nœud de votre page

  getUrl: () =>
    fetch("/api/devis/42/signature", { method: "POST" })
      .then((r) => r.json())
      .then((d) => d.signingUrl),

  onCompleted: (e) => afficherConfirmation(e.envelopeId),
  onDeclined: () => afficherRefus(),
});

// Le cadre parle à votre page par postMessage — pas besoin de page de retour,
// contrairement au mode fenêtre.

Nechat podepsat bez toho, aby odešel nějaký e-mail

Portál, který zobrazuje ceremonii u něj, často nepotřebuje naši pozvánku: přichází spolu s jeho vlastní cestou a nabízí účet zákazníkovi, který to nechce. Nastavte hodnotu NONE na kanál oznámení příjemce a nic se mu již neodešle — vy ho vedete na jeho podpis.

  • • Nastavení je podle příjemce, ne podle obálky: můžete umlčet klienta, kterého hostujete, a ponechat e-mail pro externí spoluúčastníka, který nemá portál.
  • • Je vyhrazen pro podpisovatele a schvalovatele, jedinou skupinu, kterým máte odkaz k předání. Přečtete si jej v odpovědi na vytvoření a odeslání, nebo si vyžádáte čerstvou adresu URL v moment u kliknutí na POST /api/v1/envelopes/{id}/embed-url.
  • • Automatické znovuzaslání se zastaví samo pro tohoto příjemce: nikdy jsme mu nenapsali, nezačínáme znovuzaslání. Ostatní příjemci se pokračují normálně znovuposílat.
  • • Certifikát podpisu to zmíní, příjemce za příjemcem. Záznám o důkazech, který by se o tom zmlčel, by mohl vyvolat dojem, že tento podpis ant obdržel od nás pozvánku, která nikdy neexistovala.
JSONjson
POST /api/v1/envelopes

{
  "subject": "Mandat de gestion",
  "documentIds": ["doc_8f2c1a4b9e7d"],
  "recipients": [
    {
      "email": "client@exemple.fr",
      "name": "Camille Client",
      "role": "SIGNER",
      "notificationChannel": "NONE"
    },
    {
      "email": "notaire@exemple.fr",
      "name": "Maître Notaire",
      "role": "SIGNER"
    }
  ]
}

// La réponse rend le lien de chaque signataire :
//
//   "recipients": [
//     { "email": "client@exemple.fr",  "accessToken": "…",
//       "notificationChannel": "NONE"  },
//     { "email": "notaire@exemple.fr", "accessToken": "…",
//       "notificationChannel": "EMAIL" }
//   ]
//
// Le client ne reçoit rien : vous l'emmenez sur sa signature depuis votre
// portail. Le notaire, lui, reçoit son invitation comme d'habitude.

Zobrazit jméno vašeho klienta jako odesílatele

Ve výchozím nastavení podepisující vidí jméno držitele klíče API. Pokud necháte podepisovat dokumenty více firem pomocí jednoho klíče, předejte pole sender při vytváření obálky: stránka pro podepisování a e-maily s pozvánkou a připomenutím pak zobrazují jméno příslušné firmy.

  • • Vyhrazeno pro plán Business a vyšší. V nižším plánu je vytváření odmítnuto, aby se zabránilo tomu, aby podepisující viděl jiné jméno než očekávané.
  • • Jméno je pouze zobrazení: certifikát a audit trail zachovávají skutečného odesílatele a e-maily vždy odesílá Certyneo.
  • • Adresa je volitelná. Bez ní podepisující vidí pouze jméno, nikdy adresu držitele klíče.
JSONjson
POST /api/v1/envelopes

{
  "subject": "Devis 2026-118",
  "documentIds": ["doc_8f2c1a4b9e7d"],
  "recipients": [
    { "email": "client@exemple.fr", "name": "Camille Client", "role": "SIGNER" }
  ],
  "sender": {
    "name": "1.2.3. Panneaux Solaires",
    "email": "devis@123-panneaux-solaires.fr"
  }
}

Ověřování

Každý volání obsahuje klíč API v hlavičce Authorization. Klíče se generují z Nastavení → Klíče API a ukazují se pouze jednou.

HTTPhttp
GET /api/v1/account/me HTTP/1.1Host: certyneo.com
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx

# 200 OK
{ "data": { "id": "usr_…", "email": "you@example.com", "plan": "BUSINESS", "environment": "live" } }
  • • Formát: sk_live_… ve produkci, sk_test_… pro testovací prostředí. Hlavička: Authorization: Bearer <klíč>.
  • • Obory: obálky, dokumenty, webhooky, značky — čtení (:read) nebo zápis (:write). Zápis implikuje čtení; obor * dává všechna práva.
  • • Klíče sk_test_ vytvářejí testovací zdroje, které jsou vyloučeny z kvóty a fakturace. Příjemci se neodesílá žádný skutečný e-mail, pokud jeho adresa neodpovídá e-mailu odesílajícího účtu — užitečné pro otestování celého procesu na sobě.
  • • Chyby: 401 neplatný klíč, 403 nedostatečná obor, 429 překročená rychlostová omezení, 402 měsíční kvota dosažena.

Forma odpovědí

Před tím, než zapišete svého klienta, je důležité znát: kolekce jsou obaleny v objektu data, zatímco jednotlivé zdroje jsou vráceny rovnou. Tedy čtení response.data.data na jednotlivém zdroji vrací tedy undefined.

Kolekce — obalenajson
// GET /api/v1/envelopes
// Collections are WRAPPED in a "data" array.
{
  "data": [
    { "id": "env_abc123", "subject": "Contrat", "status": "SENT" }
  ]
}
Jednotlivý zdroj — rovnoujson
// GET /api/v1/envelopes/{id}
// Single resources are returned FLAT — no "data" envelope.
{
  "id": "env_abc123",
  "subject": "Contrat",
  "status": "COMPLETED",
  "recipients": [ /* … */ ]
}

Limity přenosu

Limity zajišťují stabilní kvalitu služby pro všechny klienty. Pokud potřebujete více, kontaktujte nás.

  • • 100 požadavků za minutu na API klíč
  • • Burst tolerován až 200 požadavků za méně než 10s
  • • Odpověď 429 s hlavičkou Retry-After udávající zpoždění v sekundách

Jít dále