← GriffNode Docs

GriffNode API Reference (v1.0.1)

Accept Bitcoin, Litecoin, Dogecoin, Dash, Ethereum and ERC-20 tokens. Server-to-server, authenticated with a secret API key (Authorization: Bearer sk_live_… for live, or sk_test_… for test mode — same base URL). All monetary amounts in API responses are JSON numbers; webhook amounts are strings to preserve decimal precision (see the webhooks section).

Rate limits. Every request is rate-limited per API key in two windows — per minute and per hour — by plan tier (min/hour): starter 30/500, business 100/2000, professional 300/5000, enterprise 1000/20000. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (Unix seconds) for the per-minute window. On 429 the body is error: "RATE_LIMIT_EXCEEDED" (either window) with a Retry-After header (seconds) — clients should retry after it. A separate 429 with error: "MONTHLY_LIMIT_REACHED" means the plan's monthly transaction quota (not the request rate).

Base URL: https://api.griffnode.com/v1. Single base URL for both live and test traffic. A live secret key (sk_live_) settles real funds on mainnet; a test secret key (sk_test_) runs in test mode with no real funds. There is no separate sandbox host.

Authentication: Secret API key: Authorization: Bearer sk_live_… (or sk_test_…).

Transactions

Create and read merchant payment transactions.

POST /transactions/create

Create a payment transaction

Endpoint: POST https://api.griffnode.com/v1/transactions/create · Operation ID createTransaction · Requires a secret API key.

Parameters
NameInTypeRequiredDescription
X-Idempotency-KeyheaderstringoptionalOptional unique key for a create request (e.g. a UUID). A retried create with the same key returns the original transaction instead of creating a duplicate — send it on every create so a network retry can't double-charge the customer.

Request body: application/json, a CreateTransactionRequest object (required).

Request body fields
FieldTypeRequiredDescription
cryptoCryptoSymbolrequiredSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
amountnumberrequiredFiat amount (≥ 1.00 USD equivalent).
currency_fiatFiatCurrencyoptionalOne of: USD, PLN, EUR, GBP. Default USD.
metadataMetadataoptionalFree-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).
customer_emailstring or nulloptionalFormat email.
success_urlstring or nulloptionalFormat uri.
cancel_urlstring or nulloptionalFormat uri.
Responses
StatusBodyDescription
201TransactionEnvelopeTransaction created.
400ErrorValidation error (INVALID_REQUEST, INVALID_CRYPTO, INVALID_AMOUNT, AMOUNT_TOO_LOW, INVALID_CURRENCY, INVALID_METADATA, WALLET_NOT_CONFIGURED, MISSING_ITEMS, MISSING_ORDER_ID, …).
401ErrorMissing or invalid API key (UNAUTHORIZED).
402ErrorMerchant platform balance too low for overage fees (INSUFFICIENT_BALANCE).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).
409objectThis client IP already has an active transaction (ACTIVE_TRANSACTION_EXISTS). Body includes an existing_transaction object.
429ErrorRate limit or quota exceeded. error is RATE_LIMIT_EXCEEDED (per-minute request rate — honour Retry-After) or MONTHLY_LIMIT_REACHED (the plan's monthly transaction quota). Rate-limit headers accompany the RATE_LIMIT_EXCEEDED case.

POST /transactions/create-detailed

Create an itemized transaction (Professional/Enterprise plans)

Endpoint: POST https://api.griffnode.com/v1/transactions/create-detailed · Operation ID createDetailedTransaction · Requires a secret API key.

Parameters
NameInTypeRequiredDescription
X-Idempotency-KeyheaderstringoptionalOptional unique key for a create request (e.g. a UUID). A retried create with the same key returns the original transaction instead of creating a duplicate — send it on every create so a network retry can't double-charge the customer.

Request body: application/json, a CreateDetailedTransactionRequest object (required).

Request body fields
FieldTypeRequiredDescription
cryptoCryptoSymbolrequiredSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
currency_fiatFiatCurrencyoptionalOne of: USD, PLN, EUR, GBP. Default USD.
itemsarray of LineItemrequired
order_idstringrequired
metadataMetadataoptionalFree-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).
customer_emailstring or nulloptionalFormat email.
success_urlstring or nulloptionalFormat uri.
cancel_urlstring or nulloptionalFormat uri.
Responses
StatusBodyDescription
201TransactionEnvelopeTransaction created.
400ErrorValidation error (INVALID_REQUEST, INVALID_CRYPTO, INVALID_AMOUNT, AMOUNT_TOO_LOW, INVALID_CURRENCY, INVALID_METADATA, WALLET_NOT_CONFIGURED, MISSING_ITEMS, MISSING_ORDER_ID, …).
401ErrorMissing or invalid API key (UNAUTHORIZED).
402ErrorMerchant platform balance too low for overage fees (INSUFFICIENT_BALANCE).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).
429ErrorRate limit or quota exceeded. error is RATE_LIMIT_EXCEEDED (per-minute request rate — honour Retry-After) or MONTHLY_LIMIT_REACHED (the plan's monthly transaction quota). Rate-limit headers accompany the RATE_LIMIT_EXCEEDED case.

GET /transactions/list

List the merchant's transactions (newest first)

Endpoint: GET https://api.griffnode.com/v1/transactions/list · Operation ID listTransactions · Requires a secret API key.

Parameters
NameInTypeRequiredDescription
limitqueryintegeroptionalDefault 20. Minimum 1. Maximum 100.
offsetqueryintegeroptionalDefault 0. Minimum 0.
statusqueryTransactionStatusoptionalPublic transaction status (internal sub-states are mapped to these). One of: pending, awaiting_confirmation, completed, partial, expired, failed.
cryptoqueryCryptoSymboloptionalSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
Responses
StatusBodyDescription
200objectA page of transactions. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).

