Public REST API · v1 · GA

User Evaluation
has an API.

Your scripts can pull transcripts, kick off AI jobs, and subscribe to events using the same endpoints the app uses. Available on Basic, Standard, and Plus.

curl · /v1/me
curl https://api.userevaluation.com/v1/me \
  -H "Authorization: Bearer ue_live_..."

# {
#   "data": {
#     "id":    "65f8...",
#     "email": "researcher@acme.com",
#     "plan":  "Plus Monthly"
#   }
# }

What ships in v1

Auth, rate limits,
signed webhooks, audit log.

Pick the integration. The plumbing is already there.

Bearer auth, hashed at rest

Generate keys in Settings. We store only the SHA-256 hash. A leaked key is revocable; the secret itself can't be recovered.

Per-tier rate limits

60 requests per minute on Basic, 300 on Standard, 1000 on Plus. X-RateLimit-* headers on every response. Sustained abuse auto-revokes the key.

Signed webhooks

HMAC-SHA256 with a per-subscription secret. Five retries with exponential backoff. The subscription auto-disables after 24 hours of failures.

OpenAPI 3.1 spec

Drop /v1/openapi.json into Postman or any OpenAPI codegen. TypeScript and Python clients are also published.

SDKs

TypeScript and Python clients.

Pick the language. The REST endpoints return the same JSON if you’d rather skip the SDK.

@userevaluation/api

npm
installbash
npm install @userevaluation/api
example.tsts
import { UE } from "@userevaluation/api";

const ue = new UE({ apiKey: process.env.UE_API_KEY! });

const me = await ue.me.get();
const { segments } = await ue.files.transcript(fileId);

userevaluation

PyPI
installbash
pip install userevaluation
example.pypy
from userevaluation import UE

with UE() as ue:                    # reads UE_API_KEY
    me = ue.me()
    transcript = ue.get_transcript(file_id)

Signed webhooks

Subscribe instead of polling.

Ten event types cover the work the app does on your behalf: project changes, test publication, response submission, transcription, chat completion, engage sessions. Each delivery carries an HMAC-SHA256 signature you verify against the secret you saved at create time.

  • Five retries with exponential backoff before auto-disable
  • 30-day delivery log on /v1/webhooks/:id/deliveries
  • X-UE-Event-Id for client-side dedupe
webhook.ts · subscribe + verifyts
// 1. Subscribe once
await ue.webhooks.create({
  url: "https://your-app.example.com/hooks/ue",
  events: ["test.response.submitted", "engage.session.completed"]
});

// 2. Verify in your handler
import crypto from "node:crypto";
function verify(req, secret) {
  const m = /t=(\d+),\s*v1=([0-9a-f]+)/.exec(req.headers["x-ue-signature"]);
  if (!m) return false;
  const expected = crypto.createHmac("sha256", secret)
    .update(`${m[1]}.${req.rawBody}`).digest("hex");
  return crypto.timingSafeEqual(Buffer.from(m[2], "hex"), Buffer.from(expected, "hex"));
}

What people build

Concrete things teams use the API for.

Sync to your data warehouse

Pull transcripts and tags into Snowflake or BigQuery. Run SQL across studies that the in-app chat doesn't expose.

Ground your own agents in research

Feed your in-house agent real transcripts and demographics. Tags and citations come back as plain JSON.

Bridges to Slack, Linear, your CRM

Subscribe to test.response.submitted or engage.session.completed and forward results to whatever channel your team lives in.

Run AI work from CI

POST a transcription or sentiment job from a release pipeline. Poll /v1/jobs/:id until status is succeeded.

Internal dashboards

Hit /v1/usage from Looker, Streamlit, or Retool. Totals, error breakdowns, and the last 50 calls come back as one JSON payload.

Recruit from your own CRM

POST an invitation to /v1/engage/tests/:id/invitations from a script. The pool stays in your control; we handle the email and tracking.

The endpoints, in one place

Every primitive you can read or write from /v1.

GET /me · GET /workspace
GET POST PATCH DELETE /projects
GET /tests/:id · GET /tests/:id/responses
GET /files/:id · GET /files/:id/transcript
POST /uploads · POST /projects/:id/files
GET POST /projects/:id/{notes,cards,lanes,tags,clips}
POST /projects/:id/chat · GET /projects/:id/chat/:thread
POST /projects/:id/{reports,auto-tag,sentiment}
POST /files/:id/transcribe · GET /jobs/:id
GET POST /engage/tests · POST /engage/tests/:id/publish
POST /engage/tests/:id/invitations
GET POST DELETE /webhooks · GET /webhooks/:id/deliveries
GET /usage

Get an API key.
Ship the integration.

Generate a key from Settings. The quickstart gets you to your first successful request in five minutes.