Bearer token
Send exactly one Authorization: Bearer … header. Tokens begin with wc_live_, are shown once, and are invalidated immediately when disabled or rotated.
Merchant integration
Source-aligned reference for asset and wallet readiness, server-side invoice creation, searchable reconciliation, hosted checkout, dynamic IPN delivery, and store webhooks. Examples are inert templates with deliberate copy controls—this page never reads or inserts a merchant token.
https://api.example.comhttps://pay.example.comCurrent originLoading active service URLs, including custom subdomain names. Safe placeholders remain if settings are unavailable.
01 · First request
Default hosts: merchant.example.com for the console, pay.example.com for checkout, and api.example.com for API requests. Existing installations keep their configured names; examples below use your active URLs.
Enable a scanner-ready native asset or verified token, generate and back up its chain wallet, then select it for the store. A fresh trusted rate must be available.
In Settings → API access, choose read/write, assign the project, optionally restrict exact egress IPs, and save the one-time token securely.
Send the token and a new Idempotency-Key. Decimal money values are strings; unknown JSON fields are rejected.
Open links.checkout for the customer. Poll the invoice detail endpoint and verify signed notifications independently.
02 · Trust boundary
Send exactly one Authorization: Bearer … header. Tokens begin with wc_live_, are shown once, and are invalidated immediately when disabled or rotated.
Read only can list and retrieve. Read + write can also create. Neither grants console, node, system, webhook-management, or credential-management access.
A credential can access only enabled projects explicitly assigned to it. Invoice creation additionally requires the store UUID to belong to that project and both resources to be enabled.
When enabled, the public API compares the proxy-established client address to exact IPv4/IPv6 entries. CIDR ranges are not accepted; allowlist stable outbound proxy/NAT addresses, not private workstation addresses.
03 · Capability gate
The project’s native asset is the chain switch. It must be payment-supported, runtime-wired, and scanner-ready with the required endpoint role before a token on that chain can be promoted or selected.
CoinGecko supplies a candidate contract or mint, icon, and price identity. Wholly Crypto verifies network identity and token metadata through configured nodes before creating a durable asset.
Project enablement makes an asset available. The store’s ordered subset controls which ready methods appear on newly created invoices; up to 64 can be selected.
One chain wallet serves its native asset and verified tokens. Payment-acceptance switches do not pause read-only tracking: active and disabled wallets continue refreshing registered same-chain assets. Exact balances include issued invoice addresses; USD values are advisory. Pending or stale data is never proof of zero.
--restricted-rpc is incompatible because it denies subaddress creation. 04 · Reconciliation
Use the public invoice UUID returned as public_id, not the internal id. Poll GET /v1/projects/{project_id}/invoices/{public_id}; back off between unchanged responses.
expired is not necessarily the end of monitoring. A late transfer can move an invoice back to processing or onward to settled/invalid. cancelled is terminal.
sequence starts at 1 and increases on state transitions and additional-payment events, even when status fields stay unchanged. Store the highest processed value per invoice so retried or out-of-order notifications cannot regress local state.
05 · Server-to-server events
Set ipn_url while creating an invoice to override the store default. Omitted or null inherits that default. The store must already have an IPN signing secret created in the console.
Configure endpoints and their event subscriptions in the project’s Webhooks console. They receive selected store events independently of any invoice IPN URL.
06 · Route catalog
07 · Failure handling
Canonical JSON envelope
{
"error": {
"code": "invalid_payment_request",
"message": "must be greater than zero",
"details": { "field": "amount" }
}
}Branch on the HTTP status and stable error.code. Treat message as operator-facing context. details is optional.
08 · Current contract