Integroi sähköinen allekirjoitus pinoonsa
Lähetä kirjekuoria, seuraa allekirjoituksia, vastaanota webhookeja. Yksinkertainen REST API, OpenAPI 3.0, curl/Node/Python-esimerkit — kaikki mitä tarvitset Certyneoin liittämiseksi HRIS-, CRM- tai muuhun liiketoiminnalliseen ohjelmistoosi muutamassa tunnissa.
Nopea aloitus
Kolme vaihetta: luodaan API-näkymä asetuksista, base64-koodataan PDF-asiakirja ja lähetetään. Vastauksesta löytyy `signUrl`, jota voidaan jakaa suoraan asiakkaalle.
# 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"])Kokeile API:a omilla työkaluillasi
Postman-kokoelma ja RapidAPI-kortti luodaan OpenAPI-spesifikaatiosta, joka dokumentoi myös tämän sivun. Kaikki kolme pysyvät siis linjassa todellisen API:n kanssa, endpoint kerrallaan, sen sijaan että hajoaisivat ensimmäisessä lisäyksessä.
Postman-kokoelma
25 pyynnöt järjestettyinä aihealueittain — kirjekuoret, asiakirjat, mallit, leimaukset, webhookit — joista jokaisesta on esimerkki rungosta ja vastauksesta. Liitä avaimesi kokoelman apiKey-muuttujaan ja käynnistä sitten GET /health: se ei vaadi todennusta ja vahvistaa, että konfiguraatiosi on oikein ennen ensimmäistä todennettua kutsua.
Kirjekuoret
Luominen, lähettäminen, tilanseuraanta, peruutus. Kirjekuori voi sisältää useita asiakirjoja ja useita allekirjoittajia (rinnakkainen tai peräkkäinen).
Webhookit
Kaikki kirjekuoren ja vastaanottajan tapahtumat (`envelope.sent`, `recipient.signed`, `envelope.completed`…) toimitetaan valitsemaasi URL-osoitteeseen — täydellinen luettelo kohdassa /developers/webhooks. HMAC SHA-256 jokaisella payload-tiedolla lähteen tarkistamista varten.
Yksinkertainen tunnistaminen
Bearer-tunnus. Yksi avain ympäristöä kohden (testi / prod). Peruutettavissa välittömästi. Raja 100 pyyyntöä/min/avain, 200:n purskeilla, siisti 429 Retry-After-otsikolla.
Saatavilla olevat päätepisteet
52 julkista reittiä: tili, asiakirjat, kirjekuoret, mallit, webhookit, elektroniset leimaukset, API-avaimet ja laskutus. Kaikki hyväksyvät Bearer-tunnuksen ja palauttavat JSON-muotoa.
| Menetelmä | Polku | Kuvaus |
|---|---|---|
| GET | /api/v1/account/me | Todennetun kutsujan identiteetti (id, sähköposti, paketti) : tunnisteiden testi ilman vaaditun laajuuden kanssa |
| GET | /api/v1/sandbox | Laske testiavaimilla luodut tiedot (poistetaan automaattisesti 30 päivän kuluttua) |
| DELETE | /api/v1/sandbox | Poista kaikki testiavaimilla luodut tiedot koskematta todellisiin tietoihin |
| POST | /api/v1/documents | Lataa PDF (multipart) : palauttaa dokumentin tunnuksen |
| GET | /api/v1/documents | Luettele dokumentit |
| GET | /api/v1/documents/{id} | Lue dokumentin metatiedot |
| DELETE | /api/v1/documents/{id} | Poista dokumentti |
| GET | /api/v1/envelopes | Luettele kirjekuoret (suodata ?status= ja ?limit= avulla) |
| POST | /api/v1/envelopes | Luo kirjekuori (tila DRAFT) : templateId:stä tai documentIds:stä, joissa on valinnainen fields-taulukko |
| GET | /api/v1/envelopes/{id} | Lue kirjekuoren tila |
| PATCH | /api/v1/envelopes/{id} | Muokkaa DRAFT-kirjekuorta |
| DELETE | /api/v1/envelopes/{id} | Poista DRAFT-kirjekuori (409 kun se on lähetetty : peruuta sen sijaan) |
| POST | /api/v1/envelopes/{id}/send | Lähetä DRAFT-kirjekuori : lähettää kutsut |
| POST | /api/v1/envelopes/{id}/void | Peruuta lähetetty kirjekuori, jota ei ole vielä kokonaan allekirjoitettu : odottavat allekirjoittajat saavat ilmoituksen |
| GET | /api/v1/envelopes/{id}/audit-trail | Lataa eIDAS-todistuskansion PDF |
| POST | /api/v1/envelopes/{id}/embed-url | Palauttaa vastaanottajan allekirjoitus-URL-osoitteen yhdessä pyydetyn alkuperän kehyskehytysoikeuden kanssa. Kutsuttava napsautushetkellä: oikeus on voimassa kaksi tuntia. |
| GET | /api/v1/audit-anchors/{root} | Julkinen : ankkuroidun tarkistuskierroksen metatiedot tai todistetiedosto .ots ?format=ots-kanssa (ilman todennusta) |
| POST | /api/v1/audit-anchors/verify | Julkinen : tarkista tarkistuskierroksen merkintä ja sen todiste ankkuroitua Merklen juurta vastaan (ilman todennusta, ei paljasta mitään) |
| GET | /api/v1/envelopes/{id}/signed-document | Lataa allekirjoitettu PDF (kun COMPLETED) |
| GET | /api/v1/envelopes/bulk | Luettele joukkolähetyksesi |
| POST | /api/v1/envelopes/bulk | Joukkolähetys: luo N kirjekuorta mallin ja CSV-tiedoston perusteella (vain Standard/Business) |
| GET | /api/v1/envelopes/bulk/{id} | Joukkolähetyksen edistyminen: laskurit, virheet riveittäin, luodut kirjekuoret |
| GET | /api/v1/templates | Lue uudelleenkäytettävät kirjekuorimallit |
| POST | /api/v1/templates | Luo malli (asiakirjat, roolit, sijoitetut kentät) |
| GET | /api/v1/workspaces | Listaa työtilat, joissa voit luoda kirjekuoren |
| POST | /api/v1/sepa-mandates | Luo SEPA-valtakirjan PDF ja sen DRAFT-kirjekuori, kentät jo sijoitettuna |
| POST | /api/v1/payroll-adapters/normalize | Normalisoi palkkalaskelman CSV (Silae, Sage Paie, PayFit, Lucca) joukkolähetysmuotoon |
| POST | /api/v1/ag-copropriete | Luo yhtiökokouksen kirjekuori (päätöslauskelmat ja omistusosuudet) |
| POST | /api/v1/ag-copropriete/{envelopeId}/votes | Kirjaa osakkaan äänet yhtiökokouksen päätöslauselmista |
| POST | /api/v1/ag-copropriete/{envelopeId}/tally | Laske kokous: tulos päätöslauselmittain, painotettu omistusosuuksilla |
| GET | /api/v1/videos/{videoId} | Lataa säilytetty identiteettiä koskeva video: GDPR-saantioikeus (art. 15) |
| GET | /api/v1/webhooks | Lue webhookit |
| POST | /api/v1/webhooks | Rekisteröi webhook: palauttaa allekirjoitussalaisuuden vain kerran |
| GET | /api/v1/webhooks/{id} | Lue webhook-tilaus |
| PATCH | /api/v1/webhooks/{id} | Muuta URL-osoitetta, tapahtumia tai aktiivista tilaa |
| DELETE | /api/v1/webhooks/{id} | Poista webhook |
| POST | /api/v1/seals | Aseta pätevä sähköinen sinetti asiakirjaan |
| GET | /api/v1/seals/{id} | Lue sinetin tila |
| GET | /api/v1/seals/{id}/certificate | Lataa sinetin sertifikaatti |
| GET | /api/v1/payslips/workspaces | Palkkalaskelmat: tilat, joille tämä avain jakaa, asiakkaan hallussa olevia tai delegoituja (kirjanpitotoimistot, palkkalaskelman hoitajat) |
| GET | /api/v1/payslips/employees | Palkkalaskelmat: työntekijärekisteri, joista ne, jotka ovat kieltäneet sähköisen toimittamisen (paperinen palkkalaskelma erääntynyt) |
| PUT | /api/v1/payslips/employees | Palkkalaskelmat: lisää tai päivitä rekisterin työntekijöitä (älä koskaan poista niitä) |
| POST | /api/v1/payslips | Toimita palkkalaskelma (PDF) työntekijän kassakaappiin: sinetöity, säilytetty 50 vuotta, uudelleenyritys ilman kaksinkertaisuutta |
| GET | /api/v1/payslips | Luettele toimitetut palkkalaskelmat ja niiden konsultaation todisteet |
| GET | /api/v1/keys | Luettele API-avaimet |
| POST | /api/v1/keys | Luo API-avain: salaisuus näytetään vain kerran |
| PATCH | /api/v1/keys/{id} | Nimeä uudelleen tai peruuta avain |
| DELETE | /api/v1/keys/{id} | Poista avain |
| GET | /api/v1/billing/usage | Nykyisen kauden kulutus ja ennustettu kustannus |
| GET | /api/v1/status | Palvelun tila |
| GET | /api/v1/health | Terveystarkistus: tietokanta, jono ja objektin tallennus |
| GET | /api/v1/openapi | Koneen tulkittava OpenAPI-spesifikaatio |
Käyttöjärjestelmien mallit
Malli tallentaa kerran kaikille PDF:lle, rooleille ja allekirjoituskenttien sijainnille, ja sitä käytetään uudelleen jokaisessa lähetyksessä: välitä sen tunnus templateId:ssä documentIds:n sijaan, ja sijoitetut kentät kopioidaan luodun kirjekuoren päälle.
- • Mallit luodaan koontinäytöstä (Mallit → Uusi malli), jossa lataat asiakirjan ja sijoitat kentät hiirellä — se on yksinkertaisin tapa. API sallii myös niiden luomisen POST /api/v1/templates:lla toimittamalla asiakirjat, roolit ja kentät; huomio, kentät sijoitetaan siellä absoluuttisiin koordinaatteihin (sivu, x, y, leveys, korkeus), joten sinun on tiedettävä PDF:n asettelu.
- • Tilillä, joka ei ole vielä tallentanut yhtään mallia, GET /api/v1/templates palauttaa tyhjän luettelon. Se on normaali käyttäytyminen, ei todentamisvirhe.
- • Luettelo sisältää vain mallit, jotka kuuluvat API-avaimen omistajalle. Kollegasi luoma malli ei näy siinä, vaikka jaetun työtilan sisällä: luo avain tililtä, joka omistaa mallin.
- • templateId ja documentIds sulkevat toisensa pois: lähetä toinen tai toinen, ei koskaan molemmat eikä kumpikaan.
- • Toimita vähintään yhtä monta SIGNER-vastaanottajaa kuin malli sisältää allekirjoitusvuoroja, muuten luominen hylätään 400:lla. Luettelon palauttama signerCount-kenttä ilmoittaa odotetun määrän.
- • Mallin allekirjoitustaso peritään kirjekuorella, ellei pyyntö välitä nimenomaisesti signatureLevel-arvoa.
# 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.Avaimet voivat ottaa käyttöön Power Automatesta tai Zapieristä
Meidän no-code-liittimien "Luo kirjekuori" -toiminto kattaa vain mallipolun: Malli-kenttä on pakollinen. Ad hoc -dokumentille, joka muuttuu jokaisella suorituksella, käytä "Lataa dokumentti" -toimintoa ja sitten HTTP-raakatapahtuma osoitteeseen POST /api/v1/envelopes välittämällä palautetun documentIds-arvon.
Dokumentin lähettäminen: kaksi hyväksyttyä muotoa
POST /api/v1/documents hyväksyy tiedoston kahdella tavalla, valintasi mukaan. Samoja valvontoja sovelletaan molemmissa tapauksissa: sallitut tyypit, 50 Mt:n enimmäisraja, binäärisen allekirjoituksen varmennus ja virusanalyysi.
- • Multipart/form-data-muodossa, jossa on file-niminen osa. Se on klassinen muoto, curl -F:n ja useimpien kirjastojen muoto.
- • Raakamuodossa: tiedoston tavut muodostavat pyynnön rungon ja Content-Type-otsikko antaa sen tyypin (esimerkiksi application/pdf). Hyödyllinen työkalusta, joka välittää sisällön sellaisenaan ilman pyynnön käärimistä – näin tekee Power Automate -liitin.
- • Raakamuodossa tiedoston nimellä ei ole paikkaa rungossa: ilmoita se X-File-Name-otsikon tai ?fileName=-parametrin kautta. Ilman sitä dokumentti nimetään sen tyypin mukaan.
- • Ei-tuettu tyyppi vastaa 415:llä mainiten kaksi hyväksyttyä muotoa, ja multipart-ilmoitettu mutta lukematon runko vastaa 400:lla. Kumpikaan ei ole palvelinvirhe.
# 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.Allekirjoitusten sijainti
Ilman mallia documentIds-arvoista luodulla kirjekuorella ei ole mitään esiasetettuja kenttiä: allekirjoittaja saa dokumentin ilman allekirjoitusaluetta. Luontikutsun kanssa välitetty fields-taulukko sijoittaa kunkin kentän tarkkaan pisteeseen – se vastaa API-puolella sitä, mitä malli tallentaa kerran ja lopullisesti.
- • Koordinaatit ovat PDF-pisteitä, origo vasemmassa yläkulmassa sivua ja Y-akseli alaspäin (A4-sivu on 595 × 842 pistettä). x ja y ilmoittavat kentän vasemman yläkulman, width ja height sen koon.
- • pageNumber alkaa arvosta 1, documentIndex arvosta 0. Sivunumero, joka ylittää dokumentin, ei hylätä luonnin yhteydessä: kenttä jätetään huomiotta allekirjoituksen yhteydessä eikä näy missään – tämä on ensimmäinen asia tarkistaa, kun kenttä puuttuu puhelusta.
- • recipientEmail:n on vastattava yhtä saman kutsun vastaanottajista, isolla/pienellä kirjoituksella erottamatta. Muussa tapauksessa luonti epäonnistuu ja luetteloi kaikki virheelliset rivit, mikä välttää niiden korjaamisen yksi kerrallaan.
- • fields ja templateId sulkevat toisensa pois: mallilla on jo oma asettelu. Siten fields-taulukkoa käytetään vain documentIds-arvon kanssa.
- • Hyväksytyt tyypit: SIGNATURE, INITIALS, DATE_SIGNED, TEXT, CHECKBOX ja RADIO_GROUP. required on oletusarvoisesti true; placeholder ja dateFormat ovat valinnaisia, ja options huomioidaan vain RADIO_GROUP:ille.
- • Kirjekuori hyväksyy enintään 100 kenttää, 20 dokumenttia ja 50 vastaanottajaa – suunnitelmasi rajat voivat olla pienemmät.
# 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.Tekstiankkurit: kentän sijoittaminen ilman koordinaatteja tuntematta
Koordinaattien sijaan kenttä voi viitata dokumentissa tulostettuun tekstiin: anchorText etsii sen PDF:stä ja palvelin laskee sijainnin luonnissa. Tämä on suositeltava tapa, kun dokumentti luodaan uudelleen jokaisella lähettämisellä – pyöräytys, sopimuksien luonti – koska asettelu muuttuu kun taas "Asiakkaan allekirjoitus" pysyy. anchorPlacement kertoo, millä tekstin puolella kenttä sijaitsee (oletuksena right, muuten below, above tai left) ja anchorIndex valitsee esiintymisen kun teksti esiintyy useita kertoja.
x ja y ovat pakollisia jopa ankkurin kanssa: ne toimivat varasuunnitelmana. Löytämätön ankkuri ei epäonnistu luontia – kenttä säilyttää antamasi kirjaimellisen sijainnin ilman virhettä eikä varoitusta vastauksessa. Ilmoita siis todennäköinen varasuunnitelma 0,0:n sijaan ja tarkista piirtäminen ensimmäisellä lähetyksellä.
Integroitu allekirjoitus: allekirjoita poistumatta sovelluksestasi
Asiakkaasi tutustuu ja allekirjoittaa asiakirjansa sinun omasta käyttöliittymästäsi. Seremonia avautuu ikkunassa sivusi yläpuolella, ja hän palaa sinulle automaattisesti päätyttyään. Palvelimen puolella ei ole uutta: luot kirjekuoren tavallisesti antamalla redirectUrl-osoitteen, sitten jätät SDK:lle vastaanottajan allekirjoitus-URL-osoitteen.
- • Kutsu Certyneo.sign() suoraan napsautuskäsittelijässäsi ja välitä palvelimen kutsu getUrl-funktiolla. Await ennen sign()-kutsua poistuu käyttäjän eleestä: Safari ja Firefox estävät sitten ikkunan. SDK avaa sen välittömästi ja lataa sen, kun lupaus ratkesi.
- • redirectUrl on paluukanava. Lähetämme sinne allekirjoittajan lisäämällä certyneo_status (completed tai declined) ja certyneo_envelope. Lataa sama skripti tälle paluusivulle: se on se, joka ilmoittaa portaalin ikkunalle, joka on jäänyt avoinna taakse.
- • Upotetun tilan jälkeen omia toimintakehotuksiamme poistetaan. Asiakas ei koskaan näe kutsua Certyneo-tilin luomiseen.
- • Jos selain hylkää ikkunan, SDK siirtyy automaattisesti täyden sivun uudelleenohjaukseen. Allekirjoittajan reitti on identtinen ja paluusivusi saa täsmälleen samat parametrit.
- • Tarkoituksella ei ole "käyttäjä hylkäsi" -takaisinkutsua: ikkunan tilaa ei voi lukea sivultasi, ja tällainen takaisinkutsu laukaisisi virheellisesti. Allekirjoitus, joka ei saavuta, pysyy odottavana webhookiin asti.
// 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.Selaimen tapahtuma ei ole todiste allekirjoituksesta
onCompleted on näyttötapahtuma, jonka selain lähettää, joten kuka tahansa voi väärentää sen konsolistaan. Älä koskaan vaihda dossieroa "allekirjoitetuksi" sen perusteella: käytä sitä näytön päivittämiseen ja luota serverisi vastaanottamaan allekirjoitettuun webhook envelope.completed -tapahtumaan todellista tilaa varten. Tämä on maksupalveluintegraatioiden klassinen ansa, ja se toistuu identtisesti täällä.
Kehittää työasemallasi
Testitavaalla redirectUrl hyväksyy http://localhost (ja 127.0.0.1): voit rakentaa koko prosessin tietokoneellasi ennen käyttöönottoa. Todellinen avain hylkää sen, jotta mikään tuotantokirjekuori ei lähettäisi oikeaa allekirjoittajaa koneeseen, joka ei ole hänen omansa.
Näytä seremonia omalla sivullasi
Kehysmuodossa allekirjoitus näytetään omassa liittymässäsi ilman erillistä ikkunaa. Se vaatii yhden vaiheen enemmän kuin ikkunatila: todistaa, että sivusto, jolla se näytetään, kuuluu sinulle. Näin estetään kolmansia osapuolia peittelemästä seremonioidemme näyttämistä asiakkaittesi pettämiseksi.
- • Ilmoita sivustosi kohdassa Asetukset → Integroitu allekirjoitus ja julkaise ilmoitettu DNS-tietue. Tarkka osoite: alaverkkotunnus tai eri portti lasketaan eri sivustoksi.
- • Jokaisen allekirjoituksen yhteydessä pyydä tuore URL-osoite POST /api/v1/envelopes/{id}/embed-url:sta. Se sisältää näyttöoikeuden ja kelpaa kaksi tuntia, mikä vastaa klikkausta, ei kirjekuoren luontia.
- • Kahta kulkureittiä ei voi suorittaa kehyksessä: pätevää allekirjoitusta, jonka henkilöllisyyden varmistus kieltäytyy myös kuulumasta kehykseen, ja maksua allekirjoituksella. Molemmissa tapauksissa allekirjoittaja ohjataan täyteen ikkunaan.
- • Merkintä "Powered by Certyneo" katoaa kehyksestä Business-suunnitelmasta alkaen. Kehysmuoto itsessään sisältyy jo Standard-suunnitelmasta lähtien.
// 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.Hanki allekirjoitus ilman sähköpostin lähettämistä
Portaali, joka näyttää seremonian hänen kohdallaan, ei usein tarvitse kutsuamme: se saapuu hänen oman polkunsa rinnalla ja tarjoaa tilin asiakkaalle, joka ei sitä halua. Anna vastaanottajan ilmoituskanavalle arvo NONE, niin mitään ei lähetetä hänelle — viet hänet itse hänen allekirjoitukseensa.
- • Asetus on vastaanottajakohtainen, ei kirjekuorikohtainen: voit vaientaa isännöimäsi asiakkaan ja pitää sähköpostin ulkoiselle vastakkaalakirjoittajalle, jolla ei ole portaalia.
- • Se on varattu allekirjoittajille ja hyväksyjille, ainoille henkilöille, joille sinulla on linkki toimitettavaksi. Luet sen luomisen ja lähettämisen vastauksesta, tai pyydät tuoretta URL:ia napsautuksen yhteydessä POST /api/v1/envelopes/{id}/embed-url -osoitteesta.
- • Automaattiset muistutukset pysähtyvät itsestään tälle vastaanottajalle: emme koskaan kirjoittaneet hänelle, emme aloita muistutuksella. Muut vastaanottajat jatkavat normaalia muistuttamista.
- • Allekirjoitustodistus mainitsee sen vastaanottaja kerrallaan. Todistusaineisto, joka vaikenisi tästä, johtaisi uskomaan, että tämä allekirjoittaja sai meiltä kutsun, jota ei koskaan ollut olemassa.
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.Näytä asiakkaasi nimi lähettäjänä
Oletusarvoisesti allekirjoittaja näkee API-avaimen haltijan nimen. Jos allekirjoitat useiden yritysten asiakirjoja yhdellä avaimella, välitä sender-kenttä kirjekuoren luomisen yhteydessä: allekirjoitussivu ja kutsu- ja muistutussähköpostit näyttävät tällöin asiaan liittyvän yrityksen nimen.
- • Varattu Business-suunnitelmalle ja sitä korkeammille. Alemmalla suunnitelmalla luominen hylätään sen sijaan, että annettaisiin allekirjoittajan lukea odotettavasta poikkeava nimi.
- • Nimi on näyttö: sertifikaatti ja tilintarkastuspolku säilyttävät todellisen lähettäjän, ja sähköpostit lähetetään aina Certyneon kautta.
- • Osoite on valinnainen. Ilman sitä allekirjoittaja näkee vain nimen, ei koskaan API-avaimen haltijan osoitetta.
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"
}
}Tunnistautuminen
Jokainen kutsu sisältää API:n avaimen oikeussa. Avaimet luodaan asetuksia -> API:na ja ne näkyvät vain yhden kerran.
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" } }- • Muoto: sk_live_… tuotannossa, sk_test_… hiekkalaatikolla. Otsake: Authorization: Bearer <clé>.
- • Vallat: envottimet, dokumentit, webhooks, merkit — lukemiselle (:read) tai kirjoittamiselle (:write). Kirjoittaminen sisältää luettelon myös; vallan * antaa kaikki oikeudet.
- • Avaimet sk_test_ luovat sandbox-resursseja, jotka on jätetty kiintiön ja laskutuksen ulkopuolelle. Vastaanottajalle ei lähetetä oikeaa sähköpostia, ellei hänen osoitteensa vastaa lähettävän tilin sähköpostia — hyödyllinen koko kulun testaamiseen itsellesi.
- • Virheet: 401 väärä avain, 403 riittämätön valloitus, 429 liian suuri lähdöskapasiteetti, 402 kuukausimäärärajan ylittynyt.
Vastauksen muoto
Tieto, miten kirjoittaa asiakkaalle: kokoelmat ovat sisällytetty objektiin dataa, kun taas yksittäiset resurssit palautetaan tasaisesti. Yksittäisen ressin lukemisesta response.data.data palauttaa siis 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": [ /* … */ ]
}Nopeudenrajoitukset
Rajoitukset takaavat vakaan palvelun laadun kaikille asiakkaille. Jos tarvitset lisää, ota meihin yhteyttä.
- • 100 pyyntöä minuutissa API-avainta kohden
- • Purskeena sallittu jopa 200 pyyntöä alle 10 sekunnissa
- • 429-vastaus Retry-After-otsikolla, joka ilmoittaa viiveen sekunteissa