---
title: "FREE dry-run verification of an x402 payment payload"
method: POST
path: "/api/pay/verify"
tags: ["payments"]
---

# FREE dry-run verification of an x402 payment payload

`POST /api/pay/verify`

## Request

- Base URL: `https://www.flarewatch.io`
- URL: `https://www.flarewatch.io/api/pay/verify`
- Auth: none declared

Validates the authorization that would go base64-encoded into PAYMENT-SIGNATURE or X-PAYMENT (signature, window, amount policy) WITHOUT burning the nonce or settling. Integration-test your signing code at zero cost; the response states exactly what the paywall would decide and why.

## Request body

- object
  - `from` string, required
  - `to` string, required
  - `value` string, required: Raw units, 6 decimals. Must equal the price exactly.
  - `validAfter` integer, required
  - `validBefore` integer, required
  - `nonce` string, required: Random 32 bytes, hex.
  - `signature` string, required: 65-byte r||s||v hex.
  - `path` string

## Response `200`

The verdict the paywall would reach. Note 200 means the check RAN, not that the payment is valid — read `valid`.

- VerifyResult: Outcome of a FREE dry run. The nonce is not burned and nothing settles.
  - `valid` boolean
  - `reason` string: Present when valid=false: exactly what the paywall would object to.
  - `from` string
  - `value_raw` string
  - `verified_against` object
    - `path` string
    - `price_micro_usd` integer
  - `exact_rail` 'ok' | 'unset' | 'malformed'
  - `note` string

## Other responses

- `400`: Malformed body.
- `429`: Rate limited — structured error + RateLimit headers.

---

[API](https://skmtc.dev/flarewatch/apis/flarewatch-public-api.md) · [All operations](https://skmtc.dev/flarewatch/apis/flarewatch-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/flarewatch/apis/flarewatch-public-api/revisions/890e7013afdb?raw)
