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

# Sandbox

> Test every outcome — completed, failed, pending — with deterministic trigger codes.

## What sandbox is

Sandbox is a test version of the live API. Every endpoint behaves identically: same validation, same auth, same error envelope, same response shape. But:

* No wallet impact — sandbox transactions do not move real funds
* Callbacks are not sent for sandbox transactions

Switch by changing the base URL — credentials, payloads, and code stay the same.

```
Live:    https://api.pontisglobe.com
Sandbox: https://sandbox.pontisglobe.com
```

## Trigger codes

In sandbox, the **trailing cents** of `source_amount` decide the outcome:

| `source_amount` ends in | `sendPayoutRequest` → | `getPayoutStatus` later →                            |
| ----------------------- | --------------------- | ---------------------------------------------------- |
| `.00`                   | `pending`             | `completed`                                          |
| `.01`                   | `pending`             | `failed` (`Insufficient funds in source wallet`)     |
| `.02`                   | `pending`             | `failed` (`Recipient account not found`)             |
| `.03`                   | `pending`             | `pending` (stays pending — useful for polling tests) |
| `.04`                   | `pending`             | `failed` (`Provider declined the transaction`)       |

Any other trailing cents fall back to the `.00` path.

### Example

```js theme={null}
// Will eventually settle as completed
await sendPayoutRequest({ source_amount: '10.00', ... })

// Will fail with "Insufficient funds in source wallet"
await sendPayoutRequest({ source_amount: '10.01', ... })

// Will stay pending — polled status returns 'pending' forever
await sendPayoutRequest({ source_amount: '10.03', ... })
```

## Sandbox transaction IDs

Sandbox `transaction_id`s are prefixed `sb_` so they're easy to recognize and impossible to confuse with live IDs:

```
sb_a42b69dcd78f_01_tg3qwn_30e136b2
```

A `sb_` ID returned to one account cannot be queried by another.

## What sandbox is NOT for

* Load testing (use a staging or dedicated test environment)
* Verifying callback delivery (callbacks are not sent in sandbox — see [Callbacks](/callbacks))
* Validating exchange rates (quotes return placeholder rates)

## Done testing?

When every outcome behaves the way you expect, follow the [Going live](/going-live) checklist to switch to production.
