Biskaje API
Alleen-lezende API voor leads, offertes en facturen van je eigen organisatie. Beschikbaar in het Business-pakket.
Authenticatie
Stuur je sleutel mee in de header Authorization: Bearer. Maak sleutels aan onder Instellingen, Integraties.
curl -H "Authorization: Bearer bsk_live_..." \
"https://app.biskaje.com/api/public/v1/invoices?page=1&per_page=25"Endpoints
- GET /api/public/v1/leads
- GET /api/public/v1/quotes
- GET /api/public/v1/invoices
Paginering met page (vanaf 1) en per_page (maximaal 100, standaard 25). Het antwoord bevat total en has_more.
Limiet: 60 verzoeken per minuut per sleutel. Daarboven volgt status 429 met Retry-After.
const r = await fetch("https://app.biskaje.com/api/public/v1/leads?per_page=50", {
headers: { Authorization: "Bearer " + process.env.BISKAJE_KEY },
});
const { data, has_more } = await r.json();{ "data": [ ... ], "page": 1, "per_page": 25, "total": 42, "has_more": true }Foutcodes
- 401 unauthorized
- 403 plan_required
- 404 not_found
- 429 rate_limited
- 500 server_error
{ "error": { "code": "rate_limited", "message": "Limit is 60 requests per minute." } }Webhook handtekening controleren
Elk bericht heeft een unieke id, een tijdstempel en de header Biskaje-Signature: t=<tijd>,v1=<hmac>. Bereken HMAC-SHA256 over '<tijd>.<body>' met je geheim en vergelijk. Weiger berichten ouder dan 5 minuten en verwerk elke id maar één keer.
import crypto from "node:crypto";
const [t, v1] = header.split(",").map((p) => p.split("=")[1]);
const expected = crypto.createHmac("sha256", secret).update(t + "." + rawBody).digest("hex");
const valid = crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(expected))
&& Math.abs(Date.now() / 1000 - Number(t)) < 300;