Intro
One REST API for everything: fetch workspaces and forms (including schema and analytics), get form responses (with answers, score, datatable link), manage datatables (CRUD on rows), email history and events. API key authentication. Suitable for Zapier, Make, n8n and your own apps.
Quick start
Stap 1: maak een API key
Create API key: In Feedback Analytics go to your workspace → Settings → "API keys" section and click "New key". Save the key (starts with fa_); it is only shown once.
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"
}Authentication
Send the X-API-Key header with your API key with every request. Keys start with fa_. Your API key has access to one or more workspaces; you may only request resources from those workspaces.
Create an API key in Workspace settings → API keys (after login). Keep your key safe and never share it in frontend code or public 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"
}Error codes
On error the API returns JSON with error, message and optionally 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.
Where do I find workspace_id and table_id?
In the app you often use the workspace link. The API uses the internal workspace_id and table_id (long CUID strings) instead.
- • workspace_id: Fetch the list with GET /api/v1/workspaces; the response contains an id (and name, link) for each workspace. Use that id as workspace_id in all other endpoints.
- • table_id or datatable_id: After GET …/tables or …/datatables you get a list with id and name; use the 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
You can fetch forms in a workspace (list and details), get the form schema (questions, types, options, validation; useful for integrations) and an analytics summary (total responses, average score, last response). The schema endpoint supports If-None-Match / ETag for caching. See the overview below and the OpenAPI specification for all 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
Fetch form responses: list with pagination, filter and sort, or a single response by ID. Each response includes answers, score, link to form and datatable (row_id). When someone filled the form via an email link, you get respondent_email and email_id. With include_table_data=true you get the datatable row as it was at submit time. Ideal for reporting, CRM sync or your own 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
Manage rows in your datatables: list tables, fetch fields, read rows with filter and sort, add or update one or more rows (upsert on data.id), or delete.
/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
Fetch email event history: sends, opens, clicks, bounces, etc. linked to email_id, row_id, form_id and flow_id. Useful for reporting or CRM sync.
/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
There is a rate limit per API key (about 60 requests per minute). The response headers X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset show your current usage.
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/openapiIn Postman or Insomnia use "Import" → "Link" and paste: /api/v1/openapi (with the same domain as this page).
This documentation follows the implementation spec docs/API-ARCHITECTURE-DESIGN.md. Endpoint matrix: docs/API-ENDPOINT-MATRIX.md. Gap analysis: docs/API-GAP-ANALYSIS.md. OpenAPI: GET /api/v1/openapi. Pagination: cursor + limit (default 20, max 100).