Skip to main content

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/json with 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:

ParameterMeaning
limit1 to 100, default 20
cursorThe nextCursor from the previous page
qA 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_…"
}
}
CodeStatusMeaning
bad_request400The request is invalid. details lists each problem as { path, message }.
unauthorized401No key, or the key isn't valid.
payment_required402A 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.
forbidden403The key or role isn't allowed to do this.
not_found404It doesn't exist, or isn't in your workspace.
conflict409The state changed, for example the launch total is different from the one you sent.
rate_limited429Too many requests, or the workspace's calls for this month are used up.
unavailable503A feature isn't available right now.
internal500Something 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 pathWhat it does
GET /api/studiesList studies
POST /api/studiesCreate a study
GET /api/studies/:idGet a study, with its guide, screener and settings
PATCH /api/studies/:idUpdate a draft
POST /api/studies/:id/duplicateCopy a study
GET /api/studies/:id/estimateWhat launching would cost
POST /api/studies/:id/publishLaunch: send { "approve": true, "expectedTotalCents": … }
POST /api/studies/:id/pause, /resumePause or resume
POST /api/studies/:id/endEnd a running or paused study early (the launch closes with what was done; nothing is refunded)
GET /api/studies/:id/statsProgress numbers
GET /api/studies/:id/sessionsList sessions
GET /api/studies/:id/sessions/:sessionIdA session with its transcript
GET /api/studies/:id/participantsList participants

Study reports, clips and boards​

Method and pathWhat it does
GET /api/studies/:studyId/readoutThe study report: themes, claims and their clips
POST /api/studies/:studyId/readout/generateGenerate or regenerate the study report
POST /api/studies/:studyId/readout/exportsExport (PowerPoint, PDF, Word, Markdown, CSV)
GET /api/clipsList clips
POST /api/clipsMake a clip from a session or a file
GET /api/studies/:studyId/boardsList a study's boards
GET /api/boards/:id/export.csvA board as CSV

Reports​

Method and pathWhat it does
GET /api/reportsList reports
POST /api/reportsCreate a report from studies and a template
GET /api/reports/:idGet a report
POST /api/reports/:id/exportsExport a report

Library​

Method and pathWhat it does
GET /api/library/projectsList projects
GET /api/library/filesList files
GET /api/library/files/:idA file with its transcript
GET /api/library/files/:id/downloadA short-lived download link
POST /api/library/uploadsStart an upload: returns a URL to PUT the file to
POST /api/library/files/:id/completeFinish an upload so processing starts

Eva​

Method and pathWhat it does
POST /api/eva/askAsk Eva a question
GET /api/eva/threadsList chats
GET /api/searchSearch the workspace

Billing​

Method and pathWhat it does
GET /api/billing/pricesCurrent plan and interview prices (no key needed)
GET /api/billing/usageThis month's usage against your plan

Uploading a file​

  1. POST /api/library/uploads with name, sizeBytes and contentType (and optionally projectId and the spoken language, or "auto"). The response tells you where to PUT the file, with any headers to send.
  2. PUT the file's bytes to that URL with those headers.
  3. POST /api/library/files/:id/complete. The file is then processed and transcribed; listen for the file.ready webhook, or poll GET /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/estimate and pass the total as expectedTotalCents; if the price has changed you get 409 and nothing is charged. With no saved card, the response has a checkoutUrl to 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.