The API
Everything the app does goes through the same JSON API, and your code can use it with an API key: list studies, read study reports and transcripts, pull clips, upload files, ask Eva.
Base URL and authentication
https://api.userevaluation.com
Every path starts with /api/. Send your key as a bearer token:
curl https://api.userevaluation.com/api/studies \
-H "Authorization: Bearer ue_live_…"
A key acts as the person who created it, with their workspace role (up to Member rights). Requests other than GET need a key that can write; a read-only key gets 403 with "This API key is read-only". The one exception is POST /api/eva/ask: a read-only key can ask Eva, and Eva can't change anything for it.
The API comes with the Pro, Team and Scale plans. On Free you can't create a key, and keys made on a paid plan get 402 until you upgrade again.
Conventions
- Requests and responses are JSON. Send
Content-Type: application/jsonwith a body. - Times are ISO 8601 strings in UTC, for example
2026-10-07T09:30:00.000Z. - IDs are opaque strings with a short prefix.
Pagination
List endpoints are cursor-based. Query parameters:
| Parameter | Meaning |
|---|---|
limit | 1 to 100, default 20 |
cursor | The nextCursor from the previous page |
q | A search term, where supported |
Responses look like:
{ "items": [ … ], "nextCursor": "…", "total": 42 }
nextCursor is null on the last page. total isn't always present.
Errors
Errors use the HTTP status and a JSON body:
{
"error": {
"code": "not_found",
"message": "Study not found",
"requestId": "req_…"
}
}
| Code | Status | Meaning |
|---|---|---|
bad_request | 400 | The request is invalid. details lists each problem as { path, message }. |
unauthorized | 401 | No key, or the key isn't valid. |
payment_required | 402 | A plan limit was reached, for example upload hours, a feature your plan doesn't include (Steer Eva needs Team), or the workspace is on Free (no API). Starting a Swarm run past the month's included runs answers 402 with the $2 price until you send acceptExtraCharge: true. |
forbidden | 403 | The key or role isn't allowed to do this. |
not_found | 404 | It doesn't exist, or isn't in your workspace. |
conflict | 409 | The state changed, for example the launch total is different from the one you sent. |
rate_limited | 429 | Too many requests, or the workspace's calls for this month are used up. |
unavailable | 503 | A feature isn't available right now. |
internal | 500 | Something went wrong on our side. Quote the requestId if you contact us. |
Rate limits
Up to 600 requests a minute per API key. Above that you get 429 with "Too many requests. Try again in a minute." Back off and retry.
Each workspace also has monthly calls, shared by the API and MCP: 10,000 a month on Pro and Team, 100,000 on Scale. Past them, calls get 429 until the 1st of next month (UTC); details.resetsAt says when. See the Usage chart in Settings → API & MCP.
Main endpoints
Studies
| Method and path | What it does |
|---|---|
GET /api/studies | List studies |
POST /api/studies | Create a study |
GET /api/studies/:id | Get a study, with its guide, screener and settings |
PATCH /api/studies/:id | Update a draft |
POST /api/studies/:id/duplicate | Copy a study |
GET /api/studies/:id/estimate | What launching would cost |
POST /api/studies/:id/publish | Launch: send { "approve": true, "expectedTotalCents": … } |
POST /api/studies/:id/pause, /resume | Pause or resume |
POST /api/studies/:id/end | End a running or paused study early (the launch closes with what was done; nothing is refunded) |
GET /api/studies/:id/stats | Progress numbers |
GET /api/studies/:id/sessions | List sessions |
GET /api/studies/:id/sessions/:sessionId | A session with its transcript |
GET /api/studies/:id/participants | List participants |
Study reports, clips and boards
| Method and path | What it does |
|---|---|
GET /api/studies/:studyId/readout | The study report: themes, claims and their clips |
POST /api/studies/:studyId/readout/generate | Generate or regenerate the study report |
POST /api/studies/:studyId/readout/exports | Export (PowerPoint, PDF, Word, Markdown, CSV) |
GET /api/clips | List clips |
POST /api/clips | Make a clip from a session or a file |
GET /api/studies/:studyId/boards | List a study's boards |
GET /api/boards/:id/export.csv | A board as CSV |
Reports
| Method and path | What it does |
|---|---|
GET /api/reports | List reports |
POST /api/reports | Create a report from studies and a template |
GET /api/reports/:id | Get a report |
POST /api/reports/:id/exports | Export a report |
Library
| Method and path | What it does |
|---|---|
GET /api/library/projects | List projects |
GET /api/library/files | List files |
GET /api/library/files/:id | A file with its transcript |
GET /api/library/files/:id/download | A short-lived download link |
POST /api/library/uploads | Start an upload: returns a URL to PUT the file to |
POST /api/library/files/:id/complete | Finish an upload so processing starts |
Eva
| Method and path | What it does |
|---|---|
POST /api/eva/ask | Ask Eva a question |
GET /api/eva/threads | List chats |
GET /api/search | Search the workspace |
Billing
| Method and path | What it does |
|---|---|
GET /api/billing/prices | Current plan and interview prices (no key needed) |
GET /api/billing/usage | This month's usage against your plan |
Uploading a file
POST /api/library/uploadswithname,sizeBytesandcontentType(and optionallyprojectIdand the spokenlanguage, or"auto"). The response tells you where toPUTthe file, with any headers to send.PUTthe file's bytes to that URL with those headers.POST /api/library/files/:id/complete. The file is then processed and transcribed; listen for thefile.readywebhook, or pollGET /api/library/files/:id.
Good to know
- Launching a study through the API charges your saved card, just like in the app. Check the cost first with
GET /api/studies/:id/estimateand pass the total asexpectedTotalCents; if the price has changed you get409and nothing is charged. With no saved card, the response has acheckoutUrlto pay at, and the study launches once the payment goes through. - Use webhooks rather than polling to hear about new sessions and study reports.
- Zapier, Make and n8n can call these endpoints with an API key and listen for webhooks.