Skip to main content
Use SatisMeter through Corsair: one client, typed API calls. Create an API key in SatisMeter under Settings > Integrations > API. That page also shows the Project ID, and the Survey Keys section lists each survey’s ID. The plugin needs both: no API endpoint lists projects, so the project ID has to come from the dashboard. Things to know before you call:
  • 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 found means 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 answers 403 Forbidden on both bases.
  • One key, two bases. Survey reads live under /api/v3; the users operations live under /api with no version. The plugin picks the base for each call.
  • Two calls page by cursor. responses.list and responses.listForSurvey return at most 20 rows unless you pass pageSize (up to 100). Read page.nextPageCursor and pass it back as pageCursor; 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.track returns 204 and the event is stored, but the users API never exposes it: the events list in users.list holds survey activity (such as a filled response), not tracked events, and a track with no event name is rejected with 400 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.track counts the event every time it arrives and users.upsert re-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.remove is irreversible. It takes the internal id from users.list, not the userId you 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; referrer is 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.
What you get:
  • 10 typed API operations

Setup

1

Install

2

Add the plugin

corsair.ts
With multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.
3

Choose authentication

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 surveys
Record an event for survey targeting
See the full list on the API page.

What’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.