account:trades_v3_#{address}.
CHANNEL NAME FORMAT
account:fills_v3_#{address}
| Name | Type | Description |
|---|---|---|
| address | string | Your checksummed address. It must equal your realtime token’s sub — see subscribing to your own channels |
fill. Quarter-line legs each get their own message, distinguished by quarterlineMarketHash.
| Name | Type | Description |
|---|---|---|
| id | string | The row’s key, {matchId}:{orderId}:{marketHash}. |
| matchId | string | The engine’s match. Unique per fill |
| orderId | string | The order you signed that produced this fill, not the counterparty’s |
| tradeId | string | The bet all of this fill’s siblings belong to |
| marketHash | string | The market. For a parlay or quarter-line bet, the parent market |
| quarterlineMarketHash | string or null | The specific half-line leg, when the bet was on a quarter line |
| isParlay | boolean | true when marketHash is a parlay parent |
| userAddress | string | Your user address, checksummed |
| wallet | string | Your proxy address |
| fillAmount | string | Your stake in this fill, in base units. See unit conversions. |
| fillOdds | string | The odds this fill got, in the sx.bet protocol format. To convert to implied odds divide by 10^20. See unit conversions. |
| returnAmount | string | Gross return for this fill if it wins, stake included |
| isBettingOutcomeOne | boolean | The side you backed |
| status | string | "PENDING", "LOCKED", "FAILED" or "SETTLED". See bet lifecycle |
| txHash | string or null | The on-chain lock transaction. null until it lands |
| ceRefundAmount | string | Capital-efficiency refund on this fill. See capital efficiency |
| ceRefundFeeAmount | string | The fee taken on that refund |
| usedBetCredits | boolean | Whether bet credits paid for it |
| clientOrderId | string | Your own tag from the order that produced this fill, present only when set — the maker’s tag on maker rows, the taker’s on taker rows. See client order id |
| externalUserId | string | Optional partner tag from the order that produced this fill, present only when set — the maker’s tag on maker rows, the taker’s on taker rows. See External user id |
| createdAt | string | ISO timestamp for when the row was created |
| updatedAt | string | ISO timestamp for the last modification of this row |
| settlement | object or null | null until the fill is "SETTLED". A different shape from the bet-grain block — it carries settleTxHash, has no settleDate, and its settleFeeAmount is nullable. Do not share a parser between the two |
// To subscribe
const address = "0xbcc6D643e4159A75ED1dB4e13330230B82F2AEe5"; // checksummed
const sub = client.newSubscription(`account:fills_v3_#${address}`, { recoverable: true });
sub.on("publication", (ctx) => {
const data = ctx.data;
// message handler logic
});
sub.subscribe();
import asyncio
from centrifuge import Client, PublicationContext, SubscriptionEventHandler
async def on_publication(ctx: PublicationContext) -> None:
print(ctx.data)
async def main():
address = "0xbcc6D643e4159A75ED1dB4e13330230B82F2AEe5" # checksummed
client = Client(
"wss://realtime.sx.bet/connection/websocket",
token="YOUR_TOKEN", # from /user/realtime-token-v3/api-key
)
await client.connect()
handler = SubscriptionEventHandler(on_publication=on_publication)
sub = client.new_subscription(f"account:fills_v3_#{address}", handler)
await sub.subscribe()
await asyncio.Future() # keep running
asyncio.run(main())
{
"fill": {
"id": "0xec8eaaa2…5793:0x02d22c2a…c55ea:0x1fec4ed9…3266",
"matchId": "0xec8eaaa21ef52bf5f2a3fee5f139258a63f65cf2218dfee40362f2fc90e55793",
"orderId": "0x02d22c2ac3f2aa27ca96e156aa2fa4affb15064a169e02b55881bdd6867c55ea",
"tradeId": "0xac6bb30bba6ea82d8717219a4fa49d15b58fd638fba479f294b4d402376d14d6",
"marketHash": "0x1fec4ed9b71c2f812db900af7d12446158a0eda56041106f99551c496efd3266",
"quarterlineMarketHash": null,
"isParlay": false,
"userAddress": "0xbcc6D643e4159A75ED1dB4e13330230B82F2AEe5",
"wallet": "0x4361123dbdc1D812fdf7D27045aF358C9C8AA70A",
"fillAmount": "333334",
"fillOdds": "40000000000000000000",
"returnAmount": "833335",
"isBettingOutcomeOne": false,
"status": "LOCKED",
"txHash": "0x64307e2f35d0a81b0f44e9043e99cf01def3b2f079fb68cf2c5a942b88d95e9a",
"ceRefundAmount": "0",
"ceRefundFeeAmount": "0",
"usedBetCredits": false,
"createdAt": "2026-07-31T18:47:09.577Z",
"updatedAt": "2026-07-31T18:47:12.837Z",
"settlement": null
}
}