Shared behavior
Every/v1 endpoint follows the same rules, so what you learn on one endpoint applies to all of them. The API is read-only: every endpoint is a GET, and nothing is mutated. Feedback is ingested through your connected integrations, not this API.
Authentication
Send your key on every request as anX-API-Key header:
https://eu.api.closedloop.sh/v1). Create keys in Settings, API Keys in the app. See API keys for the full lifecycle.
Pagination
List endpoints acceptlimit and offset:
Responses wrap the page in
data and include a pagination object whose total is the full-set count of matching records, not the size of the page:
offset until you have read total records.
Filtering
Filters are query parameters, and multiple filters combine with AND semantics:- Free-text search: most list endpoints accept
q, a free-text search over titles and content. - Date ranges:
date_fromanddate_toare inclusive ISO 8601 dates. - Resource-specific filters: each endpoint documents its own. For example, insights filter by
category,severity, andcustomer_id; themes acceptstatusandsort; features accepttheme_id; context acceptstype.
/facets to discover which filter values exist in your dataset (categories, severities, sources) along with their counts.
Errors
Non-2xx responses return a JSON body with a user-safe message, a stable code, and an optional hint. Internal details are never exposed.Rate limits
Limits are enforced per API key, by plan:
Exceeding the limit returns
429 with X-RateLimit-* headers describing the window. Back off and retry after the window resets.
Timestamps
All timestamps are ISO 8601 in UTC, for example2026-05-14T10:30:00Z. Date filters (date_from, date_to) accept ISO 8601 dates and are inclusive on both ends.
Linking insights and context
Insight and context records carry the same resolvedcustomer_id, so you can line up an insight with the strategic context (churn, competitor, satisfaction) for the same customer. Filter either list by customer_id.
New to the API? Start with the API reference introduction.