> ## Documentation Index
> Fetch the complete documentation index at: https://docs.daya.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook Events

> Detailed schemas for all Pro Trading API webhook event types

## Event Types

Daya Pro sends webhooks for the following trading events:

| Event                      | Terminal? | Description                                                        |
| -------------------------- | --------- | ------------------------------------------------------------------ |
| `order.created`            | No        | Order accepted by matching engine                                  |
| `order.filled`             | Yes       | Order completely filled                                            |
| `order.partially_filled`   | No        | Order partially filled, still open                                 |
| `order.cancelled`          | Yes       | Order cancelled                                                    |
| `order.rejected`           | Yes       | Order rejected                                                     |
| `trade.executed`           | N/A       | Trade executed for your order                                      |
| `deposit.completed`        | N/A       | An NGN bank-transfer deposit settled to your Daya Pro balance      |
| `crypto.deposit.completed` | N/A       | A confirmed on-chain deposit was credited to your Daya Pro balance |

## Order Events

All order events share these common fields in the `data` object:

<ResponseField name="id" type="string" required>
  Unique order identifier (UUID)
</ResponseField>

<ResponseField name="symbol" type="string" required>
  Trading pair (e.g., `USD-NGN`)
</ResponseField>

<ResponseField name="side" type="string" required>
  Order side: `buy` or `sell`
</ResponseField>

<ResponseField name="type" type="string" required>
  Order type: `market` or `limit`
</ResponseField>

<ResponseField name="status" type="string" required>
  Order status
</ResponseField>

<ResponseField name="price" type="string">
  Limit price (omitted for market orders)
</ResponseField>

<ResponseField name="quantity" type="string" required>
  Total order quantity
</ResponseField>

<ResponseField name="filled_quantity" type="string" required>
  Quantity filled so far
</ResponseField>

<ResponseField name="executed_price" type="string">
  Volume-weighted average execution price (present when partially or fully filled)
</ResponseField>

<ResponseField name="base_asset" type="string" required>
  Base asset of the trading pair (e.g., `USD`)
</ResponseField>

<ResponseField name="quote_asset" type="string" required>
  Quote asset of the trading pair (e.g., `NGN`)
</ResponseField>

<ResponseField name="created_at" type="string" required>
  ISO 8601 timestamp when order was created
</ResponseField>

<ResponseField name="updated_at" type="string" required>
  ISO 8601 timestamp when order was last updated
</ResponseField>

***

### order.created

Sent when a new order is accepted by the matching engine.

**Status:** `open`

***

### order.filled

Sent when an order is completely filled.

**Status:** `filled`

**Additional field:**

* `executed_price` - Volume-weighted average execution price

***

### order.partially\_filled

Sent when an order is partially filled but still has remaining quantity.

**Status:** `partially_filled`

**Additional field:**

* `executed_price` - Average execution price so far

***

### order.cancelled

Sent when an order is cancelled.

**Status:** `cancelled`

**Additional field:**

<ResponseField name="cancelled_at" type="string">
  ISO 8601 timestamp when cancelled
</ResponseField>

***

### order.rejected

Sent when an order is rejected.

**Status:** `rejected`

**Additional field:**

<ResponseField name="rejection_reason" type="string">
  Reason for rejection

  **Values:**

  * `insufficient_balance` - Not enough funds
  * `invalid_price` - Price outside allowed range
  * `invalid_quantity` - Quantity below minimum or above maximum
  * `market_closed` - Market not accepting orders
  * `rate_limit_exceeded` - Too many orders
</ResponseField>

***

## Trade Events

### trade.executed

Sent when a trade is executed involving your order.

<Note>
  You may receive multiple `trade.executed` events for a single order if it fills across multiple price levels or counterparties.
</Note>

<ResponseField name="id" type="string" required>
  Unique trade identifier (UUID)
</ResponseField>

<ResponseField name="order_id" type="string" required>
  Your order ID that was filled
</ResponseField>

<ResponseField name="symbol" type="string" required>
  Trading pair
</ResponseField>

<ResponseField name="side" type="string" required>
  Your side in this trade: `buy` or `sell`
</ResponseField>

<ResponseField name="is_maker" type="boolean" required>
  Whether you were the maker in this trade

  * `true` - Your order was resting on the order book (maker)
  * `false` - Your order matched against resting orders (taker)
</ResponseField>

<ResponseField name="price" type="string" required>
  Execution price
</ResponseField>

<ResponseField name="quantity" type="string" required>
  Trade quantity
</ResponseField>

<ResponseField name="total_value" type="string" required>
  Total value in quote currency
</ResponseField>

<ResponseField name="fee" type="string" required>
  Trading fee charged
</ResponseField>

<ResponseField name="base_asset" type="string" required>
  Base asset of the trading pair
</ResponseField>

<ResponseField name="quote_asset" type="string" required>
  Quote asset of the trading pair
</ResponseField>

<ResponseField name="counterparty_order_id" type="string" required>
  The order ID of the counterparty in this trade
</ResponseField>

<ResponseField name="executed_at" type="string" required>
  ISO 8601 timestamp of execution
</ResponseField>