GET /transactions/{transaction_id}

Retrieve a single transaction

Endpoint: GET https://api.griffnode.com/v1/transactions/{transaction_id} · Operation ID getTransaction · Requires a secret API key.

Parameters
NameInTypeRequiredDescription
transaction_idpathstringrequired
Responses
StatusBodyDescription
200TransactionEnvelopeThe transaction.
401ErrorMissing or invalid API key (UNAUTHORIZED).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).
404ErrorResource not found (TRANSACTION_NOT_FOUND).

Market Data

Live prices and the supported-currency catalogue.

GET /prices

Current crypto and fiat exchange rates (USD-denominated)

Endpoint: GET https://api.griffnode.com/v1/prices · Operation ID getPrices · Requires a secret API key.

Responses
StatusBodyDescription
200objectLive rates. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).
500ErrorInternal error (RATE_FETCH_FAILED, ADDRESS_GENERATION_FAILED, UPSTREAM_ERROR, …).

GET /cryptos/list

All supported cryptocurrencies and tokens

Endpoint: GET https://api.griffnode.com/v1/cryptos/list · Operation ID listCryptocurrencies · Requires a secret API key.

Responses
StatusBodyDescription
200objectSupported-currency catalogue. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).

GET /merchant/cryptos

Cryptocurrencies this merchant has wallets configured for

Endpoint: GET https://api.griffnode.com/v1/merchant/cryptos · Operation ID listMerchantCryptocurrencies · Requires a secret API key.

Responses
StatusBodyDescription
200objectThe merchant's configured currencies. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).

Account

Merchant plan, usage, balances, stats and invoices.

GET /account

Merchant plan, usage and limits

Endpoint: GET https://api.griffnode.com/v1/account · Operation ID getAccount · Requires a secret API key.

Responses
StatusBodyDescription
200objectAccount details. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).

GET /plans

Plan catalogue and pricing

Endpoint: GET https://api.griffnode.com/v1/plans · Operation ID listPlans · Requires a secret API key.

Responses
StatusBodyDescription
200objectPlans. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).

GET /balances

On-platform balances (for overage/top-up; NOT crypto settlement)

Endpoint: GET https://api.griffnode.com/v1/balances · Operation ID listBalances · Requires a secret API key.

Responses
StatusBodyDescription
200objectBalances. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).

GET /stats

Merchant transaction analytics

Endpoint: GET https://api.griffnode.com/v1/stats · Operation ID getStats · Requires a secret API key.

Responses
StatusBodyDescription
200objectStats. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).

GET /invoices

GriffNode billing invoices (platform ↔ merchant)

Endpoint: GET https://api.griffnode.com/v1/invoices · Operation ID listInvoices · Requires a secret API key.

Parameters
NameInTypeRequiredDescription
limitqueryintegeroptionalDefault 20. Minimum 1. Maximum 100.
offsetqueryintegeroptionalDefault 0. Minimum 0.
Responses
StatusBodyDescription
200objectInvoices. Fields: success, data.
401ErrorMissing or invalid API key (UNAUTHORIZED).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).

