REST API · WEBHOOKS · v1

Bouwen met BuiltSign

Integreer juridisch geldige e-handtekeningen direct in je eigen applicatie. Upload PDFs, verstuur ondertekentransacties, plaats handtekeningvelden en ontvang webhook-events, allemaal via een eenvoudige REST API.

Base URL
url
https://api.builtsign.com/v1
API-sleutel aanmaken

Instellingen → API-sleutels

Snel starten

Een document laten ondertekenen in 4 API-aanroepen.

1. Maak een API-sleutel aan

Ga naar Instellingen → API-sleutels in je BuiltSign-dashboard en maak een sleutel aan met schrijfrechten. Sla hem veilig op,hij wordt maar één keer getoond.

Settings → API Keys

2. Upload een PDF

Upload een PDF (tot 50 MB) als multipart-formulierdata. Je ontvangt een document_id voor de volgende stap.

bash
curl -X POST https://api.builtsign.com/v1/documents/upload \
  -H "X-API-Key: bsk_live_xxxxxxxxxxxxxxxxxxxx" \
  -F "file=@contract.pdf"

3. Maak een ondertekentransactie

Maak een ondertekentransactie aan met het document_id en een lijst van ondertekenaars. Stel auto_send: false in om eerst velden te plaatsen.

bash
curl -X POST https://api.builtsign.com/v1/signing-requests \
  -H "X-API-Key: bsk_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "document_id": "doc_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "signers": [
      { "name": "Jan de Vries", "email": "jan@example.com" }
    ],
    "message": "Graag de offerte ondertekenen.",
    "expires_in_days": 7,
    "auto_send": false
  }'

4. Voeg velden toe en verstuur

Plaats handtekeningvelden met procentuele coördinaten en verstuur vervolgens om de uitnodigingsmail te sturen.

curl -X POST https://api.builtsign.com/v1/signing-requests/{request_id}/fields \
  -H "X-API-Key: bsk_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "fields": [
      {
        "signer_id": "sgn_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "field_type": "signature",
        "page_number": 1,
        "x_percent": 60.0,
        "y_percent": 82.0,
        "width_percent": 30.0,
        "height_percent": 8.0
      }
    ]
  }'

Authenticatie

Alle v1-endpoints vereisen een API-sleutel in de X-API-Key request header.

bash
curl https://api.builtsign.com/v1/signing-requests \
  -H "X-API-Key: bsk_live_xxxxxxxxxxxxxxxxxxxx"

Rechten

ScopePermissions
readBronnen ophalen en weergeven
writeBronnen aanmaken, bijwerken en versturen
adminGereserveerd voor toekomstig gebruik

Limieten

Elke API-sleutel heeft een instelbare limiet (standaard: 60 transacties/minuut, max: 1000). Bij overschrijding volgt HTTP 429.

Documenten

Upload PDFs en bekijk eerder geüploade documenten.

Ondertekentransacties

Maak ondertekentransacties aan, beheer ze en volg de status.

Handtekeningvelden

Plaats velden op een document die ondertekenaars moeten invullen voordat zij kunnen afronden.

Positionering

Coördinaten zijn procentueel (0–100) ten opzichte van de pagina-afmetingen. Het oorsprongspunt (0, 0) is de linkerbovenhoek van de pagina.

(0, 0)(100, 0)(0, 100)(100, 100)
signature
initials

Veldtypen

field_typeDescription
signatureVolledige handtekening
initialsParaaf / initialen
dateDatum (automatisch ingevuld)
textVrije tekstinvoer
checkboxAanvinkvak
selectDropdown (geef options[] mee)

Webhooks

Ontvang real-time meldingen wanneer er iets gebeurt in BuiltSign.

Instellen

Maak een webhook aan via Instellingen → Webhooks. Kies op welke events je wilt abonneren. BuiltSign stuurt een HTTP POST naar jouw endpoint voor elk event.

Events

