Integrer elektronisk signatur i din stack
Send konvolutter, spor signaturer, motta webhooks. Enkel REST API, OpenAPI 3.0, curl/Node/Python-eksempler — alt du trenger for å koble Certyneo til din HRIS, CRM eller bedriftsprogramvare på få timer.
Rask start
Tre steg: opprett en API-nøkkel fra innstillingene, koder din PDF i base64, send. Svaret inneholder `signUrl` som du kan dele direkte med mottakeren.
# 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 verktøyene dine
Postman-samlingen og RapidAPI-arket genereres fra OpenAPI-spesifikasjonen som også dokumenterer denne siden. De tre forblir derfor justert på det faktiske APIet, endpoint for endpoint, i stedet for å divergere ved første tillegg.
Postman-samling
De 25 forespørslene organisert etter domene — konvolutter, dokumenter, maler, sealer, webhooks — med et eksempel på kropp og svar for hver. Lim inn nøkkelen din i apiKey-variabelen i samlingen, deretter kjør GET /health: den krever ingen autentisering og bekrefter at konfigurasjonen din er god før det første autentiserte anropet.
Konvolutter
Oppretting, sending, statussporing, avlysning. En konvolutt kan inneholde flere dokumenter og flere underskrivere (parallelt eller sekvensielt).
Webhooks
Alle konvolutt- og mottakerhendelser (`envelope.sent`, `recipient.signed`, `envelope.completed`…) levert til URL-en du velger — komplett liste på /developers/webhooks. HMAC SHA-256 på hver last for å verifisere opprinnelsen.
Enkel autentisering
Bearer token. En nøkkel per miljø (test / prod). Kan tilbakekalles øyeblikkelig. Grense på 100 forespørsler/min/nøkkel, burst på 200, ren 429-respons med Retry-After-header.
Tilgjengelige endepunkter
De 53 offentlige rutene: konto, dokumenter, konvolutter, maler, webhooks, elektroniske sealer, API-nøkler og fakturering. Alle aksepterer en Bearer-token og returnerer JSON.
| Metode | Bane | Beskrivelse |
|---|---|---|
| GET | /api/v1/account/me | Identitet for autentisert oppkaller (id, e-post, pakke) : test av identifikatorer uten påkrevd omfang |
| GET | /api/v1/sandbox | Telle data opprettet med testnøkler (slettes automatisk etter 30 dager) |
| DELETE | /api/v1/sandbox | Slette alle data opprettet med testnøkler, uten å røre de ekte dataene |
| POST | /api/v1/documents | Last opp en PDF (multipart) : returnerer dokumentets id |
| GET | /api/v1/documents | List opp dokumenter |
| GET | /api/v1/documents/{id} | Les metadata for et dokument |
| DELETE | /api/v1/documents/{id} | Slett et dokument |
| GET | /api/v1/envelopes | List opp konvolutter (filtrer med ?status= og ?limit=) |
| POST | /api/v1/envelopes | Opprett en konvolutt (status DRAFT) : fra en templateId, eller fra documentIds med en valgfri fields-tabell |
| GET | /api/v1/envelopes/{id} | Les tilstanden til en konvolutt |
| PATCH | /api/v1/envelopes/{id} | Rediger en DRAFT-konvolutt |
| DELETE | /api/v1/envelopes/{id} | Slett en DRAFT-konvolutt (409 når den er sendt : avbryt den i stedet) |
| POST | /api/v1/envelopes/{id}/send | Send en DRAFT-konvolutt : sender invitasjonene |
| POST | /api/v1/envelopes/{id}/void | Avbryt en sendt konvolutt som ikke er fullstendig signert ennå : ventende signatarer blir varslet |
| POST | /api/v1/envelopes/{id}/remind | Send på forespørsel påminnelse til underskrivere som venter på en sendt konvolutt (en bestemt mottaker som tillegg) |
| GET | /api/v1/envelopes/{id}/audit-trail | Last ned PDF-en fra eIDAS-attestasjonslogg |
| POST | /api/v1/envelopes/{id}/embed-url | Gir signatur-URL-en til en mottaker, med rammeverk-autorisasjon for den forespurte opprinnelsen. Skal kalles ved klikk: autorisasjonen varer i to timer. |
| GET | /api/v1/audit-anchors/{root} | Offentlig : metadata for en ankret revisjonsbatch, eller bevissfil .ots med ?format=ots (uten autentisering) |
| POST | /api/v1/audit-anchors/verify | Offentlig : verifiser en revisjonsloggoppføring og beviset mot den ankrede Merkle-roten (uten autentisering, avslører ingenting) |
| GET | /api/v1/envelopes/{id}/signed-document | Last ned den signerte PDF-en (når COMPLETED) |
| GET | /api/v1/envelopes/bulk | List opp massesendte meddelelser dine |
| POST | /api/v1/envelopes/bulk | Masseomgang: opprett N konvolutter fra en mal og en CSV (Standard/Business kun) |
| GET | /api/v1/envelopes/bulk/{id} | Fremdrift for masseomgang: tellere, feil per linje, konvolutter opprettet |
| GET | /api/v1/templates | Vis oversikt over gjenbrukbare konvoluttmaler |
| POST | /api/v1/templates | Opprett en mal (dokumenter, roller, plasserte felt) |
| GET | /api/v1/workspaces | List opp arbeidsområdene der du kan opprette en konvolutt |
| POST | /api/v1/sepa-mandates | Generer PDF for et SEPA-mandat og konvolutten i UTKAST, felt allerede plassert |
| POST | /api/v1/payroll-adapters/normalize | Normaliser en lønnsliste-CSV (Silae, Sage Paie, PayFit, Lucca) til masseomgangsformat |
| POST | /api/v1/ag-copropriete | Opprett en konvolutt for generalforsamling av sameie (vedtak og brøkdeler) |
| POST | /api/v1/ag-copropriete/{envelopeId}/votes | Registrer stemmene til en sameier på vedtakene på generalforsamlingen |
| POST | /api/v1/ag-copropriete/{envelopeId}/tally | Telle opp generalforsamlingen: resultat per vedtak, vektet etter brøkdeler |
| GET | /api/v1/videos/{videoId} | Last ned en bevart identitetsvideo: rett til innsyn GDPR (art. 15) |
| GET | /api/v1/webhooks | Vis oversikt over webhooks |
| POST | /api/v1/webhooks | Registrer en webhook: returnerer signeringshemmeligheten en gang bare |
| GET | /api/v1/webhooks/{id} | Les et webhook-abonnement |
| PATCH | /api/v1/webhooks/{id} | Endre URL, hendelser eller aktiv status |
| DELETE | /api/v1/webhooks/{id} | Avmeld webhook |
| POST | /api/v1/seals | Påfør et kvalifisert elektronisk segl på et dokument |
| GET | /api/v1/seals/{id} | Les statusen for et segl |
| GET | /api/v1/seals/{id}/certificate | Last ned sertifikatet for seglet |
| GET | /api/v1/payslips/workspaces | Lønnsslipp: områdene som denne nøkkelen distribuerer, holdt eller delegert av en klient (regnskapsbyråer, lønnsledere) |
| GET | /api/v1/payslips/employees | Lønnsslipp: registeret over ansatte, med de som har nektet elektronisk levering (papirslipp skyldes) |
| PUT | /api/v1/payslips/employees | Lønnsslipper: legge til eller oppdatere ansatte fra registeret (fjerner aldri noen) |
| POST | /api/v1/payslips | Levere en lønnsslipp (PDF) i en ansatts safe: forseglet, oppbevart i 50 år, ny forsøk uten duplikat |
| GET | /api/v1/payslips | Liste over leverte lønnsslipper, med bevis på gjennomgang |
| GET | /api/v1/keys | Liste over API-nøkler |
| POST | /api/v1/keys | Opprett en API-nøkkel: hemmeligheten vises bare én gang |
| PATCH | /api/v1/keys/{id} | Gi nytt navn eller tilbakekall en nøkkel |
| DELETE | /api/v1/keys/{id} | Slett en nøkkel |
| GET | /api/v1/billing/usage | Forbruk for gjeldende periode og anslått kostnad |
| GET | /api/v1/status | Tjenestestatus |
| GET | /api/v1/health | Helsekontroll: database, kø og objektlagring |
| GET | /api/v1/openapi | OpenAPI-spesifikasjon som kan leses av maskiner |
Modeller av udløpsområder
En mal registrerer en gang for alle PDF-en, rollene og plasseringen av signeringsfeltene, og blir deretter gjenbrukt ved hver sending: send identifikatoren i templateId i stedet for documentIds, og de posisjonerte feltene kopieres til den opprettede konvolutten.
- • Maler opprettes fra dashbordet (Maler → Ny mal), der du laster opp dokumentet og posisjonerer feltene med musen — dette er den enkleste måten. API-et tillater også å opprette dem via POST /api/v1/templates, ved å gi dokumentene, rollene og feltene; vær oppmerksom på at feltene der er posisjonert i absolutte koordinater (side, x, y, bredde, høyde), så du må kjenne PDF-layouten.
- • På en konto som ennå ikke har registrert noen mal, returnerer GET /api/v1/templates en tom liste. Dette er normal oppførsel, ikke en autentiseringsfeil.
- • Listen inneholder bare maler som tilhører brukeren som eier API-nøkkelen. En mal opprettet av en kollega er ikke oppført, selv innenfor et delt arbeidsområde: generer nøkkelen fra kontoen som eier malen.
- • templateId og documentIds utelukker hverandre: send enten det ene eller det andre, aldri begge eller ingen av dem.
- • Oppgi minst like mange mottakere av typen SIGNER som malen har underskriverroller, ellers blir opprettelsen avvist med 400. Feltet signerCount som returneres av listen indikerer det forventede antallet.
- • Signeringsnivået til malen arves av konvolutten, med mindre forespørselen eksplisitt 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 «Opprett en konvolutt» i koblingsverktøyene våre uten kode dekker bare malveien: Mal-feltet er obligatorisk der. For et ad hoc-dokument som endres ved hver kjøring, bruk handlingen «Last opp et dokument» og deretter en rå HTTP-handling til POST /api/v1/envelopes ved å sende den returnerte documentIds.
Dokumentsending: to former godtatt
POST /api/v1/documents godtar filen på to måter, etter eget valg. De samme kontrollene gjelder i begge tilfeller: autoriserte typer, 50 MB-grense, verifisering av binær signatur og antivirusanalyse.
- • I multipart/form-data, med en del kalt file. Dette er den klassiske formen, den fra curl -F og de fleste biblioteker.
- • I rå brødtekst: filens bytes utgjør kallet brødteksten, og Content-Type-hodet angir typen (for eksempel application/pdf). Nyttig fra et verktøy som sender innholdet som det er, uten å pakke inn kallet — det er det Power Automate-koblingen gjør.
- • I rå brødtekst har filnavnet ingen plass i brødteksten: angi det via X-File-Name-hodet eller ?fileName=-parameteren. Uten det blir dokumentet kalt etter typen.
- • En type som ikke støttes, svarer 415 ved å navngi de to aksepterte formene, og en brødtekst annonsert som multipart men ulleselig svarer 400. Ingen av dem er en serverfeil.
# 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 av signaturregistreringsfelter
Uten mal har en konvolutt opprettet fra documentIds ingen forhåndsstilte felt: underskriveren mottar dokumentet uten et sted å signere. Arrayen fields, overført i samme opprettelseskall, plasserer hvert felt punktfast — det er ekvivalenten på API-siden av det en mal registrerer en gang for alle.
- • Koordinatene er i PDF-punkter, opprinnelse øverst til venstre på siden og Y-aksen peker nedover (en A4-side måler 595 × 842 punkter). x og y angir øvre venstre hjørne av feltet, width og height angir størrelsen.
- • pageNumber starter på 1, documentIndex starter på 0. Et sidenummer utenfor dokumentet blir ikke avvist ved opprettelse: feltet ignoreres på signeringstidspunktet og vises ingensteds — det er det første å kontrollere når et felt mangler i kallet.
- • recipientEmail må samsvare med en av mottakerne fra samme kall, uten skille mellom små og store bokstaver. Ellers mislykkes opprettelsen ved å liste alle feilaktige linjer, noe som unngår å korrigere dem en etter en.
- • fields og templateId utelukker hverandre gjensidig: en mal har allerede sitt eget oppsett. Arrayen fields brukes derfor bare med documentIds.
- • Godtatte typer: SIGNATURE, INITIALS, DATE_SIGNED, TEXT, CHECKBOX og RADIO_GROUP. required er true som standard; placeholder og dateFormat er valgfri, og options blir kun tatt med for RADIO_GROUP.
- • En konvolutt godtar maksimalt 100 felt, 20 dokumenter og 50 mottakere — grensene for planen din 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: plassere et felt uten å kjenne koordinatene
I stedet for koordinater kan et felt sitere en tekst som er skrevet ut i dokumentet: anchorText finner den i PDF-en og serveren beregner posisjonen ved opprettelse. Dette er modus som foretrekkes når dokumentet regenereres ved hver sending — brevkombinasjon, kontraktsgenerator — fordi oppsettet endres mens merknaden «Kundens signatur» forblir. anchorPlacement angir hvilken side av teksten feltet plasseres (right som standard, ellers below, above eller left) og anchorIndex velger forekomsten når teksten vises flere ganger.
x og y forblir obligatoriske selv med et anker: de tjener som tilbakefall. Et anker som ikke blir funnet, gjør ikke opprettelsen mislykkes — feltet beholder den bokstavelige posisjonen du oppga, uten feil eller advarsel i svaret. Gi derfor et plausibelt tilbakefall i stedet for 0,0, og kontroller gjengivelsen på en første sending.
Integrert signering: signer uten å forlate applikasjonen din
Klienten din ser på og signerer dokumentet sitt fra grensesnittet ditt. Seremonien åpnes i et vindu over siden din, og han kommer tilbake til deg automatisk når den er ferdig. På serversiden er det ingenting nytt: du oppretter konvolutten som vanlig ved å fylle inn redirectUrl, deretter overlater du SDK-en signeringsURL-en til mottakeren.
- • Ring Certyneo.sign() direkte i klikkhåndtakeren din, og send serveranropet ditt gjennom getUrl. En await før sign() går ut av brukerhandlingen: Safari og Firefox blokkerer da vinduet. SDK-en åpner det med en gang og laster det når løftet ditt løses.
- • redirectUrl er returkanalen. Vi sender signataren tilbake dit ved å legge til certyneo_status (completed eller declined) og certyneo_envelope. Last samme script på denne returkoden: det er det som varsler portalvinduet som ble liggende åpent bak.
- • I integrert modus er våre egne handlingsoppfordringer skjult. Klienten din ser aldri en invitasjon til å opprette en Certyneo-konto.
- • Hvis nettleseren nekter vinduet, bytter SDK-en automatisk til full sideomdireksjon. Forløpet er identisk for signataren, og returkoden din mottar nøyaktig samme parametere.
- • Det finnes med vilje ikke et tilbakekall for «brukeren ga opp»: tilstanden til vinduet er ikke lesbar fra siden din, og et slikt tilbakekall ville utløses feilaktig. En signatur som ikke ankommer forblir i ventestatus inntil webhooken.
// 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.Nettleserhendelsen er ikke bevis på signatur
onCompleted er et visningssignal, sendt av en nettleser, og kan derfor forfalskes av hvem som helst fra konsollen deres. Bytt aldri en mappe til «signert» basert på dette: bruk det til å oppdatere skjermen, og stol på det signerte webhook-enveloppen.completed mottatt av serveren din for den virkelige tilstanden. Det er den klassiske fellen med betalingsintegrasjoner, og den gjentar seg identisk her.
Utvikle på maskinen din
Med en testnøkkel godtar redirectUrl http://localhost (og 127.0.0.1): du setter opp hele forløpet på maskinen din før du distribuerer. En reell nøkkel avslår det, slik at ingen produksjonsenveloper sender en ekte signatarer tilbake til en maskin som ikke er hans egen.
Vis seremonien på siden din
Rammevisning viser signaturen inne i grensesnittet ditt, uten vindu. Det krever ett steg ekstra sammenlignet med vindusvisning: å bevise at nettstedet som viser det tilhører deg. Det er det som hindrer en tredjepart fra å ramme inn seremoniene våre for å lure kundene dine.
- • Registrer nettstedet ditt i Innstillinger → Integrert signering, og publiser DNS-posten som angitt. En eksakt adresse: et underdomene eller en annen port regnes som et annet nettsted.
- • For hver signering ber du om en frisk URL fra POST /api/v1/envelopes/{id}/embed-url. Den inneholder visningsautorisasjonen og er gyldig i to timer, noe som tilsvarer tidspunktet for klikk, ikke opprettelsen av konvolutten.
- • To prosesser kan ikke kjøre i en ramme: kvalifisert signering, hvor identitetsverifiseringen nekter å bli rammet inn igjen, og betaling ved signering. I begge tilfeller blir signataren dirigert til et fullstendig vindu.
- • Merkingen «Drevet av Certyneo» forsvinner fra rammen fra Business-planen og oppover. Rammevisning i seg selv er inkludert 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å signert uten at noen e-post sendes
Et portal som viser seremonien hjemme hos ham trenger ofte ikke invitasjonen vår: den kommer ved siden av sitt eget forløp og foreslår en konto til en klient som ikke ønsker det. Sett kanalen for varslinger av en mottaker til NONE, og ingenting blir sendt til ham — det er du som tar ham til signeringen hans.
- • Innstillingen er per mottaker, ikke per konvolutt: du kan dempe klienten du er vert for og beholde e-posten for en ekstern medunderskriver, som ikke har et portal.
- • Det er reservert for underskrivere og godkjennere, de eneste du har en kobling å levere til. Du leser den i svaret på opprettelsen og sendingen, eller du ber om en frisk URL når du klikker på POST /api/v1/envelopes/{id}/embed-url.
- • Automatiske påminnelser stopper av seg selv for denne mottakeren: vi har aldri skrevet til ham, vi begynner ikke med en påminnelse. Andre mottakere fortsetter å få påminnelser normalt.
- • Signeringssertifikatet nevner det, mottaker for mottaker. Et bevisarkiv som ville vært stille om dette ville få det til å virke som om denne underskriveren mottok en invitasjon fra oss som aldri eksisterte.
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 klientens navn som avsender
Som standard leser signataren navnet på API-nøkkeleieren. Hvis du får dokumenter signert for flere selskaper med en enkelt nøkkel, send sender-feltet ved opprettelse av konvolutten: signeringssiden og invitasjons- og påminnelses-e-postene viser deretter navnet på det aktuelle selskapet.
- • Reservert for Business-planen og høyere. På en lavere plan blir opprettelsen nektet i stedet for å la signataren lese et annet navn enn det som forventes.
- • Navnet er en visning: sertifikatet og revisjonsloggen beholder den virkelige avsenderen, og e-postene sendes alltid fra Certyneo.
- • Adressen er valgfri. Uten den ser signataren bare navnet, aldri adressen til API-nøkkeleieren.
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 anrop inneholder en API-nøkkel i Authorization-headeren. Nøkler genereres fra Innstillinger → API-nøkler og vises bare é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 produksjon, sk_test_… for sandkassen. Header: Authorization: Bearer <nøkkel>.
- • Omfang: envelopes, documents, webhooks, seals — i lesing (:read) eller skriving (:write). Skriving innebærer lesing; omfanget * gir alle rettigheter.
- • Nøkler sk_test_ oppretter ressurser i sandkassen, ekskludert fra kvoten og faktureringen. Det sendes ingen ekte e-post til mottakeren, med mindre adressen samsvarer med den sendende kontoens e-post — nyttig for å teste hele flyten på deg selv.
- • Feil: 401 ugyldig nøkkel, 403 utilstrekkelig omfang, 429 hastighetsgrense overskredet, 402 månedlig kvote nådd.
Formen på svar
Et poeng å vite før du skriver klienten din: samlinger er innkapslet i et dataobjekt, mens enhetlige ressurser returneres flatt. Lesing av response.data.data på en enhetlig ressurs 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": [ /* … */ ]
}Gjennomstrømningsgrenser
Grensene garanterer stabil servicekvalitet for alle klienter. Hvis du trenger mer, kontakt oss.
- • 100 forespørsler per minutt per API-nøkkel
- • Burst tolerert opp til 200 forespørsler på mindre enn 10 sekunder
- • 429-respons med Retry-After-header som angir forsinkelsen i sekunder