---
title: "List offers for an event"
method: GET
path: "/v2/offers/"
tags: ["Market data"]
---

# List offers for an event

`GET /v2/offers/`

## Request

- Base URL: `https://magicmarkets.com` (the document declares no server; this is the origin it was published from)
- URL: `https://magicmarkets.com/v2/offers/`
- Auth: API key in header `X-Api-Key`

Returns the stake available at each price, for each market on the named events. Each entry is the object the stream sends as `["offer", {...}]`.

A reply can be about 4 seconds behind the live prices: the stream updates every 2 seconds, and a client may cache the response for 2 seconds (`Cache-Control: private, max-age=2`). For live prices, register the event on the stream with `register_event`.

`sport` and `event_id` are required, with up to 20 events per request. `GET /v2/events/` lists them.

`bet_type` limits the response to the named markets. It takes the same strings as `POST /v2/betslips/`, so a `bet_type` from here goes into a betslip unchanged.

`market_type` keeps the named market families, such as `ah`, `ou` or `wdw`. `min_liquidity` keeps a market when its `max` stakes, added up across its `price_list`, come to at least that many USDT.

Offers come back in `event_id` order, then `bet_type` order. Page with `limit` and `after`: pass the previous page's last `"{event_id},{bet_type}"` as `after`. A page shorter than `limit` is the last one. Each page is read when it is requested, so for a consistent view of an event, use the stream.

Markets with no available stake are left out. `for` and `against` on one selection are two markets, each with its own `bet_type`. For a sport your account is not enabled for, the list is empty, as on the stream.

An event that has no prices at the moment, or that the feed does not know, returns no offers. The other events in the request still come back. Each `event_id` must have the form an event carries, such as `2026-06-15,1001,2002`; any other form gets a 400.

## Query parameters

- `sport` string, required
- `event_id` string[], required
- `bet_type` string[]
- `market_type` string[]
- `min_liquidity` number
- `limit` integer
- `after` string

## Response `200`

Offers for the named events

- OfferListEnvelope
  - `status` 'ok'
  - `data` Offer[]: One entry per market.
    - `sport` string
    - `event_id` string
    - `bet_type` string: The market and side: market type, line, outcome and `for` or `against`. `POST /v2/betslips/` accepts it as is.
    - `market_type` string: Market family the bet type belongs to (e.g. `ah`, `wdw`, `ou`).
    - `in_running` boolean: Whether the event was in running when this offer was priced.
    - `price_list` PriceLevel[]: Prices sorted descending (best price first).
      - `effective` object
        - `price` number: Decimal price
        - `min` union[]: [currency, amount] - e.g. ["USDT", 115.38]
          - union
            - string
            - number
        - `max` union[]: [currency, amount] - e.g. ["USDT", 115.38]
          - union
            - string
            - number

## Other responses

- `400`: Missing or invalid query parameter.
- `401`: Authentication failed - API key missing, malformed, or rejected.
- `403`: `invalid_customer`: the feed has no record of your account; contact support, because a retry gets the same answer. `forbidden`: the key is valid but cannot perform this action.
- `429`: Rate limit hit. Honour the `Retry-After` header.
- `500`: Unexpected internal error. Quote `data[1]` (the token) when contacting support.
- `503`: `warming`: the feed is loading its market data or customer records; retry with backoff. A body of `{ "detail": "Service unavailable" }` without the envelope means an upstream service could not be reached; retry with backoff.

---

[API](https://skmtc.dev/magicmarkets/apis/magicmarkets-api.md) · [All operations](https://skmtc.dev/magicmarkets/apis/magicmarkets-api/llms.txt) · [OpenAPI document](https://skmtc.dev/magicmarkets/apis/magicmarkets-api/revisions/00c2a7dcce2a?raw)
