Integrálja az elektronikus aláírást a stackbe
Küldjön borítékokat, nyomon kövesse az aláírásokat, fogadjon webhookokat. Egyszerű REST API, OpenAPI 3.0, curl/Node/Python példák — minden, amit szüksége van arra, hogy a Certyneót pár óra alatt csatlakoztassa az HRIS, CRM vagy üzleti szoftverre.
Gyors kezdés
Három lépés: hozzon létre egy API kulcsot a beállításokból, kódolja a PDF-et base64-be, küldje el. A válasz tartalmazza a `signUrl`-t, amelyet közvetlenül megoszthat a címzettel.
# 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óbálja ki az API-t az Ön eszközeivel
A Postman-gyűjtemény és a RapidAPI-kártya az OpenAPI-specifikációból jönnek létre, amely ezt az oldalt is dokumentálja. A három tehát az API valódi végpontokkal marad igazodva, végpont végponttal, ahelyett, hogy az első hozzáadáskor eltérne.
Postman-gyűjtemény
A 25 kérés tartomány szerint rendezve — borítékok, dokumentumok, sablonok, pecsételés, webhookok — mindegyik esetében egy kéréstest és válaszpéldával. Illessze be az API-kulcsát a gyűjtemény apiKey változójába, majd futtassa a GET /health parancsot: nem igényel hitelesítést, és megerősíti, hogy a konfigurációja jó az első hitelesített hívás előtt.
Borítékok
Létrehozás, küldés, állapot nyomon követése, visszavonás. Egy boríték több dokumentumot és több aláírót tartalmazhat (párhuzamos vagy szekvenciális).
Webhookok
Minden boríték- és címzett-esemény (`envelope.sent`, `recipient.signed`, `envelope.completed`…) az Ön által választott URL-re szállítva — a teljes lista a /developers/webhooks oldalon. HMAC SHA-256 minden payload-nál az eredet ellenőrzéséhez.
Egyszerű hitelesítés
Bearer token. Egy kulcs környezetenként (teszt / prod). Azonnal visszavonható. Korlát 100 req/perc/kulcs, 200-as burst, tiszta 429-es válasz Retry-After fejléc-cel.
Elérhető végpontok
Az összes nyilvános útvonal: fiók, dokumentumok, borítékok, sablonok, webhookok, elektronikus pecsételés, API-kulcsok és számlázás. Mindegyik elfogad Bearer tokent és JSON-t ad vissza.
| Method | Path | Description |
|---|---|---|
| GET | /api/v1/account/me | Identity of the authenticated caller (id, email, plan) — scope-less credential probe |
| POST | /api/v1/documents | Upload a PDF (multipart) — returns document id |
| GET | /api/v1/documents | List documents |
| GET | /api/v1/documents/{id} | Fetch document metadata |
| DELETE | /api/v1/documents/{id} | Delete document |
| GET | /api/v1/envelopes | List envelopes (filter with ?status= and ?limit=) |
| POST | /api/v1/envelopes | Create envelope (status: DRAFT) — from a templateId, or from documentIds with an optional fields array |
| GET | /api/v1/envelopes/{id} | Fetch envelope state |
| PATCH | /api/v1/envelopes/{id} | Update DRAFT envelope |
| DELETE | /api/v1/envelopes/{id} | Void / delete DRAFT envelope |
| POST | /api/v1/envelopes/{id}/send | Dispatch DRAFT — sends invitations |
| GET | /api/v1/envelopes/{id}/audit-trail | Download eIDAS audit-trail PDF |
| GET | /api/v1/audit-anchors/{root} | Public: metadata of an anchored audit batch, or the .ots proof file with ?format=ots (no auth) |
| POST | /api/v1/audit-anchors/verify | Public: verify an audit entry + proof against its anchored Merkle root (no auth, reveals nothing) |
| GET | /api/v1/envelopes/{id}/signed-document | Download signed PDF (once COMPLETED) |
| GET | /api/v1/envelopes/bulk | List your bulk-send jobs |
| POST | /api/v1/envelopes/bulk | Bulk send: create N envelopes from one template + a CSV (Standard/Business only) |
| GET | /api/v1/envelopes/bulk/{id} | Bulk-send job progress: counts, per-row failures, created envelopes |
| GET | /api/v1/templates | List reusable envelope templates |
| POST | /api/v1/templates | Create a template (documents, roles, positioned fields) |
| POST | /api/v1/sepa-mandates | Generate a SEPA mandate PDF and its DRAFT envelope, fields already placed |
| POST | /api/v1/payroll-adapters/normalize | Normalise a payroll CSV (Silae, Sage Paie, PayFit, Lucca) into the bulk-send shape |
| POST | /api/v1/ag-copropriete | Create a condominium general-meeting envelope (resolutions + ownership shares) |
| POST | /api/v1/ag-copropriete/{envelopeId}/votes | Record a co-owner's votes on the meeting resolutions |
| POST | /api/v1/ag-copropriete/{envelopeId}/tally | Tally the meeting - per-resolution result weighted by ownership shares |
| GET | /api/v1/videos/{videoId} | Download a stored identity video - GDPR art. 15 access path |
| GET | /api/v1/webhooks | List webhooks |
| POST | /api/v1/webhooks | Register webhook — returns the signing secret once |
| GET | /api/v1/webhooks/{id} | Fetch webhook subscription |
| PATCH | /api/v1/webhooks/{id} | Update url / events / active state |
| DELETE | /api/v1/webhooks/{id} | Unregister |
| POST | /api/v1/seals | Apply a qualified electronic seal to a document |
| GET | /api/v1/seals/{id} | Fetch seal status |
| GET | /api/v1/seals/{id}/certificate | Download the seal certificate |
| GET | /api/v1/keys | List API keys |
| POST | /api/v1/keys | Create API key — the secret is shown once |
| PATCH | /api/v1/keys/{id} | Rename / revoke key |
| DELETE | /api/v1/keys/{id} | Delete key |
| GET | /api/v1/billing/usage | Current period usage and projected cost |
| GET | /api/v1/status | Service status |
| GET | /api/v1/openapi | Machine-readable OpenAPI specification |
Képzeletek zárolatok
A sablon egyszer és véglegesen rögzíti a PDF-et, a szerepeket és az aláírási mező helyét, majd minden elküldetéskor újra felhasználható: adja meg az azonosítóját a `templateId`-ben a `documentIds` helyett, és a pozicionált mezők az elkészült borítékra másolódnak.
- • A sablonok az irányítópultról hozhatók létre (Sablonok → Új sablon), ahol feltölt a dokumentum, majd az egeret használva pozícionálja a mezőket — ez a legegyszerűbb út. Az API a POST /api/v1/templates-en keresztül is létrehozhatja őket, dokumentumok, szerepek és mezők biztosítása után; vigyázat, a mezők abszolút koordinátákban helyezkednek el (lap, x, y, szélesség, magasság), tehát ismerni kell a PDF elrendezését.
- • Egy olyan fiók esetén, amely még nem rögzített sablont, a GET /api/v1/templates üres listát ad vissza. Ez a normális viselkedés, nem hitelesítési hiba.
- • A lista csak az API-kulcsot tulajdonló felhasználó tulajdonában lévő sablonokat tartalmazza. A kolléga által létrehozott sablon nem jelenik meg, még egy megosztott munkaterületen belül sem: az API-kulcsot az a fiók alapján generálja, amely a sablont possui.
- • A `templateId` és a `documentIds` kölcsönösen kizárják egymást: az egyiket vagy a másikat küldje el, soha mindkettőt vagy egyiket sem.
- • Legalább annyi SIGNER destinátáriust biztosítson, ahány aláírási szereppel rendelkezik a sablon, különben a létrehozás 400-as elutasítással kerül lejátszásra. A lista által visszaadott `signerCount` mező az elvárt számot adja meg.
- • A sablon aláírási szintje a boríték által öröklődik, kivéve, ha a kérés kifejezetten a `signatureLevel` értéket adja meg.
# 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.Power Automate-től vagy a Zapier-től
A no-code összekötőink "Boríték létrehozása" művelete csak a sablon alapú útvonalat fedi le: a Sablon mező kötelező. Egy ad hoc dokumentumhoz, amely minden végrehajtáskor változik, használja a "Dokumentum feltöltése" műveletet, majd egy nyers HTTP műveletet a POST /api/v1/envelopes végpontra, átadva a visszaadott documentIds azonosítót.
Dokumentum küldése: két elfogadott forma
A POST /api/v1/documents két módon fogadja a fájlt, szabadon választva. Mindkét esetben ugyanazok a kontrollok érvényesek: engedélyezett típusok, 50 MB-os korlát, bináris aláírás ellenőrzése és víruskeresés.
- • Multipart/form-data formátumban, egy file nevű résszel. Ez a klasszikus forma, a curl -F és a legtöbb könyvtár formája.
- • Nyers testben: a fájl bájtjai a kérés testét képezik, és a Content-Type fejléc a típusát adja meg (például application/pdf). Hasznos egy olyan eszközből, amely a tartalmat olyan, ahogyan van, továbbítja, anélkül, hogy a kérést burkolná — ezt teszi a Power Automate összekötő.
- • Nyers testben a fájlnév nem tartozik a testbe: adja meg az X-File-Name fejlécen vagy a ?fileName= paraméteren keresztül. Nélküle a dokumentum típusa alapján lesz elnevezve.
- • A nem támogatott típus 415-öt ad vissza, megnevezve a két elfogadott formát, és egy multipart-ként bejelentett, de olvashatatlan test 400-at ad vissza. Egyik sem szerver hiba.
# 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.Csomagolás a aláírás mezőknek
Sablon nélkül, a documentIds alapján létrehozott boríték nem rendelkezik előzetesen elhelyezett mezőkkel: az aláíró a dokumentumot aláírási helyek nélkül kapja meg. A fields tömb, amelyet ugyanabban a létrehozási hívásban adunk át, minden mezőt pontosan elhelyez — ez az API oldaláról az egyenértéke annak, amit egy sablon egyszer és mindenkorra rögzít.
- • A koordináták PDF pontok, az origó az oldal bal felső sarkában, az Y tengely lefelé mutat (egy A4-es oldal 595 × 842 pont). Az x és y a mező bal felső sarkát, a width és height annak méretét jelöli.
- • A pageNumber 1-ből kezdődik, a documentIndex 0-ból. Egy dokumentumon túli oldalszám nem kerül elutasításra a létrehozás során: a mező az aláírás időpontjában figyelmen kívül marad és sehol nem jelenik meg — ez az első dolog, amit ellenőrizni kell, ha egy mező hiányzik a hívásból.
- • A recipientEmail meg kell, hogy egyezzen az ugyanabban a hívásban szereplő egyik címzetttel, kis- és nagybetűkre való tekintet nélkül. Ellenkező esetben a létrehozás meghiúsul az összes hibás sor felsorolásával, így nem kell egyenként javítani őket.
- • A fields és templateId kölcsönösen kizárják egymást: egy sablon már rendelkezik saját elrendezésével. A fields tömb ezért csak documentIds-vel használható.
- • Elfogadott típusok: SIGNATURE, INITIALS, DATE_SIGNED, TEXT, CHECKBOX és RADIO_GROUP. A required alapértelmezett értéke true; a placeholder és dateFormat opcionálisak, és az options csak a RADIO_GROUP esetén vesz fel értéket.
- • Egy boríték legfeljebb 100 mezőt, 20 dokumentumot és 50 címzettet fogad el — az Ön csomagjának korlátai ennél alacsonyabbak lehetnek.
# 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.Szöveges horgonyok: mező elhelyezése a koordináták ismerete nélkül
Koordináták helyett egy mező hivatkozhat a dokumentumban nyomtatott szövegre: az anchorText megkeresi a PDF-ben, és a kiszolgáló a pozíciót a létrehozáskor számítja ki. Ez az előnyben részesítendő módszer, amikor a dokumentum minden küldéskor újra előáll — körlevél, szerződésgenerátor — mivel az elrendezés változik, miközben az "Ügyfél aláírása" megjegyzés marad. Az anchorPlacement azt jelzi, hogy a mező a szöveg melyik oldalára kerüljön (alapértelmezésben right, vagy below, above vagy left), és az anchorIndex az előfordulást választja ki, amikor a szöveg többször jelenik meg.
Az x és y kötelezőek maradnak még horgonnyal is: ezek tartalékként szolgálnak. A nem encontrado horgony nem okozza a létrehozás meghiúsulását — a mező megtartja az Ön által megadott szó szerinti pozíciót, hiba vagy figyelmeztetés nélkül a válaszban. Ezért adjon meg egy valódi tartalékot, mint a 0,0, és ellenőrizze a megjelenítést az első küldéskor.
Hitelesítés
Kulcs API minden hívásban a Header-ben szerepel. A kulcsok a Beállítások → API-képek oldalról generálhatók és csak egyszer jelennek meg.
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átum: sk_live_… éles környezetben, sk_test_… a tesztkörnyezetben. Fejléc: Authorization: Bearer <clé>.
- • Tartalom: kijelölőlapok, dokumentumok, webhívások, aláírások – olvasható (:) vagy írási (:write) mód. Az íráshoz szükség van olvasáshoz; a tartalom * minden jogot ad.
- • A sk_test_ kulcsok sandbox erőforrásokat hoznak létre, a kvótából és a számlázásból kizárva. A címzettnek nem küld valódi e-mailt, kivéve, ha a címe megegyezik a küldő fiók e-mail címével — hasznos a teljes folyamat saját magadon történő teszteléséhez.
- • Hibák: 401 érvénytelen kulcs, 403 túlcsordult tartomány, 429 túl sok kérelem, 402 havi kvótának elérése.
Válasz formátuma
Egy fontos információ a kliens előtt: a könyvtárak egy objektumban kerülnek bekapcsolódásra, míg az egyszerű erőforrások átadóként jelennek meg. Egy egyszerű erőforráson response.data.data olvasása tehát undefined ad vissza.
// 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": [ /* … */ ]
}Sebességkorlátozások
A korlátozások stabil szolgáltatásminőséget garantálnak minden ügyfélnek. Ha többre van szüksége, vegye fel velünk a kapcsolatot.
- • 100 kérés percenként API-kulcsonként
- • Burst megengedett akár 200 kéréssig 10 másodperc alatt
- • 429-es válasz Retry-After fejléc-cel, amely a késleltetést másodpercben jelzi