EventTrigger
signing_request.createdOndertekentransactie aangemaakt
signing_request.sentTransactie verzonden naar ondertekenaars
signing_request.completedAlle ondertekenaars hebben getekend
signing_request.cancelledOndertekentransactie geannuleerd
signing_request.expiredOndertekentransactie verlopen
signer.viewedOndertekenaar heeft de pagina geopend
signer.signedOndertekenaar heeft ondertekend
signer.declinedOndertekenaar heeft geweigerd
signer.withdrawnOndertekenaar heeft handtekening ingetrokken
document.signedOndertekende PDF gegenereerd
signing_request.remindedHerinneringsmails verstuurd naar openstaande ondertekenaars
document.uploadedDocument geüpload via API
member.invitedTeamlid uitgenodigd voor de organisatie

Payload-formaat

Elke webhook-POST bevat deze velden:

json
{
  "event": "signing_request.completed",
  "timestamp": "2026-05-21T11:00:00Z",
  "webhook_id": "wh_xxxxxxxxxxxxxxxxxxxx",
  "data": {
    "signing_request_id": "sr_xxxxxxxxxxxxxxxxxxxx",
    "completed_at": "2026-05-21T11:00:00Z",
    "all_signers": [
      { "email": "alice@example.com", "name": "Alice Smith", "signed_at": "2026-05-21T10:30:00Z" },
      { "email": "bob@example.com", "name": "Bob Jones", "signed_at": "2026-05-21T11:00:00Z" }
    ],
    "signed_pdf_s3_key": "orgs/org_xxx/signed/sr_xxx.pdf"
  }
}

Request Headers

HeaderValue
Content-Typeapplication/json
X-Webhook-SignatureHMAC-SHA256 hex digest
X-Webhook-Eventevent type (e.g. signer.signed)
X-Webhook-IDwebhook UUID
X-Webhook-Retryattempt number (only on retries)

Handtekeningverificatie

Valideer elke inkomende webhook door de HMAC-SHA256-handtekening te verifiëren. Verifieer altijd, vertrouw de payload nooit zonder verificatie.

import crypto from "crypto";

// Express middleware example
app.post("/webhook", express.raw({ type: "application/json" }), (req, res) => {
  const signature = req.headers["x-webhook-signature"];
  const secret    = process.env.BUILTSIGN_WEBHOOK_SECRET;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(req.body) // raw Buffer, not parsed JSON
    .digest("hex");

  if (expected !== signature) {
    return res.status(401).send("Invalid signature");
  }

  const event = JSON.parse(req.body);
  // TODO: handle event (e.g. event.event === "document.signed")
  res.sendStatus(200);
});

Herhalingen

BuiltSign herhaalt mislukte bezorgingen tot 3 keer: na 1 minuut, 5 minuten en 15 minuten. Na 10 opeenvolgende mislukkingen wordt de webhook automatisch gepauzeerd.

Node.js SDK

Zero-dependency TypeScript client voor Node.js ≥ 18. Dekt elk API-endpoint met volledige type-veiligheid en ingebouwde retry-logica.

Installatie

bash
npm install @builtsign/node

TypeScript · Node.js ≥ 18 · Zero dependencies

Snelstart

typescript
import BuiltSign from "@builtsign/node";

const builtsign = new BuiltSign({ apiKey: process.env.BUILTSIGN_API_KEY! });

// 1. Upload a PDF
const { document_id } = await builtsign.documents.upload(
  await fs.readFile("contract.pdf"),
  "contract.pdf",
);

// 2. Create a signing request
const request = await builtsign.signingRequests.create({
  document_id,
  signers: [
    { name: "Jan de Vries", email: "jan@example.com", order: 1 },
    { name: "Lisa Smit",    email: "lisa@example.com", order: 2 },
  ],
  signing_order: "sequential",
  expires_in_days: 7,
  auto_send: false,
});

// 3. Place signature fields
await builtsign.signingRequests.addFields(request.id, [{
  signer_id: request.signers[0].id,
  field_type: "signature",
  page_number: 1,
  x_percent: 60,
  y_percent: 82,
  width_percent: 30,
  height_percent: 8,
}]);

// 4. Send
await builtsign.signingRequests.send(request.id);

API resources

ResourceMethods
builtsign.documentsupload(), list()
builtsign.signingRequestscreate(), list(), get(), send(), cancel(), addFields(), download(), remind(), reactivate(), embeddedUrl()
builtsign.templateslist(), create(), get(), update(), delete(), send()
builtsign.contactslist(), create(), delete()
builtsign.webhooksverify()
builtsign.eventslist()
builtsign.bulksend(), getJob()
builtsign.usageget()

