> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dotportion.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Changes to the public API, and what is not available yet.

`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.

<AccordionGroup>
  <Accordion title="Webhooks" icon="webhook">
    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.
  </Accordion>

  <Accordion title="Idempotency-Key" icon="rotate">
    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.
  </Accordion>

  <Accordion title="PDF reports" icon="file-pdf">
    `?format=pdf` returns `400`. JSON only for now.
  </Accordion>

  <Accordion title="Inviting team members" icon="user-plus">
    `GET /v1/members` reads the roster, but there's no endpoint to invite a teammate.
    Invite from the dashboard.
  </Accordion>

  <Accordion title="Re-running an evaluation" icon="arrows-rotate">
    No endpoint to re-grade a submission. Contact us if you need one re-run.
  </Accordion>

  <Accordion title="Sorting" icon="arrow-down-a-z">
    No `sort` parameter. Listings are newest-first; cursor pagination depends on that
    ordering. Filter server-side, sort client-side.
  </Accordion>

  <Accordion title="SDKs" icon="cube">
    REST only. The [OpenAPI spec](https://app.dotportion.com/api/v1/openapi.json) works with
    standard generators in the meantime.
  </Accordion>

  <Accordion title="Browser calls (CORS)" icon="globe">
    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.
  </Accordion>
</AccordionGroup>

## 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](/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`](https://app.dotportion.com/api/v1/openapi.json), generated from
  the code that serves the API.

Two notes for anyone who integrated against a pre-release build:

<Warning>
  **`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`.
</Warning>

<Note>
  **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.
</Note>
