# Test from the terminal

For the first test without third-party libraries, use `node sandbox.mjs` (Node 20+) or `python3 sandbox.py` (Python 3.9+). Both reject production keys. Never send funds to a sandbox address.

You can also run the public MCP demonstration without supplying an API key:

```bash
curl --fail-with-body https://api.luniumpay.com/mcp/onboarding \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"lunium_start_sandbox_demo","arguments":{"flow":"custody","request_id":"REPLACE-WITH-A-RANDOM-UUID"}}}'
```

Replace `request_id` with one random UUID per test and keep it unchanged on retries. Read `result.structuredContent.dados.demo_id` from the response. Poll every three seconds for up to 60 seconds:

```bash
curl --fail-with-body https://api.luniumpay.com/mcp/onboarding \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"lunium_get_sandbox_demo","arguments":{"demo_id":"RETURNED-DEMO-ID"}}}'
```

`completed: true` confirms that the selected flow completed with simulated funds. Also check `result.isError`: MCP tool errors may accompany HTTP 200. A successful demonstration does not prove a bank, exchange or blockchain transaction. To test callbacks, configure your own HTTPS receiver on the sandbox key before generating events.

Demo flows: `custody` (PIX → BRL custody → USDC/Base), `cashin` (PIX → BTC), `payout` (custody → PIX) and `cashout` (USDT → PIX).

Complete HTTP guide: https://docs.luniumpay.com/en/manual . Payment simulation, error scenarios and limits: https://docs.luniumpay.com/en/sandbox . English API contract: https://docs.luniumpay.com/en/openapi.json .
