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;

← Biskaje