API-dokumentasjon
Bygg BankID-signering inn i ditt eget system. Last opp et dokument, opprett en signeringsforespørsel, og få beskjed via webhook når den er signert.
Kom i gang
- Lag en testnøkkel under Konto → Utvikler. Testnøkler (
sk_test_…) signerer mot testmiljøet: ekte signeringsflyt, men ingen betaling, ingen kvote og ingen ekte penger. - Last opp PDF-en med
POST /v1/documents. - Opprett signeringen med
POST /v1/signature_requests. - Registrer et webhook-endepunkt, så sier vi fra når dokumentet er ferdig signert.
- Bytt til en live-nøkkel (
sk_live_…) når alt virker.
Autentisering
Send nøkkelen som bearer-token. Hver nøkkel har et sett tilganger (scopes) — den kommer ikke til endepunkter den ikke har fått tilgang til, og en nøkkel kan aldri lage en ny nøkkel.
Authorization: Bearer sk_live_...Idempotens
Send en Idempotency-Key på alle POST-kall. Faller nettet ut midt i et kall, kan du trygt prøve på nytt med samme nøkkel: du får det opprinnelige svaret tilbake i stedet for en ny signeringsforespørsel. Samme nøkkel med et annet innhold gir 422 — det er en feil hos deg, og vi skjuler den ikke.
curl https://esigner.no/api/v1/signature_requests \
-H "Authorization: Bearer sk_test_..." \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"documentId": "<fra POST /v1/documents>",
"signers": [{ "name": "Ola Nordmann", "email": "ola@example.no" }],
"useSubscription": true
}'Endepunkter
- POST
/v1/documentsUpload the PDF(s) to be signed
multipart/form-data. Fields: ownerEmail, and one or more files (PDF). Returns the document id.
- GET
/v1/eventsList events
The same events delivered to your webhook endpoints, newest first. Useful for backfilling after downtime.
- POST
/v1/signature_requestsCreate a signature request
Sends the document to each signer for BankID/eID signing. Pass an Idempotency-Key header to make retries safe.
- GET
/v1/signature_requests/{id}Retrieve a signature request
Full maskinlesbar spesifikasjon (OpenAPI 3.1): /api/v1/openapi.json
Webhooks
Vi POSTer hendelser til adressen din og signerer hver leveranse med Esigner-Signature: t=<unix>,v1=<hmac>. HMAC-en er over <t>.<rå body>, så en fanget melding ikke kan spilles av på nytt med et annet tidsstempel. Verifiser alltid før du stoler på innholdet.
Hendelser: document.completed, document.signing_failed, order.captured. Feiler en levering, prøver vi på nytt med økende mellomrom (1 min → 6 t). Svarer endepunktet ikke over tid, deaktiverer vi det og sier fra på e-post — hendelsene går ikke tapt, og du kan sende dem på nytt.
// Verifiser Esigner-Signature: t=<unix>,v1=<hmac>
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(rawBody, header, secret) {
const [t, v1] = header.split(",").map(p => p.split("=")[1]);
const expected = createHmac("sha256", secret)
.update(`${t}.${rawBody}`)
.digest("hex");
return timingSafeEqual(Buffer.from(v1), Buffer.from(expected));
}Står du fast? Ta kontakt — vi svarer gjerne på integrasjonsspørsmål.