MCP Server

Laat AI-assistenten documenten uploaden en ondertekentransacties versturen via het Model Context Protocol.

Wat is MCP?

Het Model Context Protocol (MCP) is een open standaard van Anthropic waarmee AI-assistenten zoals Claude externe tools kunnen aanroepen. De BuiltSign MCP-server biedt 11 tools zodat een AI je ondertekenwerkstroom van begin tot eind kan beheren.

Installatie

bash
# Build from source
cd packages/mcp-server
npm install && npm run build

Claude Desktop configuratie

json
{
  "mcpServers": {
    "builtsign": {
      "command": "node",
      "args": ["/path/to/packages/mcp-server/dist/index.js"],
      "env": {
        "BUILTSIGN_API_KEY": "bs_live_xxxxxxxxxxxxxxxxxxxx",
        "BUILTSIGN_API_URL": "https://app.builtsign.com"
      }
    }
  }
}

Beschikbare tools

upload_documentlees een lokale PDF en upload hem
list_documents
create_signing_requestconcept aanmaken
create_and_send_signing_requestaanmaken en direct versturen
send_signing_requestbestaand concept versturen
get_signing_requeststatus opvragen
list_signing_requestsmet statusfilter en cursor-paginatie
cancel_signing_request
send_reminder
list_templates
send_from_templaterollen koppelen aan ondertekenaars
list_eventsvolledige audit trail met cursor-paginatie

Bring Your Own AI (BYOAI)

Koppel je eigen AI-pipeline aan BuiltSign. Na elke voltooide ondertekening ontvang je een webhook met een downloadlink (1 uur geldig) naar het getekende PDF. Verwerk het volledig op je eigen infrastructuur.

Enterprise only

Hoe het werkt

01

Document getekend

Alle ondertekenaars voltooien het ondertekteningsverzoek. BuiltSign genereert de definitieve PDF en slaat die beveiligd op in S3.

02

Webhook verstuurd

BuiltSign stuurt direct een JSON-payload naar jouw endpoint, inclusief een presigned URL om het getekende PDF te downloaden (1 uur geldig).

03

Jouw AI verwerkt

Jouw pipeline downloadt de PDF en doet wat nodig is: data extraheren, archiveren, workflows starten. BuiltSign ziet de output nooit.

Wat je kunt bouwen

Contractgegevens (namen, bedragen, datums) extraheren en naar CRM of ERP sturen

Vervolgworkflows starten: onboarding, provisioning, compliance-controles

Slack-meldingen sturen met een AI-samenvatting van het getekende document

Getekende contracten in een RAG-pipeline laden voor interne documentzoekopdrachten

Instellen

BYOAI wordt per organisatie ingesteld. Je geeft een HTTPS-endpoint op en genereert een signing secret.

1

Ga naar Instellingen → Ontwikkelaars → Bring Your Own AI

2

Voer je HTTPS-endpoint URL in en genereer een signing secret

3

Deploy je webhook-handler. Gebruik het signing secret om elk verzoek te verifiëren (zie code hieronder)

AI-integratie-instellingen openen

Webhook-payload

BuiltSign stuurt een POST-verzoek met deze JSON-body. De signed_pdf_url is een presigned S3-URL die 1 uur geldig is.

json
{
  "event": "document.signed",
  "signing_request_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "document_name": "Koopcontract 2026.pdf",
  "completed_at": "2026-06-16T10:30:00Z",
  "signed_pdf_url": "https://s3.amazonaws.com/builtsign/signed/...?X-Amz-Expires=3600",
  "expires_in": 3600,
  "signers": [
    {
      "name": "Jan de Vries",
      "email": "jan@example.com",
      "signed_at": "2026-06-16T10:28:00Z"
    },
    {
      "name": "Lisa Smit",
      "email": "lisa@example.com",
      "signed_at": "2026-06-16T10:30:00Z"
    }
  ]
}

signed_pdf_url verloopt na 1 uur. Download de PDF direct in je handler.