Billing

Plan upgrades and account top-ups.

POST /billing/checkout

Start a plan upgrade or account top-up

Endpoint: POST https://api.griffnode.com/v1/billing/checkout · Operation ID createBillingCheckout · Requires a secret API key.

Request body: application/json (required).

Request body fields
FieldTypeRequiredDescription
tierPlanTierrequiredOne of: starter, business, professional, enterprise.
billing_monthsintegeroptionalDefault 1. Minimum 1.
payment_methodstringoptionalDefault crypto.
Responses
StatusBodyDescription
201TransactionEnvelopeBilling transaction created.
401ErrorMissing or invalid API key (UNAUTHORIZED).
402ErrorMerchant platform balance too low for overage fees (INSUFFICIENT_BALANCE).
403ErrorKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).

System

Health and hosted-checkout redirect.

GET /health

API health check

Endpoint: GET https://api.griffnode.com/v1/health · Operation ID getHealth · No API key required.

Responses
StatusBodyDescription
200objectService status (intentionally NOT wrapped in the success envelope). Fields: status, service, version.

GET /pay

Hosted-checkout redirect (browser flow, publishable key)

Browser-facing redirect to the hosted payment page, authenticated by a publishable key in the query string (safe to expose client-side). Not used by the server-side SDKs — included for completeness.

Endpoint: GET https://api.griffnode.com/v1/pay · Operation ID hostedCheckoutRedirect · No API key required.

Parameters
NameInTypeRequiredDescription
pkquerystringrequiredPublishable key, pk_live_… / pk_test_…
amountquerystringrequiredFiat amount (≥ 1.00 USD equivalent).
cryptoqueryCryptoSymbolrequiredSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
linkquerystringoptionalPayment-link slug for attribution.
Responses
StatusBodyDescription
302Redirect to https://griffnode.com/transaction/{transaction_id}
400ErrorValidation error (INVALID_REQUEST, INVALID_CRYPTO, INVALID_AMOUNT, AMOUNT_TOO_LOW, INVALID_CURRENCY, INVALID_METADATA, WALLET_NOT_CONFIGURED, MISSING_ITEMS, MISSING_ORDER_ID, …).

Webhooks

GriffNode delivers payment lifecycle events to the webhook URL configured in your dashboard. Amounts in webhook payloads are decimal strings, not JSON numbers, so precision is preserved.

POST webhook: paymentEvent

Payment lifecycle event delivered to the merchant's webhook URL

Signed with HMAC-SHA256 over the RAW request body. Verify by comparing X-GriffNode-Signature: sha256=<hex> to hex(hmac_sha256(webhook_secret, raw_body)) using a constant-time compare. Also sent: X-GriffNode-Event (the event type) and X-Webhook-ID (unique delivery id — use for idempotency).

Endpoint: POST webhook: paymentEvent · Operation ID paymentWebhook · Requires a secret API key.

Request body: application/json, a WebhookPayload object.

Request body fields
FieldTypeRequiredDescription
eventstringrequiredOne of: payment.created, payment.pending, payment.completed, payment.overpaid, payment.partial, payment.expired, payment.failed.
timestampstringrequiredFormat date-time.
transaction_idstringrequired
statusTransactionStatusrequiredPublic transaction status (internal sub-states are mapped to these). One of: pending, awaiting_confirmation, completed, partial, expired, failed.
currency_cryptoCryptoSymboloptionalSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
currency_fiatFiatCurrencyoptionalOne of: USD, PLN, EUR, GBP. Default USD.
amount_fiatstringoptionalDecimal string.
amount_usdstringoptionalDecimal string.
amount_cryptostringoptionalDecimal string.
order_idstring or nulloptional
receipt_urlstring or nulloptionalPresent on completed/overpaid. Format uri.
metadataMetadataoptionalFree-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).
Responses
StatusBodyDescription
200Acknowledge within 15s. Non-2xx is retried with backoff.

Data objects

Every request body and response payload above is composed from these objects.

CryptoSymbol

Supported coin/token symbol. /cryptos/list is authoritative at runtime.

Type: string. Supported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.

FiatCurrency

Type: string. One of: USD, PLN, EUR, GBP. Default USD.

TransactionStatus

Public transaction status (internal sub-states are mapped to these).

Type: string. Public transaction status (internal sub-states are mapped to these). One of: pending, awaiting_confirmation, completed, partial, expired, failed.

PlanTier

