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.
https://api.builtsign.com/v1Instellingen → API-sleutels
Een document laten ondertekenen in 4 API-aanroepen.
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 KeysUpload een PDF (tot 50 MB) als multipart-formulierdata. Je ontvangt een document_id voor de volgende stap.
curl -X POST https://api.builtsign.com/v1/documents/upload \
-H "X-API-Key: bsk_live_xxxxxxxxxxxxxxxxxxxx" \
-F "file=@contract.pdf"Maak een ondertekentransactie aan met het document_id en een lijst van ondertekenaars. Stel auto_send: false in om eerst velden te plaatsen.
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
}'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
}
]
}'Alle v1-endpoints vereisen een API-sleutel in de X-API-Key request header.
curl https://api.builtsign.com/v1/signing-requests \
-H "X-API-Key: bsk_live_xxxxxxxxxxxxxxxxxxxx"| Scope | Permissions |
|---|---|
read | Bronnen ophalen en weergeven |
write | Bronnen aanmaken, bijwerken en versturen |
admin | Gereserveerd voor toekomstig gebruik |
Limieten
Elke API-sleutel heeft een instelbare limiet (standaard: 60 transacties/minuut, max: 1000). Bij overschrijding volgt HTTP 429.
Upload PDFs en bekijk eerder geüploade documenten.
Maak ondertekentransacties aan, beheer ze en volg de status.
Plaats velden op een document die ondertekenaars moeten invullen voordat zij kunnen afronden.
Coördinaten zijn procentueel (0–100) ten opzichte van de pagina-afmetingen. Het oorsprongspunt (0, 0) is de linkerbovenhoek van de pagina.
| field_type | Description |
|---|---|
signature | Volledige handtekening |
initials | Paraaf / initialen |
date | Datum (automatisch ingevuld) |
text | Vrije tekstinvoer |
checkbox | Aanvinkvak |
select | Dropdown (geef options[] mee) |
Ontvang real-time meldingen wanneer er iets gebeurt in BuiltSign.
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.
| Event | Trigger |
|---|---|
signing_request.created | Ondertekentransactie aangemaakt |
signing_request.sent | Transactie verzonden naar ondertekenaars |
signing_request.completed | Alle ondertekenaars hebben getekend |
signing_request.cancelled | Ondertekentransactie geannuleerd |
signing_request.expired | Ondertekentransactie verlopen |
signer.viewed | Ondertekenaar heeft de pagina geopend |
signer.signed | Ondertekenaar heeft ondertekend |
signer.declined | Ondertekenaar heeft geweigerd |
signer.withdrawn | Ondertekenaar heeft handtekening ingetrokken |
document.signed | Ondertekende PDF gegenereerd |
signing_request.reminded | Herinneringsmails verstuurd naar openstaande ondertekenaars |
document.uploaded | Document geüpload via API |
member.invited | Teamlid uitgenodigd voor de organisatie |
Elke webhook-POST bevat deze velden:
{
"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"
}
}| Header | Value |
|---|---|
| Content-Type | application/json |
| X-Webhook-Signature | HMAC-SHA256 hex digest |
| X-Webhook-Event | event type (e.g. signer.signed) |
| X-Webhook-ID | webhook UUID |
| X-Webhook-Retry | attempt number (only on retries) |
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.
Zero-dependency TypeScript client voor Node.js ≥ 18. Dekt elk API-endpoint met volledige type-veiligheid en ingebouwde retry-logica.
npm install @builtsign/nodeTypeScript · Node.js ≥ 18 · Zero dependencies
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);| Resource | Methods |
|---|---|
| builtsign.documents | upload(), list() |
| builtsign.signingRequests | create(), list(), get(), send(), cancel(), addFields(), download(), remind(), reactivate(), embeddedUrl() |
| builtsign.templates | list(), create(), get(), update(), delete(), send() |
| builtsign.contacts | list(), create(), delete() |
| builtsign.webhooks | verify() |
| builtsign.events | list() |
| builtsign.bulk | send(), getJob() |
| builtsign.usage | get() |
Laat AI-assistenten documenten uploaden en ondertekentransacties versturen via het Model Context Protocol.
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.
# Build from source
cd packages/mcp-server
npm install && npm run build{
"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"
}
}
}
}| upload_document | lees een lokale PDF en upload hem |
| list_documents | |
| create_signing_request | concept aanmaken |
| create_and_send_signing_request | aanmaken en direct versturen |
| send_signing_request | bestaand concept versturen |
| get_signing_request | status opvragen |
| list_signing_requests | met statusfilter en cursor-paginatie |
| cancel_signing_request | |
| send_reminder | |
| list_templates | |
| send_from_template | rollen koppelen aan ondertekenaars |
| list_events | volledige audit trail met cursor-paginatie |
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.
Document getekend
Alle ondertekenaars voltooien het ondertekteningsverzoek. BuiltSign genereert de definitieve PDF en slaat die beveiligd op in S3.
Webhook verstuurd
BuiltSign stuurt direct een JSON-payload naar jouw endpoint, inclusief een presigned URL om het getekende PDF te downloaden (1 uur geldig).
Jouw AI verwerkt
Jouw pipeline downloadt de PDF en doet wat nodig is: data extraheren, archiveren, workflows starten. BuiltSign ziet de output nooit.
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
BYOAI wordt per organisatie ingesteld. Je geeft een HTTPS-endpoint op en genereert een signing secret.
Ga naar Instellingen → Ontwikkelaars → Bring Your Own AI
Voer je HTTPS-endpoint URL in en genereer een signing secret
Deploy je webhook-handler. Gebruik het signing secret om elk verzoek te verifiëren (zie code hieronder)
BuiltSign stuurt een POST-verzoek met deze JSON-body. De signed_pdf_url is een presigned S3-URL die 1 uur geldig is.
{
"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.
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);
});| Header | Value |
|---|---|
| Content-Type | application/json |
| X-BuiltSign-Signature | HMAC-SHA256 hex digest of raw body |
| X-BuiltSign-Event | document.signed |
Klaar om je AI te koppelen?
Stel je endpoint in via Instellingen. Klaar in minder dan 2 minuten.
Laat ondertekenaars documenten direct in jouw applicatie ondertekenen. Geen doorverwijzing naar builtsign.com.
Roep embeddedUrl() aan vanuit je backend met de allowed origin van je frontend. Geeft een kortlevende URL terug per ondertekenaar.
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;Installeer @builtsign/embed en geef de URL door aan BuiltSignEmbed. Die maakt een iframe, luistert naar postMessage-events en roept je callbacks aan.
npm install @builtsign/embedimport { 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();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.
Alle fouten bevatten een JSON-body met een detail-veld dat het probleem beschrijft.
| Code | Description |
|---|---|
400 | Ongeldig verzoek, ongeldige invoer of schending van een beperking |
401 | Niet geautoriseerd, ontbrekende of ongeldige API-sleutel |
403 | Verboden, onvoldoende rechten of planbeperking |
404 | Niet gevonden, bron bestaat niet of behoort tot een andere organisatie |
409 | Conflict, actie niet toegestaan in de huidige status |
422 | Onverwerkbaar, validatiefout (controleer velddetails) |
429 | Te veel verzoeken, limiet overschreden |
502 | Upstream-fout, S3 of e-mailprovider tijdelijk niet beschikbaar |