BitcofyDevelopers
RUENDashboard ↗
BITCOFY MERCHANT API

Payments, clearly documented

A practical Merchant API guide, from the first invoice to payout reconciliation. Start with hosted checkout, then connect webhooks and server-side automation.

BASE URLhttps://pay.bitcofy.prov1

Your first payment

  1. Create a project in the merchant cabinet. Complete activation if payment is required.
  2. Obtain the project ID, API key and API secret under Integrations. Keep secrets on your server.
  3. Create an invoice with the request below. Store its invoice_id against your order_id.
  4. Redirect the buyer to the returned invoice_url. Bitcofy offers the available networks and assets.
  5. Verify a signed webhook or read the invoice through the API. Fulfil only on the verified result, never on a browser redirect alone.
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/invoices' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{"project_id":"YOUR_PROJECT_ID","order_id":"order-1001","amount":"49.90","currency":"USD","buy_type":"package","success_url":"https://merchant.example/order/success","cancel_url":"https://merchant.example/order/cancel"}'

amount is the order price in USD or RUB, not a USDT quantity. Use the selected payment option's amount_crypto, fees and rate lock. Creating an invoice again with the same project and order ID returns the existing invoice; changed request fields do not update it.

Authentication and secrets

Base origin: https://pay.bitcofy.pro. Reference paths already include /api/v1.

OperationCredentialsPurpose
Public informationNoneNetworks, rates and integration capabilities
Project readsX-API-Key or Authorization: Bearer <project_api_key>Access to your own project
Project writesAPI key plus X-API-SecretInvoices, settings and payouts
Signed payout or request decisionWrite access plus signature, nonce, timestampAdditional Ed25519 signature
Cabinet loginUser sessionNot a Merchant API key

API keys start with bpk_, API secrets with bps_, webhook secrets with bwhsec_live_. These credentials are distinct. Register the Base64 Ed25519 public key; keep the private key on your server. HTTP headers are case-insensitive; JSON names and network/asset values must match the API. JSON writes use Content-Type: application/json.

Invoice lifecycle

Invoice status, transaction confirmations and withdrawable balance are different states.

StatusMeaningAction
createdInvoice exists; payment window has not startedShare checkout URL
waiting_paymentRoute selected and payment window startedAwait payment before session expiry
pendingTransfer detected, processing incompleteWait for confirmations and resolution
paidPayment acceptedFulfil once
paid_overOverpayment acceptedReconcile the actual credited amount
partially_paid, wrong_amount, additional_paymentAmount needs further handlingInspect payments and resolution, not automatic full fulfilment
late_paymentLate payment recordedInspect credit outcome against your order policy
expired, cancelWindow expired or invoice cancelledDo not fulfil from browser navigation alone

Use required_confirmations from the chosen payment option and confirmations/credited from payments. Requirements vary by network and configuration. A transaction hash is not proof of credit.

A created invoice does not represent a running payment window. The session timer starts when the buyer selects a network and asset. The active route and rate are locked for the session; inspect current session fields rather than inferring timing from invoice creation.

Hosted checkout and available assets

Prefer the returned invoice_url. Public by-hash methods support hosted checkout; they do not replace authenticated Merchant API methods.

Before POST …/payment-session, open the hosted invoice page in the same browser. The endpoint requires a valid access cookie and applies rate limits. The invoice hash alone is insufficient. A 403 asking to open the hosted page indicates missing access.

/api/v1/public/networks describes platform capabilities. For an invoice, use its current payment_options; project and administrator restrictions can change availability. Do not offer an option from an obsolete cache. Read address and amount for the same network/asset pair. A token symbol on another network is not interchangeable. Return URLs control navigation, not payment confirmation.

Receive and verify webhooks

Configure a public HTTPS URL through the cabinet or POST …/webhook/config, send a test through POST …/webhook/test, and inspect delivery records through GET …/webhook/events.

Headers: X-Bitcofy-Event-Id, X-Bitcofy-Event-Type, X-Bitcofy-Timestamp, X-Bitcofy-Signature, X-Bitcofy-Retry-Count. Signature: hex HMAC-SHA256 using the webhook secret over the exact timestamp string, a dot, and the original request body bytes. Do not re-serialize JSON before verification.

