Integration
Field continuously over one signed contract
Teams that field every week should not be emailing specifications. The API covers feasibility, launch, live quota state and completion callbacks, using the same signed-callback protocol we run internally between our own panel and our supply partners. One integration, one signature scheme, one set of status values.

The whole surface
| Call | Called by | Returns |
|---|---|---|
POST /feasibility | Your system | Expected incidence range, price per complete, earliest full-n date |
POST /studies | Your system | Study id and the entry link template to send respondents to |
GET /studies/{id}/quota | Your system | Per-cell filled and remaining counts, refreshed live |
GET /callback | Ours, into yours | Terminal status for one respondent, signed |
POST /studies/{id}/close | Your system | Final counts and the rejection log |
Status values, and why there are only four
Every terminal outcome maps to one of four values: complete, screenout, quotafull, security. Providers who expose a dozen states usually do it because their internal systems disagree with each other, and the ambiguity always ends up being settled in the provider’s favour. Four states can be reconciled line by line against your own counts.
Callback signing
Callbacks are public GET requests. Without a signature, anyone who guesses a session id can credit themselves a complete. Ours are signed with HMAC-SHA256 over a fixed field order, compared in constant time, and settled exactly once per session even if both the browser redirect and the server-to-server postback arrive.
A failed signature returns a bare invalid with no explanation of what was wrong. Telling a forger which field failed is telling them how to succeed.
Before you integrate
Sandbox credentials are issued before any commercial discussion, and the sandbox returns the same four statuses with the same signature scheme against generated sessions. Most integrations that break in production break because they were tested only against the happy path, so the sandbox lets you force each terminal status on demand.