Public REST API · v1 · GA
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 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
Pick the integration. The plumbing is already there.
Generate keys in Settings. We store only the SHA-256 hash. A leaked key is revocable; the secret itself can't be recovered.
60 requests per minute on Basic, 300 on Standard, 1000 on Plus. X-RateLimit-* headers on every response. Sustained abuse auto-revokes the key.
HMAC-SHA256 with a per-subscription secret. Five retries with exponential backoff. The subscription auto-disables after 24 hours of failures.
Drop /v1/openapi.json into Postman or any OpenAPI codegen. TypeScript and Python clients are also published.
SDKs
Pick the language. The REST endpoints return the same JSON if you’d rather skip the SDK.
npm install @userevaluation/apiimport { 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);pip install userevaluationfrom userevaluation import UE
with UE() as ue: # reads UE_API_KEY
me = ue.me()
transcript = ue.get_transcript(file_id)Signed webhooks
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.
// 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
Pull transcripts and tags into Snowflake or BigQuery. Run SQL across studies that the in-app chat doesn't expose.
Feed your in-house agent real transcripts and demographics. Tags and citations come back as plain JSON.
Subscribe to test.response.submitted or engage.session.completed and forward results to whatever channel your team lives in.
POST a transcription or sentiment job from a release pipeline. Poll /v1/jobs/:id until status is succeeded.
Hit /v1/usage from Looker, Streamlit, or Retool. Totals, error breakdowns, and the last 50 calls come back as one JSON payload.
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
Generate a key from Settings. The quickstart gets you to your first successful request in five minutes.