javascript
import { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyWebhook(rawBody, timestamp, signature, secret) {
  if (!Buffer.isBuffer(rawBody) || typeof timestamp !== 'string' ||
      typeof signature !== 'string' || !/^[a-f0-9]{64}$/i.test(signature)) return false;
  const expected = createHmac('sha256', secret)
    .update(timestamp + '.', 'utf8').update(rawBody).digest();
  return timingSafeEqual(expected, Buffer.from(signature, 'hex'));
}
  1. Verify signature, timestamp freshness and project ownership. Choose your receiver freshness window with clock skew in mind.
  2. Persist and deduplicate by event_id atomically with order processing.
  3. Return any 2xx after durable acceptance. Queue slow processing.
  4. Handle duplicate and out-of-order deliveries; retrieve the current object when needed.

Delivery timeout is 5 seconds, with up to 10 total attempts. Retry delays are 15, 30, 60, 120, 240 seconds, then capped at 300 seconds; queue scheduling affects actual delivery time. Exhausted events become dead. Use API reconciliation as well as webhooks.

Core events: invoice.created, invoice.status_changed, payout.created, payout.processing, payout.status_changed, payout.rejected, webhook.test. Additional payout transition events can occur. Do not depend on arrival order.

Payouts and approval requests

Use a directly signed POST /api/v1/payouts, or create a payout request through POST …/payout-requests for a separate approval/rejection step.

Check /balances, network, asset and destination first. Ledger balance can exceed available_for_withdrawal because collection is pending. Obtain fees and availability from the API. For direct payouts, amount includes the fee; reconcile gross_amount, fee_amount and net_amount. HTTP 200 does not mean blockchain sending is complete.

StateMeaning
requestedAwaiting a decision
approved, rejectedRequest decision; approval does not prove payout completion
pending / provider_status=processingPayout processing
success / provider_status=completedCompleted
send_error / provider_status=failedSending error; reconcile result and reservation release

Store request, payout and idempotency IDs, transaction hash and final-state flags. GET …/payouts/reconcile accepts exactly one of request_id, payout_id or idempotency_key.

Ed25519 signing

Generate keys on your server and register the public key with POST …/security/payout-key. Base64-encode the signature. API key and secret remain required.

The direct payout message is UTF-8, joined with LF (\n), without a trailing newline:

text
bitcofy-payout-v1
{project_id}
{network}
{asset}
{amount}
{destination_address}
{idempotency_key}
{nonce}
{timestamp_utc}

Approval/rejection uses a different message. Action is approve or reject; keep the reason line empty for approval:

text
bitcofy-payout-approval-v1
{project_id}
{request_id}
{action}
{rejection_reason_or_empty}
{nonce}
{timestamp_utc}

Timestamp must be within 5 minutes of server time. The server normalizes it using Python UTC isoformat(). Send and sign a timestamp without fractional seconds and with +00:00, for example 2026-09-29T12:00:00+00:00, to avoid Z/offset and fractional-second differences. Generate a unique nonce for each new signed attempt.

Send amount as a plain decimal string without exponent notation and sign the identical string. Avoid floating-point numbers. A server-provided example message illustrates the format; sign the actual values of your operation.

These examples sign an already assembled canonical message. API-generated private_key is a Base64 32-byte seed. This differs from the expanded 64-byte TweetNaCl/Go key; convert the seed as shown below.

Node.js

javascript
import { createPrivateKey, sign } from 'node:crypto';

// message: canonical UTF-8 message shown above, no trailing newline.
export function signMessage(seedBase64, message) {
  const seed = Buffer.from(seedBase64, 'base64');
  if (seed.length !== 32) throw new Error('Expected a 32-byte Ed25519 seed');
  const pkcs8 = Buffer.concat([
    Buffer.from('302e020100300506032b657004220420', 'hex'), seed
  ]);
  const key = createPrivateKey({ key: pkcs8, format: 'der', type: 'pkcs8' });
  return sign(null, Buffer.from(message, 'utf8'), key).toString('base64');
}

Python

python
# Dependency: cryptography
import base64
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey

def sign_message(seed_base64: str, message: str) -> str:
    seed = base64.b64decode(seed_base64, validate=True)
    key = Ed25519PrivateKey.from_private_bytes(seed)  # 32-byte seed
    return base64.b64encode(key.sign(message.encode('utf-8'))).decode('ascii')

Go

go
package payouts

import (
    "crypto/ed25519"
    "encoding/base64"
    "fmt"
)

func SignMessage(seedBase64 string, message string) (string, error) {
    seed, err := base64.StdEncoding.DecodeString(seedBase64)
    if err != nil || len(seed) != ed25519.SeedSize {
        return "", fmt.Errorf("expected a Base64 32-byte Ed25519 seed")
    }
    key := ed25519.NewKeyFromSeed(seed)
    signature := ed25519.Sign(key, []byte(message))
    return base64.StdEncoding.EncodeToString(signature), nil
}

Retries and reconciliation

SituationAction
Invoice creation timeoutFind by order ID or retry with the same order ID
Payout timeoutQuery by the same idempotency key or reconcile first
Payout already existsObserve it; do not create a second payout
New signed attempt after reconciliationKeep the logical operation key, refresh nonce/timestamp, sign again
400, 401, 403, 422Fix parameters, access or signature before retrying
Payout 409Inspect the structured reason, available balance and reservation
429 or temporary unavailabilityBack off with jitter; respect Retry-After when present

Do not change the idempotency key just because a response was lost. A failed connection can leave a write's outcome unknown. Prefer status reads and webhooks over repeated POST requests.

Before going live

  1. Verify project access, activation and asset availability.
  2. Exercise successful, partial, expired and late payments.
  3. Verify raw-body webhook signatures, duplicates and out-of-order events.
  4. Ensure browser redirects cannot fulfil orders without API confirmation.
  5. Exercise response loss, identifier lookup and payout duplicate protection.
  6. Verify payout fees, available balances, Ed25519 encoding, nonce and timestamp.
  7. Log operation identifiers and errors without credentials or private keys.

For agents and automated readers

Share the documentation URL directly. The full guide and reference are present in HTML without JavaScript or authentication.

Choose a workflow, then consult the exact endpoint. Replace illustrative IDs and example values; they are not real credentials. Fetch networks, fees and confirmation requirements from the API.

Every request, explained

Choose an endpoint. Expand parameters, success responses and errors separately. Examples illustrate shape; replace identifiers and sign the actual values before sending.

Reference data

GET

Health

/api/v1/health
No API key
Parameters & request example

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/health'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
statusstringRequiredObject state; see the relevant workflow for values and actions.
appstringRequiredApp
json
{
  "status": "ok",
  "app": "string"
}
Errors & recovery

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
json
{
  "detail": "Error description"
}
GET

List Rates

/api/v1/public/rates
No API key
Parameters & request example

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/public/rates'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
ratesarray<object>RequiredRates
rates[].base_currencystringRequiredBase Currency
rates[].quote_currencystringRequiredQuote Currency
rates[].ratestringRequiredRate pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
rates[].sourcestringRequiredSource
rates[].captured_atstringRequiredCaptured At format: date-time
json
{
  "rates": [
    {
      "base_currency": "USD",
      "quote_currency": "USD",
      "rate": "string",
      "source": "api",
      "captured_at": "2026-07-13T12:00:00Z"
    }
  ]
}
Errors & recovery

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
json
{
  "detail": "Error description"
}
GET

List Networks

/api/v1/public/networks
No API key
  • This is a network registry. Determine invoice-specific availability from its payment_options.
Parameters & request example

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/public/networks'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

json
[
  {
    "example_key": "string"
  }
]
Errors & recovery

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
json
{
  "detail": "Error description"
}
GET

List Public Integrations

/api/v1/public/integrations
No API key
Parameters & request example

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/public/integrations'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
[].slugstringRequiredSlug
[].display_namestringRequiredDisplay Name
[].categorystringRequiredCategory
[].descriptionstringRequiredDescription
[].supports_webhooksbooleanRequiredSupports Webhooks
[].supports_embedded_checkoutbooleanRequiredSupports Embedded Checkout
[].docs_markdownstringRequiredDocs Markdown
json
[
  {
    "slug": "string",
    "display_name": "string",
    "category": "string",
    "description": "string",
    "supports_webhooks": false,
    "supports_embedded_checkout": false,
    "docs_markdown": "string"
  }
]
Errors & recovery

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
json
{
  "detail": "Error description"
}

Invoices & checkout

POST

Create Invoice

/api/v1/invoices
X-API-Key + X-API-Secret
  • USD or RUB; buy_type: package or balance. Repeated project_id + order_id returns the existing invoice without updating it.
Parameters & request example
FieldTypePresenceMeaning & constraints
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
project_idstringRequiredProject identifier; must belong to the API key.
order_idstringRequiredYour order identifier. Reuse in the same project returns the existing invoice.
amountnumber / stringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. >: 0; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
currencystringRequiredUSD or RUB; order price currency, not the cryptoasset.
buy_typestringOptionalpackage: order payment; balance: credit actual confirmed amount after fee. default: "package"; min length: 1; max length: 32
callback_urlstring / nullOptionalLegacy invoice field; does not configure project webhooks. Use /webhook/config.
success_urlstring / nullOptionalAbsolute HTTP(S) return URL after payment. A redirect does not prove credit.
cancel_urlstring / nullOptionalAbsolute HTTP(S) return URL on cancellation.
customer_idstring / nullOptionalOptional customer identifier in your system.
customer_emailstring / nullOptionalOptional valid customer email. format: email
metadataobjectOptionalYour JSON order metadata. System billing_invoice_kind fields are reserved.
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/invoices' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "project_id": "project_demo_001",
  "order_id": "order_1001",
  "amount": "100.00",
  "currency": "USD",
  "buy_type": "package",
  "callback_url": "https://merchant.example/api/bitcofy/webhook",
  "success_url": "https://merchant.example/payment/success",
  "cancel_url": "https://merchant.example/payment/cancel",
  "customer_id": "customer_42",
  "customer_email": "buyer@example.com",
  "metadata": {
    "order_ref": "SO-1001",
    "source": "landing",
    "plan": "pro"
  }
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
invoice_idstringRequiredInvoice identifier returned on creation.
invoice_hashstringRequiredPublic identifier from the checkout URL. Keep customer links private.
invoice_urlstringRequiredHosted checkout URL for the customer.
requested_usd_amountstringRequiredRequested Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
service_fee_usd_amountstring / nullOptionalService Fee Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_payable_usd_amountstring / nullOptionalTotal Payable Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
expires_atstringRequiredExpires At format: date-time
statusstringRequiredObject state; see the relevant workflow for values and actions.
buy_typestringRequiredpackage: order payment; balance: credit actual confirmed amount after fee.
invoice_languagestringRequiredInvoice Language
resolved_languagestringRequiredResolved Language
success_urlstring / nullOptionalAbsolute HTTP(S) return URL after payment. A redirect does not prove credit.
cancel_urlstring / nullOptionalAbsolute HTTP(S) return URL on cancellation.
payment_session_started_atstring / nullOptionalPayment Session Started At format: date-time
payment_session_expires_atstring / nullOptionalPayment Session Expires At format: date-time
payment_session_activebooleanOptionalPayment Session Active default: false
selected_networkstring / nullOptionalSelected Network
selected_assetstring / nullOptionalSelected Asset
payment_optionsarray<object>RequiredPayment Options
payment_options[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
payment_options[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
payment_options[].option_keystringRequiredOption Key
payment_options[].fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_locked_untilstringRequiredRate Locked Until format: date-time
payment_options[].required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
payment_options[].network_logo_urlstring / nullOptionalNetwork Logo Url
payment_options[].asset_logo_urlstring / nullOptionalAsset Logo Url
tracked_payment_optionobject / nullOptionaltracked payment option
tracked_payment_option.networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
tracked_payment_option.assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
tracked_payment_option.option_keystringRequiredOption Key
tracked_payment_option.fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_locked_untilstringRequiredRate Locked Until format: date-time
tracked_payment_option.required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
tracked_payment_option.network_logo_urlstring / nullOptionalNetwork Logo Url
tracked_payment_option.asset_logo_urlstring / nullOptionalAsset Logo Url
json
{
  "invoice_id": "inv_demo_001",
  "invoice_hash": "dd8659b3058a",
  "invoice_url": "string",
  "requested_usd_amount": "string",
  "service_fee_usd_amount": "string",
  "total_payable_usd_amount": "string",
  "expires_at": "2026-07-13T12:00:00Z",
  "status": "ok",
  "buy_type": "package",
  "invoice_language": "auto",
  "resolved_language": "auto",
  "success_url": "https://merchant.example/payment/success",
  "cancel_url": "https://merchant.example/payment/cancel",
  "payment_session_started_at": "2026-07-13T12:00:00Z",
  "payment_session_expires_at": "2026-07-13T12:00:00Z",
  "payment_session_active": false,
  "selected_network": "Tron",
  "selected_asset": "USDT",
  "payment_options": [
    {
      "network": "Tron",
      "asset": "USDT",
      "option_key": "string",
      "fee_percent": "0",
      "fee_usd_amount": "0",
      "total_payable_usd_amount": "0",
      "amount_crypto": "string",
      "rate_value": "string",
      "rate_locked_until": "2026-07-13T12:00:00Z",
      "required_confirmations": 1,
      "network_logo_url": "Tron",
      "asset_logo_url": "USDT"
    }
  ],
  "tracked_payment_option": {
    "network": "Tron",
    "asset": "USDT",
    "option_key": "string",
    "fee_percent": "0",
    "fee_usd_amount": "0",
    "total_payable_usd_amount": "0",
    "amount_crypto": "string",
    "rate_value": "string",
    "rate_locked_until": "2026-07-13T12:00:00Z",
    "required_confirmations": 1,
    "network_logo_url": "Tron",
    "asset_logo_url": "USDT"
  }
}
Errors & recovery400 · 401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Invoice not found after creation
json
{
  "detail": "Error description"
}
GET

Get Invoice

/api/v1/invoices/{invoice_id}
X-API-Key
  • A detected transaction does not yet imply credit. Check status, confirmations, required_confirmations and credited where present.
Parameters & request example
FieldTypePresenceMeaning & constraints
invoice_idpath · stringRequiredInvoice identifier returned on creation.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/invoices/YOUR_INVOICE_ID' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
invoice_idstringRequiredInvoice identifier returned on creation.
invoice_hashstringRequiredPublic identifier from the checkout URL. Keep customer links private.
invoice_urlstringRequiredHosted checkout URL for the customer.
requested_usd_amountstringRequiredRequested Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
service_fee_usd_amountstring / nullOptionalService Fee Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_payable_usd_amountstring / nullOptionalTotal Payable Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
expires_atstringRequiredExpires At format: date-time
statusstringRequiredObject state; see the relevant workflow for values and actions.
buy_typestringRequiredpackage: order payment; balance: credit actual confirmed amount after fee.
invoice_languagestringRequiredInvoice Language
resolved_languagestringRequiredResolved Language
success_urlstring / nullOptionalAbsolute HTTP(S) return URL after payment. A redirect does not prove credit.
cancel_urlstring / nullOptionalAbsolute HTTP(S) return URL on cancellation.
payment_session_started_atstring / nullOptionalPayment Session Started At format: date-time
payment_session_expires_atstring / nullOptionalPayment Session Expires At format: date-time
payment_session_activebooleanOptionalPayment Session Active default: false
selected_networkstring / nullOptionalSelected Network
selected_assetstring / nullOptionalSelected Asset
payment_optionsarray<object>RequiredPayment Options
payment_options[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
payment_options[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
payment_options[].option_keystringRequiredOption Key
payment_options[].fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_locked_untilstringRequiredRate Locked Until format: date-time
payment_options[].required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
payment_options[].network_logo_urlstring / nullOptionalNetwork Logo Url
payment_options[].asset_logo_urlstring / nullOptionalAsset Logo Url
tracked_payment_optionobject / nullOptionaltracked payment option
tracked_payment_option.networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
tracked_payment_option.assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
tracked_payment_option.option_keystringRequiredOption Key
tracked_payment_option.fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_locked_untilstringRequiredRate Locked Until format: date-time
tracked_payment_option.required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
tracked_payment_option.network_logo_urlstring / nullOptionalNetwork Logo Url
tracked_payment_option.asset_logo_urlstring / nullOptionalAsset Logo Url
order_idstringRequiredYour order identifier. Reuse in the same project returns the existing invoice.
fiat_currencystringRequiredFiat Currency
amount_fiatstringRequiredAmount Fiat pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
deposit_addressesarray<object>RequiredDeposit Addresses
deposit_addresses[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
deposit_addresses[].addressstringRequiredAddress
deposit_addresses[].derivation_pathstringRequiredDerivation Path
deposit_addresses[].wallet_statusstringRequiredWallet Status
json
{
  "invoice_id": "inv_demo_001",
  "invoice_hash": "dd8659b3058a",
  "invoice_url": "string",
  "requested_usd_amount": "string",
  "service_fee_usd_amount": "string",
  "total_payable_usd_amount": "string",
  "expires_at": "2026-07-13T12:00:00Z",
  "status": "ok",
  "buy_type": "package",
  "invoice_language": "auto",
  "resolved_language": "auto",
  "success_url": "https://merchant.example/payment/success",
  "cancel_url": "https://merchant.example/payment/cancel",
  "payment_session_started_at": "2026-07-13T12:00:00Z",
  "payment_session_expires_at": "2026-07-13T12:00:00Z",
  "payment_session_active": false,
  "selected_network": "Tron",
  "selected_asset": "USDT",
  "payment_options": [
    {
      "network": "Tron",
      "asset": "USDT",
      "option_key": "string",
      "fee_percent": "0",
      "fee_usd_amount": "0",
      "total_payable_usd_amount": "0",
      "amount_crypto": "string",
      "rate_value": "string",
      "rate_locked_until": "2026-07-13T12:00:00Z",
      "required_confirmations": 1,
      "network_logo_url": "Tron",
      "asset_logo_url": "USDT"
    }
  ],
  "tracked_payment_option": {
    "network": "Tron",
    "asset": "USDT",
    "option_key": "string",
    "fee_percent": "0",
    "fee_usd_amount": "0",
    "total_payable_usd_amount": "0",
    "amount_crypto": "string",
    "rate_value": "string",
    "rate_locked_until": "2026-07-13T12:00:00Z",
    "required_confirmations": 1,
    "network_logo_url": "Tron",
    "asset_logo_url": "USDT"
  },
  "order_id": "order_1001",
  "fiat_currency": "USD",
  "amount_fiat": "string",
  "deposit_addresses": [
    {
      "network": "Tron",
      "address": "TQ9ExampleDestinationAddress123456789",
      "derivation_path": "string",
      "wallet_status": "string"
    }
  ]
}
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Invoice not found
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Get Invoice Payments

/api/v1/invoices/{invoice_id}/payments
X-API-Key
  • A detected transaction does not yet imply credit. Check status, confirmations, required_confirmations and credited where present.
Parameters & request example
FieldTypePresenceMeaning & constraints
invoice_idpath · stringRequiredInvoice identifier returned on creation.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/invoices/YOUR_INVOICE_ID/payments' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
invoice_idstringRequiredInvoice identifier returned on creation.
invoice_statusstringRequiredInvoice Status
buy_typestringRequiredpackage: order payment; balance: credit actual confirmed amount after fee.
credited_total_amountstringOptionalCredited Total Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
credited_fee_totalstringOptionalCredited Fee Total default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
itemsarray<object>RequiredItems
items[].transaction_idstringRequiredTransaction Id
items[].invoice_idstringRequiredInvoice identifier returned on creation.
items[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
items[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
items[].tx_hashstringRequiredTx Hash
items[].logical_indexstringRequiredLogical Index
items[].addressstringRequiredAddress
items[].amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
items[].confirmationsintegerRequiredCurrent confirmation count for the detected transaction.
items[].block_numberinteger / nullOptionalBlock Number
items[].statusstringRequiredObject state; see the relevant workflow for values and actions.
items[].buy_typestringRequiredpackage: order payment; balance: credit actual confirmed amount after fee.
items[].crediting_statusstringRequiredCrediting Status
items[].net_amount_after_feestringOptionalNet Amount After Fee default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
items[].fee_amountstringOptionalFee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
items[].detected_atstringRequiredDetected At format: date-time
items[].confirmed_atstring / nullOptionalConfirmed At format: date-time
json
{
  "invoice_id": "inv_demo_001",
  "invoice_status": "string",
  "buy_type": "package",
  "credited_total_amount": "0",
  "credited_fee_total": "0",
  "items": [
    {
      "transaction_id": "string",
      "invoice_id": "inv_demo_001",
      "network": "Tron",
      "asset": "USDT",
      "tx_hash": "0xabc123def456",
      "logical_index": "string",
      "address": "TQ9ExampleDestinationAddress123456789",
      "amount": "string",
      "confirmations": 1,
      "block_number": 1,
      "status": "ok",
      "buy_type": "package",
      "crediting_status": "string",
      "net_amount_after_fee": "0",
      "fee_amount": "0",
      "detected_at": "2026-07-13T12:00:00Z",
      "confirmed_at": "2026-07-13T12:00:00Z"
    }
  ]
}
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Invoice not found
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Get Invoice By Hash

/api/v1/public/invoices/by-hash/{invoice_hash}
No API key
  • A detected transaction does not yet imply credit. Check status, confirmations, required_confirmations and credited where present.
Parameters & request example
FieldTypePresenceMeaning & constraints
invoice_hashpath · stringRequiredPublic identifier from the checkout URL. Keep customer links private.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/public/invoices/by-hash/YOUR_INVOICE_HASH'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
invoice_idstringRequiredInvoice identifier returned on creation.
invoice_hashstringRequiredPublic identifier from the checkout URL. Keep customer links private.
invoice_urlstringRequiredHosted checkout URL for the customer.
requested_usd_amountstringRequiredRequested Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
service_fee_usd_amountstring / nullOptionalService Fee Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_payable_usd_amountstring / nullOptionalTotal Payable Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
expires_atstringRequiredExpires At format: date-time
statusstringRequiredObject state; see the relevant workflow for values and actions.
buy_typestringRequiredpackage: order payment; balance: credit actual confirmed amount after fee.
invoice_languagestringRequiredInvoice Language
resolved_languagestringRequiredResolved Language
success_urlstring / nullOptionalAbsolute HTTP(S) return URL after payment. A redirect does not prove credit.
cancel_urlstring / nullOptionalAbsolute HTTP(S) return URL on cancellation.
payment_session_started_atstring / nullOptionalPayment Session Started At format: date-time
payment_session_expires_atstring / nullOptionalPayment Session Expires At format: date-time
payment_session_activebooleanOptionalPayment Session Active default: false
selected_networkstring / nullOptionalSelected Network
selected_assetstring / nullOptionalSelected Asset
payment_optionsarray<object>RequiredPayment Options
payment_options[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
payment_options[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
payment_options[].option_keystringRequiredOption Key
payment_options[].fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_locked_untilstringRequiredRate Locked Until format: date-time
payment_options[].required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
payment_options[].network_logo_urlstring / nullOptionalNetwork Logo Url
payment_options[].asset_logo_urlstring / nullOptionalAsset Logo Url
tracked_payment_optionobject / nullOptionaltracked payment option
tracked_payment_option.networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
tracked_payment_option.assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
tracked_payment_option.option_keystringRequiredOption Key
tracked_payment_option.fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_locked_untilstringRequiredRate Locked Until format: date-time
tracked_payment_option.required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
tracked_payment_option.network_logo_urlstring / nullOptionalNetwork Logo Url
tracked_payment_option.asset_logo_urlstring / nullOptionalAsset Logo Url
deposit_addressesarray<object>RequiredDeposit Addresses
deposit_addresses[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
deposit_addresses[].addressstringRequiredAddress
json
{
  "invoice_id": "inv_demo_001",
  "invoice_hash": "dd8659b3058a",
  "invoice_url": "string",
  "requested_usd_amount": "string",
  "service_fee_usd_amount": "string",
  "total_payable_usd_amount": "string",
  "expires_at": "2026-07-13T12:00:00Z",
  "status": "ok",
  "buy_type": "package",
  "invoice_language": "auto",
  "resolved_language": "auto",
  "success_url": "https://merchant.example/payment/success",
  "cancel_url": "https://merchant.example/payment/cancel",
  "payment_session_started_at": "2026-07-13T12:00:00Z",
  "payment_session_expires_at": "2026-07-13T12:00:00Z",
  "payment_session_active": false,
  "selected_network": "Tron",
  "selected_asset": "USDT",
  "payment_options": [
    {
      "network": "Tron",
      "asset": "USDT",
      "option_key": "string",
      "fee_percent": "0",
      "fee_usd_amount": "0",
      "total_payable_usd_amount": "0",
      "amount_crypto": "string",
      "rate_value": "string",
      "rate_locked_until": "2026-07-13T12:00:00Z",
      "required_confirmations": 1,
      "network_logo_url": "Tron",
      "asset_logo_url": "USDT"
    }
  ],
  "tracked_payment_option": {
    "network": "Tron",
    "asset": "USDT",
    "option_key": "string",
    "fee_percent": "0",
    "fee_usd_amount": "0",
    "total_payable_usd_amount": "0",
    "amount_crypto": "string",
    "rate_value": "string",
    "rate_locked_until": "2026-07-13T12:00:00Z",
    "required_confirmations": 1,
    "network_logo_url": "Tron",
    "asset_logo_url": "USDT"
  },
  "deposit_addresses": [
    {
      "network": "Tron",
      "address": "TQ9ExampleDestinationAddress123456789"
    }
  ]
}
Errors & recovery404 · 422 · 429

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
429Rate limit exceededBack off with jitter and honor Retry-After when present.

Possible detail messages

  • Too many public invoice requests
  • Invoice not found
json
{
  "detail": "Error description"
}
POST

Start Public Invoice Payment Session

/api/v1/public/invoices/by-hash/{invoice_hash}/payment-session
Checkout page cookie
  • First open /payment_{invoice_hash} to obtain the access cookie. Normally called by hosted checkout.
Parameters & request example
FieldTypePresenceMeaning & constraints
invoice_hashpath · stringRequiredPublic identifier from the checkout URL. Keep customer links private.

JSON body

FieldTypePresenceMeaning & constraints
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options. min length: 1; max length: 32
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project. min length: 1; max length: 32
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/public/invoices/by-hash/YOUR_INVOICE_HASH/payment-session' \
  --cookie checkout-cookies.txt \
  --header 'Content-Type: application/json' \
  --data '{
  "network": "Ethereum",
  "asset": "USDT"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
invoice_idstringRequiredInvoice identifier returned on creation.
invoice_hashstringRequiredPublic identifier from the checkout URL. Keep customer links private.
invoice_urlstringRequiredHosted checkout URL for the customer.
requested_usd_amountstringRequiredRequested Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
service_fee_usd_amountstring / nullOptionalService Fee Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_payable_usd_amountstring / nullOptionalTotal Payable Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
expires_atstringRequiredExpires At format: date-time
statusstringRequiredObject state; see the relevant workflow for values and actions.
buy_typestringRequiredpackage: order payment; balance: credit actual confirmed amount after fee.
invoice_languagestringRequiredInvoice Language
resolved_languagestringRequiredResolved Language
success_urlstring / nullOptionalAbsolute HTTP(S) return URL after payment. A redirect does not prove credit.
cancel_urlstring / nullOptionalAbsolute HTTP(S) return URL on cancellation.
payment_session_started_atstring / nullOptionalPayment Session Started At format: date-time
payment_session_expires_atstring / nullOptionalPayment Session Expires At format: date-time
payment_session_activebooleanOptionalPayment Session Active default: false
selected_networkstring / nullOptionalSelected Network
selected_assetstring / nullOptionalSelected Asset
payment_optionsarray<object>RequiredPayment Options
payment_options[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
payment_options[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
payment_options[].option_keystringRequiredOption Key
payment_options[].fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_locked_untilstringRequiredRate Locked Until format: date-time
payment_options[].required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
payment_options[].network_logo_urlstring / nullOptionalNetwork Logo Url
payment_options[].asset_logo_urlstring / nullOptionalAsset Logo Url
tracked_payment_optionobject / nullOptionaltracked payment option
tracked_payment_option.networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
tracked_payment_option.assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
tracked_payment_option.option_keystringRequiredOption Key
tracked_payment_option.fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_locked_untilstringRequiredRate Locked Until format: date-time
tracked_payment_option.required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
tracked_payment_option.network_logo_urlstring / nullOptionalNetwork Logo Url
tracked_payment_option.asset_logo_urlstring / nullOptionalAsset Logo Url
deposit_addressesarray<object>RequiredDeposit Addresses
deposit_addresses[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
deposit_addresses[].addressstringRequiredAddress
json
{
  "invoice_id": "inv_demo_001",
  "invoice_hash": "dd8659b3058a",
  "invoice_url": "string",
  "requested_usd_amount": "string",
  "service_fee_usd_amount": "string",
  "total_payable_usd_amount": "string",
  "expires_at": "2026-07-13T12:00:00Z",
  "status": "ok",
  "buy_type": "package",
  "invoice_language": "auto",
  "resolved_language": "auto",
  "success_url": "https://merchant.example/payment/success",
  "cancel_url": "https://merchant.example/payment/cancel",
  "payment_session_started_at": "2026-07-13T12:00:00Z",
  "payment_session_expires_at": "2026-07-13T12:00:00Z",
  "payment_session_active": false,
  "selected_network": "Tron",
  "selected_asset": "USDT",
  "payment_options": [
    {
      "network": "Tron",
      "asset": "USDT",
      "option_key": "string",
      "fee_percent": "0",
      "fee_usd_amount": "0",
      "total_payable_usd_amount": "0",
      "amount_crypto": "string",
      "rate_value": "string",
      "rate_locked_until": "2026-07-13T12:00:00Z",
      "required_confirmations": 1,
      "network_logo_url": "Tron",
      "asset_logo_url": "USDT"
    }
  ],
  "tracked_payment_option": {
    "network": "Tron",
    "asset": "USDT",
    "option_key": "string",
    "fee_percent": "0",
    "fee_usd_amount": "0",
    "total_payable_usd_amount": "0",
    "amount_crypto": "string",
    "rate_value": "string",
    "rate_locked_until": "2026-07-13T12:00:00Z",
    "required_confirmations": 1,
    "network_logo_url": "Tron",
    "asset_logo_url": "USDT"
  },
  "deposit_addresses": [
    {
      "network": "Tron",
      "address": "TQ9ExampleDestinationAddress123456789"
    }
  ]
}
Errors & recovery400 · 403 · 404 · 422 · 429

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
429Rate limit exceededBack off with jitter and honor Retry-After when present.

Possible detail messages

  • Too many public invoice requests
  • Open the hosted invoice page before starting a payment session
  • Invoice not found
json
{
  "detail": "Error description"
}
GET

Get Public Invoice Payments By Hash

/api/v1/public/invoices/by-hash/{invoice_hash}/payments
No API key
  • A detected transaction does not yet imply credit. Check status, confirmations, required_confirmations and credited where present.
Parameters & request example
FieldTypePresenceMeaning & constraints
invoice_hashpath · stringRequiredPublic identifier from the checkout URL. Keep customer links private.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/public/invoices/by-hash/YOUR_INVOICE_HASH/payments'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
invoice_idstringRequiredInvoice identifier returned on creation.
invoice_statusstringRequiredInvoice Status
itemsarray<object>RequiredItems
items[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
items[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
items[].confirmationsintegerRequiredCurrent confirmation count for the detected transaction.
items[].statusstringRequiredObject state; see the relevant workflow for values and actions.
json
{
  "invoice_id": "inv_demo_001",
  "invoice_status": "string",
  "items": [
    {
      "network": "Tron",
      "asset": "USDT",
      "confirmations": 1,
      "status": "ok"
    }
  ]
}
Errors & recovery404 · 422 · 429

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
429Rate limit exceededBack off with jitter and honor Retry-After when present.

Possible detail messages

  • Too many public invoice requests
  • Invoice not found
json
{
  "detail": "Error description"
}
GET

Poll Invoice By Order

/api/v1/projects/{project_id}/invoices/by-order/{order_id}
X-API-Key
  • A detected transaction does not yet imply credit. Check status, confirmations, required_confirmations and credited where present.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
order_idpath · stringRequiredYour order identifier. Reuse in the same project returns the existing invoice.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/invoices/by-order/YOUR_ORDER_ID' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
invoice_idstringRequiredInvoice identifier returned on creation.
invoice_hashstringRequiredPublic identifier from the checkout URL. Keep customer links private.
invoice_urlstringRequiredHosted checkout URL for the customer.
requested_usd_amountstringRequiredRequested Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
service_fee_usd_amountstring / nullOptionalService Fee Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_payable_usd_amountstring / nullOptionalTotal Payable Usd Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
expires_atstringRequiredExpires At format: date-time
statusstringRequiredObject state; see the relevant workflow for values and actions.
buy_typestringRequiredpackage: order payment; balance: credit actual confirmed amount after fee.
invoice_languagestringRequiredInvoice Language
resolved_languagestringRequiredResolved Language
success_urlstring / nullOptionalAbsolute HTTP(S) return URL after payment. A redirect does not prove credit.
cancel_urlstring / nullOptionalAbsolute HTTP(S) return URL on cancellation.
payment_session_started_atstring / nullOptionalPayment Session Started At format: date-time
payment_session_expires_atstring / nullOptionalPayment Session Expires At format: date-time
payment_session_activebooleanOptionalPayment Session Active default: false
selected_networkstring / nullOptionalSelected Network
selected_assetstring / nullOptionalSelected Asset
payment_optionsarray<object>RequiredPayment Options
payment_options[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
payment_options[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
payment_options[].option_keystringRequiredOption Key
payment_options[].fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payment_options[].rate_locked_untilstringRequiredRate Locked Until format: date-time
payment_options[].required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
payment_options[].network_logo_urlstring / nullOptionalNetwork Logo Url
payment_options[].asset_logo_urlstring / nullOptionalAsset Logo Url
tracked_payment_optionobject / nullOptionaltracked payment option
tracked_payment_option.networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
tracked_payment_option.assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
tracked_payment_option.option_keystringRequiredOption Key
tracked_payment_option.fee_percentstringOptionalFee Percent default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.fee_usd_amountstringOptionalFee Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.total_payable_usd_amountstringOptionalTotal Payable Usd Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.amount_cryptostringRequiredCryptoasset amount for the selected payment route. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_valuestringRequiredRate Value pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
tracked_payment_option.rate_locked_untilstringRequiredRate Locked Until format: date-time
tracked_payment_option.required_confirmationsintegerRequiredConfirmation threshold for this network; do not hardcode it.
tracked_payment_option.network_logo_urlstring / nullOptionalNetwork Logo Url
tracked_payment_option.asset_logo_urlstring / nullOptionalAsset Logo Url
order_idstringRequiredYour order identifier. Reuse in the same project returns the existing invoice.
fiat_currencystringRequiredFiat Currency
amount_fiatstringRequiredAmount Fiat pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
deposit_addressesarray<object>RequiredDeposit Addresses
deposit_addresses[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
deposit_addresses[].addressstringRequiredAddress
deposit_addresses[].derivation_pathstringRequiredDerivation Path
deposit_addresses[].wallet_statusstringRequiredWallet Status
project_idstringRequiredProject identifier; must belong to the API key.
json
{
  "invoice_id": "inv_demo_001",
  "invoice_hash": "dd8659b3058a",
  "invoice_url": "string",
  "requested_usd_amount": "string",
  "service_fee_usd_amount": "string",
  "total_payable_usd_amount": "string",
  "expires_at": "2026-07-13T12:00:00Z",
  "status": "ok",
  "buy_type": "package",
  "invoice_language": "auto",
  "resolved_language": "auto",
  "success_url": "https://merchant.example/payment/success",
  "cancel_url": "https://merchant.example/payment/cancel",
  "payment_session_started_at": "2026-07-13T12:00:00Z",
  "payment_session_expires_at": "2026-07-13T12:00:00Z",
  "payment_session_active": false,
  "selected_network": "Tron",
  "selected_asset": "USDT",
  "payment_options": [
    {
      "network": "Tron",
      "asset": "USDT",
      "option_key": "string",
      "fee_percent": "0",
      "fee_usd_amount": "0",
      "total_payable_usd_amount": "0",
      "amount_crypto": "string",
      "rate_value": "string",
      "rate_locked_until": "2026-07-13T12:00:00Z",
      "required_confirmations": 1,
      "network_logo_url": "Tron",
      "asset_logo_url": "USDT"
    }
  ],
  "tracked_payment_option": {
    "network": "Tron",
    "asset": "USDT",
    "option_key": "string",
    "fee_percent": "0",
    "fee_usd_amount": "0",
    "total_payable_usd_amount": "0",
    "amount_crypto": "string",
    "rate_value": "string",
    "rate_locked_until": "2026-07-13T12:00:00Z",
    "required_confirmations": 1,
    "network_logo_url": "Tron",
    "asset_logo_url": "USDT"
  },
  "order_id": "order_1001",
  "fiat_currency": "USD",
  "amount_fiat": "string",
  "deposit_addresses": [
    {
      "network": "Tron",
      "address": "TQ9ExampleDestinationAddress123456789",
      "derivation_path": "string",
      "wallet_status": "string"
    }
  ],
  "project_id": "project_demo_001"
}
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Invoice not found
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Get Invoice Qr

/api/v1/invoices/{invoice_id}/qr
X-API-Key
  • A detected transaction does not yet imply credit. Check status, confirmations, required_confirmations and credited where present.
Parameters & request example
FieldTypePresenceMeaning & constraints
invoice_idpath · stringRequiredInvoice identifier returned on creation.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/invoices/YOUR_INVOICE_ID/qr' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · image/svg+xml

Shape illustration: values are examples; actual state may differ.

xml
<svg xmlns="http://www.w3.org/2000/svg">…</svg>
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Invoice not found
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Get Public Invoice Payment Qr

/api/v1/public/invoices/by-hash/{invoice_hash}/payment-qr
No API key
  • A detected transaction does not yet imply credit. Check status, confirmations, required_confirmations and credited where present.
Parameters & request example
FieldTypePresenceMeaning & constraints
invoice_hashpath · stringRequiredPublic identifier from the checkout URL. Keep customer links private.
networkquery · stringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetquery · stringRequiredAsset code, e.g. USDT. Must be available for this network and project.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/public/invoices/by-hash/YOUR_INVOICE_HASH/payment-qr?network=tron&asset=USDT'
Successful response

200 · image/svg+xml

Shape illustration: values are examples; actual state may differ.

xml
<svg xmlns="http://www.w3.org/2000/svg">…</svg>
Errors & recovery404 · 422 · 429

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
429Rate limit exceededBack off with jitter and honor Retry-After when present.

Possible detail messages

  • Too many public invoice requests
  • Invoice not found
  • Payment option not found
json
{
  "detail": "Error description"
}

Project & keys

GET

List Project Api Keys

/api/v1/projects/{project_id}/api-keys
X-API-Key
  • Creation returns the key and secret once. Listing exposes prefixes and state.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/api-keys' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
[].key_idstringRequiredKey identifier from the project key list.
[].project_idstringRequiredProject identifier; must belong to the API key.
[].namestringRequiredHuman-readable key label.
[].key_prefixstringRequiredKey Prefix
[].secret_prefixstring / nullOptionalSecret Prefix
[].api_keystring / nullOptionalProject API access key; store immediately on creation.
[].api_secretstring / nullOptionalWrite API secret; returned on creation, keep on your server.
[].is_activebooleanRequiredIs Active
[].last_used_atstring / nullOptionalLast Used At format: date-time
[].created_atstringRequiredCreated At format: date-time
json
[
  {
    "key_id": "string",
    "project_id": "project_demo_001",
    "name": "string",
    "key_prefix": "string",
    "secret_prefix": "secret_123456",
    "api_key": "string",
    "api_secret": "secret_123456",
    "is_active": false,
    "last_used_at": "2026-07-13T12:00:00Z",
    "created_at": "2026-07-13T12:00:00Z"
  }
]
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}
POST

Create Project Api Key

/api/v1/projects/{project_id}/api-keys
X-API-Key + X-API-Secret
  • Creation returns the key and secret once. Listing exposes prefixes and state.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
namestringRequiredHuman-readable key label. min length: 1; max length: 128
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/api-keys' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Integration key"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
key_idstringRequiredKey identifier from the project key list.
project_idstringRequiredProject identifier; must belong to the API key.
namestringRequiredHuman-readable key label.
key_prefixstringRequiredKey Prefix
secret_prefixstring / nullOptionalSecret Prefix
api_keystringRequiredProject API access key; store immediately on creation.
api_secretstringRequiredWrite API secret; returned on creation, keep on your server.
is_activebooleanRequiredIs Active
last_used_atstring / nullOptionalLast Used At format: date-time
created_atstringRequiredCreated At format: date-time
json
{
  "key_id": "string",
  "project_id": "project_demo_001",
  "name": "string",
  "key_prefix": "string",
  "secret_prefix": "secret_123456",
  "api_key": "string",
  "api_secret": "secret_123456",
  "is_active": false,
  "last_used_at": "2026-07-13T12:00:00Z",
  "created_at": "2026-07-13T12:00:00Z"
}
Errors & recovery400 · 401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
json
{
  "detail": "Error description"
}
POST

Deactivate Project Api Key

/api/v1/projects/{project_id}/api-keys/{key_id}/deactivate
X-API-Key + X-API-Secret
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
key_idpath · stringRequiredKey identifier from the project key list.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

No request body.

bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/api-keys/YOUR_KEY_ID/deactivate' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
key_idstringRequiredKey identifier from the project key list.
project_idstringRequiredProject identifier; must belong to the API key.
namestringRequiredHuman-readable key label.
key_prefixstringRequiredKey Prefix
secret_prefixstring / nullOptionalSecret Prefix
api_keystring / nullOptionalProject API access key; store immediately on creation.
api_secretstring / nullOptionalWrite API secret; returned on creation, keep on your server.
is_activebooleanRequiredIs Active
last_used_atstring / nullOptionalLast Used At format: date-time
created_atstringRequiredCreated At format: date-time
json
{
  "key_id": "string",
  "project_id": "project_demo_001",
  "name": "string",
  "key_prefix": "string",
  "secret_prefix": "secret_123456",
  "api_key": "string",
  "api_secret": "secret_123456",
  "is_active": false,
  "last_used_at": "2026-07-13T12:00:00Z",
  "created_at": "2026-07-13T12:00:00Z"
}
Errors & recovery400 · 401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
json
{
  "detail": "Error description"
}
POST

Register Payout Key

/api/v1/projects/{project_id}/security/payout-key
X-API-Key + X-API-Secret
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
public_keystringRequiredEd25519 public key, 32 bytes encoded as Base64. min length: 32
algorithmstringOptionalEd25519. default: "Ed25519"
namestring / nullOptionalHuman-readable key label. max length: 128
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/security/payout-key' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "public_key": "BASE64_ED25519_PUBLIC_KEY",
  "algorithm": "Ed25519",
  "name": "string"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
key_idstringRequiredKey identifier from the project key list.
project_idstringRequiredProject identifier; must belong to the API key.
namestringRequiredHuman-readable key label.
algorithmstringRequiredEd25519.
public_keystringRequiredEd25519 public key, 32 bytes encoded as Base64.
public_key_previewstringRequiredPublic Key Preview
originstringRequiredOrigin
is_activebooleanRequiredIs Active
created_atstringRequiredCreated At format: date-time
private_keystring / nullOptionalPrivate key: returned only on generation. Store securely immediately.
signing_message_examplestringRequiredCanonical message example; sign your actual operation values.
json
{
  "key_id": "string",
  "project_id": "project_demo_001",
  "name": "string",
  "algorithm": "string",
  "public_key": "BASE64_ED25519_PUBLIC_KEY",
  "public_key_preview": "BASE64_ED25519_PUBLIC_KEY",
  "origin": "string",
  "is_active": false,
  "created_at": "2026-07-13T12:00:00Z",
  "private_key": "BASE64_ED25519_PRIVATE_KEY",
  "signing_message_example": "string"
}
Errors & recovery400 · 401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
json
{
  "detail": "Error description"
}
GET

List Project Payout Keys

/api/v1/projects/{project_id}/payout-keys
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-keys' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
[].key_idstringRequiredKey identifier from the project key list.
[].project_idstringRequiredProject identifier; must belong to the API key.
[].namestringRequiredHuman-readable key label.
[].algorithmstringRequiredEd25519.
[].public_keystringRequiredEd25519 public key, 32 bytes encoded as Base64.
[].public_key_previewstringRequiredPublic Key Preview
[].originstringRequiredOrigin
[].is_activebooleanRequiredIs Active
[].created_atstringRequiredCreated At format: date-time
json
[
  {
    "key_id": "string",
    "project_id": "project_demo_001",
    "name": "string",
    "algorithm": "string",
    "public_key": "BASE64_ED25519_PUBLIC_KEY",
    "public_key_preview": "BASE64_ED25519_PUBLIC_KEY",
    "origin": "string",
    "is_active": false,
    "created_at": "2026-07-13T12:00:00Z"
  }
]
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}
POST

Generate Project Payout Key

/api/v1/projects/{project_id}/payout-keys/generate
X-API-Key + X-API-Secret
  • Returns an Ed25519 private_key once. Alternatively generate locally and register only public_key via /security/payout-key.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
namestring / nullOptionalHuman-readable key label. max length: 128
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-keys/generate' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "string"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
key_idstringRequiredKey identifier from the project key list.
project_idstringRequiredProject identifier; must belong to the API key.
namestringRequiredHuman-readable key label.
algorithmstringRequiredEd25519.
public_keystringRequiredEd25519 public key, 32 bytes encoded as Base64.
public_key_previewstringRequiredPublic Key Preview
originstringRequiredOrigin
is_activebooleanRequiredIs Active
created_atstringRequiredCreated At format: date-time
private_keystring / nullOptionalPrivate key: returned only on generation. Store securely immediately.
signing_message_examplestringRequiredCanonical message example; sign your actual operation values.
json
{
  "key_id": "string",
  "project_id": "project_demo_001",
  "name": "string",
  "algorithm": "string",
  "public_key": "BASE64_ED25519_PUBLIC_KEY",
  "public_key_preview": "BASE64_ED25519_PUBLIC_KEY",
  "origin": "string",
  "is_active": false,
  "created_at": "2026-07-13T12:00:00Z",
  "private_key": "BASE64_ED25519_PRIVATE_KEY",
  "signing_message_example": "string"
}
Errors & recovery400 · 401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
json
{
  "detail": "Error description"
}
POST

Delete Project Payout Key

/api/v1/projects/{project_id}/payout-keys/{key_id}/delete
X-API-Key + X-API-Secret
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
key_idpath · stringRequiredKey identifier from the project key list.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

No request body.

bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-keys/YOUR_KEY_ID/delete' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
key_idstringRequiredKey identifier from the project key list.
project_idstringRequiredProject identifier; must belong to the API key.
namestringRequiredHuman-readable key label.
algorithmstringRequiredEd25519.
public_keystringRequiredEd25519 public key, 32 bytes encoded as Base64.
public_key_previewstringRequiredPublic Key Preview
originstringRequiredOrigin
is_activebooleanRequiredIs Active
created_atstringRequiredCreated At format: date-time
json
{
  "key_id": "string",
  "project_id": "project_demo_001",
  "name": "string",
  "algorithm": "string",
  "public_key": "BASE64_ED25519_PUBLIC_KEY",
  "public_key_preview": "BASE64_ED25519_PUBLIC_KEY",
  "origin": "string",
  "is_active": false,
  "created_at": "2026-07-13T12:00:00Z"
}
Errors & recovery400 · 401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
json
{
  "detail": "Error description"
}
GET

Get Project Payout Key Signing Message Example

/api/v1/projects/{project_id}/payout-keys/{key_id}/signing-message-example
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
key_idpath · stringRequiredKey identifier from the project key list.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-keys/YOUR_KEY_ID/signing-message-example' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
key_idstringRequiredKey identifier from the project key list.
project_idstringRequiredProject identifier; must belong to the API key.
algorithmstringRequiredEd25519.
public_keystringRequiredEd25519 public key, 32 bytes encoded as Base64.
originstringRequiredOrigin
signing_message_examplestringRequiredCanonical message example; sign your actual operation values.
json
{
  "key_id": "string",
  "project_id": "project_demo_001",
  "algorithm": "string",
  "public_key": "BASE64_ED25519_PUBLIC_KEY",
  "origin": "string",
  "signing_message_example": "string"
}
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Get Project Balances

/api/v1/projects/{project_id}/balances
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/balances' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
balancesarray<object>RequiredBalances
balances[].project_idstringRequiredProject identifier; must belong to the API key.
balances[].networkstring / nullRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
balances[].assetstring / nullRequiredAsset code, e.g. USDT. Must be available for this network and project.
balances[].account_codestringRequiredAccount Code
balances[].balancestringRequiredBalance pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
balances[].available_for_withdrawalstring / nullOptionalAvailable For Withdrawal pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
balances[].pending_aggregation_balancestring / nullOptionalPending Aggregation Balance pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
json
{
  "balances": [
    {
      "project_id": "project_demo_001",
      "network": "Tron",
      "asset": "USDT",
      "account_code": "string",
      "balance": "string",
      "available_for_withdrawal": "string",
      "pending_aggregation_balance": "string"
    }
  ]
}
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Get Project Transactions

/api/v1/projects/{project_id}/transactions
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/transactions' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
itemsarray<object>RequiredItems
items[].transaction_typestringRequiredTransaction Type
items[].reference_idstringRequiredReference Id
items[].statusstringRequiredObject state; see the relevant workflow for values and actions.
items[].networkstring / nullOptionalNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
items[].assetstring / nullOptionalAsset code, e.g. USDT. Must be available for this network and project.
items[].amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
items[].currencystring / nullOptionalUSD or RUB; order price currency, not the cryptoasset.
items[].created_atstringRequiredCreated At format: date-time
items[].metaobjectOptionalMeta
json
{
  "items": [
    {
      "transaction_type": "string",
      "reference_id": "string",
      "status": "ok",
      "network": "Tron",
      "asset": "USDT",
      "amount": "string",
      "currency": "USD",
      "created_at": "2026-07-13T12:00:00Z",
      "meta": {
        "example_key": "string"
      }
    }
  ]
}
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Export Project Transactions Csv

/api/v1/projects/{project_id}/transactions/export.csv
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/transactions/export.csv' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · text/csv

Shape illustration: values are examples; actual state may differ.

text
Transaction CSV file. Columns depend on the export format.
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Export Project Transactions Quickbooks Csv

/api/v1/projects/{project_id}/transactions/export-quickbooks.csv
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/transactions/export-quickbooks.csv' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · text/csv

Shape illustration: values are examples; actual state may differ.

text
Transaction CSV file. Columns depend on the export format.
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}

Payouts

GET

List Project Payout Requests

/api/v1/projects/{project_id}/payout-requests
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-requests' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
[].request_idstringRequiredPayout approval request identifier.
[].project_idstringRequiredProject identifier; must belong to the API key.
[].networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
[].assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
[].amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
[].destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
[].statusstringRequiredObject state; see the relevant workflow for values and actions.
[].idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
[].requested_viastringRequiredRequested Via
[].requested_by_user_idstring / nullOptionalRequested By User Id
[].approved_by_user_idstring / nullOptionalApproved By User Id
[].rejected_by_user_idstring / nullOptionalRejected By User Id
[].approved_payout_idstring / nullOptionalApproved Payout Id
[].approved_payout_statusstring / nullOptionalApproved Payout Status
[].rejection_reasonstring / nullOptionalRejection reason; included verbatim in the signed message.
[].notestring / nullOptionalOptional note on the payout request.
[].created_atstringRequiredCreated At format: date-time
[].decided_atstring / nullOptionalDecided At format: date-time
json
[
  {
    "request_id": "req_demo_001",
    "project_id": "project_demo_001",
    "network": "Tron",
    "asset": "USDT",
    "amount": "string",
    "destination_address": "TQ9ExampleDestinationAddress123456789",
    "status": "ok",
    "idempotency_key": "action_001",
    "requested_via": "string",
    "requested_by_user_id": "string",
    "approved_by_user_id": "string",
    "rejected_by_user_id": "string",
    "approved_payout_id": "payout_demo_001",
    "approved_payout_status": "string",
    "rejection_reason": "string",
    "note": "string",
    "created_at": "2026-07-13T12:00:00Z",
    "decided_at": "2026-07-13T12:00:00Z"
  }
]
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}
POST

Create Project Payout Request

/api/v1/projects/{project_id}/payout-requests
X-API-Key + X-API-Secret
  • Fee is included in amount. API acceptance does not confirm blockchain broadcast; track payout state.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountnumber / stringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. >: 0; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation. min length: 1; max length: 255
notestring / nullOptionalOptional note on the payout request. max length: 500
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-requests' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "network": "Tron",
  "asset": "USDT",
  "amount": "50.00",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "idempotency_key": "withdraw_001",
  "note": "Manual withdrawal from merchant UI"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
request_idstringRequiredPayout approval request identifier.
project_idstringRequiredProject identifier; must belong to the API key.
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
statusstringRequiredObject state; see the relevant workflow for values and actions.
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
requested_viastringRequiredRequested Via
requested_by_user_idstring / nullOptionalRequested By User Id
approved_by_user_idstring / nullOptionalApproved By User Id
rejected_by_user_idstring / nullOptionalRejected By User Id
approved_payout_idstring / nullOptionalApproved Payout Id
approved_payout_statusstring / nullOptionalApproved Payout Status
rejection_reasonstring / nullOptionalRejection reason; included verbatim in the signed message.
notestring / nullOptionalOptional note on the payout request.
created_atstringRequiredCreated At format: date-time
decided_atstring / nullOptionalDecided At format: date-time
json
{
  "request_id": "req_demo_001",
  "project_id": "project_demo_001",
  "network": "Tron",
  "asset": "USDT",
  "amount": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "status": "ok",
  "idempotency_key": "action_001",
  "requested_via": "string",
  "requested_by_user_id": "string",
  "approved_by_user_id": "string",
  "rejected_by_user_id": "string",
  "approved_payout_id": "payout_demo_001",
  "approved_payout_status": "string",
  "rejection_reason": "string",
  "note": "string",
  "created_at": "2026-07-13T12:00:00Z",
  "decided_at": "2026-07-13T12:00:00Z"
}
Errors & recovery400 · 401 · 403 · 409 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
409Payout availability conflictInspect error_code and available balance. insufficient_project_reserve: insufficient reserve; insufficient_aggregated_balance: funds not ready to send. Reconcile first.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Payout availability conflict; inspect structured error fields
json
{
  "detail": "Error description"
}
json
{
  "detail": "Payout availability conflict",
  "error_code": "insufficient_aggregated_balance",
  "network": "tron",
  "asset": "USDT",
  "requested_amount": "100",
  "fee_amount": "1",
  "available_balance": "100",
  "available_aggregated_amount": "50",
  "pending_aggregation_balance": "50"
}
GET

Poll Project Payout Request By Idempotency

/api/v1/projects/{project_id}/payout-requests/by-idempotency/{idempotency_key}
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
idempotency_keypath · stringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-requests/by-idempotency/YOUR_IDEMPOTENCY_KEY' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
request_idstringRequiredPayout approval request identifier.
project_idstringRequiredProject identifier; must belong to the API key.
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
statusstringRequiredObject state; see the relevant workflow for values and actions.
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
requested_viastringRequiredRequested Via
requested_by_user_idstring / nullOptionalRequested By User Id
approved_by_user_idstring / nullOptionalApproved By User Id
rejected_by_user_idstring / nullOptionalRejected By User Id
approved_payout_idstring / nullOptionalApproved Payout Id
approved_payout_statusstring / nullOptionalApproved Payout Status
rejection_reasonstring / nullOptionalRejection reason; included verbatim in the signed message.
notestring / nullOptionalOptional note on the payout request.
created_atstringRequiredCreated At format: date-time
decided_atstring / nullOptionalDecided At format: date-time
json
{
  "request_id": "req_demo_001",
  "project_id": "project_demo_001",
  "network": "Tron",
  "asset": "USDT",
  "amount": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "status": "ok",
  "idempotency_key": "action_001",
  "requested_via": "string",
  "requested_by_user_id": "string",
  "approved_by_user_id": "string",
  "rejected_by_user_id": "string",
  "approved_payout_id": "payout_demo_001",
  "approved_payout_status": "string",
  "rejection_reason": "string",
  "note": "string",
  "created_at": "2026-07-13T12:00:00Z",
  "decided_at": "2026-07-13T12:00:00Z"
}
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Payout request not found
  • Project API key is required
json
{
  "detail": "Error description"
}
POST

Approve Project Payout Request Via Api

/api/v1/projects/{project_id}/payout-requests/{request_id}/approve
X-API-Key + X-API-Secret
  • Requires API key, API secret and Ed25519 signature. See Signatures for canonical message, UTC, nonce and 5-minute freshness.
  • Fee is included in amount. API acceptance does not confirm blockchain broadcast; track payout state.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
request_idpath · stringRequiredPayout approval request identifier.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
noncestringRequiredUnique value for a new signed attempt; prevents signature replay. min length: 1; max length: 255
timestampstringRequiredUTC date-time within ±5 minutes. Sign canonical +00:00 representation; see Signatures. format: date-time
signaturestringRequiredEd25519 signature of the canonical message, 64 bytes encoded as Base64. min length: 32
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-requests/YOUR_REQUEST_ID/approve' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "nonce": "nonce_20260713_approve_001",
  "timestamp": "2026-07-13T12:00:00Z",
  "signature": "BASE64_ED25519_SIGNATURE"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
request_idstringRequiredPayout approval request identifier.
project_idstringRequiredProject identifier; must belong to the API key.
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
statusstringRequiredObject state; see the relevant workflow for values and actions.
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
requested_viastringRequiredRequested Via
requested_by_user_idstring / nullOptionalRequested By User Id
approved_by_user_idstring / nullOptionalApproved By User Id
rejected_by_user_idstring / nullOptionalRejected By User Id
approved_payout_idstring / nullOptionalApproved Payout Id
approved_payout_statusstring / nullOptionalApproved Payout Status
rejection_reasonstring / nullOptionalRejection reason; included verbatim in the signed message.
notestring / nullOptionalOptional note on the payout request.
created_atstringRequiredCreated At format: date-time
decided_atstring / nullOptionalDecided At format: date-time
json
{
  "request_id": "req_demo_001",
  "project_id": "project_demo_001",
  "network": "Tron",
  "asset": "USDT",
  "amount": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "status": "ok",
  "idempotency_key": "action_001",
  "requested_via": "string",
  "requested_by_user_id": "string",
  "approved_by_user_id": "string",
  "rejected_by_user_id": "string",
  "approved_payout_id": "payout_demo_001",
  "approved_payout_status": "string",
  "rejection_reason": "string",
  "note": "string",
  "created_at": "2026-07-13T12:00:00Z",
  "decided_at": "2026-07-13T12:00:00Z"
}
Errors & recovery400 · 401 · 403 · 409 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
409Payout availability conflictInspect error_code and available balance. insufficient_project_reserve: insufficient reserve; insufficient_aggregated_balance: funds not ready to send. Reconcile first.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Payout availability conflict; inspect structured error fields
json
{
  "detail": "Error description"
}
json
{
  "detail": "Payout availability conflict",
  "error_code": "insufficient_aggregated_balance",
  "network": "tron",
  "asset": "USDT",
  "requested_amount": "100",
  "fee_amount": "1",
  "available_balance": "100",
  "available_aggregated_amount": "50",
  "pending_aggregation_balance": "50"
}
POST

Reject Project Payout Request Via Api

/api/v1/projects/{project_id}/payout-requests/{request_id}/reject
X-API-Key + X-API-Secret
  • Requires API key, API secret and Ed25519 signature. See Signatures for canonical message, UTC, nonce and 5-minute freshness.
  • Fee is included in amount. API acceptance does not confirm blockchain broadcast; track payout state.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
request_idpath · stringRequiredPayout approval request identifier.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
noncestringRequiredUnique value for a new signed attempt; prevents signature replay. min length: 1; max length: 255
timestampstringRequiredUTC date-time within ±5 minutes. Sign canonical +00:00 representation; see Signatures. format: date-time
signaturestringRequiredEd25519 signature of the canonical message, 64 bytes encoded as Base64. min length: 32
rejection_reasonstringRequiredRejection reason; included verbatim in the signed message. min length: 1; max length: 500
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payout-requests/YOUR_REQUEST_ID/reject' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "nonce": "nonce_20260713_reject_001",
  "timestamp": "2026-07-13T12:00:00Z",
  "signature": "BASE64_ED25519_SIGNATURE",
  "rejection_reason": "KYC check failed"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
request_idstringRequiredPayout approval request identifier.
project_idstringRequiredProject identifier; must belong to the API key.
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
statusstringRequiredObject state; see the relevant workflow for values and actions.
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
requested_viastringRequiredRequested Via
requested_by_user_idstring / nullOptionalRequested By User Id
approved_by_user_idstring / nullOptionalApproved By User Id
rejected_by_user_idstring / nullOptionalRejected By User Id
approved_payout_idstring / nullOptionalApproved Payout Id
approved_payout_statusstring / nullOptionalApproved Payout Status
rejection_reasonstring / nullOptionalRejection reason; included verbatim in the signed message.
notestring / nullOptionalOptional note on the payout request.
created_atstringRequiredCreated At format: date-time
decided_atstring / nullOptionalDecided At format: date-time
json
{
  "request_id": "req_demo_001",
  "project_id": "project_demo_001",
  "network": "Tron",
  "asset": "USDT",
  "amount": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "status": "ok",
  "idempotency_key": "action_001",
  "requested_via": "string",
  "requested_by_user_id": "string",
  "approved_by_user_id": "string",
  "rejected_by_user_id": "string",
  "approved_payout_id": "payout_demo_001",
  "approved_payout_status": "string",
  "rejection_reason": "string",
  "note": "string",
  "created_at": "2026-07-13T12:00:00Z",
  "decided_at": "2026-07-13T12:00:00Z"
}
Errors & recovery400 · 401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
json
{
  "detail": "Error description"
}
POST

Create Payout

/api/v1/payouts
X-API-Key + X-API-Secret
  • Requires API key, API secret and Ed25519 signature. See Signatures for canonical message, UTC, nonce and 5-minute freshness.
  • Fee is included in amount. API acceptance does not confirm blockchain broadcast; track payout state.
Parameters & request example
FieldTypePresenceMeaning & constraints
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
project_idstringRequiredProject identifier; must belong to the API key.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
amountnumber / stringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. >: 0; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
noncestringRequiredUnique value for a new signed attempt; prevents signature replay.
timestampstringRequiredUTC date-time within ±5 minutes. Sign canonical +00:00 representation; see Signatures. format: date-time
signaturestringRequiredEd25519 signature of the canonical message, 64 bytes encoded as Base64. min length: 32
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/payouts' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "project_id": "project_demo_001",
  "network": "Tron",
  "asset": "USDT",
  "amount": "25.00",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "idempotency_key": "payout_001",
  "nonce": "nonce_20260713_001",
  "timestamp": "2026-07-13T12:00:00Z",
  "signature": "BASE64_ED25519_SIGNATURE"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
payout_idstringRequiredPayout identifier.
project_idstringRequiredProject identifier; must belong to the API key.
request_idstring / nullOptionalPayout approval request identifier.
notestring / nullOptionalOptional note on the payout request.
operational_expenseboolean / nullOptionalOperational Expense
source_scopestring / nullOptionalSource Scope
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
gross_amountstring / nullOptionalGross Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
net_amountstring / nullOptionalNet Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
fee_amountstringOptionalFee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
provider_fee_amountstringOptionalProvider Fee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_reservedstring / nullOptionalTotal Reserved pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
statusstringRequiredObject state; see the relevant workflow for values and actions.
provider_statusstring / nullOptionalProvider Status
finalbooleanOptionalFinal default: false
funds_reservedbooleanOptionalFunds Reserved default: false
funds_releasedbooleanOptionalFunds Released default: false
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
request_noncestringRequiredRequest Nonce
request_timestampstringRequiredRequest Timestamp format: date-time
gas_modestring / nullOptionalGas Mode
rental_providerstring / nullOptionalRental Provider
rental_order_idstring / nullOptionalRental Order Id
gas_preparation_statusstring / nullOptionalGas Preparation Status
payout_submitted_fee_nativestring / nullOptionalPayout Submitted Fee Native pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_actual_fee_nativestring / nullOptionalPayout Actual Fee Native pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_gas_fee_sourcestring / nullOptionalPayout Gas Fee Source
payout_native_required_amountstring / nullOptionalPayout Native Required Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_native_current_balancestring / nullOptionalPayout Native Current Balance pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
reserve_floor_reached_for_sweepsboolean / nullOptionalReserve Floor Reached For Sweeps
tx_hashstring / nullOptionalTx Hash
explorer_urlstring / nullOptionalExplorer Url
processed_atstring / nullOptionalProcessed At format: date-time
confirmed_atstring / nullOptionalConfirmed At format: date-time
error_reasonstring / nullOptionalError Reason
status_historyarray<object>OptionalStatus History
status_history[].statusstringRequiredObject state; see the relevant workflow for values and actions.
status_history[].provider_statusstring / nullOptionalProvider Status
status_history[].event_typestring / nullOptionalEvent Type
status_history[].finalbooleanOptionalFinal default: false
status_history[].atstringRequiredAt format: date-time
status_history[].actorstring / nullOptionalActor
status_history[].reasonstring / nullOptionalReason
json
{
  "payout_id": "payout_demo_001",
  "project_id": "project_demo_001",
  "request_id": "req_demo_001",
  "note": "string",
  "operational_expense": false,
  "source_scope": "string",
  "network": "Tron",
  "asset": "USDT",
  "amount": "string",
  "gross_amount": "string",
  "net_amount": "string",
  "fee_amount": "0",
  "provider_fee_amount": "0",
  "total_reserved": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "status": "ok",
  "provider_status": "string",
  "final": false,
  "funds_reserved": false,
  "funds_released": false,
  "idempotency_key": "action_001",
  "request_nonce": "nonce_20260713_001",
  "request_timestamp": "2026-07-13T12:00:00Z",
  "gas_mode": "string",
  "rental_provider": "string",
  "rental_order_id": "order_1001",
  "gas_preparation_status": "string",
  "payout_submitted_fee_native": "string",
  "payout_actual_fee_native": "string",
  "payout_gas_fee_source": "string",
  "payout_native_required_amount": "string",
  "payout_native_current_balance": "string",
  "reserve_floor_reached_for_sweeps": false,
  "tx_hash": "0xabc123def456",
  "explorer_url": "string",
  "processed_at": "2026-07-13T12:00:00Z",
  "confirmed_at": "2026-07-13T12:00:00Z",
  "error_reason": "string",
  "status_history": [
    {
      "status": "ok",
      "provider_status": "string",
      "event_type": "string",
      "final": false,
      "at": "2026-07-13T12:00:00Z",
      "actor": "string",
      "reason": "string"
    }
  ]
}
Errors & recovery400 · 401 · 403 · 409 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
409Payout availability conflictInspect error_code and available balance. insufficient_project_reserve: insufficient reserve; insufficient_aggregated_balance: funds not ready to send. Reconcile first.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Payout availability conflict; inspect structured error fields
json
{
  "detail": "Error description"
}
json
{
  "detail": "Payout availability conflict",
  "error_code": "insufficient_aggregated_balance",
  "network": "tron",
  "asset": "USDT",
  "requested_amount": "100",
  "fee_amount": "1",
  "available_balance": "100",
  "available_aggregated_amount": "50",
  "pending_aggregation_balance": "50"
}
GET

Get Payout

/api/v1/payouts/{payout_id}
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
payout_idpath · stringRequiredPayout identifier.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/payouts/YOUR_PAYOUT_ID' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
payout_idstringRequiredPayout identifier.
project_idstringRequiredProject identifier; must belong to the API key.
request_idstring / nullOptionalPayout approval request identifier.
notestring / nullOptionalOptional note on the payout request.
operational_expenseboolean / nullOptionalOperational Expense
source_scopestring / nullOptionalSource Scope
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
gross_amountstring / nullOptionalGross Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
net_amountstring / nullOptionalNet Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
fee_amountstringOptionalFee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
provider_fee_amountstringOptionalProvider Fee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_reservedstring / nullOptionalTotal Reserved pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
statusstringRequiredObject state; see the relevant workflow for values and actions.
provider_statusstring / nullOptionalProvider Status
finalbooleanOptionalFinal default: false
funds_reservedbooleanOptionalFunds Reserved default: false
funds_releasedbooleanOptionalFunds Released default: false
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
request_noncestringRequiredRequest Nonce
request_timestampstringRequiredRequest Timestamp format: date-time
gas_modestring / nullOptionalGas Mode
rental_providerstring / nullOptionalRental Provider
rental_order_idstring / nullOptionalRental Order Id
gas_preparation_statusstring / nullOptionalGas Preparation Status
payout_submitted_fee_nativestring / nullOptionalPayout Submitted Fee Native pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_actual_fee_nativestring / nullOptionalPayout Actual Fee Native pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_gas_fee_sourcestring / nullOptionalPayout Gas Fee Source
payout_native_required_amountstring / nullOptionalPayout Native Required Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_native_current_balancestring / nullOptionalPayout Native Current Balance pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
reserve_floor_reached_for_sweepsboolean / nullOptionalReserve Floor Reached For Sweeps
tx_hashstring / nullOptionalTx Hash
explorer_urlstring / nullOptionalExplorer Url
processed_atstring / nullOptionalProcessed At format: date-time
confirmed_atstring / nullOptionalConfirmed At format: date-time
error_reasonstring / nullOptionalError Reason
status_historyarray<object>OptionalStatus History
status_history[].statusstringRequiredObject state; see the relevant workflow for values and actions.
status_history[].provider_statusstring / nullOptionalProvider Status
status_history[].event_typestring / nullOptionalEvent Type
status_history[].finalbooleanOptionalFinal default: false
status_history[].atstringRequiredAt format: date-time
status_history[].actorstring / nullOptionalActor
status_history[].reasonstring / nullOptionalReason
json
{
  "payout_id": "payout_demo_001",
  "project_id": "project_demo_001",
  "request_id": "req_demo_001",
  "note": "string",
  "operational_expense": false,
  "source_scope": "string",
  "network": "Tron",
  "asset": "USDT",
  "amount": "string",
  "gross_amount": "string",
  "net_amount": "string",
  "fee_amount": "0",
  "provider_fee_amount": "0",
  "total_reserved": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "status": "ok",
  "provider_status": "string",
  "final": false,
  "funds_reserved": false,
  "funds_released": false,
  "idempotency_key": "action_001",
  "request_nonce": "nonce_20260713_001",
  "request_timestamp": "2026-07-13T12:00:00Z",
  "gas_mode": "string",
  "rental_provider": "string",
  "rental_order_id": "order_1001",
  "gas_preparation_status": "string",
  "payout_submitted_fee_native": "string",
  "payout_actual_fee_native": "string",
  "payout_gas_fee_source": "string",
  "payout_native_required_amount": "string",
  "payout_native_current_balance": "string",
  "reserve_floor_reached_for_sweeps": false,
  "tx_hash": "0xabc123def456",
  "explorer_url": "string",
  "processed_at": "2026-07-13T12:00:00Z",
  "confirmed_at": "2026-07-13T12:00:00Z",
  "error_reason": "string",
  "status_history": [
    {
      "status": "ok",
      "provider_status": "string",
      "event_type": "string",
      "final": false,
      "at": "2026-07-13T12:00:00Z",
      "actor": "string",
      "reason": "string"
    }
  ]
}
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Payout not found
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Poll Payout By Idempotency

/api/v1/projects/{project_id}/payouts/by-idempotency/{idempotency_key}
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
idempotency_keypath · stringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payouts/by-idempotency/YOUR_IDEMPOTENCY_KEY' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
payout_idstringRequiredPayout identifier.
project_idstringRequiredProject identifier; must belong to the API key.
request_idstring / nullOptionalPayout approval request identifier.
notestring / nullOptionalOptional note on the payout request.
operational_expenseboolean / nullOptionalOperational Expense
source_scopestring / nullOptionalSource Scope
networkstringRequiredNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstringRequiredAsset code, e.g. USDT. Must be available for this network and project.
amountstringRequiredAmount > 0: invoice fiat currency, or payout asset units including fee. Send a decimal string. pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
gross_amountstring / nullOptionalGross Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
net_amountstring / nullOptionalNet Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
fee_amountstringOptionalFee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
provider_fee_amountstringOptionalProvider Fee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
total_reservedstring / nullOptionalTotal Reserved pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstringRequiredRecipient address in the selected network. Verify the network before signing.
statusstringRequiredObject state; see the relevant workflow for values and actions.
provider_statusstring / nullOptionalProvider Status
finalbooleanOptionalFinal default: false
funds_reservedbooleanOptionalFunds Reserved default: false
funds_releasedbooleanOptionalFunds Released default: false
idempotency_keystringRequiredYour stable identifier for one logical payout; reuse for reconciliation.
request_noncestringRequiredRequest Nonce
request_timestampstringRequiredRequest Timestamp format: date-time
gas_modestring / nullOptionalGas Mode
rental_providerstring / nullOptionalRental Provider
rental_order_idstring / nullOptionalRental Order Id
gas_preparation_statusstring / nullOptionalGas Preparation Status
payout_submitted_fee_nativestring / nullOptionalPayout Submitted Fee Native pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_actual_fee_nativestring / nullOptionalPayout Actual Fee Native pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_gas_fee_sourcestring / nullOptionalPayout Gas Fee Source
payout_native_required_amountstring / nullOptionalPayout Native Required Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
payout_native_current_balancestring / nullOptionalPayout Native Current Balance pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
reserve_floor_reached_for_sweepsboolean / nullOptionalReserve Floor Reached For Sweeps
tx_hashstring / nullOptionalTx Hash
explorer_urlstring / nullOptionalExplorer Url
processed_atstring / nullOptionalProcessed At format: date-time
confirmed_atstring / nullOptionalConfirmed At format: date-time
error_reasonstring / nullOptionalError Reason
status_historyarray<object>OptionalStatus History
status_history[].statusstringRequiredObject state; see the relevant workflow for values and actions.
status_history[].provider_statusstring / nullOptionalProvider Status
status_history[].event_typestring / nullOptionalEvent Type
status_history[].finalbooleanOptionalFinal default: false
status_history[].atstringRequiredAt format: date-time
status_history[].actorstring / nullOptionalActor
status_history[].reasonstring / nullOptionalReason
json
{
  "payout_id": "payout_demo_001",
  "project_id": "project_demo_001",
  "request_id": "req_demo_001",
  "note": "string",
  "operational_expense": false,
  "source_scope": "string",
  "network": "Tron",
  "asset": "USDT",
  "amount": "string",
  "gross_amount": "string",
  "net_amount": "string",
  "fee_amount": "0",
  "provider_fee_amount": "0",
  "total_reserved": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "status": "ok",
  "provider_status": "string",
  "final": false,
  "funds_reserved": false,
  "funds_released": false,
  "idempotency_key": "action_001",
  "request_nonce": "nonce_20260713_001",
  "request_timestamp": "2026-07-13T12:00:00Z",
  "gas_mode": "string",
  "rental_provider": "string",
  "rental_order_id": "order_1001",
  "gas_preparation_status": "string",
  "payout_submitted_fee_native": "string",
  "payout_actual_fee_native": "string",
  "payout_gas_fee_source": "string",
  "payout_native_required_amount": "string",
  "payout_native_current_balance": "string",
  "reserve_floor_reached_for_sweeps": false,
  "tx_hash": "0xabc123def456",
  "explorer_url": "string",
  "processed_at": "2026-07-13T12:00:00Z",
  "confirmed_at": "2026-07-13T12:00:00Z",
  "error_reason": "string",
  "status_history": [
    {
      "status": "ok",
      "provider_status": "string",
      "event_type": "string",
      "final": false,
      "at": "2026-07-13T12:00:00Z",
      "actor": "string",
      "reason": "string"
    }
  ]
}
Errors & recovery401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Payout not found
  • Project API key is required
json
{
  "detail": "Error description"
}
GET

Reconcile Project Payout

/api/v1/projects/{project_id}/payouts/reconcile
X-API-Key
  • Supply exactly one of request_id, payout_id, idempotency_key. Reconcile ambiguous writes before retrying.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
request_idquery · string / nullOptionalPayout approval request identifier. Supply exactly one of the three identifiers.
payout_idquery · string / nullOptionalPayout identifier. Supply exactly one of the three identifiers.
idempotency_keyquery · string / nullOptionalYour stable identifier for one logical payout; reuse for reconciliation. Supply exactly one of the three identifiers.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/payouts/reconcile?idempotency_key=YOUR_IDEMPOTENCY_KEY' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
project_idstringRequiredProject identifier; must belong to the API key.
query_typestringRequiredQuery Type
request_idstring / nullOptionalPayout approval request identifier. Supply exactly one of the three identifiers.
payout_idstring / nullOptionalPayout identifier. Supply exactly one of the three identifiers.
idempotency_keystring / nullOptionalYour stable identifier for one logical payout; reuse for reconciliation. Supply exactly one of the three identifiers.
request_statusstring / nullOptionalRequest Status
payout_statusstring / nullOptionalPayout Status
statusstringRequiredObject state; see the relevant workflow for values and actions.
provider_statusstring / nullOptionalProvider Status
finalbooleanOptionalFinal default: false
funds_reservedbooleanOptionalFunds Reserved default: false
funds_releasedbooleanOptionalFunds Released default: false
networkstring / nullOptionalNetwork code from /api/v1/public/networks. For payment use the invoice payment_options.
assetstring / nullOptionalAsset code, e.g. USDT. Must be available for this network and project.
gross_amountstring / nullOptionalGross Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
fee_amountstringOptionalFee Amount default: "0"; pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
net_amountstring / nullOptionalNet Amount pattern: ^(?!^[-+.]*$)[+-]?0*\d*\.?\d*$
destination_addressstring / nullOptionalRecipient address in the selected network. Verify the network before signing.
tx_hashstring / nullOptionalTx Hash
explorer_urlstring / nullOptionalExplorer Url
processed_atstring / nullOptionalProcessed At format: date-time
confirmed_atstring / nullOptionalConfirmed At format: date-time
rejection_reasonstring / nullOptionalRejection reason; included verbatim in the signed message.
error_reasonstring / nullOptionalError Reason
status_historyarray<object>OptionalStatus History
status_history[].statusstringRequiredObject state; see the relevant workflow for values and actions.
status_history[].provider_statusstring / nullOptionalProvider Status
status_history[].event_typestring / nullOptionalEvent Type
status_history[].finalbooleanOptionalFinal default: false
status_history[].atstringRequiredAt format: date-time
status_history[].actorstring / nullOptionalActor
status_history[].reasonstring / nullOptionalReason
json
{
  "project_id": "project_demo_001",
  "query_type": "string",
  "request_id": "req_demo_001",
  "payout_id": "payout_demo_001",
  "idempotency_key": "action_001",
  "request_status": "string",
  "payout_status": "string",
  "status": "ok",
  "provider_status": "string",
  "final": false,
  "funds_reserved": false,
  "funds_released": false,
  "network": "Tron",
  "asset": "USDT",
  "gross_amount": "string",
  "fee_amount": "0",
  "net_amount": "string",
  "destination_address": "TQ9ExampleDestinationAddress123456789",
  "tx_hash": "0xabc123def456",
  "explorer_url": "string",
  "processed_at": "2026-07-13T12:00:00Z",
  "confirmed_at": "2026-07-13T12:00:00Z",
  "rejection_reason": "string",
  "error_reason": "string",
  "status_history": [
    {
      "status": "ok",
      "provider_status": "string",
      "event_type": "string",
      "final": false,
      "at": "2026-07-13T12:00:00Z",
      "actor": "string",
      "reason": "string"
    }
  ]
}
Errors & recovery400 · 401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Provide exactly one of request_id, payout_id, or idempotency_key
  • Payout not found
  • Payout request not found
  • Project API key is required
json
{
  "detail": "Error description"
}

Webhooks

POST

Configure Project Webhook

/api/v1/projects/{project_id}/webhook/config
X-API-Key + X-API-Secret
  • Saves webhook_url. The compatibility callback_secret field does not rotate the project secret.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

JSON body

FieldTypePresenceMeaning & constraints
webhook_urlstringRequiredPublic HTTPS webhook handler URL; no URL user credentials.
callback_secretstring / nullOptionalCompatibility field: this endpoint does not rotate the webhook signing secret. min length: 6
bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/webhook/config' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET" \
  --header 'Content-Type: application/json' \
  --data '{
  "webhook_url": "https://merchant.example/webhooks/bitcofy"
}'
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
project_idstringRequiredProject identifier; must belong to the API key.
webhook_urlstringRequiredPublic HTTPS webhook handler URL; no URL user credentials.
callback_secret_maskedstringRequiredCallback Secret Masked
json
{
  "project_id": "project_demo_001",
  "webhook_url": "https://merchant.example/api/bitcofy/webhook",
  "callback_secret_masked": "secret_123456"
}
Errors & recovery400 · 401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project not found
json
{
  "detail": "Error description"
}
POST

Queue Test Webhook

/api/v1/projects/{project_id}/webhook/test
X-API-Key + X-API-Secret
  • Queues an event. Success does not mean your receiver has already accepted it.
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.
X-API-SecretheaderRequiredAPI secret for this key; required for writes.

No request body.

bash
curl --request POST 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/webhook/test' \
  --header "X-API-Key: $BITCOFY_API_KEY" \
  --header "X-API-Secret: $BITCOFY_API_SECRET"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
event_idstringRequiredEvent Id
event_typestringRequiredEvent Type
deliveredbooleanRequiredDelivered
deadbooleanRequiredDead
attemptsintegerRequiredAttempts
last_errorstring / nullOptionalLast Error
last_response_statusinteger / nullOptionalLast Response Status
next_attempt_atstring / nullOptionalNext Attempt At format: date-time
delivered_atstring / nullOptionalDelivered At format: date-time
payloadobjectRequiredPayload
json
{
  "event_id": "string",
  "event_type": "string",
  "delivered": false,
  "dead": false,
  "attempts": 1,
  "last_error": "string",
  "last_response_status": 1,
  "next_attempt_at": "2026-07-13T12:00:00Z",
  "delivered_at": "2026-07-13T12:00:00Z",
  "payload": {
    "example_key": "string"
  }
}
Errors & recovery400 · 401 · 403 · 404 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
400Invalid request or stateInspect detail, parameters, signature and current state; do not retry unchanged.
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
404Object not foundVerify the identifier and project.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project not found
  • Project webhook_url or callback_secret is not configured
json
{
  "detail": "Error description"
}
GET

List Project Webhook Events

/api/v1/projects/{project_id}/webhook/events
X-API-Key
Parameters & request example
FieldTypePresenceMeaning & constraints
project_idpath · stringRequiredProject identifier; must belong to the API key.
X-API-KeyheaderRequired*Project key. Alternative: Authorization: Bearer <project_api_key>.

No request body.

bash
curl --request GET 'https://pay.bitcofy.pro/api/v1/projects/YOUR_PROJECT_ID/webhook/events' \
  --header "X-API-Key: $BITCOFY_API_KEY"
Successful response

200 · application/json

Shape illustration: values are examples; actual state may differ.

FieldTypePresenceMeaning & constraints
[].event_idstringRequiredEvent Id
[].event_typestringRequiredEvent Type
[].deliveredbooleanRequiredDelivered
[].deadbooleanRequiredDead
[].attemptsintegerRequiredAttempts
[].last_errorstring / nullOptionalLast Error
[].last_response_statusinteger / nullOptionalLast Response Status
[].next_attempt_atstring / nullOptionalNext Attempt At format: date-time
[].delivered_atstring / nullOptionalDelivered At format: date-time
[].payloadobjectRequiredPayload
json
[
  {
    "event_id": "string",
    "event_type": "string",
    "delivered": false,
    "dead": false,
    "attempts": 1,
    "last_error": "string",
    "last_response_status": 1,
    "next_attempt_at": "2026-07-13T12:00:00Z",
    "delivered_at": "2026-07-13T12:00:00Z",
    "payload": {
      "example_key": "string"
    }
  }
]
Errors & recovery401 · 403 · 422 · 423

Handler errors are listed below. detail depends on validation and state; its text is not a stable error code. After a 5xx, a write outcome may be unknown: reconcile first.

HTTPMeaningAction
401Invalid credentialsCheck the API key, active state and write secret.
403Access deniedCheck project ownership and activation; checkout session calls also need the invoice cookie.
422Validation faileddetail is an array: loc identifies the field, msg explains the error, type is its code. Correct required fields and types.
423Project lockedCheck project activation and restrictions in the dashboard. Do not retry unchanged.

Possible detail messages

  • API key does not have access to this project
  • Project API key is required
json
{
  "detail": "Error description"
}