---
title: "POST /api/me/sites/batches/preview"
method: POST
path: "/api/me/sites/batches/preview"
tags: ["merchant_config"]
---

# POST /api/me/sites/batches/preview

`POST /api/me/sites/batches/preview`

## Request

- Base URL: `https://api.aifinpay.io`
- URL: `https://api.aifinpay.io/api/me/sites/batches/preview`
- Auth: API key in cookie `aifinpay_session`

Owned configuration control-plane. Fresh ownership, Cache-Control no-store. Strict raw UTF8 JSON <=1MiB/depth12/duplicate and unknown keys rejected. Preview does not probe DNS/HTTP. Atomic marker publication; ambiguous completion resolves by idempotency/owned operation lookup. No settlement/network activation.

## Request body

- MerchantSiteBatch
  - `format` 'aifinpay-site-batch', required
  - `version` 1, required
  - `sites` object[], required
    - `client_row_id` string, required
    - `name` string, required
    - `site_url` string, uri, required
    - `upstream_base_url` string, uri, required
    - `gateway_slug` string, required
    - `enabled_intent` boolean, required
    - `network_mode` 'live' | 'test', required
    - `settlement_chain` string, required
    - `settlement_version` '1.2' | '1.4', required
    - `pay_to` object, required
      - `evm` string
      - `polygon` string
      - `solana` string
    - `resources` object[]
      - `id` string, required
      - `route_pattern` string, required
      - `type` 'page' | 'api' | 'dataset' | 'mcp_tool' | 'product', required
      - `name` string, nullable
      - `description` string
      - `active` boolean
      - `paywall_enabled` boolean
      - `currency` 'USD'
      - `billing_unit` 'request'
      - `unit_weight` integer
      - `price_usd` string
      - `tier` 'standard' | 'complex' | 'premium' | 'null', nullable
      - `chains` string[]
      - `payment_assets` string[]
      - `daily_unit_limit` integer, nullable
      - `fallback_gateway_id` string, nullable

## Response `200`

Owned authoritative sanitized result.

- MerchantSiteBatchPreview
  - `preview_id` string, required
  - `digest` string, required
  - `expires_at` string, date-time, required
  - `base_revision` string, required
  - `context_revision` string, required
  - `changes` object[], required
    - `action` string, required
    - `kind` string, required
    - `id` string
    - `gateway_id` string
    - `summary` string, required
  - `errors` object[], required
    - `path` string, required
    - `code` string, required
    - `message` string, required
  - `can_confirm` boolean, required
  - `id_map` object, required
  - `sites` object[], required
    - `client_row_id` string, required
    - `name` string, required
    - `site_url` string, uri, required
    - `upstream_base_url` string, uri, required
    - `gateway_slug` string, required
    - `enabled_intent` boolean, required
    - `network_mode` 'live' | 'test', required
    - `settlement_chain` string, required
    - `settlement_version` '1.2' | '1.4', required
    - `pay_to` object, required
      - `evm` string
      - `polygon` string
      - `solana` string
    - `resources` object[]
      - `id` string, required
      - `route_pattern` string, required
      - `type` 'page' | 'api' | 'dataset' | 'mcp_tool' | 'product', required
      - `name` string, nullable
      - `description` string
      - `active` boolean
      - `paywall_enabled` boolean
      - `currency` 'USD'
      - `billing_unit` 'request'
      - `unit_weight` integer
      - `price_usd` string
      - `tier` 'standard' | 'complex' | 'premium' | 'null', nullable
      - `chains` string[]
      - `payment_assets` string[]
      - `daily_unit_limit` integer, nullable
      - `fallback_gateway_id` string, nullable
    - `merchant_id` string, required
    - `gateway_id` string, required
    - `proof_state` 'PENDING_DNS', required

## Other responses

- `400`: Safe failure without partial active configuration.
- `401`: Safe failure without partial active configuration.
- `403`: AIFP-* error envelope. See backend/server.js safe error handler.
- `404`: Absent or not currently owned; generic existence-safe response.
- `409`: Safe failure without partial active configuration.
- `413`: Safe failure without partial active configuration.
- `429`: Safe failure without partial active configuration.
- `503`: Safe failure without partial active configuration.
- `5XX`: AIFP-* error envelope. See backend/server.js safe error handler.

---

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