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

# Payment Requirements

> Payment conditions defined by the server

## Type

```ts theme={null}
interface PaymentRequirements {
  scheme: "exact";
  network: string;
  maxAmountRequired: string;
  resource: string;
  description: string;
  mimeType: string;
  payTo: string;
  maxTimeoutSeconds: number;
  asset: string;
  paymentType?: "eip3009" | "permit" | "permit2";
  outputSchema?: Record<string, unknown>;
  extra?: Record<string, unknown>;
}
```

## Field highlights

* `scheme`: always `"exact"`
* `network`: kebab-case network name (e.g., `bsc`, `base-sepolia`)
* `maxAmountRequired`: maximum amount to pay (wei)
* `payTo`: merchant address (EIP-7702)
* `asset`: token contract address
* `maxTimeoutSeconds`: signature validity window (anti-replay)

## Example

```json theme={null}
{
  "scheme": "exact",
  "network": "bsc",
  "maxAmountRequired": "1000000",
  "resource": "https://api.example.com/premium",
  "description": "Premium API access",
  "mimeType": "application/json",
  "payTo": "0xSeller",
  "maxTimeoutSeconds": 600,
  "asset": "0xUSDC",
  "paymentType": "permit"
}
```

## Zod schema

```ts theme={null}
import { z } from "zod";

export const PaymentRequirementsSchema = z.object({
  scheme: z.literal("exact"),
  network: z.string(), // e.g. "bsc", "bsc-testnet", "base-sepolia"
  maxAmountRequired: z.string().refine(
    (v) => Number.isInteger(Number(v)) && Number(v) >= 0
  ),
  resource: z.string().url(),
  description: z.string(),
  mimeType: z.string(),
  outputSchema: z.record(z.any()).optional(),
  payTo: z.string(), // EVM 0x... or SVM
  maxTimeoutSeconds: z.number().int().positive(),
  asset: z.string(), // token address (EVM/SVM)
  paymentType: z.enum(["eip3009", "permit", "permit2"]).optional(),
  extra: z.record(z.any()).optional(),
});
```

## Supported networks

```ts theme={null}
type Network =
  | "bsc" | "bsc-testnet"
  | "ethereum" | "sepolia"
  | "base" | "base-sepolia"
  | "polygon" | "arbitrum" | "optimism";
```

## Validation highlights

* scheme must be `"exact"`
* network must match client/chain config
* `BigInt(payment.value) <= BigInt(maxAmountRequired)`
* `resource` is a valid URL and matches the protected resource
* `payTo` equals the merchant recipient address (EIP-7702 recommended)
* Timeout: `deadline/validBefore <= now + maxTimeoutSeconds`
* If `paymentType` is specified, the client must use that type

## Common scenarios

* Fixed-price API: create and cache requirements at startup, reuse to reduce overhead
* Dynamic pricing: compute `maxAmountRequired/description` from request context
* Multiple token options: return multiple `accepts` for client selection (see 402)

## Combined with 402

```json theme={null}
{
  "x402Version": 1,
  "accepts": [
    { "scheme": "exact", "network": "bsc", "asset": "0xUSDC", "maxAmountRequired": "1000000", "description": "Pay with USDC", "mimeType": "application/json", "payTo": "0xSeller", "maxTimeoutSeconds": 600 },
    { "scheme": "exact", "network": "bsc", "asset": "0xDAI", "maxAmountRequired": "1000000000000000000", "description": "Pay with DAI", "mimeType": "application/json", "payTo": "0xSeller", "maxTimeoutSeconds": 600 }
  ]
}
```
