Intro
Eén REST API voor alles: workspaces en formulieren opvragen (incl. schema en analytics), formulierresponses ophalen (met antwoorden, score, koppeling aan datatable), datatabellen beheren (CRUD op rijen), e-mailhistorie en events. API-key authenticatie. Geschikt voor Zapier, Make, n8n en eigen apps.
Quick start
Stap 1: maak een API key
API-sleutel aanmaken: Ga in Feedback Analytics naar je workspace → Instellingen → sectie "API-sleutels" en klik op "Nieuwe sleutel". Bewaar de sleutel (begint met fa_); hij wordt maar één keer getoond.
Stuur de key mee via de header X-API-Key.
Stap 2: doe je eerste request
curl https://feedback-analytics.com/api/v1/workspaces \
-H "X-API-Key: YOUR_API_KEY"Stap 3: begrijp de response
Elke succes-response heeft hetzelfde envelope: data, meta, links, request_id.
{
"data": [
{
"id": "ws_123",
"name": "Main workspace",
"link": "my-workspace"
}
],
"meta": {},
"links": {},
"request_id": "req_abc123"
}Authenticatie
Stuur bij elk request de header X-API-Key met je API-sleutel. Sleutels beginnen met fa_. Je API-sleutel heeft toegang tot één of meerdere workspaces; je mag alleen resources van die workspaces opvragen.
Maak een API-sleutel aan in Workspace instellingen → API-sleutels (na inloggen). Bewaar je sleutel veilig en deel deze nooit in frontend-code of publieke repos.
curl "https://feedback-analytics.com/api/v1/workspaces" \
-H "X-API-Key: fa_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"Response format
Elke succes-response heeft exact vier top-level velden. Errors hebben error en request_id.
dataDe resource of lijst resources.
metaExtra metadata, o.a. paginering (limit, has_more).
linksNavigatie: self, next, prev (bij lijsten).
request_idUnieke id voor debugging en support.
{
"data": {},
"meta": {},
"links": {},
"request_id": "req_abc123"
}Foutcodes
Bij een fout retourneert de API JSON met error, message en optioneel details.
{
"error": {
"code": "resource_not_found",
"message": "Resource not found",
"status": 404
},
"request_id": "req_abc123"
}Error codes
| Code | HTTP | Wanneer |
|---|---|---|
| invalid_api_key | 401 | Ontbrekende of ongeldige API-key. |
| api_key_expired | 401 | Key ingetrokken of verlopen. |
| insufficient_scope | 403 | Key mist vereiste scope. |
| workspace_access_denied | 403 | Geen toegang tot deze workspace. |
| resource_not_found | 404 | Resource niet gevonden of geen toegang. |
| validation_error | 400 | Ongeldige body/query; zie details. |
| conflict | 409 | Bijv. dubbele unieke waarde. |
| idempotency_replay | 409 | Zelfde Idempotency-Key, andere body. |
| rate_limit_exceeded | 429 | Retry na Retry-After header. |
| internal_error | 500 | Serverfout; retry met backoff. |
Pagination
Cursor-based: gebruik limit (standaard 20, max 100) en cursor voor de volgende pagina. Gebruik links.next voor de volgende URL.
curl "https://feedback-analytics.com/api/v1/workspaces/WORKSPACE_ID/responses?limit=20&cursor=resp_123" \
-H "X-API-Key: YOUR_API_KEY"- • default limit = 20, max limit = 100
- • cursor-based; geen page/offset
- • meta.has_more geeft aan of er meer pagina's zijn
Filtering & sort
Query parameters per resource. Veelvoorkomend: form_id, created_after, created_before, score_gte, score_lte. Sort: sort=veld:richting (asc of desc).
curl "https://feedback-analytics.com/api/v1/workspaces/WORKSPACE_ID/responses?form_id=form_123&limit=20" \
-H "X-API-Key: YOUR_API_KEY"curl "https://feedback-analytics.com/api/v1/workspaces/WORKSPACE_ID/responses?created_after=2026-01-01&score_gte=8" \
-H "X-API-Key: YOUR_API_KEY"curl "https://feedback-analytics.com/api/v1/workspaces/WORKSPACE_ID/responses?sort=created_at:desc" \
-H "X-API-Key: YOUR_API_KEY"Resources
Alle endpoints zijn genest onder /api/v1/workspaces/{workspace_id}. Vervang workspace_id met de id uit GET /workspaces.
Waar vind ik workspace_id en table_id?
In de app gebruik je vaak de link van je workspace. De API gebruikt daarentegen de interne workspace_id en table_id (lange CUID-strings).
- • workspace_id: Haal de lijst op met GET /api/v1/workspaces; de response bevat voor elke workspace een id (en name, link). Gebruik die id als workspace_id in alle andere endpoints.
- • table_id of datatable_id: Na GET …/tables of …/datatables krijg je een lijst met id en name; gebruik de id in …/datatables/{datatable_id}/rows.
Workspaces
Workspaces die de API-key kan benaderen. Gebruik de id als workspace_id in alle andere endpoints.
/api/v1/workspacesLijst workspaces
/api/v1/workspaces/{workspace_id}Eén workspace ophalen
curl "https://feedback-analytics.com/api/v1/workspaces" -H "X-API-Key: YOUR_API_KEY"Forms
Je kunt de formulieren in een workspace opvragen (lijst en details), het formulierschema ophalen (vragen, types, opties, validatie; handig voor integraties) en een analytics-samenvatting (totaal responses, gemiddelde score, laatste response). Het schema-endpoint ondersteunt If-None-Match / ETag voor caching. Zie het overzicht hieronder en de OpenAPI-specificatie voor alle parameters.
/api/v1/workspaces/{workspace_id}/formsLijst formulieren
/api/v1/workspaces/{workspace_id}/forms/{form_id}Eén formulier, ?include=questions
/api/v1/workspaces/{workspace_id}/forms/{form_id}/schemaFormulierschema (ETag)
/api/v1/workspaces/{workspace_id}/forms/{form_id}/analytics/summaryAnalytics-samenvatting
Questions
Vragen horen bij een formulier. Alleen lezen in v1.
/api/v1/workspaces/{workspace_id}/forms/{form_id}/questionsLijst vragen
/api/v1/workspaces/{workspace_id}/forms/{form_id}/questions/{question_id}Eén vraag
Responses
Haal formulierresponses op: lijst met paginering, filter en sort, of één response op ID. Elke response bevat antwoorden, score, koppeling aan formulier en datatable (row_id). Wanneer iemand het formulier via een e-maillink heeft ingevuld, krijg je respondent_email en email_id. Met include_table_data=true krijg je de datatable-rij zoals die was op het moment van invullen. Ideaal voor rapportages, CRM-sync of eigen dashboards.
/api/v1/workspaces/{workspace_id}/responsesLijst responses (alle formulieren)
/api/v1/workspaces/{workspace_id}/responses/{response_id}Eén response
/api/v1/workspaces/{workspace_id}/forms/{form_id}/responsesLijst responses van één formulier
Veelgebruikte filters
form_id, created_after, created_before, score_gte, score_lte
curl "https://feedback-analytics.com/api/v1/workspaces/WORKSPACE_ID/responses?form_id=form_123&limit=20" \
-H "X-API-Key: YOUR_API_KEY"{
"data": [
{
"id": "resp_123",
"form_id": "form_123",
"score": 8,
"created_at": "2026-03-10T12:00:00Z",
"answers": [],
"respondent_email": null,
"row_id": null
}
],
"meta": { "limit": 20, "has_more": false },
"links": { "self": "...", "next": null, "prev": null },
"request_id": "req_abc123"
}Datatables
Beheer rijen in je datatabellen: lijst tabellen, velden ophalen, rijen lezen met filter en sort, één rij of meerdere rijen toevoegen/bijwerken (upsert op data.id), of verwijderen.
/api/v1/workspaces/{workspace_id}/datatablesLijst datatables
/api/v1/workspaces/{workspace_id}/datatables/{datatable_id}Eén datatable, ?include=fields
Rows (datatable-rijen)
CRUD op rijen binnen een datatable. Server wijst row_id toe bij POST. PATCH voor partiële update, DELETE voor verwijderen.
/api/v1/workspaces/{workspace_id}/datatables/{datatable_id}/rowsLijst rijen
/api/v1/workspaces/{workspace_id}/datatables/{datatable_id}/rows/{row_id}Eén rij
/api/v1/workspaces/{workspace_id}/datatables/{datatable_id}/rowsRij aanmaken
/api/v1/workspaces/{workspace_id}/datatables/{datatable_id}/rows/{row_id}Rij bijwerken
/api/v1/workspaces/{workspace_id}/datatables/{datatable_id}/rows/{row_id}Rij verwijderen (204)
curl -X POST "https://feedback-analytics.com/api/v1/workspaces/WORKSPACE_ID/datatables/DATATABLE_ID/rows" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"data": {"email": "jan@voorbeeld.nl", "naam": "Jan"}}'{
"data": {
"row_id": "row_abc",
"email": "jan@voorbeeld.nl",
"naam": "Jan",
"created_at": "2026-03-10T12:00:00Z",
"updated_at": "2026-03-10T12:00:00Z"
},
"meta": {},
"links": {},
"request_id": "req_abc123"
}Email events
Haal de historie van e-mail-events op: verzendingen, opens, clicks, bounces, etc. gekoppeld aan email_id, row_id, form_id en flow_id. Handig voor rapportages of sync met je CRM.
/api/v1/workspaces/{workspace_id}/email-eventsLijst e-mail events
/api/v1/workspaces/{workspace_id}/emails/{email_id}/eventsEvents voor één e-mail (convenience)
Filters: email_id, type, created_after, created_before, recipient
curl "https://feedback-analytics.com/api/v1/workspaces/WORKSPACE_ID/email-events?limit=20&sort=created_at:desc" \
-H "X-API-Key: YOUR_API_KEY"Webhook endpoints
Beheer webhook-URLs voor events. POST om aan te maken, DELETE om te verwijderen.
/api/v1/workspaces/{workspace_id}/webhook-endpointsLijst webhooks
/api/v1/workspaces/{workspace_id}/webhook-endpointsWebhook aanmaken
/api/v1/workspaces/{workspace_id}/webhook-endpoints/{endpoint_id}Eén webhook
/api/v1/workspaces/{workspace_id}/webhook-endpoints/{endpoint_id}Webhook verwijderen (204)
API keys
Lijst metadata van API-keys (geen secrets). POST om een key aan te maken; de secret wordt één keer getoond. DELETE om te revoken.
/api/v1/workspaces/{workspace_id}/api-keysLijst keys (metadata)
/api/v1/workspaces/{workspace_id}/api-keysKey aanmaken (secret 1x in response)
/api/v1/workspaces/{workspace_id}/api-keys/{key_id}Key revoken (204)
Rate limit
Er geldt een rate limit per API-key (ongeveer 60 requests per minuut). De response-headers X-RateLimit-Limit, X-RateLimit-Remaining en X-RateLimit-Reset geven je huidige gebruik weer.
Elke response bevat de headers X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (Unix seconden).
OpenAPI specification
De machine-readable OpenAPI 3.0-spec kun je gebruiken voor client generation, Postman/Insomnia import, tooling en SDK-generation.
OpenAPI spec (JSON)
GET https://feedback-analytics.com/api/v1/openapiGebruik in Postman of Insomnia de optie "Import" → "Link" en plak: /api/v1/openapi (met hetzelfde domein als deze pagina).
Deze documentatie volgt de implementatiespecificatie docs/API-ARCHITECTURE-DESIGN.md. Endpointmatrix: docs/API-ENDPOINT-MATRIX.md. Gap-analyse: docs/API-GAP-ANALYSIS.md. OpenAPI: GET /api/v1/openapi. Paginering: cursor + limit (standaard 20, max 100).