Skip to main content
v1 gets additive changes only — new endpoints and new response fields, never a removal or a rename. Treat unknown fields as forward compatibility rather than an error.

Not available yet

Stated plainly so you don’t design around something that isn’t there.
No outbound event delivery. Poll GET /v1/submissions?status=evaluated&since=…, or poll a submission’s report until evaluated is true. Every 30–60 seconds is plenty.
The header is accepted and ignored, so a retried POST can create a duplicate — retrying a timed-out invitation may invite the candidate twice. Guard retries on your side: record the invitation id you got back, and check before retrying.
?format=pdf returns 400. JSON only for now.
GET /v1/members reads the roster, but there’s no endpoint to invite a teammate. Invite from the dashboard.
No endpoint to re-grade a submission. Contact us if you need one re-run.
No sort parameter. Listings are newest-first; cursor pagination depends on that ordering. Filter server-side, sort client-side.
REST only. The OpenAPI spec works with standard generators in the meantime.
No CORS headers, so the API can’t be called directly from a browser. It’s designed for server-to-server use — which is also the right place for a key that can read candidate reports.

Changes

August 2026 — first public release

The full hiring loop: challenges, assessments, invitations, submissions, reports, events, members and account. Also in this release:
  • Test mode. sk_test_ keys served from a deterministic sandbox, with documented inputs for reproducing 404 and 402. See Test mode.
  • Key expiry and rotation. Keys can expire after 30, 90 or 365 days; an expired key behaves exactly like a revoked one.
  • Retry-After on 429, plus X-RateLimit-* and X-Request-Id on every response.
  • OpenAPI 3.1 spec at /api/v1/openapi.json, generated from the code that serves the API.
Two notes for anyone who integrated against a pre-release build:
final_score is gone from the submission resource. It was the pre-v0.4 composite, superseded by ship_score on the report. Shipping both put two different numbers for “how did they do” in one contract with nothing to reconcile them. Read ship_score from GET /v1/submissions/{id}/report.
A malformed id now returns 404 rather than 500. Previously a non-UUID id reached the database and surfaced as a server error. It’s now indistinguishable from an unknown id, which is also what tenant isolation requires.