***

## Deposit Events

### deposit.completed

Sent when an NGN bank-transfer deposit settles to your Daya Pro balance. Useful for
triggering downstream ledger updates without polling.

<Note>
  Bank deposit events fire only on the terminal `completed` state. On-chain deposits use
  `crypto.deposit.completed`.
</Note>

<ResponseField name="id" type="string" required>
  Deposit transaction identifier
</ResponseField>

<ResponseField name="type" type="string" required>
  Always `deposit`
</ResponseField>

<ResponseField name="method" type="string" required>
  Funding rail used. Always `bank_transfer` for this event
</ResponseField>

<ResponseField name="status" type="string" required>
  Always `completed` for this event
</ResponseField>

<ResponseField name="amount_ngn" type="string" required>
  Settled amount in NGN as a decimal string
</ResponseField>

<ResponseField name="fee_amount_ngn" type="string">
  Fee charged in NGN, if any
</ResponseField>

<ResponseField name="currency" type="string" required>
  Currency code of the original deposit. Always `NGN` for this event
</ResponseField>

<ResponseField name="payment_provider" type="string">
  Underlying provider that settled the deposit (e.g. `flutterwave`)
</ResponseField>

<ResponseField name="provider_transaction_id" type="string">
  Provider-side reference for reconciliation
</ResponseField>

<ResponseField name="tx_ref" type="string">
  Transaction reference (when provider supplies one)
</ResponseField>

<ResponseField name="originator_name" type="string">
  Name on the source bank account, when available
</ResponseField>

<ResponseField name="matching_reference" type="string">
  Internal reference used to attribute the deposit to your account
</ResponseField>

<ResponseField name="reference" type="string">
  User-supplied or generated reference shown on statements
</ResponseField>

<ResponseField name="narration" type="string">
  Free-form narration from the source institution
</ResponseField>

<ResponseField name="description" type="string">
  Human-readable summary
</ResponseField>

<ResponseField name="created_at" type="string" required>
  ISO 8601 timestamp when the deposit was first observed
</ResponseField>

<ResponseField name="completed_at" type="string">
  ISO 8601 timestamp when the deposit finished settling
</ResponseField>

### crypto.deposit.completed

Sent after a confirmed on-chain deposit is credited to your Daya Pro balance.

<Note>
  This event is for account-level crypto collection. It is not a per-customer wallet
  creation or custody event.
</Note>

<ResponseField name="transaction_id" type="string" required>
  Daya transaction identifier
</ResponseField>

<ResponseField name="status" type="string" required>
  Always `completed` for this event
</ResponseField>

<ResponseField name="asset" type="string" required>
  Partner-facing asset symbol, such as `USDT`
</ResponseField>

<ResponseField name="amount" type="string" required>
  Credited amount as a full-precision decimal string for the asset
</ResponseField>

<ResponseField name="fee_amount" type="string" required>
  Fee amount as a full-precision decimal string for the asset
</ResponseField>

<ResponseField name="fee_asset" type="string" required>
  Asset used to charge the fee. This currently matches `asset`
</ResponseField>

<ResponseField name="blockchain" type="string" required>
  Canonical chain key, such as `ethereum` or `polygon`
</ResponseField>

<ResponseField name="transaction_hash" type="string">
  On-chain transaction hash when available
</ResponseField>

<ResponseField name="from_address" type="string">
  Source address when available
</ResponseField>

<ResponseField name="to_address" type="string">
  Account-level deposit address that received the funds
</ResponseField>

<ResponseField name="created_at" type="string" required>
  ISO 8601 timestamp when the deposit transaction was first observed
</ResponseField>

<ResponseField name="completed_at" type="string">
  ISO 8601 timestamp when the deposit was credited
</ResponseField>

<ResponseExample>
  ```json theme={null}
  {
    "event_id": "880e8400-e29b-41d4-a716-446655440000",
    "type": "crypto.deposit.completed",
    "timestamp": "2026-06-05T12:00:09Z",
    "data": {
      "transaction_id": "11111111-1111-1111-1111-111111111111",
      "status": "completed",
      "asset": "USDT",
      "amount": "50.000000",
      "fee_amount": "0.000000",
      "fee_asset": "USDT",
      "blockchain": "ethereum",
      "transaction_hash": "0xhash456",
      "from_address": "0xsource",
      "to_address": "0x1234567890abcdef1234567890abcdef12345678",
      "created_at": "2026-06-05T11:59:30Z",
      "completed_at": "2026-06-05T12:00:09Z"
    }
  }
  ```
</ResponseExample>

***

## Order Status Flow

```
                    +---> rejected
                    |
placed ---> created +---> filled
                    |
                    +---> partially_filled ---> filled
                    |                      |
                    |                      +---> cancelled
                    |
                    +---> cancelled
```

## Next Steps

<CardGroup cols={2}>
  <Card title="Webhook Overview" icon="webhook" href="/pro/webhooks/overview">
    Delivery guarantees and implementation
  </Card>

  <Card title="Signature Verification" icon="shield-check" href="/pro/webhooks/verification">
    Verify webhook authenticity
  </Card>
</CardGroup>
