Integrer elektronisk signering i din stack
Send kuverter, spor signaturer, modtag webhooks. Simpel REST API, OpenAPI 3.0, curl/Node/Python-eksempler — alt hvad du skal bruge for at forbinde Certyneo med din HRIS, CRM eller forretningssoftware på få timer.
Hurtig start
Tre trin: opret en API-nøgle fra indstillingerne, kodér din PDF i base64, send. Svaret indeholder `signUrl`, som du direkte kan dele med modtageren.
# 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"// 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);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"])Prøv API'en fra dine værktøjer
Postman-samlingen og RapidAPI-arket genereres fra OpenAPI-specifikationen, som også dokumenterer denne side. De tre forbliver således justeret på det rigtige API, endpoint for endpoint, snarere end at divergere ved første tilføjelse.
Postman-samling
De 25 anmodninger organiseret efter domæne — konvolutter, dokumenter, skabeloner, segl, webhooks — med et eksempel på brødtekst og svar for hver enkelt. Indsæt din nøgle i samlingens apiKey-variabel, og kør derefter GET /health: den kræver ingen godkendelse og bekræfter, at din konfiguration er god før det første godkendte opkald.
Kuverter
Oprettelse, afsendelse, statussporings-, aflysning. En kuvert kan indeholde flere dokumenter og flere underskrivere (parallelt eller sekventielt).
Webhooks
Alle konvolut- og modtagerhændelser (`envelope.sent`, `recipient.signed`, `envelope.completed`…) leveret til din valgte URL — komplet liste på /developers/webhooks. HMAC SHA-256 på hver payload for at verificere oprindelsen.
Simpel autentificering
Bearer token. En nøgle pr. miljø (test/prod). Øjeblikkeligt tilbagekaldelig. Grænse 100 anmodninger/minut/nøgle, burst på 200, korrekt 429 med Retry-After-header.
Tilgængelige endpoints
De 53 offentlige ruter: konto, dokumenter, konvolutter, skabeloner, webhooks, elektroniske segl, API-nøgler og fakturering. Alle accepterer et Bearer-token og returnerer JSON.
| Metode | Sti | Beskrivelse |
|---|---|---|
| GET | /api/v1/account/me | Identitet for godkendt opkalder (id, e-mail, plan) : test af identifikatorer uden påkrævet scope |
| GET | /api/v1/sandbox | Tæl de data, der er oprettet med testnøgler (slettes automatisk efter 30 dage) |
| DELETE | /api/v1/sandbox | Slet alle data, der er oprettet med testnøgler, uden at røre de rigtige data |
| POST | /api/v1/documents | Upload en PDF (multipart) : returnerer dokument-id'et |
| GET | /api/v1/documents | Liste dokumenter |
| GET | /api/v1/documents/{id} | Læs dokumentets metadata |
| DELETE | /api/v1/documents/{id} | Slet et dokument |
| GET | /api/v1/envelopes | Liste konvolutter (filtrer med ?status= og ?limit=) |
| POST | /api/v1/envelopes | Opret en konvolut (status DRAFT) : fra en templateId, eller fra documentIds med et valgfrit fields-array |
| GET | /api/v1/envelopes/{id} | Læs en konvoluts tilstand |
| PATCH | /api/v1/envelopes/{id} | Rediger en DRAFT-konvolut |
| DELETE | /api/v1/envelopes/{id} | Slet en DRAFT-konvolut (409 når den er sendt : annuller i stedet) |
| POST | /api/v1/envelopes/{id}/send | Send en DRAFT-konvolut : sender invitationer |
| POST | /api/v1/envelopes/{id}/void | Annuller en sendt konvolut, der ikke er fuldt signeret endnu : afventende underskrivere bliver notificeret |
| POST | /api/v1/envelopes/{id}/remind | Påmind underskrivere efter anmodning på en sendt kuvert (en bestemt modtager som valgfrit) |
| GET | /api/v1/envelopes/{id}/audit-trail | Download PDF for eIDAS-revisionsjournal |
| POST | /api/v1/envelopes/{id}/embed-url | Returnerer underskrifts-URL'en for en modtager med en rammeauthorisering for den ønskede oprindelse. Skal kaldes når der klikkes: authoriseringen gælder i to timer. |
| GET | /api/v1/audit-anchors/{root} | Offentlig : metadata for et ankret revisionsbatch, eller bevisprof .ots med ?format=ots (uden godkendelse) |
| POST | /api/v1/audit-anchors/verify | Offentlig : verificer en revisionspost og dens bevis mod den ankrede Merkle-rod (uden godkendelse, afslører intet) |
| GET | /api/v1/envelopes/{id}/signed-document | Download signeret PDF (når COMPLETED) |
| GET | /api/v1/envelopes/bulk | Liste dine masseudsendelser |
| POST | /api/v1/envelopes/bulk | Masseafsendelse: opret N kuverter ud fra en skabelon og en CSV (Kun Standard/Business) |
| GET | /api/v1/envelopes/bulk/{id} | Progression af masseafsendelse: tællere, fejl pr. linje, oprettede kuverter |
| GET | /api/v1/templates | Liste genbrug kuvertskabeloner |
| POST | /api/v1/templates | Opret en skabelon (dokumenter, roller, positionerede felter) |
| GET | /api/v1/workspaces | Anført arbejdsområderne, hvor du kan oprette en kuvert |
| POST | /api/v1/sepa-mandates | Generer PDF for et SEPA-mandat og dets DRAFT-kuvert, felter allerede placeret |
| POST | /api/v1/payroll-adapters/normalize | Normaliser en lønnings-CSV (Silae, Sage Paie, PayFit, Lucca) til masseafsendelsesformat |
| POST | /api/v1/ag-copropriete | Opret en kuvert til generalforsamling for ejerlejlighed (beslutninger og ejerandele) |
| POST | /api/v1/ag-copropriete/{envelopeId}/votes | Registrer stemmerne fra en ejerlejlighedsejer på generalforsamlingens beslutninger |
| POST | /api/v1/ag-copropriete/{envelopeId}/tally | Tæl generalforsamlingen op: resultat pr. beslutning, vægtet efter ejerandele |
| GET | /api/v1/videos/{videoId} | Download en bevaret identitetsvideo: GDPR-adgangsret (art. 15) |
| GET | /api/v1/webhooks | Liste webhooks |
| POST | /api/v1/webhooks | Registrer en webhook: returnerer signaturhemmeligheden kun en gang |
| GET | /api/v1/webhooks/{id} | Læs et webhook-abonnement |
| PATCH | /api/v1/webhooks/{id} | Rediger URL, begivenheder eller aktivt tilstand |
| DELETE | /api/v1/webhooks/{id} | Afmeld webhook |
| POST | /api/v1/seals | Påfør et kvalificeret elektronisk segl på et dokument |
| GET | /api/v1/seals/{id} | Læs status for et segl |
| GET | /api/v1/seals/{id}/certificate | Download seglcertifikatet |
| GET | /api/v1/payslips/workspaces | Lønsedler: de områder, som denne nøgle distribuerer, ejes eller delegeres af en klient (regnskabskontorer, lønningsadministratorer) |
| GET | /api/v1/payslips/employees | Lønsedler: registret over medarbejdere, inklusiv dem, der har afslået elektronisk levering (papirlønseddel skyldig) |
| PUT | /api/v1/payslips/employees | Lønsedler: tilføje eller opdatere medarbejdere fra registret (fjerner aldrig nogen) |
| POST | /api/v1/payslips | Aflever en lønseddel (PDF) i en medarbejders boks: forseglede, bevaret i 50 år, genoprobering uden duplikater |
| GET | /api/v1/payslips | Vise de afleverede lønsedler med deres konsultationsbevis |
| GET | /api/v1/keys | Vise API-nøgler |
| POST | /api/v1/keys | Opret en API-nøgle: hemmeligheden vises kun én gang |
| PATCH | /api/v1/keys/{id} | Omdøb eller tilbagekald en nøgle |
| DELETE | /api/v1/keys/{id} | Slet en nøgle |
| GET | /api/v1/billing/usage | Forbrug i den aktuelle periode og forventet omkostninger |
| GET | /api/v1/status | Tjenestestatus |
| GET | /api/v1/health | Sundhedskontrol: database, kø og objektlagring |
| GET | /api/v1/openapi | Maskinlæsbar OpenAPI-specifikation |
Modeller af udstyr
En skabelon registrerer én gang for alle PDF'en, rollerne og placeringen af underskriftfelter, som derefter genbruges ved hver afsendelse: overfør dens identifikator i templateId i stedet for documentIds, og de positionerede felter kopieres til den oprettede kuvert.
- • Skabeloner oprettes fra dashboardet (Skabeloner → Ny skabelon), hvor du uploader dokumentet og positionerer felterne med musen — dette er den enkleste vej. API'en giver også mulighed for at oprette dem via POST /api/v1/templates ved at angive dokumenterne, rollerne og felterne; vær opmærksom på, at felterne her er positioneret i absolutte koordinater (side, x, y, bredde, højde), så du skal kende PDF'ens layout.
- • På en konto, der endnu ikke har registreret nogen skabelon, returnerer GET /api/v1/templates en tom liste. Dette er den normale adfærd, ikke en autentificeringsfejl.
- • Listen indeholder kun skabeloner, der ejes af brugeren, der ejer API-nøglen. En skabelon, der er oprettet af en kollega, vises ikke, selv inden for et delt arbejdsområde: generer nøglen fra kontoen, der ejer skabelonen.
- • templateId og documentIds udelukker hinanden: send den ene eller den anden, aldrig begge eller ingen af dem.
- • Angiv mindst lige så mange SIGNER-modtagere, som skabelonen har underskriftsroller, ellers afvises oprettelsen med 400. Feltet signerCount returneret af listen angiver det forventede antal.
- • Signaturens niveau på skabelonen arves af kuverten, medmindre anmodningen eksplicit sender signatureLevel.
# 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.Fra Power Automate eller Zapier
Handlingen « Opret en kuvert » i vores no-code-forbindelser dækker kun stien pr. skabelon: feltet Skabelon er obligatorisk der. For et ad hoc-dokument, der ændrer sig ved hver udførelse, skal du bruge handlingen « Upload et dokument » og derefter en råt HTTP-handling til POST /api/v1/envelopes, hvor du sender det returnerede documentIds.
Dokumentafsendelse: to formularer accepteret
POST /api/v1/documents accepterer filen på to måder efter eget valg. De samme kontroller gælder i begge tilfælde: autoriserede typer, grænse på 50 MB, verifikation af binær signatur og antivirusanalyse.
- • I multipart/form-data med en del kaldet file. Det er den klassiske form, den som curl -F og de fleste biblioteker bruger.
- • I råt krop: filens bytes udgør anmodningskroppen, og headeren Content-Type angiver dens type (for eksempel application/pdf). Nyttigt fra et værktøj, der videresender indholdet direkte, uden at pakke anmodningen ind — det er hvad Power Automate-forbindelsen gør.
- • I råt krop har filnavnet ingen plads i kroppen: angiv det via headeren X-File-Name eller parameteren ?fileName=. Uden den navngives dokumentet efter dets type.
- • En ikke-understøttet type svarer 415 ved at navngive de to accepterede formularer, og en krop annonceret som multipart, men ulæselig, svarer 400. Ingen af dem er en serverfejl.
# 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.Placering af signaturfelter
Uden en skabelon har en kuvert, der er oprettet fra documentIds, ingen forudpositionerede felter: underskriveren modtager dokumentet uden et sted at underskrive. Arrayet fields, der sendes i det samme opkald til oprettelse, placerer hvert felt med præcision — det svarer på API-siden til, hvad en skabelon engang for alle registrerer.
- • Koordinaterne er i PDF-punkter, oprindelsen i øverste venstre hjørne af siden, og Y-aksen peger nedad (en A4-side måler 595 × 842 punkter). x og y angiver feltets øverste venstre hjørne, width og height dets størrelse.
- • pageNumber starter ved 1, documentIndex starter ved 0. Et sidetal udover dokumentet afvises ikke ved oprettelse: feltet ignoreres ved underskrivelse og vises ingen steder — det er det første, man skal kontrollere, når et felt mangler i opkaldet.
- • recipientEmail skal svare til en af modtagerne i det samme opkald uden forskel på store og små bogstaver. Ellers mislykkes oprettelsen ved at angive alle de fejlagtige linjer, hvilket undgår at korrigere dem en ad gangen.
- • fields og templateId udelukker hinanden: en skabelon har allerede sit eget layout. Arrayet fields bruges derfor kun med documentIds.
- • Accepterede typer: SIGNATURE, INITIALS, DATE_SIGNED, TEXT, CHECKBOX og RADIO_GROUP. required er true som standard; placeholder og dateFormat er valgfri, og options ignoreres kun for RADIO_GROUP.
- • En kuvert accepterer maksimalt 100 felter, 20 dokumenter og 50 modtagere — grænserne for din plan kan være lavere.
# 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.Tekstanker: placering af et felt uden at kende koordinaterne
I stedet for koordinater kan et felt citere en tekst, der er udskrevet i dokumentet: anchorText finder det i PDF'en, og serveren beregner positionen ved oprettelsen. Det er tilstanden at foretrække, når dokumentet regenereres ved hvert udsendelse — serialisering, kontraktgenerator — fordi layoutet bevæger sig, mens omtalen « Kundens underskrift » forbliver. anchorPlacement angiver, på hvilken side af teksten feltet er placeret (right som standard, ellers below, above eller left), og anchorIndex vælger forekomsten, når teksten vises flere gange.
x og y er stadig obligatoriske selv med et anker: de tjener som fallback. En ikke-fundet anker medfører ikke oprettelsestransport — feltet bevarer den ordret position, du har leveret, uden fejl eller advarsel i svaret. Angiv derfor et plausibelt fallback i stedet for 0,0, og bekræft gengivelsen på en første udsendelse.
Integreret signering: underskriv uden at forlade din app
Din klient ser og skriver under sit dokument fra dit eget interface. Ceremonien åbnes i et vindue over din side og kommer tilbage til dig automatisk når den er færdig. På serversiden er der intet nyt: du opretter kuverten som sædvanlig ved at angive redirectUrl, derefter lader du SDK'en håndtere modtagerens URL til signering.
- • Kald Certyneo.sign() direkte i din klik-handler og overfør dit serveropkald via getUrl. Et await før sign() forlader brugerens handling: Safari og Firefox blokerer derefter vinduet. SDK'en åbner det med det samme og indlæser det når dit løfte løses.
- • redirectUrl er returkanalen. Vi sender signataren tilbage til den ved at tilføje certyneo_status (completed eller declined) og certyneo_envelope. Indlæs det samme script på denne returside: det er det, der underretter portalvinduet, som forbliver åbent bagved.
- • I integreret tilstand undertrykkes vores egne opfordringer til handling. Din klient ser aldrig en invitation til at oprette en Certyneo-konto.
- • Hvis browseren nægter at åbne vinduet, skifter SDK'et automatisk til fuld sideomdirigering. Forløbet er identisk for signataren, og din returside modtager nøjagtigt de samme parametre.
- • Der findes med vilje ikke noget "bruger opgav" callback: vinduets tilstand kan ikke læses fra din side, og et sådant callback ville blive udløst uretmæssigt. En signatur, der ikke gennemføres, forbliver ventende indtil webhook.
// 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.Browserbegivenheden er ikke et bevis på signatur
onCompleted er et displaysignal, udsendt af en browser og derfor kan forfalskes af hvem som helst fra konsollen. Skift aldrig en sag til "signeret" på dette grundlag: brug det til at opdatere skærmen, og stol på webhook'et signeret envelope.completed modtaget af din server for den aktuelle tilstand. Dette er den klassiske fælde ved betalingsintegrationer, og det gentager sig identisk her.
Udvikling på din maskine
Med en testnøgle accepterer redirectUrl http://localhost (og 127.0.0.1): du bygger hele forløbet på din maskine, før du udrulles. En rigtig nøgle nægter det, så ingen produktionskonvolut sender en ægte signatar tilbage til en maskine, der ikke er hans egen.
Vis ceremonien på din side
Rammetilstand viser signaturen inde i dit interface uden popup-vindue. Det kræver et ekstra trin sammenlignet med vinduetilstand: at bevise, at det websted, som vil vise det, tilhører dig. Det er det, der forhindrer tredjeparter i at ramme vores ceremonier for at narre dine kunder.
- • Erklær dit websted under Indstillinger → Integreret signatur, og publicer den angivne DNS-post. En præcis adresse: et underdomæne eller en anden port tæller som et separat websted.
- • Ved hver signatur skal du anmode om en frisk URL via POST /api/v1/envelopes/{id}/embed-url. Den bærer visningstilladelsen og er gyldig i to timer, hvilket svarer til når der klikkes, ikke når konvolutten oprettes.
- • To signeringsprocesser kan ikke køre inden for en ramme: den kvalificerede signatur, hvis identitetsbekræftelse nægter at være rammet til gengæld, og betaling ved signatur. I begge tilfælde dirigeres underskriveren til et fuldt vindue.
- • Teksten "Drevet af Certyneo" forsvinder fra rammen fra Business-planen og opefter. Rammetilstanden selv er inkluderet fra Standard-planen.
// 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.Få underskrift uden at nogen e-mail afsendes
En portal, der viser ceremonien hos selv, har ofte ikke brug for vores invitation: den kommer ved siden af deres eget forløb og tilbyder en konto til en kunde, der ikke ønsker det. Giv værdien NONE til notifikationskanalen for en modtager, og intet mere sendes til dem - det er du, der tager dem til deres underskrift.
- • Indstillingen er pr. modtager, ikke pr. kuvert: du kan gøre klienten, du hoster, tavs og beholde e-mailen for en ekstern medunderskriver, som ikke har en portal.
- • Det er forbeholdt underskrivere og godkendere, de eneste hvem du har et link at overlevere. Du læser det i svaret på oprettelse og afsendelse, eller du anmoder om en frisk URL på klikket på POST /api/v1/envelopes/{id}/embed-url.
- • Automatiske påmindelser stopper af sig selv for denne modtager: vi skrev aldrig til dem, vi starter ikke med en påmindelse. Andre modtagere bliver ved med at blive påmindet normalt.
- • Signeringscertifikatet nævner det, modtager for modtager. Et bevisdokument, der ville tie stille om dette, ville få det til at virke, som om denne underskriver modtog en invitation fra os, som aldrig eksisterede.
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.Vis dit klientnavn som afsendes
Som standard læser underskriveren navnet på API-nøglens indehaver. Hvis du får dokumenter signeret fra flere virksomheder med en enkelt nøgle, skal du angive feltet sender ved oprettelsen af kuverten: signeringssiden og invitations- og påmindelses-e-mails viser derefter det relevante firmanavn.
- • Reserveret til Business-plan og derover. På en lavere plan afvises oprettelsen i stedet for at lade underskriveren læse et andet navn end det forventede.
- • Navnet er en visning: certifikatet og revisionssporet bevarer den faktiske afsendes, og e-mails sendes altid fra Certyneo.
- • Adressen er valgfri. Uden den ser underskriveren kun navnet, aldrig API-nøglens indehavers adresse.
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"
}
}Autentisering
Hvert kald har en API-nøgle i hovedet Authorization. Nøglerne genereres fra Indstillinger → API-nøgler og vises kun én gang.
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" } }- • Format: sk_live_… i produktion, sk_test_… for sandbox. Hovedet: Authorization: Bearer <nøgle>.
- • Omfang: envelopes, documents, webhooks, seals — læsning (:read) eller skrivning (:write). Skrivning implikerer læsning; omfang * giver alle rettigheder.
- • Nøglerne sk_test_ opretter ressourcer i sandbox, udelukket fra kvote og fakturering. Der sendes ingen rigtig e-mail til modtageren, medmindre adressen matcher den afsendende kontos e-mail — nyttigt til at teste hele flowet på dig selv.
- • Fejl: 401 ugyldig nøgle, 403 manglende rettigheder, 429 forhøjet belastning, 402 månedlig kvote nået.
Formen af svar
En ting at vide før du skriver din kunde: samlingerne er indkapslet i et data-objekt, mens enkelte ressourcer returneres flat. Læs response.data.data på en enkeltresurs returnerer derfor undefined.
// GET /api/v1/envelopes
// Collections are WRAPPED in a "data" array.
{
"data": [
{ "id": "env_abc123", "subject": "Contrat", "status": "SENT" }
]
}// GET /api/v1/envelopes/{id}
// Single resources are returned FLAT — no "data" envelope.
{
"id": "env_abc123",
"subject": "Contrat",
"status": "COMPLETED",
"recipients": [ /* … */ ]
}Hastighedsbegrænsninger
Begrænsningerne garanterer stabil servicekvalitet for alle kunder. Hvis du har brug for mere, kontakt os.
- • 100 anmodninger pr. minut pr. API-nøgle
- • Burst tolereret op til 200 anmodninger på mindre end 10s
- • 429-svar med Retry-After-header, der angiver forsinkelsen i sekunder