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

# Go-live checklist

> Everything to switch from a test workspace to a live one without surprises.

A workspace's mode is fixed when it is created, so going live means creating a **live** workspace next to your test one and pointing your integration at it.

## The workspace

<Steps>
  <Step title="Create the live workspace">
    Same check and settings as the test one: the workspace type, the minimum age on age workspaces, whether expired documents are accepted and whether one face may verify under several of your users.
  </Step>

  <Step title="Add a payment method">
    Live verifications beyond the free trial need a payment method on the account; without one, creating a verification fails with `402 PAYMENT_METHOD_REQUIRED`. See [Pricing](/getting-started/pricing).
  </Step>

  <Step title="Set the URLs">
    The webhook URL of your production handler, over HTTPS, and a redirect URL of your own. A new workspace's redirect URL is a ProofAge page.
  </Step>

  <Step title="Swap the keys">
    Put the live public key and a live secret key into your production configuration. Copy the live secret key from the console into your secrets manager; for live workspaces it is never returned by the API or the MCP server.
  </Step>
</Steps>

## Your integration

* [ ] Verifications are created on your backend, signed, with `external_id` set to your user's ID.
* [ ] The Browser SDK uses the **live** public key, or the person is redirected to the verification `url`.
* [ ] The page the person returns to does not assume an outcome: it waits for the webhook or reads the status.
* [ ] The webhook handler verifies the signature and the timestamp, and rejects anything else with `401`.
* [ ] It handles `approved`, `declined`, `resubmission_requested`, `review`, `abandoned` and `expired`.
* [ ] It answers `2xx` quickly and processes in the background.
* [ ] It skips a delivery ID it has already processed.
* [ ] Unknown [decision reasons](/core-technology/decision-reasons) fall back to a generic message.
* [ ] Error handling reads all four error shapes, or you use a [server SDK](/integration/sdks).

## After the switch

* [ ] Run one real verification end to end on the live workspace and check the webhook arrived.
* [ ] Look at the workspace's webhook deliveries in the console for failed attempts during the first days.
* [ ] Keep the test workspace for development; its keys never create billable verifications.


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