Order Callback

When an order received through a Payment Channel changes status, CoinGate sends a structured callback to the URL configured on that Payment Channel (callback_url). The payload follows a versioned envelope (event, object, data) and includes everything a merchant needs for reconciliation: contact details, external identifiers, the payment address, blockchain transactions, fees, and the exchange rate.

📘

API Callback Documentation

The callback is delivered as a POST request with a application/json body. For shared callback behavior — retry policy, IP allowlist, manual resend — see the API Callbacks reference.

A callback is sent every time the order transitions to one of these statuses:

eventWhen it fires
order.status.confirmingIncoming transaction detected, waiting for confirmations
order.status.paidOrder is fully paid (transactions sufficient and AML-cleared)
order.status.invalidOrder rejected (AML failure, payment failed, manual invalidation)
order.status.refundedOrder fully refunded
order.status.partially_refundedOrder partially refunded

Request

PropertyValue
MethodPOST
URLThe Payment Channel's callback_url
Content-Typeapplication/json
User-AgentCoinGate Payment Channel Order Callback
BodyJSON object — see Payload below

Payload

{
  "event": "order.status.paid",
  "object": "order",
  "data": {
    "id": 390104,
    "status": "paid",
    "address": "bc1qexample...",
    "contact": {
      "id": 123,
      "type": "business",
      "company_name": "Acme Corp",
      "external_contact_id": "shop_user_123"
    },
    "price": {
      "amount": "10.00",
      "currency": { "id": 2, "title": "Euro", "symbol": "EUR" }
    },
    "pay": {
      "amount": "0.00016069",
      "currency": {
        "id": 1,
        "title": "Bitcoin",
        "symbol": "BTC",
        "platform": { "id": 6, "title": "Bitcoin" }
      },
      "exchange_rate": {
        "to_currency": { "id": 2, "title": "Euro", "symbol": "EUR" },
        "value": "62000.00"
      }
    },
    "receive": {
      "amount": "9.00",
      "currency": { "id": 2, "title": "Euro", "symbol": "EUR" },
      "exchange_rate": {
        "to_currency": { "id": 2, "title": "Euro", "symbol": "EUR" },
        "value": "1.0"
      }
    },
    "payment_channel": {
      "id": 456,
      "purpose": "merchant_payment"
    },
    "blockchain_transactions": [
      {
        "id": 123,
        "txid": "5c1a0a92-9a3d-4107-9a00-8d6a2a4b6620",
        "amount": "0.00001234",
        "status": "confirmed",
        "network_confirmations": 6,
        "currency": {
          "id": 1,
          "title": "Bitcoin",
          "symbol": "BTC",
          "platform": { "id": 6, "title": "Bitcoin" }
        }
      }
    ],
    "fees": [
      {
        "type": "processing_fee",
        "amount": "0.000002",
        "currency": { "id": 1, "symbol": "BTC" }
      }
    ],
    "paid_at": "2026-04-30T14:04:32+00:00"
  }
}
📘

Exchange rate

exchange_rate.value is the rate to convert into exchange_rate.to_currency (the order's price currency). The exchange_rate object is omitted entirely when no rate applies to that side. pay.currency.platform identifies the blockchain the paid asset settled on.