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

# Test your paywall

> Hit the generated URL with curl and confirm the 402 → pay → retry flow end-to-end.

You've created a service and a paywall. Now confirm the full payment flow works against the generated URL.

<Tip>
  Testing with **Mainnet mode** off? Grab testnet USDC from the [Testnet USDC Faucet](https://testmint.myproceeds.xyz/) before you run the steps below.
</Tip>

## With curl (x402)

The first request should return `402`. The second request — with payment proof — should return your upstream response.

```bash Step 1 — request the protected resource theme={null}
curl -i https://myproceeds.xyz/api/x402/pay/{serviceId}/{slug}
```

```bash Step 2 — retry with payment proof theme={null}
curl -i \
  -H "X-Payment: YOUR_PAYMENT_RECEIPT" \
  https://myproceeds.xyz/api/x402/pay/{serviceId}/{slug}
```

For a complete x402 client implementation in JavaScript or React, see [x402](/standards/x402).

## With an MPP-aware client

Tempo-enabled paywalls expose an MPP URL. The `mppx` CLI handles the 402 challenge and retry for you:

```bash theme={null}
npx mppx https://myproceeds.xyz/api/mpp/pay/{serviceId}/{slug}
```

For programmatic use, see [MPP](/standards/mpp).

## From Claude Code, Cursor, or Codex

You can also test by letting an AI agent pay the URL for you. Install a wallet tool, fund it, and hand your agent the paywall URL — see [Pay with an agent](/agents/overview).

## What success looks like

| Status                    | Meaning                                                        |
| ------------------------- | -------------------------------------------------------------- |
| `402 Payment Required`    | Paywall is live, no payment was provided.                      |
| `200 OK`                  | Payment was validated and the upstream response was proxied.   |
| `4xx`/`5xx` after payment | Payment succeeded, but the upstream call failed. Check Events. |

When the request completes, the matching transaction in the dashboard moves from `Pending` to `Completed`. A failed flow ends in `Failed`.

## Next

<CardGroup cols={2}>
  <Card title="Monitor payments" icon="chart-line" href="/quickstart/monitor-payments">
    Watch transactions and events as your tests run.
  </Card>

  <Card title="Troubleshooting" icon="wrench" href="/guides/troubleshooting">
    Resolve challenge, payment, and fulfillment failures.
  </Card>
</CardGroup>
