API · Справочник

Gamma API на gamma-api.polymarket.com — это «каталог»: именно так вы находите рынки и события и получаете token ID, которые нужны CLOB для торговли. Он публичный, без аутентификации, так что вы можете изучать каждый эндпоинт из браузера или curl прямо сейчас, как и живые инструменты на этой странице.

Кратко
  • Базовый URL: https://gamma-api.polymarket.com · без аутентификации, только чтение.
  • Лимит запросов: ~4 000 запросов / 10 с в целом (/events ~500, /markets ~300).
  • Шаг 1 почти каждого бота: превратить рынок в его token ID, затем торговать ими на CLOB.
  • Всё — это JSON. Три важных поля приходят как строки JSON, которые нужно разобрать заново (см. ниже).

Эндпоинты, которыми вы реально пользуетесь

ЭндпоинтВозвращаетИспользуйте, чтобы
GET /marketsРынки с метаданными, актуальными ценами и token ID.Разрешить slug в token ID; сканировать торгуемые рынки.
GET /eventsСобытия (группу связанных рынков) с их дочерними рынками.Просматривать по темам; рендерить многоисходные карточки.
GET /public-search?q=Полнотекстовый поиск по событиям и рынкам.Найти рынок, когда известно только название.
GET /tagsКатегорийные теги (политика, крипто, спорт...).Обнаружить корректные фильтры tag_slug.

Частые параметры запроса на /markets и /events: active=true, closed=false, slug=, tag_slug=, order=volume24hr, ascending=false, limit= и offset= для пагинации.

GET /markets — запрос и ответ

Запросите один рынок по slug. Вы получаете массив (даже для одного рынка), так что берите элемент [0]:

curl -s "https://gamma-api.polymarket.com/markets?slug=will-it-rain-in-nyc-today" | jq '.[0]'
import requests, json
m = requests.get("https://gamma-api.polymarket.com/markets",
                 params={"slug": "will-it-rain-in-nyc-today"}).json()[0]

Урезанный, аннотированный ответ (поля, которые важны боту):

{
  "id": "519284",
  "question": "Will it rain in NYC today?",
  "slug": "will-it-rain-in-nyc-today",
  "conditionId": "0x1f2e...c0",      // the market id (NOT what you trade on)
  "active": true,                    // listed and live
  "closed": false,                   // not yet resolved
  "acceptingOrders": true,           // the CLOB is currently taking orders
  "outcomes": "[\"Yes\", \"No\"]",          // JSON string -> parse it
  "clobTokenIds": "[\"7142...\", \"1098...\"]", // JSON string, aligned with outcomes
  "outcomePrices": "[\"0.62\", \"0.38\"]",     // JSON string, last prices
  "bestBid": 0.61,
  "bestAsk": 0.63,
  "lastTradePrice": 0.62,
  "volume24hr": 48213.5,
  "endDate": "2026-06-16T00:00:00Z"
}

Два token ID исходов лежат внутри clobTokenIds. Именно на них торгует CLOB — прочитайте их, и вы сможете поставить ордер.

Подвох №1: поля-строки в кодировке JSON

Gamma возвращает clobTokenIds, outcomes и outcomePrices как JSON-строки внутри JSON, так что вам придётся декодировать их второй раз. И никогда не хардкодьте, какой токен «Да»: читайте разобранный массив outcomes и сопоставляйте по имени, потому что порядок не гарантирован.

import requests, json
m = requests.get("https://gamma-api.polymarket.com/markets",
                 params={"slug": SLUG}).json()[0]
outcomes   = json.loads(m["outcomes"])        # e.g. ["Yes", "No"]
token_ids  = json.loads(m["clobTokenIds"])    # aligned with outcomes
prices     = json.loads(m["outcomePrices"])   # aligned with outcomes
yes_token  = token_ids[outcomes.index("Yes")]
print(yes_token, prices[outcomes.index("Yes")])
const r = await fetch(`https://gamma-api.polymarket.com/markets?slug=${SLUG}`);
const m = (await r.json())[0];
const outcomes  = JSON.parse(m.outcomes);
const tokenIds  = JSON.parse(m.clobTokenIds);
const yesToken  = tokenIds[outcomes.indexOf("Yes")];
curl -s "https://gamma-api.polymarket.com/markets?slug=$SLUG" | jq -r '.[0].clobTokenIds | fromjson | .[0]'

Попробуйте на реальном рынке — вставьте slug и вытяните его token ID вживую:

Сканируем торгуемые рынки

Типичный запрос обнаружения бота просит активные, открытые рынки, самые оживлённые первыми, в одной категории:

GET https://gamma-api.polymarket.com/markets
    ?active=true&closed=false&order=volume24hr&ascending=false&limit=20&tag_slug=politics

Отфильтруйте результат на стороне клиента до рынков, которые действительно торгуемы, прежде чем действовать по ним:

# keep only markets the CLOB will accept orders on right now
tradeable = [m for m in markets
             if m.get("active") and not m.get("closed") and m.get("acceptingOrders")]

Ищите вживую (это вызывает /public-search, затем загружает token ID по каждому рынку):

Пагинация и свежесть

  • Пагинация: добавьте limit и offset и идите, пока не получите короткую страницу. Держите limit ≤ 500 на /events, ≤ 300 на /markets.
  • Свежесть: цены (bestBid, bestAsk, lastTradePrice) двигаются постоянно. Gamma годится для обнаружения и грубой цены, но котируйте и торгуйте по актуальному стакану CLOB, а не по кэшированной цене Gamma.
  • Кэширование: кэшируйте соответствие slug -> token_id (оно стабильно), а не цены.

GET /events — многоисходные группы

Событие связывает вместе родственные рынки (например, «Выборы мэра Нью-Йорка» держат по одному рынку на кандидата). Используйте его, чтобы рендерить многоисходные карточки или найти каждый рынок по теме:

curl -s "https://gamma-api.polymarket.com/events?slug=nyc-mayor-2025" | jq '.[0].markets | length'

У каждого события есть массив markets; у каждой записи те же строковые поля clobTokenIds / outcomes, что и у верхнеуровневого рынка, так что применяется тот же разбор.

conditionId против token_id. Gamma даёт вам conditionId рынка и его clobTokenIds (по одному на исход). CLOB торгует по token_id, никогда по conditionId — их путаница — самый частый баг первого бота.

Справочник полей (те, что кусаются)

ПолеЗначение
conditionIdИдентификатор рынка. Используется для расчёта и on-chain поиска, не для постановки ордеров.
clobTokenIdsJSON-строка с массивом token ID исходов. Разберите её; торгуйте ими на CLOB.
outcomes / outcomePricesJSON-строки с массивами, выровненными по индексу с clobTokenIds.
active / closedВ списке и живой / рассчитан. Торгуемый рынок — это active && !closed.
acceptingOrdersПринимает ли CLOB ордера прямо сейчас. Проверяйте это перед котированием.
bestBid / bestAsk / lastTradePriceОриентировочные цены. Авторитетная цена приходит из стакана CLOB.

Далее: CLOB API (торговать по token_id) · Data API (история и PnL) · Исправить ошибку.