Type: string. One of: starter, business, professional, enterprise.

Metadata

Free-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).

Type: object or null. Free-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).

LineItem

LineItem fields
FieldTypeRequiredDescription
namestringrequired
quantityintegeroptionalDefault 1. Minimum 1.
pricenumberrequired

CreateTransactionRequest

CreateTransactionRequest fields
FieldTypeRequiredDescription
cryptoCryptoSymbolrequiredSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
amountnumberrequiredFiat amount (≥ 1.00 USD equivalent).
currency_fiatFiatCurrencyoptionalOne of: USD, PLN, EUR, GBP. Default USD.
metadataMetadataoptionalFree-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).
customer_emailstring or nulloptionalFormat email.
success_urlstring or nulloptionalFormat uri.
cancel_urlstring or nulloptionalFormat uri.

CreateDetailedTransactionRequest

CreateDetailedTransactionRequest fields
FieldTypeRequiredDescription
cryptoCryptoSymbolrequiredSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
currency_fiatFiatCurrencyoptionalOne of: USD, PLN, EUR, GBP. Default USD.
itemsarray of LineItemrequired
order_idstringrequired
metadataMetadataoptionalFree-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).
customer_emailstring or nulloptionalFormat email.
success_urlstring or nulloptionalFormat uri.
cancel_urlstring or nulloptionalFormat uri.

PaymentSplit

One on-chain payment toward the transaction.

PaymentSplit fields
FieldTypeRequiredDescription
txidstringoptionalOn-chain transaction hash (blockchain id, NOT the GriffNode transaction_id).
amount_cryptonumberoptional
confirmationsintegeroptional
statusstringoptional
detected_atstringoptionalFormat date-time.
confirmed_atstring or nulloptionalFormat date-time.

Transaction

The canonical, curated public view of a transaction (same shape from create, get and list). Internal fields (capability tokens, client_ip, address_index, derivation/db internals) are deliberately NOT exposed.

Transaction fields
FieldTypeRequiredDescription
transaction_idstringrequired
statusTransactionStatusrequiredPublic transaction status (internal sub-states are mapped to these). One of: pending, awaiting_confirmation, completed, partial, expired, failed.
typestringoptionalOne of: basic, detailed.
cryptoCryptoSymbolrequiredSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
deposit_addressstringoptional
amount_cryptonumberoptional
amount_fiatnumberrequired
amount_usdnumberrequired
amount_paidnumberoptional
amount_remainingnumberoptional
currency_fiatFiatCurrencyrequiredOne of: USD, PLN, EUR, GBP. Default USD.
fiat_to_usd_ratenumberoptional
exchange_ratenumberoptionalUSD per unit of crypto, locked at creation.
confirmations_requiredintegeroptional
payment_urlstringoptionalFormat uri.
order_idstring or nulloptional
customer_emailstring or nulloptional
itemsarray or nulloptional
paymentsarray of PaymentSplitoptionalOn-chain payments detected toward this transaction.
metadataMetadataoptionalFree-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).
success_urlstring or nulloptional
cancel_urlstring or nulloptional
created_atstringrequiredFormat date-time.
updated_atstringoptionalFormat date-time.
expires_atstringrequiredFormat date-time.

TransactionEnvelope

TransactionEnvelope fields
FieldTypeRequiredDescription
successtruerequired
dataTransactionrequiredThe canonical, curated public view of a transaction (same shape from create, get and list). Internal fields (capability tokens, client_ip, address_index, derivation/db internals) are deliberately NOT exposed. Fields: transaction_id, status, type, crypto, deposit_address, amount_crypto, amount_fiat, amount_usd, amount_paid, amount_remaining, currency_fiat, fiat_to_usd_rate, exchange_rate, confirmations_required, payment_url, order_id, customer_email, items, payments, metadata, success_url, cancel_url, created_at, updated_at, expires_at.

Cryptocurrency

Cryptocurrency fields
FieldTypeRequiredDescription
symbolCryptoSymboloptionalSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
namestringoptional
blockchainstringoptional
networkstringoptional
typestringoptionalOne of: coin, token.

Account

Account fields
FieldTypeRequiredDescription
planobjectoptionalFields: tier, billing_cycle, auto_renewal, expires_at.
usageobjectoptionalFields: monthly_transactions_used, monthly_transaction_limit, overage_cost_per_tx.
limitsobjectoptionalFields: api_rate_limit_per_minute, api_rate_limit_per_hour, webhook_support.

Plan

