> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.transxact.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.transxact.io/_mcp/server.

# Test vs Live mode

Every Merchant account has two separate modes, distinguished by API key
prefix: `sk_test_...` and `sk_live_...`. Data created under one mode (Checkout
Sessions, Payouts) is never visible or actionable under the other.

## Test mode

Granted instantly at signup — no documents, no waiting. Test mode integrates
against Provider sandboxes, so you can build and test your full integration
before Verification is even submitted.

## Live mode

Unlocked once your Verification submission is reviewed and approved:

Both tiers send a TIN and a photo of the TIN card, plus:

* **Business accounts** verify via company registration, and pay out via
  weekly bank transfer every Monday.
* **Individual accounts** verify via personal ID (FNPF card, passport,
  driver's licence, or Voter ID), and pay out wallet-to-wallet
  to the Merchant's own Provider wallet every day, since they typically have no business
  bank account.

Verification is reviewed asynchronously in the background — there's no
blocking modal or sales call. You can keep integrating in Test mode while it's
pending.

Live mode also opens one Provider at a time, as each Provider's agreement
with Transxact is signed. Until at least one Provider takes Live mode payments,
the dashboard shows Live mode as a waitlist.

## Getting a Live mode key

Once your account is verified and a Provider is live, the dashboard shows a
**Create Live mode key** button. The key is shown once — copy it then. We only
keep a hash of it.

## Which Providers a customer sees

A Live mode Checkout Session only offers the Providers that are live — the
hosted payment page hides the rest. Test mode Checkout Sessions always offer
every Provider.

Creating a Live mode Checkout Session while no Provider is live returns
`409` with a stable error code you can branch on:

```json
{ "error": { "code": "live_mode_unavailable", "message": "No Provider takes Live mode payments yet" } }
```

## Payouts

Set where you're paid on the dashboard's **Where we pay you** page: a bank
account for a Business account, an M-PAiSA or MyCash number for an Individual
account. Changing it needs a login through an emailed link.

Each Payout from `GET /v1/payouts` has a `status`:

* `pending` — on its way to your payout destination.
* `paid` — sent. `paidAt` says when.
* `failed` — the transfer didn't go through. `failureReason` says why. The
  amount goes back on your balance and out again in your next Payout.

Test mode Payouts are always `paid`, since no real money moves. Live mode
money stays on your balance, with no Payout created, until you've set where
you're paid.

## Switching over

No code changes are needed beyond swapping which API key you use — the same
endpoints and request/response shapes work in both modes. Just point your
integration at `sk_live_...` once you have one.