API Referentie
Integreer FeedBackNL met je eigen applicatie via onze REST API. Alle endpoints, authenticatie en codevoorbeelden op één plek.
Authenticatie
Alle API-aanroepen vereisen een Bearer token. Genereer je API-sleutel in het dashboard onder Instellingen → API-toegang.
Voeg de header Authorization: Bearer fb_live_4k9x2m7p1q8w3n5v toe aan elke request. Testomgevingen gebruiken het prefix fb_test_. Sleutels zijn per account gekoppeld en kunnen per project worden ingeperkt. Verwijder een sleutel direct in het dashboard; de oude token vervalt binnen 30 seconden.
Live-omgeving
https://api.feedbacknl.com/v1
Token-formaat: fb_live_<32 karakters>
Rate limit: 600 requests per minuut per account.
Test-omgeving
https://api.sandbox.feedbacknl.com/v1
Token-formaat: fb_test_<32 karakters>
Rate limit: 120 requests per minuut. Data wordt na 7 dagen automatisch verwijderd.
Endpoints
De API omvat drie kernfuncties: feedback ophalen, labels beheren en webhooks configureren. Alle responses zijn JSON.
GET /feedback
Haal een lijst op van ontvangen feedbackitems. Ondersteunt paginate via ?page=<n>&limit=<n> (max 100 per pagina).
Query parameters:
status — new, reviewed, resolved (optioneel)
label_id — filter op label (optioneel)
since — ISO 8601 datum, bv. 2025-01-15T08:00:00Z (optioneel)
Response (200):
{ "data": [ { "id": "fb_8x2k9m", "message": "Betaalpagina laadt te lang bij iDeal", "rating": 2, "source": "widget", "label_ids": ["lbl_slow_checkout"], "created_at": "2025-03-12T14:22:07Z", "shop_domain": "modehaus-amsterdam.nl" } ], "meta": { "page": 1, "total": 147, "limit": 25 } }
GET /feedback/{id}
Haal een enkel feedbackitem op met volledige metadata inclusief browser-info, sessie-ID en bijgevoegde screenshots.
Response (200):
{ "id": "fb_8x2k9m", "message": "Betaalpagina laadt te lang bij iDeal", "rating": 2, "source": "widget", "label_ids": ["lbl_slow_checkout"], "shop_domain": "modehaus-amsterdam.nl", "browser": "Chrome 133.0.6943.5", "os": "macOS 15.3", "session_id": "sess_4m2x9k7p", "screenshots": ["https://cdn.feedbacknl.com/screenshots/fb_8x2k9m_1.png"], "created_at": "2025-03-12T14:22:07Z", "updated_at": "2025-03-12T14:22:07Z" }
POST /labels
Maak een nieuw label aan voor het categoriseren van feedback. Labels worden gebruikt voor filtering en rapportages.
Body (JSON):
{ "name": "Betaling & Checkout", "color": "#E53E3E", "auto_rule": { "field": "rating", "operator": "lte", "value": 2 } }
Response (201):
{ "id": "lbl_payment_issues", "name": "Betaling & Checkout", "color": "#E53E3E", "auto_rule": { "field": "rating", "operator": "lte", "value": 2 }, "created_at": "2025-03-12T15:01:33Z" }
PUT /labels/{id}
Werk de naam, kleur of automatische regel van een bestaand label bij. Alleen velden die worden doorgegeven worden aangepast.
Body (JSON):
{ "name": "Checkout-problemen", "color": "#DD6B20" }
Response (200):
{ "id": "lbl_payment_issues", "name": "Checkout-problemen", "color": "#DD6B20", "auto_rule": { "field": "rating", "operator": "lte", "value": 2 }, "created_at": "2025-03-12T15:01:33Z", "updated_at": "2025-03-12T16:44:11Z" }
DELETE /labels/{id}
Verwijder een label. Feedbackitems behouden hun verwijzing; het label verschijnt als null in queries. Dit kan niet ongedaan worden gemaakt.
Response (204): Geen inhoud.
POST /webhooks
Registreer een webhook-URL die wordt aangeroepen bij nieuwe feedback, label-wijzigingen of statusupdates.
Body (JSON):
{ "url": "https://hooks.mijndomein.nl/feedbacknl", "events": ["feedback.created", "label.updated"], "secret": "whsec_r8k2m9x4p7q1" }
Response (201):
{ "id": "wh_3k7m2x", "url": "https://hooks.mijndomein.nl/feedbacknl", "events": ["feedback.created", "label.updated"], "active": true, "created_at": "2025-03-12T16:10:45Z" }
Elke webhook-payload bevat de header X-FeedbackNL-Signature met een HMAC-SHA256 handtekening gegenereerd met je webhook secret.
Codevoorbeelden
Praktische voorbeelden in cURL, Node.js en Python om snel te starten met de FeedBackNL API.
cURL — Feedback ophalen
curl -X GET "https://api.feedbacknl.com/v1/feedback?status=new&limit=10" \ -H "Authorization: Bearer fb_live_4k9x2m7p1q8w3n5v" \ -H "Content-Type: application/json"
Node.js — Label aanmaken
const response = await fetch('https://api.feedbacknl.com/v1/labels', { method: 'POST', headers: { 'Authorization': 'Bearer fb_live_4k9x2m7p1q8w3n5v', 'Content-Type': 'application/json' }, body: JSON.stringify({ name: 'Voorraadproblemen', color: '#38A169', auto_rule: { field: 'rating', operator: 'lte', value: 2 } }) }); const label = await response.json(); console.log(label.id); // "lbl_stock_issues"
Python — Webhook registreren
import requests headers = { "Authorization": "Bearer fb_live_4k9x2m7p1q8w3n5v", "Content-Type": "application/json" } payload = { "url": "https://hooks.mijndomein.nl/feedbacknl", "events": ["feedback.created", "feedback.resolved"], "secret": "whsec_r8k2m9x4p7q1" } response = requests.post( "https://api.feedbacknl.com/v1/webhooks", headers=headers, json=payload ) print(response.json()) # {"id": "wh_3k7m2x", ...}
Webhook payload verifiëren (Node.js)
const crypto = require('crypto'); function verifyWebhook(payload, signature, secret) { const expected = crypto .createHmac('sha256', secret) .update(payload, 'utf8') .digest('hex'); return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from('sha256=' + expected) ); } // In je Express route: app.post('/feedbacknl', (req, res) => { const sig = req.headers['x-feedbacknl-signature']; if (!verifyWebhook(JSON.stringify(req.body), sig, 'whsec_r8k2m9x4p7q1')) { return res.status(401).send('Invalid signature'); } console.log('Nieuw feedbackitem:', req.body.data.message); res.status(200).send('OK'); });
Foutcodes
De API gebruikt standaard HTTP-statuscodes. Hieronder de meest voorkomende fouten en hoe je ze oplost.
401 Unauthorized
Je API-token is ongeldig, verlopen of niet opgenomen in de Authorization-header. Controleer of je fb_live_ of fb_test_ prefix correct gebruikt.
403 Forbidden
Je account heeft geen toestemming voor deze actie. Dit gebeurt wanneer je een test-token gebruikt op de live-omgeving of omgekeerd.
422 Unprocessable Entity
De request-body is ongeldig. De response bevat een errors array met veldspecifieke beschrijvingen, bv. { "errors": [{ "field": "name", "message": "Labelnaam is verplicht en max 64 karakters" }] }.
429 Too Many Requests
Je hebt de rate limit bereikt. Wacht tot de volgende minuut of implementeer exponential backoff. De header X-RateLimit-Remaining geeft het resterende aantal requests aan.
Support & SDK's
Officiële SDK's zijn beschikbaar voor Node.js (@feedbacknl/api), Python (feedbacknl) en PHP (feedbacknl/api-sdk). Alle SDK's zijn open source op GitHub onder github.com/feedbacknl.
Voor technische vragen: api@feedbacknl.com of het developerforum op developers.feedbacknl.com. Reactietijd is doorgaans binnen 4 uur op werkdagen.