Integrați semnătura electronică în stack-ul dvs.
Trimiteți pluve, urmăriți semnăturile, primiți webhooks. API REST simplu, OpenAPI 3.0, exemple curl/Node/Python — tot ceea ce trebuie pentru a conecta Certyneo la HRIS, CRM sau software-ul dvs. în câteva ore.
Trei pași: creați o cheie API din setări, codificați PDF-ul în base64, trimiteți. Răspunsul conține `signUrl` pe care îl puteți partaja direct cu destinatarul.
Pluve
# 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"])Încercați API-ul din instrumentele dumneavoastră
Colecția Postman și fișa RapidAPI sunt generate din specificația OpenAPI care documentează și această pagină. Cele trei rămân deci aliniate cu API-ul real, endpoint cu endpoint, în loc să diverge la primul adaos.
Colecția Postman
Cele 25 de cereri aranjate după domeniu — plicuri, documente, șabloane, sigilii, webhook-uri — cu un exemplu de corp și răspuns pentru fiecare. Lipiți cheia dumneavoastră în variabila apiKey a colecției, apoi lansați GET /health: nu necesită nicio autentificare și confirmă că configurația dumneavoastră este bună înainte de primul apel autentificat.
Creație, trimitere, urmărire de stare, anulare. O pluă poate conține mai multe documente și mai mulți semnatari (paralel sau secvențial).
Webhooks
Primiți `envelope.created`, `envelope.completed`, `envelope.declined` pe URL-ul dvs. HMAC SHA-256 pe fiecare payload pentru a verifica originea.
Toate evenimentele de plic și destinatar (`envelope.sent`, `recipient.signed`, `envelope.completed`…) livrate la URL-ul dvs. de alegere — listă completă pe /developers/webhooks. HMAC SHA-256 pe fiecare sarcină pentru a verifica originea.
Autentificare simplă
Token de tip „bearer”. O cheie pentru fiecare mediu (test / producție). Revocabilă instantaneu. Limită de 100 de solicitări/minut/cheie, vârf de 200, 429 propriu cu antetul Retry-After.
12 rute acoperind ciclul complet: pluve, documente, webhooks, chei API. Toate rutele acceptă Bearer token și returnează JSON.
Cele 53 rute publice: cont, documente, plicuri, șabloane, webhooks, sigiluri electronice, chei API și facturare. Toate acceptă un token Bearer și returnează JSON.
| Metodă | Cale | Descriere |
|---|---|---|
| GET | /api/v1/account/me | Identitatea apelantului autentificat (id, e-mail, plan) : test al identificatorilor fără domeniu necesar |
| GET | /api/v1/sandbox | Numărarea datelor create cu cheile de test (șterse automat după 30 de zile) |
| DELETE | /api/v1/sandbox | Ștergerea tuturor datelor create cu cheile de test, fără a atinge datele reale |
| POST | /api/v1/documents | Încărcați un PDF (multipart) : returnează id-ul documentului |
| GET | /api/v1/documents | Listați documentele |
| GET | /api/v1/documents/{id} | Citiți metadatele unui document |
| DELETE | /api/v1/documents/{id} | Ștergeți un document |
| GET | /api/v1/envelopes | Listați plicurile (filtrați cu ?status= și ?limit=) |
| POST | /api/v1/envelopes | Creați un plic (stare DRAFT) : din templateId, sau din documentIds cu un tablou fields opțional |
| GET | /api/v1/envelopes/{id} | Citiți starea unui plic |
| PATCH | /api/v1/envelopes/{id} | Modificați un plic DRAFT |
| DELETE | /api/v1/envelopes/{id} | Ștergeți un plic DRAFT (409 după trimitere : anulați-l în schimb) |
| POST | /api/v1/envelopes/{id}/send | Trimiteți un plic DRAFT : expediază invitațiile |
| POST | /api/v1/envelopes/{id}/void | Anulați un plic trimis care nu este încă complet semnat : semnatarii în așteptare sunt anunțați |
| POST | /api/v1/envelopes/{id}/remind | Relansați la cerere semnatarii care așteaptă un plic trimis (un destinatar specific opțional) |
| GET | /api/v1/envelopes/{id}/audit-trail | Descărcați PDF-ul jurnalului de dovezi eIDAS |
| POST | /api/v1/envelopes/{id}/embed-url | Returnează URL-ul de semnare al unui destinatar, însoțit de o autorizație de încadrare pentru originea solicitată. De apelat în momentul clicului: autorizația este valabilă două ore. |
| GET | /api/v1/audit-anchors/{root} | Public : metadatele unui lot de audit ancorat, sau fișier de dovezi .ots cu ?format=ots (fără autentificare) |
| POST | /api/v1/audit-anchors/verify | Public : verificați o intrare de audit și dovada sa față de rădăcina Merkle ancorată (fără autentificare, nu dezvăluie nimic) |
| GET | /api/v1/envelopes/{id}/signed-document | Descărcați PDF-ul semnat (odată COMPLETED) |
| GET | /api/v1/envelopes/bulk | Listați trimiterile în masă |
| POST | /api/v1/envelopes/bulk | Trimitere în masă: creați N plicuri dintr-un șablon și un CSV (Standard/Business doar) |
| GET | /api/v1/envelopes/bulk/{id} | Progresul unui trimitere în masă: conturi, eșecuri pe rând, plicuri create |
| GET | /api/v1/templates | Listați șabloanele de plic reutilizabile |
| POST | /api/v1/templates | Creați un șablon (documente, roluri, câmpuri poziţionate) |
| GET | /api/v1/workspaces | Listați spațiile de lucru în care puteți crea un plic |
| POST | /api/v1/sepa-mandates | Generați PDF-ul unui mandat SEPA și pliculul DRAFT al acestuia, câmpuri deja plasate |
| POST | /api/v1/payroll-adapters/normalize | Normalizați un CSV de salariu (Silae, Sage Paie, PayFit, Lucca) în formatul trimiterii în masă |
| POST | /api/v1/ag-copropriete | Creați un plic pentru adunarea generală a condominiului (rezoluții și cote-părți) |
| POST | /api/v1/ag-copropriete/{envelopeId}/votes | Înregistrați voturile unui proprietar asupra rezoluțiilor adunării |
| POST | /api/v1/ag-copropriete/{envelopeId}/tally | Procesați adunarea: rezultat pe rezoluție, ponderat după cote-părți |
| GET | /api/v1/videos/{videoId} | Descărcați o înregistrare video de identitate păstrată: drept de acces RGPD (art. 15) |
| GET | /api/v1/webhooks | Listați webhooks-urile |
| POST | /api/v1/webhooks | Înregistrați un webhook: returnează secretul de semnare o singură dată |
| GET | /api/v1/webhooks/{id} | Citiți o abonare webhook |
| PATCH | /api/v1/webhooks/{id} | Modificați URL-ul, evenimentele sau starea activă |
| DELETE | /api/v1/webhooks/{id} | Dezabonați webhook-ul |
| POST | /api/v1/seals | Aplicați o ștampilă electronică calificată pe un document |
| GET | /api/v1/seals/{id} | Citiți starea unei ștampile |
| GET | /api/v1/seals/{id}/certificate | Descărcați certificatul ștampilei |
| GET | /api/v1/payslips/workspaces | Bulletin de salariu: spațiile pentru care această cheie distribuie, deținute sau delegate de un client (birou contabil, gestionar salariu) |
| GET | /api/v1/payslips/employees | Buletine de salariu: registrul angajaților, inclusiv cei care au refuzat entrega electronică (chitanță pe hârtie datorată) |
| PUT | /api/v1/payslips/employees | Buletine de salariu: adăugați sau actualizați angajații din registru (nu îi eliminați niciodată) |
| POST | /api/v1/payslips | Remiteți o chitanță de salariu (PDF) în seiful unui angajat: sigilată, păstrată 50 de ani, reîncercare fără duplicat |
| GET | /api/v1/payslips | Enumerați chitanțele remise, cu dovada consultării lor |
| GET | /api/v1/keys | Enumerați cheile API |
| POST | /api/v1/keys | Creați o cheie API: secretul se afișează doar o dată |
| PATCH | /api/v1/keys/{id} | Redenumați sau revocați o cheie |
| DELETE | /api/v1/keys/{id} | Ștergeți o cheie |
| GET | /api/v1/billing/usage | Consumul perioadei actuale și costul estimat |
| GET | /api/v1/status | Starea serviciului |
| GET | /api/v1/health | Verificare de sănătate: bază de date, coadă de așteptare și stocare de obiecte |
| GET | /api/v1/openapi | Specificație OpenAPI lizibilă de mașină |
Modeluri de înveliș
Un șablon înregistrează o dată pentru totdeauna PDF-ul, rolurile și locația câmpurilor de semnare, apoi se reutilizează la fiecare trimitere: transmiteți identificatorul acestuia în templateId în loc de documentIds, iar câmpurile poziționate sunt recopiate pe plicul creat.
- • Șabloanele se creează din tabloul de bord (Șabloane → Șablon nou), unde depuneți documentul și apoi poziționați câmpurile cu mouse-ul — acesta este calea cea mai simplă. API permite și crearea lor prin POST /api/v1/templates, furnizând documentele, rolurile și câmpurile; atenție, câmpurile sunt poziționate în coordonate absolute (pagină, x, y, lățime, înălțime), deci trebuie să cunoașteți aspectul PDF-ului.
- • Pe un cont care nu a înregistrat încă nici un șablon, GET /api/v1/templates returnează o listă goală. Acesta este comportamentul normal, nu o eroare de autentificare.
- • Lista conține doar șabloanele aparținând utilizatorului proprietar al cheii API. Un șablon creat de un coleg nu apare pe ea, chiar și într-un spațiu de lucru partajat: generați cheia din contul care deține șablonul.
- • templateId și documentIds se exclud reciproc: trimiteți unul sau altul, niciodată amândoi nici nici una din ele.
- • Furnizați cel puțin atât de mulți destinatari SIGNER cât are șablonul roluri semnătare, altfel crearea este respingă cu 400. Câmpul signerCount returnat de listă indică numărul așteptat.
- • Nivelul de semnătură al modelului este moștenit de către plic, decât dacă cererea transmite în mod explicit 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.De la Power Automate sau Zapier
Acțiunea « Creează un plic » din conectoarele noastre fără cod acoperă doar calea după model: câmpul Model este obligatoriu. Pentru un document ad hoc care se schimbă la fiecare execuție, utilizați acțiunea « Încărcă un document » apoi o acțiune HTTP brută către POST /api/v1/envelopes transmițând documentIds-ul returnat.
Trimiterea documentului: două forme acceptate
POST /api/v1/documents acceptă fișierul în două moduri, la alegere. Aceleași controale se aplică în ambele cazuri: tipuri autorizate, plafon de 50 Mo, verificarea semnăturii binare și analiză antivirus.
- • În multipart/form-data, cu o parte numită file. Aceasta este forma clasică, cea a curl -F și a majorității bibliotecilor.
- • În corp brut: octeții fișierului constituie corpul cererii, iar antetul Content-Type indică tipul acestuia (application/pdf de exemplu). Util din parte unui instrument care transmite conținutul în forma lui brută, fără a înfășura cererea — aceasta este ceea ce face conectorul Power Automate.
- • În corp brut, numele fișierului nu are loc în corp: indicați-l prin antetul X-File-Name sau prin parametrul ?fileName=. Fără acesta, documentul este numit după tipul său.
- • Un tip nesuportat răspunde 415 numind cele două forme acceptate, iar un corp anunțat ca multipart dar ilizibil răspunde 400. Nici unul dintre acestea nu este o eroare de server.
# 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.Plasarea campurilor de semnare
Fără model, un plic creat din documentIds nu are niciun câmp pre-poziționat: semnatarul primește documentul fără un loc unde să semneze. Tabloul fields, transmis în același apel de creare, plasează fiecare câmp la punct exact — este echivalentul, pe partea API, a ceea ce un model înregistrează o dată pentru totdeauna.
- • Coordonatele sunt în puncte PDF, originea în colțul din stânga sus al paginii și axa Y în jos (o pagină A4 măsoară 595 × 842 puncte). x și y desemnează colțul din stânga sus al câmpului, width și height dimensiunea acestuia.
- • pageNumber începe de la 1, documentIndex începe de la 0. Un număr de pagină dincolo de document nu este respins la creare: câmpul este ignorat la momentul semnării și nu apare nicăieri — aceasta este primul lucru de verificat atunci când un câmp lipsește apelului.
- • recipientEmail trebuie să corespundă unuia dintre destinatarii din același apel, fără distincție între majuscule și minuscule. Altfel, crearea eșuează prin enumerarea tuturor liniilor defectuoase, ceea ce evită corectarea lor una după alta.
- • fields și templateId se exclud reciproc: un model poartă deja propria sa punere în pagină. Tabloul fields se utilizează deci doar cu documentIds.
- • Tipuri acceptate: SIGNATURE, INITIALS, DATE_SIGNED, TEXT, CHECKBOX și RADIO_GROUP. required valorează true în mod implicit; placeholder și dateFormat sunt opționale, iar options este reținut doar pentru RADIO_GROUP.
- • Un plic acceptă maximum 100 de câmpuri, 20 de documente și 50 de destinatari — limitele planului dvs. putând fi mai mici.
# 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.Ancore de text: plasați un câmp fără a cunoaște coordonatele
Mai degrabă decât coordonate, un câmp poate cita un text imprimat în document: anchorText îl localizează în PDF și serverul calculează poziția la creare. Acesta este modul de preferat atunci când documentul este regenerat la fiecare trimitere — litere cu corespondență, generator de contracte — deoarece punerea în pagină se mișcă în timp ce menționarea « Semnătura clientului » rămâne. anchorPlacement indică de ce parte a textului se plasează câmpul (right în mod implicit, altfel below, above sau left) și anchorIndex alege apariția atunci când textul apare de mai multe ori.
x și y rămân obligatorii chiar și cu o ancoră: servesc ca rezervă. O ancoră nelocalizată nu face ca crearea să eșueze — câmpul păstrează poziția literală pe care ați furnizat-o, fără eroare sau avertisment în răspuns. Indicați deci o rezervă plauzibilă mai degrabă decât 0,0, și verificați redarea pe o primă trimitere.
Semnătură integrată: semnați fără a părăsi aplicația dvs.
Clientul dvs. consultă și semnează documentul din interfața dvs. proprie. Ceremonia se deschide într-o fereastră deasupra paginii dvs., și el revine la dvs. automat după terminare. Pe partea serverului, nimic nou: creați plicul în mod obișnuit introducând redirectUrl, apoi încredințați SDK-ului URL-ul de semnare al destinatarului.
- • Apelați Certyneo.sign() direct în gestionar de clic, și transmiteți apelul serverului prin getUrl. Un await înainte de sign() iese din gestul utilizatorului: Safari și Firefox blochează atunci fereastra. SDK-ul o deschide imediat și o încarcă când promisiunea dvs. se rezolvă.
- • redirectUrl este canalul de întoarcere. Trimitem semnatar-ul acolo adăugând certyneo_status (completed sau declined) și certyneo_envelope. Încărcați același script pe această pagină de întoarcere: acesta va notifica fereastra portalului care a rămas deschisă în spate.
- • În modul integrat, apelurile noastre proprii la acțiune sunt suprimate. Clientul dvs. nu vede niciodată o invitație de a crea un cont Certyneo.
- • Dacă browserul refuză fereastra, SDK-ul comută singur în redirecționare pe pagina completă. Parcursul este identic pentru semnatarul și pagina dvs. de întoarcere primește exact aceiași parametri.
- • Intenționat nu există nicio apelare „utilizatorul a abandonat": starea ferestrei nu este citibil de pe pagina dvs., și un astfel de apel s-ar declanșa incorect. O semnătură care nu ajunge rămâne în așteptare până la 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.Evenimentul browserului nu este o dovadă de semnătură
onCompleted este un semnal de afișare, emis de un browser, deci falsificabil de oricine din consola sa. Nu comutați niciodată un dosar în „semnat" pe această bază: folosiți-l pentru a reîmprospăta ecranul și bazați-vă pe webhook-ul semnat envelope.completed primit de serverul dvs. pentru starea reală. Aceasta este capcana clasică a integrărilor de plată și se reproduce identic aici.
Să dezvoltați pe postul dvs.
Cu o cheie de test, redirectUrl acceptă http://localhost (și 127.0.0.1): construiți tot parcursul pe mașina dvs. înainte de a implementa. O cheie reală o refuză, pentru ca nicio plic de producție să nu trimită un semnataru adevărat către o mașină care nu este a sa.
Afișați ceremonia în pagina dvs.
Modul cadru afișează semnătura în interiorul interfeței dvs., fără fereastră. Solicită un pas în plus decât modul fereastră: a demonstra că site-ul care o va afișa vă aparține. Acesta este ceea ce împiedică un terț să încadreze ceremoniile noastre pentru a vă înșela clienții.
- • Declarați site-ul în Setări → Semnătură integrată, apoi publicați înregistrarea DNS indicată. O adresă exactă: un subdomeniu sau un port diferit contează ca un alt site.
- • La fiecare semnătură, solicitați o URL proaspătă la POST /api/v1/envelopes/{id}/embed-url. Ea poartă autorizația de afișare și este valabilă două ore, ceea ce corespunde momentului clic, nu creării plicului.
- • Două parcursuri nu pot decurge într-un cadru: semnătura calificată, a cărei verificare a identității refuză să fie încadrată la rândul ei, și plata la semnătură. În ambele cazuri, semnatarul este direcționat către o fereastră completă.
- • Mențiunea « Alimentat de Certyneo » dispare din cadru începând cu planul Business. Modul cadru în sine este inclus din planul Standard.
// 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.Să faceți să semneze fără ca niciun e-mail să plece
Un portal care afișează ceremonia la el nu are adesea nevoie de invitația noastră: aceasta ajunge lângă propriul parcurs și propune un cont unui client care nu o dorește. Dați valoarea NONE canalului de notificare al unui destinatar și nimic nu îi mai este trimis — dumneavoastră îl duceți la semnare.
- • Setarea este per destinatar, nu per plic: puteți tăcea clientul pe care îl găzduiți și păstra e-mailul pentru un contrasemnatar extern, care nu are un portal.
- • Este rezervat pentru semnatari și aprobatori, singurele persoane cărora aveți un link de remis. Îl citiți din răspunsul creării și trimiterii, sau solicitați un URL proaspăt la momentul clicului la POST /api/v1/envelopes/{id}/embed-url.
- • Reînnouirile automate se opresc de la sine pentru acest destinatar: nu i-am scris niciodată, nu începem cu o reînnoire. Alți destinatari continuă să fie reînnoiți în mod normal.
- • Certificatul de semnătură o menționează, destinatar după destinatar. Un dosar de dovezi care ar tăcea asupra acestui lucru ar lăsa să se creadă că acest semnatăr a primit de la noi o invitație care nu a existat niciodată.
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.Afișați numele clientului dumneavoastră ca expeditor
În mod implicit, semnatarul citește numele titularului cheii API. Dacă faceți să semneze documente din mai multe companii cu o singură cheie, treceți câmpul sender la crearea plicului : pagina de semnare și e-mailurile de invitație și de reamintire afișează apoi numele companiei în cauză.
- • Rezervat planului Business și dincolo. Pe un plan inferior, crearea este refuzată mai degrabă decât să lăsați semnatarul să citească un alt nume decât cel așteptat.
- • Numele este o afișare : certificatul și pista de audit păstrează expeditorul real, iar e-mailurile pleacă mereu de la Certyneo.
- • Adresa este facultativă. Fără ea, semnatarul vede doar numele, niciodată adresa titularului cheii.
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"
}
}Autentificare
Fiecare apel poartă o cheie API în antetul Authorization. Cheile se generează din Setări → Chei API și sunt afișate o singură dată.
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_… în producție, sk_test_… pentru sandbox. Antet: Authorization: Bearer <clé>.
- • Domenii: envelopes, documents, webhooks, seals — în citire (:read) sau scriere (:write). Scrierea implică citirea; domeniul * acordă toate drepturile.
- • Cheile sk_test_ creează resurse în sandbox, excluse din cotă și factură. Niciun e-mail real nu este trimis destinatarului, cu excepția cazului în care adresa acestuia se potrivește cu e-mailul contului expeditor — util pentru a testa fluxul complet pe tine însuți.
- • Erori: 401 cheie nevalidă, 403 domeniu insuficient, 429 limită de debit depășită, 402 cotă lunară atinsă.
Forma răspunsurilor
Un punct de cunoscut înainte de a scrie clientul dvs.: colecțiile sunt încapsulate într-un obiect data, în timp ce resursele unitare sunt returnate plat. Citirea response.data.data pe o resursă unitară returnează deci 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": [ /* … */ ]
}Limitele garantează o calitate de serviciu stabilă pentru toți clienții. Dacă aveți nevoie de mai mult, contactați-ne.
100 cereri pe minut pe cheie API
- • 100 de solicitări pe minut per cheie API
- • Se tolerează un vârf de trafic de până la 200 de solicitări în mai puțin de 10 secunde
- • Răspuns 429 cu antet Retry-After indicând întârzierea în secunde