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

# September 2026

> What changed in ProofAge in September 2026.

<Update label="September 30" description="API">
  * **`GET /v1/verifications/{id}/document` returns more.** `type` (`passport`, `id`, `driver_license`, `residence_permit`, `other`; an open enum, `other` is declared and not yet produced) and `issuing_country` (ISO 3166-1 alpha-2, `XK` for Kosovo) are added to `document` on every workspace. Identity (KYC) workspaces also get `middle_name`, `gender` (`F`, `M`, `X`; `X` is declared and not yet produced), `nationality`, `place_of_birth`, `issue_date` and `expiry_date` in `fields`, so the object carries ten fields.
  * **Age workspaces keep the four fields** (`first_name`, `last_name`, `date_of_birth`, `document_number`) and add only `type` and `issuing_country`. The six KYC-only keys are absent, not `null`.
  * **Dates are `YYYY-MM-DD` or `null`.** A document that prints only the month or year of expiry reports the last day of that period. A permanent document (for example `PERMANENTE`) reads as a `null` `expiry_date`.
  * Fix: a partially printed birth date is now `null` instead of a string such as `1968-04`.
  * Fix: an empty text field is now `null` instead of `""`.
  * Fix: the sex letter of a Mexican voter card or driving licence created before 20 August 2026 17:00 UTC is now `null`. The document service read it inverted for most women until then.
  * The tenant MCP server returns the same `document` object from `list-verifications` with `select: ["document"]`.
  * SDK releases to match: `@proofage/node` 0.9.0, `proofage` (Python) 0.4.0, `proofage/php-sdk` 0.4.0 and `proofage/laravel-client` 0.9.4. The new keys are optional in their types and `type` and `gender` are open, so a value added later does not break them.
    See [Reading results](/integration/retrieving-results) and [Data models](/api-reference/data-models#document-result).
</Update>

<Update label="September 30" description="Decisions">
  * Two new decline reasons, `selfie.liveness.failed` and `selfie.liveness.unavailable`. They appear on workspaces that use the AWS liveness check (beta). See [Decision reasons](/core-technology/decision-reasons).
</Update>

<Update label="September 29" description="API">
  * **Errors are always JSON.** Every error from `api.proofage.xyz` is JSON, with or without `Accept: application/json`. Before, a 404 or 403 came back as an HTML page and a validation error as a redirect. A missing verification answers `404 {"message": "Resource not found"}`. See [Errors](/integration/error-handling).
  * **Consent checks the workspace.** `POST /v1/verifications/{id}/consent` answers `403` for a verification of another workspace, like the other verification endpoints.
  * An `external_id` sent as an array is a `422` validation error, not a `500`.
  * The OpenAPI spec lists only the fields integrations send and receive; the browser SDK's own fields are gone from it.
  * Switching an age workspace from ID documents to facial age estimation needs a minimum age of 18 in the same request, unless the workspace already has 18.
  * SDK releases to match: `@proofage/node` 0.8.1, `proofage` (Python) 0.3.1, `proofage/php-sdk` 0.3.2 and `proofage/laravel-client` 0.9.2. The fields only the ProofAge widget sends are deprecated in all of them: they still work, and will be removed in the next minor release. The Postman collection now signs every request itself; see [Postman collection](/api-reference/postman).
</Update>

<Update label="September 28" description="SDKs and API">
  * New SDK releases: `@proofage/node` 0.7 and 0.8, `proofage` (Python) 0.3, `proofage/php-sdk` 0.3.0 and 0.3.1, and `proofage/laravel-client` 0.9.0 and 0.9.1. Every request now names the SDK and its version, so support can see which client sent it.
  * **Signed creates only tie a verification to your user.** `POST /v1/verifications` without an HMAC signature now ignores `external_id` and `callback_url`. Sign create requests on your backend; see [API authentication](/getting-started/api-authentication#creating-without-a-signature).
</Update>

<Update label="September 27" description="MCP server">
  * The MCP server serves the developer documentation and the OpenAPI spec as resources, and a new integration guide tool gives an agent everything it needs to integrate a workspace end to end.
  * `get-verification-stats` returns the dashboard's figures.
  * Support specialists can use the MCP server, with the tools their role allows, and can erase a person's personal data on request.
</Update>

<Update label="September" description="Console and widget">
  * **Workspace checks renamed.** Creating a workspace is one question, "What should this workspace check?": **Identity (KYC)**, or **Age verification** by **ID document** or **Facial age estimation**. The age setting is now called **Minimum age**. API fields are unchanged.
  * **Verification links**: create a verification by hand from the Verifications page, with a QR code. See [Verification links](/console/verification-links).
  * **Dashboard**: verification volume and resubmission insights, filterable by workspace.
  * The widget shows your workspace's branding from the first frame, and takes its language from the link, then the session, then the browser.
</Update>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.