API — как выгрузить эти данные себе

Загрузка…
Это обычные статические JSON-файлы на CDN. Никакой авторизации, ключей и лимитов — просто GET. Заголовок Access-Control-Allow-Origin: * стоит, поэтому можно дёргать прямо из браузерных приложений. Данные обновляются примерно раз в 15 минут, время снимка — в поле generated_at.

Одна оговорка про User-Agent. CDN режет запросы с Python-urllib — отдаёт 403. Это тот клиент, которым pandas ходит за URL внутри себя, поэтому pd.read_csv("https://…") напрямую не сработает: качайте файл через requests (примеры ниже уже так и написаны). curl, wget, requests и браузер работают без всяких заголовков.
Быстрый стартСписок эндпоинтов Что уже собраноВсе участки (true/false) ФедеральныеОдномандатные Итоги и местаВыгрузить всёСпорные участки

Быстрый старт


  

Сначала берём meta.json — там список регионов с их числовыми id. Эти id подставляются в адреса вида r<id>.json. Важно: id региона может смениться, когда добавляются новые собранные регионы (они отсортированы по алфавиту), поэтому сопоставляйте регион по имени, а не запоминайте номер.



  

Список эндпоинтов

АдресЧто внутри

Что уже собрано, а что нет

Общий прогресс

Сколько участков страны уже собрано, разрез по регионам, плюс действующие параметры правила «спорности». Маленький файл — удобно опрашивать.

Не путайте три счётчика. В разрезе по регионам collected — участки, у которых есть оба протокола, а federal и mandate — у которых есть соответствующий. Верхняя строка сайта и meta.json считают участки с хотя бы одним протоколом, поэтому там число чуть больше, чем collected_uiks: два протокола запрашиваются отдельно и приходят не всегда одновременно.


  

Все участки региона со статусом (true/false)

Полный перечень участков, включая ещё не обработанные

Содержит все участки региона, а не только собранные. Формат компактный: cols — названия колонок, rows — массивы значений.

КолонкаСмысл
guidидентификатор участка в системе ЦИК (стабильный)
name, num«УИК №123» и его номер
tikтерриториальная комиссия (район)
collectedtrue, если собраны оба протокола
federalесть федеральный протокол (партсписки)
mandateесть одномандатный протокол
suspiciousучасток помечен как спорный (см. ниже)

  

Только федеральные результаты (партийные списки)

JSON

По каждому собранному участку: votes — голоса в том же порядке, что массив parties; protocol — строки протокола в порядке protocolLines (1 — в списке, 9 — недействительные, 10 — действительные).

CSV (для Excel / pandas)

Разделитель ;, кодировка UTF-8 с BOM — Excel открывает без плясок. Колонки: region;tik;uik;uik_num;guid;registered;turnout;invalid;valid;suspicious, далее по одной колонке на каждую партию (заголовок — полное название партии).


  

Только одномандатные результаты

JSON

У каждого участка свой список candidates (ФИО, партия выдвижения, голоса) и номер округа district. Кандидаты различаются от округа к округу, поэтому единой «широкой» таблицы тут быть не может — в отличие от федеральных.

Важно: у одномандатного протокола своё число избирателей в списке. Оно может быть меньше федерального: «мобильным избирателям» из других округов окружной бюллетень не выдают. Не смешивайте явку из одного протокола с числом избирателей из другого.


  

Готовые итоги и распределение мест

Итог по стране (федеральный список)

Полные результаты региона (оба протокола сразу)

450 мест в Думе, три варианта подсчёта

В seats.json лежит variants с тремя наборами: orig (как в данных ЦИК), clean (без спорных участков), fixed (спорные заменены средними по региону). В каждом — federal[225], mandate[225] и подробности по округам с победителями.

Компактные точки для графиков

Одна строка — один участок: число избирателей, явка и голоса, свёрнутые по партиям, отдельно для федерального и одномандатного, плюс метка спорности. Колонки перечислены в поле cols.

Как выгрузить всё разом

Монолитного дампа на 90 тысяч участков намеренно нет: он менялся бы целиком каждые 15 минут и его пришлось бы перекачивать. Вместо этого данные нарезаны по регионам — забираются циклом и хорошо кэшируются.



  

Спорные участки — как они определяются

Загрузка параметров…

Метка suspicious проставлена у каждого участка во всех выгрузках — можно использовать её по-своему или пересчитать самостоятельно по сырым данным. Это эвристика, а не доказательство нарушений: она намеренно консервативна (нужны оба признака сразу, малые участки исключены), поэтому скорее пропустит сомнительный участок, чем пометит честный.

Актуальные числовые параметры всегда лежат в status.json в поле suspicious_rule — эта страница показывает именно их, так что при изменении правила описание обновится автоматически.

Откуда данные

Источник — публичные протоколы участковых комиссий с сайта ЦИК РФ (сводные таблицы результатов). Здесь они только перекладываются в удобный формат: значения протоколов не изменяются и не пересчитываются. Исключение — варианты clean/fixed в seats.json, которые явно помечены как расчётные.