- Use the API key, not the read or write key. In newer projects a read request made with the read key returns 403, and a Users API request made with the write key returns 403 too. Your browser snippet keeps using the write key; leave it as it is.
- A 404
Project not foundmeans the project ID. Both bases look the project up before they check the key, so a wrong project ID answers 404 whichever key you send. A wrong key on the right project answers403 Forbiddenon both bases. - One key, two bases. Survey reads live under
/api/v3; the users operations live under/apiwith no version. The plugin picks the base for each call. - Two calls page by cursor.
responses.listandresponses.listForSurveyreturn at most 20 rows unless you passpageSize(up to 100). Readpage.nextPageCursorand pass it back aspageCursor; when it is absent there are no more pages. - The default date range is 30 days. Both response listings only return the last month unless you pass
startDate, so older responses need an explicit range. - A tracked event is not readable back.
users.trackreturns 204 and the event is stored, but the users API never exposes it: theeventslist inusers.listholds survey activity (such as a filled response), not tracked events, and a track with no event name is rejected with400 Event not specified. Treat the 204 as acceptance, not as proof the event reached targeting. Survey targeting on events is configured in the dashboard. - Writes are not retried.
users.trackcounts the event every time it arrives andusers.upsertre-applies traits, so a failed write is reported rather than replayed: the write may have landed. Reads are replayed on a 500 or a dropped connection. users.removeis irreversible. It takes the internalidfromusers.list, not theuserIdyou sent, and deleting a user does not delete their responses: it anonymises them.- Personal data. Responses carry the answering user’s email, traits and IP address. The plugin stores none of it locally;
referreris returned because the API returns it, but it is never written to the event log, since a URL can carry a token. - No webhooks. SatisMeter does not send them.
- 10 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
List a project’s surveysWhat’s next
API reference
Every
satismeter.api.* operation with input and output types.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.