Plan fields
FieldTypeRequiredDescription
tierPlanTieroptionalOne of: starter, business, professional, enterprise.
monthly_price_usdnumber or nulloptional
yearly_price_usdnumber or nulloptional
monthly_transaction_limitinteger or nulloptional
overage_cost_per_txnumberoptional
webhook_supportbooleanoptional
webhook_limitinteger or nulloptional
ip_whitelistbooleanoptional
api_rate_limit_per_minuteintegeroptional
api_rate_limit_per_hourintegeroptional
custom_pricingbooleanoptional

Balance

Balance fields
FieldTypeRequiredDescription
currencystringoptional
available_balancenumberoptional
pending_balancenumberoptional
updated_atstringoptionalFormat date-time.

Invoice

Invoice fields
FieldTypeRequiredDescription
transaction_idstringoptional
purchase_typestringoptional
amount_fiatnumberoptional
currency_fiatFiatCurrencyoptionalOne of: USD, PLN, EUR, GBP. Default USD.
statusstringoptional
crypto_symbolCryptoSymboloptionalSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
created_atstringoptionalFormat date-time.
confirmed_atstring or nulloptionalFormat date-time.
expires_atstringoptionalFormat date-time.

Pagination

Pagination fields
FieldTypeRequiredDescription
limitintegerrequired
offsetintegerrequired
totalintegerrequired

WebhookPayload

Payment-event payload. AMOUNTS ARE STRINGS (e.g. "100.00", "0.00109462") to preserve decimal precision — parse before arithmetic.

WebhookPayload fields
FieldTypeRequiredDescription
eventstringrequiredOne of: payment.created, payment.pending, payment.completed, payment.overpaid, payment.partial, payment.expired, payment.failed.
timestampstringrequiredFormat date-time.
transaction_idstringrequired
statusTransactionStatusrequiredPublic transaction status (internal sub-states are mapped to these). One of: pending, awaiting_confirmation, completed, partial, expired, failed.
currency_cryptoCryptoSymboloptionalSupported coin/token symbol. /cryptos/list is authoritative at runtime. One of: BTC, LTC, DOGE, DASH, ETH, USDT, USDC, DAI, WBTC, SHIB, PEPE, LINK, UNI, AAVE, MKR.
currency_fiatFiatCurrencyoptionalOne of: USD, PLN, EUR, GBP. Default USD.
amount_fiatstringoptionalDecimal string.
amount_usdstringoptionalDecimal string.
amount_cryptostringoptionalDecimal string.
order_idstring or nulloptional
receipt_urlstring or nulloptionalPresent on completed/overpaid. Format uri.
metadataMetadataoptionalFree-form key/value (≤20 keys, string values ≤500 chars, ≤4 KB total).

Error

Error fields
FieldTypeRequiredDescription
successfalserequired
errorstringrequiredMachine-readable code.
messagestringrequiredHuman-readable description.

Error responses

Errors return the standard error envelope — success: false, a machine-readable error code and a human-readable message.

Reusable error responses
ResponseWhen it is returned
BadRequestValidation error (INVALID_REQUEST, INVALID_CRYPTO, INVALID_AMOUNT, AMOUNT_TOO_LOW, INVALID_CURRENCY, INVALID_METADATA, WALLET_NOT_CONFIGURED, MISSING_ITEMS, MISSING_ORDER_ID, …).
UnauthorizedMissing or invalid API key (UNAUTHORIZED).
ForbiddenKey lacks permission — e.g. a publishable key on a secret-only endpoint, or plan too low (FORBIDDEN, USE_PAY_ENDPOINT, PLAN_UPGRADE_REQUIRED, NO_ACTIVE_PLAN).
NotFoundResource not found (TRANSACTION_NOT_FOUND).
InsufficientBalanceMerchant platform balance too low for overage fees (INSUFFICIENT_BALANCE).
ActiveTransactionExistsThis client IP already has an active transaction (ACTIVE_TRANSACTION_EXISTS). Body includes an existing_transaction object.
TooManyRequestsRate limit or quota exceeded. error is RATE_LIMIT_EXCEEDED (per-minute request rate — honour Retry-After) or MONTHLY_LIMIT_REACHED (the plan's monthly transaction quota). Rate-limit headers accompany the RATE_LIMIT_EXCEEDED case.
ServerErrorInternal error (RATE_FETCH_FAILED, ADDRESS_GENERATION_FAILED, UPSTREAM_ERROR, …).