curl --request POST \
--url https://magicmarkets.com/v2/orders/ \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"betslip_id": "bs-single-001",
"price": 3.25,
"stake": [
"USDT",
100
]
}
'{
"status": "ok",
"data": {
"order_id": 5001,
"order_type": "normal",
"bet_type": "for,h",
"bet_type_description": "Home",
"sport": "fb",
"want_price": 3.25,
"want_stake": [
"USDT",
115.38
],
"ccy_rate": 1,
"placement_time": "2026-06-15T12:00:00+00:00",
"expiry_time": "2026-06-15T12:05:00+00:00",
"closed": false,
"close_reason": null,
"status": "open",
"keep_open_ir": false,
"exchange_mode": "make_and_take",
"price": null,
"stake": null,
"profit_loss": null,
"bet_bar_values": null,
"current_score": null,
"legs": null,
"event_info": {
"event_type": "normal",
"event_id": "2026-06-15,1001,2002",
"event_name": "Arsenal vs. Chelsea",
"home_id": 1001,
"home_team": "Arsenal",
"away_id": 2002,
"away_team": "Chelsea",
"competition_id": 1,
"competition_name": "England Premier League",
"competition_country": "XE",
"start_time": "2026-06-15T15:00:00+00:00",
"date": "2026-06-15",
"result": null
},
"bets": [],
"user_data": null
}
}{
"status": "error",
"code": "validation_error",
"data": {
"validation_errors": {
"non_field_errors": [
"event_stake_limit_reached"
]
}
}
}{
"status": "error",
"code": "auth_error",
"data": {
"detail": "Authentication credentials were not provided."
}
}{
"status": "error",
"code": "forbidden",
"data": null
}{
"status": "error",
"code": "order_already_created",
"data": {
"order_id": 5001,
"message": "An order with this request_uuid already exists."
}
}{
"status": "error",
"code": "throttled",
"data": {
"message": "Request was throttled. Expected available in 12 seconds.",
"retry_after": 12
}
}{
"status": "error",
"code": "server_error",
"data": [
"An error has occurred, token:",
"ABC123abc456DEF789gh"
]
}Create order
Places a new order on an existing betslip.
curl --request POST \
--url https://magicmarkets.com/v2/orders/ \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"betslip_id": "bs-single-001",
"price": 3.25,
"stake": [
"USDT",
100
]
}
'{
"status": "ok",
"data": {
"order_id": 5001,
"order_type": "normal",
"bet_type": "for,h",
"bet_type_description": "Home",
"sport": "fb",
"want_price": 3.25,
"want_stake": [
"USDT",
115.38
],
"ccy_rate": 1,
"placement_time": "2026-06-15T12:00:00+00:00",
"expiry_time": "2026-06-15T12:05:00+00:00",
"closed": false,
"close_reason": null,
"status": "open",
"keep_open_ir": false,
"exchange_mode": "make_and_take",
"price": null,
"stake": null,
"profit_loss": null,
"bet_bar_values": null,
"current_score": null,
"legs": null,
"event_info": {
"event_type": "normal",
"event_id": "2026-06-15,1001,2002",
"event_name": "Arsenal vs. Chelsea",
"home_id": 1001,
"home_team": "Arsenal",
"away_id": 2002,
"away_team": "Chelsea",
"competition_id": 1,
"competition_name": "England Premier League",
"competition_country": "XE",
"start_time": "2026-06-15T15:00:00+00:00",
"date": "2026-06-15",
"result": null
},
"bets": [],
"user_data": null
}
}{
"status": "error",
"code": "validation_error",
"data": {
"validation_errors": {
"non_field_errors": [
"event_stake_limit_reached"
]
}
}
}{
"status": "error",
"code": "auth_error",
"data": {
"detail": "Authentication credentials were not provided."
}
}{
"status": "error",
"code": "forbidden",
"data": null
}{
"status": "error",
"code": "order_already_created",
"data": {
"order_id": 5001,
"message": "An order with this request_uuid already exists."
}
}{
"status": "error",
"code": "throttled",
"data": {
"message": "Request was throttled. Expected available in 12 seconds.",
"retry_after": 12
}
}{
"status": "error",
"code": "server_error",
"data": [
"An error has occurred, token:",
"ABC123abc456DEF789gh"
]
}Authorizations
API key created from the magic-markets website
Body
Limit decimal price. A bet is taken only at this price or better, and an off-tick limit moves to the first tick that honours it; see "Price ticks".
[currency, amount] - e.g. ["USDT", 115.38]
Show child attributes
Show child attributes
Order duration in seconds (default 15)
How the order interacts with the exchange. make_and_take: fill against the best available liquidity first; any remaining stake is advertised on the exchange at your price, while the order keeps taking newly available liquidity. take_only: only consume available liquidity; remaining stake is never advertised and other orders cannot match against it. dark: like make_and_take, but the advertised remaining stake is hidden from other customers - they can still match it when their price crosses yours, but they cannot see your price until then. There is no post-only mode: no order type rests in the book without also taking crossing liquidity.
make_and_take, take_only, dark Keep order open when event goes in-play
512Idempotency key
dark orders only (rejected on other modes): the minimum total stake another order must request to be allowed to match yours at your price point. Cannot exceed the order's own stake. Set it non-zero to stop small probe orders from discovering your price.
Show child attributes
Show child attributes
Placement-time score assertion, [home, away]. When present, the order is rejected with validation_error / non_field_errors: ["event_scores_dont_match"] unless the value matches the live score the exchange holds for the event - use it to avoid placing on a price that has not reacted to a goal yet. Only meaningful for football: for sports without a goal-style running score, and while no score is known yet, the server assumes [0, 0] and rejects any other value. Omit the field to skip the check.
Show child attributes
Show child attributes
When true, only liquidity sources that do not hold bets in danger status are used. When false or omitted, all available liquidity sources are used.
Optional per-source minimum stakes, keyed by source. A source is only used if it can take at least its minimum. Values are [currency, amount] tuples.
Show child attributes
Show child attributes
Optional caller-supplied tag recorded against the order.