Verifieer X-BuiltSign-Signature bij elk verzoek. Weiger alles wat niet overeenkomt.

Handtekening verifiëren en PDF downloaden

Verifieer altijd de HMAC-SHA256-handtekening voordat je de payload verwerkt. Gebruik de ruwe request-body (geen geparseerde JSON) voor de HMAC-berekening.

import crypto from "crypto";
import express from "express";

app.post("/ai-webhook", express.raw({ type: "application/json" }), async (req, res) => {
  // 1. Verify the signature
  const signature = req.headers["x-builtsign-signature"];
  const secret    = process.env.BUILTSIGN_AI_SECRET;

  const expected = crypto
    .createHmac("sha256", secret)
    .update(req.body)          // raw Buffer — do NOT parse first
    .digest("hex");

  if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
    return res.status(401).send("Invalid signature");
  }

  const payload = JSON.parse(req.body);

  // 2. Download the signed PDF (URL valid 1 hour)
  const pdfResponse = await fetch(payload.signed_pdf_url);
  const pdfBuffer   = await pdfResponse.arrayBuffer();

  // 3. Send to your AI pipeline
  await yourAiPipeline.process({
    documentName: payload.document_name,
    pdf:          Buffer.from(pdfBuffer),
    signers:      payload.signers,
    completedAt:  payload.completed_at,
  });

  res.sendStatus(200);
});

Request-headers

HeaderValue
Content-Typeapplication/json
X-BuiltSign-SignatureHMAC-SHA256 hex digest of raw body
X-BuiltSign-Eventdocument.signed

Klaar om je AI te koppelen?

Stel je endpoint in via Instellingen. Klaar in minder dan 2 minuten.

Nu instellen

Embedded Signing

Laat ondertekenaars documenten direct in jouw applicatie ondertekenen. Geen doorverwijzing naar builtsign.com.

1. Genereer een embedded URL (server-side)

Roep embeddedUrl() aan vanuit je backend met de allowed origin van je frontend. Geeft een kortlevende URL terug per ondertekenaar.

typescript
const { signers } = await builtsign.signingRequests.embeddedUrl(
  request.id,
  { allowed_origin: "https://yourapp.com" },
);

// Pass signer.embedded_url to your frontend
const signerUrl = signers[0].embedded_url;

2. Mount het signing iframe (client-side)

Installeer @builtsign/embed en geef de URL door aan BuiltSignEmbed. Die maakt een iframe, luistert naar postMessage-events en roept je callbacks aan.

bash
npm install @builtsign/embed
typescript
import { BuiltSignEmbed } from "@builtsign/embed";

const embed = new BuiltSignEmbed({
  containerId: "signing-container",  // <div id="signing-container">
  embeddedUrl: signerUrl,

  onSigned: (e) => {
    console.log("Signed!", e.documentName);
    embed.close();
  },
  onDeclined: (e) => {
    console.log("Declined:", e.reason);
    embed.close();
  },
});

embed.open();

Enterprise

Gebouwd voor enterprise-teams

Heb je white-label branding, SSO of een eigen omgeving nodig? BuiltSign is een SaaS-product, geen installatie vereist. Neem contact met ons op voor enterprise-onboarding, maatwerkcontracten en geavanceerde integraties.

  • White-label API & onderteken-UI
  • SSO (SAML 2.0 / OIDC)
  • Eigen domein
  • Dedicated omgeving
  • SLA + prioriteitssupport
  • Aangepaste limieten & volumeprijzen
Contact opnemen

Foutcodes

Alle fouten bevatten een JSON-body met een detail-veld dat het probleem beschrijft.

CodeDescription
400Ongeldig verzoek, ongeldige invoer of schending van een beperking
401Niet geautoriseerd, ontbrekende of ongeldige API-sleutel
403Verboden, onvoldoende rechten of planbeperking
404Niet gevonden, bron bestaat niet of behoort tot een andere organisatie
409Conflict, actie niet toegestaan in de huidige status
422Onverwerkbaar, validatiefout (controleer velddetails)
429Te veel verzoeken, limiet overschreden
502Upstream-fout, S3 of e-mailprovider tijdelijk niet beschikbaar