---
title: "POST /api/me/merchants/:id/config/preview"
method: POST
path: "/api/me/merchants/{id}/config/preview"
tags: ["merchant_config"]
---

# POST /api/me/merchants/:id/config/preview

`POST /api/me/merchants/{id}/config/preview`

## Request

- Base URL: `https://api.aifinpay.io`
- URL: `https://api.aifinpay.io/api/me/merchants/{id}/config/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.

## Path parameters

- `id` string, required: Server-issued identifier

## Request body

- MerchantConfigImport
  - `format` 'aifinpay-merchant-config', required
  - `version` 1, required
  - `exported_revision` string
  - `revision` string
  - `router_slug` string, nullable
  - `default_gateway_id` string, nullable
  - `legacy_gateway_id` string, nullable
  - `upserts` object[]
    - `id` string, required
    - `name` string, required
    - `slug` string, required
    - `type` 'hosted_x402', required
    - `enabled_intent` boolean, required
    - `priority` integer, required
    - `upstream_base_url` string, uri, required
    - `description` string
    - `metadata` object
    - `chains` string[]
    - `payment_assets` 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
  - `gateways` object[]
    - `id` string, required
    - `name` string, required
    - `slug` string, required
    - `type` 'hosted_x402', required
    - `enabled_intent` boolean, required
    - `priority` integer, required
    - `upstream_base_url` string, uri, required
    - `description` string
    - `metadata` object
    - `chains` string[]
    - `payment_assets` 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
  - `delete_gateway_ids` string[]
  - `delete_resources` object[]
    - `gateway_id` string, required
    - `resource_ids` string[], required

## Response `200`

Owned authoritative sanitized result.

- MerchantConfigPreview
  - `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
  - `config` object, required
    - `format` 'aifinpay-merchant-config', required
    - `version` 1, required
    - `revision` string, required
    - `router_slug` string, nullable, required
    - `default_gateway_id` string, nullable, required
    - `legacy_gateway_id` string, nullable, required
    - `gateways` object[], required
      - `id` string, required
      - `name` string, required
      - `slug` string, required
      - `type` 'hosted_x402', required
      - `enabled_intent` boolean, required
      - `priority` integer, required
      - `upstream_base_url` string, uri, required
      - `description` string
      - `metadata` object
      - `chains` string[]
      - `payment_assets` 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

## 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)
