Merchant API

A Merchant is a sub-merchant you onboard for acquiring under your platform. This page documents the object field by field, the tri-state capability model your product should gate on, and the four endpoints — create, list, retrieve, update. How verification itself works is on Onboarding & KYB.

The Merchant object

GET /v1/merchants/mch_7Rq3wN8dK2Vs
{
  "id": "mch_7Rq3wN8dK2Vs",
  "object": "merchant",
  "legal_name": "Aurora Retail B.V.",
  "trading_name": "Aurora",
  "country": "NL",
  "mcc": "5734",
  "mid": "845512000318",
  "kyb_status": "active",
  "capabilities": {
    "card_payments": "active",
    "local_methods": "active",
    "payouts": "active"
  },
  "livemode": false,
  "created_at": "2026-07-16T08:02:19Z"
}
FieldTypeDescription
idstringUnique identifier, always prefixed mch_.
legal_namestringRegistered legal name of the entity. Fixed after creation.
trading_namestring · nullableCustomer-facing name (doing-business-as). Appears on card statements where the scheme allows.
countrystringTwo-letter ISO 3166-1 country code of incorporation. Fixed after creation.
mccstringFour-digit ISO 18245 merchant category code. Validated — and corrected if wrong — during review.
midstring · nullableMerchant id at the acquiring level, assigned once the merchant becomes active. This is what appears in scheme clearing records and settlement reports. null until then.
kyb_statusenumcreated · kyb_pending · under_review · active · restricted · suspended — the KYB lifecycle.
capabilitiesobjectPer-capability activation state — see below.
livemodebooleantrue for objects created with a live-mode key, false in test mode.
created_attimestampCreation time, ISO 8601 UTC.

Capabilities

Capabilities answer the only question your product actually asks: can this merchant do X right now? Each one moves independently through three states:

inactive pending active KYB checks run checks pass merchant restricted or suspended — capability paused
CapabilityGoverns
card_paymentsAccepting card payments — the card-family methods (card, apple_pay, google_pay). See Cards & 3DS.
local_methodsAccepting local payment methods — bank redirects, real-time rails, wallets, vouchers. See the method catalog.
payoutsReceiving payouts to the merchant's settlement bank account.
Gate on capabilities, not on kyb_status kyb_status: active tells you verification passed; it doesn't tell you which features work. Capabilities can stagger during activation (card_payments active while payouts is still pending) and pause individually while a merchant is restricted. Check capabilities.card_payments === "active" before offering card acceptance — nothing else.

Endpoints

Four endpoints, standard conventions: Bearer auth, Idempotency-Key on POSTs, cursor pagination on lists. There is no delete — merchants carry regulatory history and are deactivated, never erased.

POST /v1/merchants
curl https://api.finscale.dev/v1/merchants \
  -H "Authorization: Bearer sk_test_51FinscaleDemo…" \
  -H "Idempotency-Key: idem_mch_aurora_01" \
  -H "Content-Type: application/json" \
  -d '{
    "legal_name": "Aurora Retail B.V.",
    "trading_name": "Aurora",
    "country": "NL",
    "mcc": "5734"
  }'

Returns 201 with the merchant in kyb_status: kyb_pending — see the onboarding walkthrough for the full response and what happens next. legal_name, trading_name, and mcc are required-or-optional exactly as shown: only trading_name may be omitted.

Webhook events

One event type covers the object: merchant.updated, fired on every kyb_status or capability change, carrying the full Merchant as data.object. There is no merchant.created — creation is your own API call, so you already know. Payload example on the onboarding page; delivery mechanics in Webhooks.

Error scenarios

ScenarioResponse
Missing legal_name, malformed mcc or country400invalid_request_error
Attempting to update legal_name or country400invalid_request_error; fixed after creation
Unknown merchant id404invalid_request_error
Same Idempotency-Key, different payload409idempotency_error
Too many requests429rate_limit_error; see Rate limits

All error responses use the standard error envelope. Full request/response schemas are in the API reference.