Siirry pääsisältöön
Certyneo
Julkinen API v1

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.

cURLbash
# 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"
JavaScript / Nodets
// 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);
Pythonpython
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.

RapidAPI-kortti

Sama luettelo päätepisteistä, joita voi kokeilla suoraan selaimesta. Testialusta odottaa kahta erillistä otsikkoa: RapidAPI-avainta, jonka alusta sinulle antaa, ja Certyneo-avaintasi Authorization-kenttään — toinen näistä antaa todelliset oikeudet kutsuun.

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äPolkuKuvaus
GET/api/v1/account/meTodennetun kutsujan identiteetti (id, sähköposti, paketti) : tunnisteiden testi ilman vaaditun laajuuden kanssa
GET/api/v1/sandboxLaske testiavaimilla luodut tiedot (poistetaan automaattisesti 30 päivän kuluttua)
DELETE/api/v1/sandboxPoista kaikki testiavaimilla luodut tiedot koskematta todellisiin tietoihin
POST/api/v1/documentsLataa PDF (multipart) : palauttaa dokumentin tunnuksen
GET/api/v1/documentsLuettele dokumentit
GET/api/v1/documents/{id}Lue dokumentin metatiedot
DELETE/api/v1/documents/{id}Poista dokumentti
GET/api/v1/envelopesLuettele kirjekuoret (suodata ?status= ja ?limit= avulla)
POST/api/v1/envelopesLuo 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}/sendLähetä DRAFT-kirjekuori : lähettää kutsut
POST/api/v1/envelopes/{id}/voidPeruuta lähetetty kirjekuori, jota ei ole vielä kokonaan allekirjoitettu : odottavat allekirjoittajat saavat ilmoituksen
GET/api/v1/envelopes/{id}/audit-trailLataa eIDAS-todistuskansion PDF
POST/api/v1/envelopes/{id}/embed-urlPalauttaa 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/verifyJulkinen : tarkista tarkistuskierroksen merkintä ja sen todiste ankkuroitua Merklen juurta vastaan (ilman todennusta, ei paljasta mitään)
GET/api/v1/envelopes/{id}/signed-documentLataa allekirjoitettu PDF (kun COMPLETED)
GET/api/v1/envelopes/bulkLuettele joukkolähetyksesi
POST/api/v1/envelopes/bulkJoukkolä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/templatesLue uudelleenkäytettävät kirjekuorimallit
POST/api/v1/templatesLuo malli (asiakirjat, roolit, sijoitetut kentät)
GET/api/v1/workspacesListaa työtilat, joissa voit luoda kirjekuoren
POST/api/v1/sepa-mandatesLuo SEPA-valtakirjan PDF ja sen DRAFT-kirjekuori, kentät jo sijoitettuna
POST/api/v1/payroll-adapters/normalizeNormalisoi palkkalaskelman CSV (Silae, Sage Paie, PayFit, Lucca) joukkolähetysmuotoon
POST/api/v1/ag-coproprieteLuo yhtiökokouksen kirjekuori (päätöslauskelmat ja omistusosuudet)
POST/api/v1/ag-copropriete/{envelopeId}/votesKirjaa osakkaan äänet yhtiökokouksen päätöslauselmista
POST/api/v1/ag-copropriete/{envelopeId}/tallyLaske 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/webhooksLue webhookit
POST/api/v1/webhooksRekisterö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/sealsAseta pätevä sähköinen sinetti asiakirjaan
GET/api/v1/seals/{id}Lue sinetin tila
GET/api/v1/seals/{id}/certificateLataa sinetin sertifikaatti
GET/api/v1/payslips/workspacesPalkkalaskelmat: tilat, joille tämä avain jakaa, asiakkaan hallussa olevia tai delegoituja (kirjanpitotoimistot, palkkalaskelman hoitajat)
GET/api/v1/payslips/employeesPalkkalaskelmat: työntekijärekisteri, joista ne, jotka ovat kieltäneet sähköisen toimittamisen (paperinen palkkalaskelma erääntynyt)
PUT/api/v1/payslips/employeesPalkkalaskelmat: lisää tai päivitä rekisterin työntekijöitä (älä koskaan poista niitä)
POST/api/v1/payslipsToimita palkkalaskelma (PDF) työntekijän kassakaappiin: sinetöity, säilytetty 50 vuotta, uudelleenyritys ilman kaksinkertaisuutta
GET/api/v1/payslipsLuettele toimitetut palkkalaskelmat ja niiden konsultaation todisteet
GET/api/v1/keysLuettele API-avaimet
POST/api/v1/keysLuo 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/usageNykyisen kauden kulutus ja ennustettu kustannus
GET/api/v1/statusPalvelun tila
GET/api/v1/healthTerveystarkistus: tietokanta, jono ja objektin tallennus
GET/api/v1/openapiKoneen 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.
cURLbash
# 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.
cURLbash
# 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.
cURLbash
# 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.
JavaScriptjavascript
// 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.
JavaScriptjavascript
// 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.
JSONjson
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.
JSONjson
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.

HTTPhttp
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.

Kokoelma — sisällytettyjson
// GET /api/v1/envelopes
// Collections are WRAPPED in a "data" array.
{
  "data": [
    { "id": "env_abc123", "subject": "Contrat", "status": "SENT" }
  ]
}
Yksittäinen resurssi — tasaisestijson
// 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

Mene pidemmälle