Webhooks
Event envelope
Shared event envelope for all webhook deliveries.
Event envelope
Every webhook payload uses same outer envelope.
Example
{
"event_id": "4f35af6b-6aa3-4a6d-bc6f-9a5b24ad7bb0",
"event_type": "mini_app.trade.processed",
"operator_id": 12,
"occurred_at": "2026-06-18T00:00:00.000Z",
"aggregate_type": "mini_app_order",
"aggregate_id": "123",
"idempotency_key": "mini_app_order:123:processed",
"data": {
"order_id": 123,
"trade_id": 456,
"executed_trade_id": 456,
"operator_id": 12,
"operator_user_id": 34,
"polynion_user_id": 789,
"external_user_id": "operator-user-123",
"market_id": 51,
"side": "buy",
"outcome": "yes",
"status": "processed",
"requested_external_amount_minor": 10000,
"requested_shares_micro": null,
"quoted_credits_equivalent": 6340,
"quoted_external_amount_minor": 10000,
"shares_micro": 1234500,
"balance_spent": 10000,
"trade_fee": 39,
"trade_fee_credits": 25,
"currency_code": "IDR",
"fx_rate_snapshot_id": 88,
"failure_reason": null
}
}
Fields
| Field | Type | Meaning |
|---|---|---|
event_id | string | Globally unique event identifier. Primary dedupe key on receiver side. |
event_type | string | Business event name. |
operator_id | number | OpenPoly operator record ID for routing and audit. |
occurred_at | string | UTC ISO timestamp when event became true. |
aggregate_type | string | Resource family behind event, such as mini_app_order. |
aggregate_id | string | Aggregate identifier, always serialized as string. |
idempotency_key | string | Stable event-level idempotency key from OpenPoly side. |
data | object | Event-specific payload only. |
Invariants
event_idunique across all webhook eventsaggregate_idalways string, even if underlying DB key numericdatashape depends onevent_type- trade event
datais reconstructed from durable order/user/operator/trade rows when possible - no API key, wallet secret, launch token, or session secret in payload
- no raw internal transaction token in payload
- legacy trade fields
credits_deltaandexternal_amount_minorare not emitted in trade callbackdata trade_feeis historical fee in integer minor units ofcurrency_code;trade_fee_creditsis same fee denominated in Credits
Receiver guidance
- store full envelope with raw body hash if audit required
- dedupe by
event_id, not byaggregate_id - route business logic by
event_type - use
aggregate_typeandaggregate_idfor correlation, not dedupe
Related pages
- event list and payloads:
/docs/webhooks/event-types - retry behavior:
/docs/webhooks/retry-and-replay
