{
"id": "54b1fca5-697c-4b22-937f-e78abb9bb42f",
"type": "trade.busted",
"createdAt": "2026-10-21T09:12:40.102Z",
"data": {
"tradeId": "a1b2c3d4-0000-1111-2222-333344445555",
"orderId": "019f2d10-aaaa-733c-b8af-42a3620ee999",
"clientOrderId": "my-app-order-8f3e2a1b",
"externalCustomerId": "cust-92",
"marketId": 60497,
"eventId": 5454,
"role": "taker",
"side": "buy",
"contractSide": "yes",
"price": 46,
"quantity": 4,
"resolution": "reversed"
}
}A trade was busted (per player)
Fires when an admin busts a trade — once per player of yours in that trade, so twice if both sides are your customers. It carries only that player’s own order and trade data. resolution says what happened to the money:
resolution | Meaning | Money |
|---|---|---|
reversed | The fill is cancelled and the money returned. | For a customer whose cash you hold, a wallet.credit (BUY refund) or wallet.debit (SELL payout taken back) with reason: trade_bust_reversal follows. |
corrected_to_fair_value | The trade stands, re-priced to fair value as of when it executed. | For a customer whose cash you hold, a single wallet.credit or wallet.debit with reason: trade_bust_correction follows, if anything is owed. |
Match the wallet event to this one with tradeId. Delivery order between events is not guaranteed. Exclude busted trades from your volume and P&L.
Delivered async, signed, at-least-once. Every delivery carries:
X-DimeTrades-Event-Id: 54b1fca5-697c-4b22-937f-e78abb9bb42f
X-DimeTrades-Event-Type: trade.busted
X-DimeTrades-Signature: t=1786384403,v1=6ac323d7d75b7e9f6cbfce6acc19edc657798f1e30dcd00c933cba5a4000a58b
v1 is HMAC-SHA256(webhookSecret, "{t}.{rawBody}"), hex-encoded. Verify it, and reject stale timestamps, before trusting the payload. Retried with exponential backoff (30s -> 2m -> 10m -> 1h -> 6h) up to 8 attempts if your endpoint doesn’t return 2xx; dedupe on id since a retried delivery reuses the same event id. Full details in the Partner webhooks guide.
{
"id": "54b1fca5-697c-4b22-937f-e78abb9bb42f",
"type": "trade.busted",
"createdAt": "2026-10-21T09:12:40.102Z",
"data": {
"tradeId": "a1b2c3d4-0000-1111-2222-333344445555",
"orderId": "019f2d10-aaaa-733c-b8af-42a3620ee999",
"clientOrderId": "my-app-order-8f3e2a1b",
"externalCustomerId": "cust-92",
"marketId": 60497,
"eventId": 5454,
"role": "taker",
"side": "buy",
"contractSide": "yes",
"price": 46,
"quantity": 4,
"resolution": "reversed"
}
}Authorizations
The end user's JWT access token, sent as Authorization: Bearer <token>.
Obtain one from POST /partner/customers or POST /partner/customers/login
— both return it as token. It identifies which of your users a call
is made for, and is sent alongside your X-API-Key on every authenticated
endpoint.
Event discovery, categories, subcategories and scores are public and need no token.
ISV / partner credential — public half. Required on every request.
Identifies the integration partner (ISV) making the call. Issued by Dime
Trades when the ISV is onboarded and sent on every /partner/* endpoint:
X-API-Key: dt_pk_live_7f3c9a2e5b18
- On the two partner endpoints that create accounts or issue tokens (
POST /partner/customers,POST /partner/customers/login), it is accompanied byX-API-Secretand is the only authentication — there is no user token yet. - On every other partner endpoint it is sent alongside the user's
Authorization: Bearer <token>: the API key says which platform is calling, the bearer token says which user it is calling for.
Credentials are scoped to one or more brands; using a key with a brandId outside that scope returns 403. Staging and production keys are separate.
The key identifies your platform — treat it as a backend credential.
Body
The payload DimeTrades sends to your webhookUrl.
Every webhook delivery shares this envelope. id is stable across retries — use it to dedupe. data varies per type; see each webhook page.
Stable per-event id. Identical across delivery retries — dedupe on this.
One of the webhook event names, e.g. order.filled, trade.executed.
Event-specific payload — see the individual webhook for its shape. Every order.*, trade.executed and wallet.* event carries orderId, clientOrderId (the key you supplied on POST /orders; null only for an order placed without one), marketId, eventId (the event the market belongs to) and externalCustomerId (your own id for the customer, as supplied when you registered them), so you can correlate on your own keys without a lookup. The exception is a wallet.credit with reason: market_settlement, which has no order behind it and carries marketId and positionId instead.
Response
Return any 2xx to acknowledge receipt. Anything else (including a timeout) is treated as a delivery failure and retried.
