{"name":"Dodo IS API","vendor":"Dodo Brands","industry":"retail","summary":"API информационной системы Dodo IS (Додо Пицца, Drinkit, донерные) для разработчиков расширений: заведения, статистика доставки и заказы курьеров, заказы, продажи и отмены, стоп-продажи, сотрудники и смены, складские остатки и финансовые продажи. Доступен для всех стран и концепций; для большинства методов нужна учётная запись пользователя Dodo IS. Почти все методы — `GET` с параметрами в строке запроса.","docsUrl":"https://docs.dodois.io/","coverage":{"included":[],"excluded":[]},"scenarios":[{"id":"sobrat-ezhednevnyy-otchet-po-vyruchke","title":"Собрать ежедневный отчёт по выручке пиццерий","summary":"Отчёт для партнёра-франчайзи: выручка каждой пиццерии по дням и каналам продаж — в таблицу, BI или чат.","steps":["Создай приложение в кабинете разработчика Dodo IS и получи токен по OAuth 2.0 Authorization Code: https://auth.dodois.io/connect/authorize, затем https://auth.dodois.io/connect/token. Запроси scopes shared, user.role:read и offline_access, чтобы получать refresh_token и не просить вход каждый день.","Узнай ID своих заведений: GET /units с countryId (например, RU) и businessId. Пагинация — skip и take.","Запроси продажи: GET /finances/sales/units/daily с units (UUID через запятую без пробелов), fromDate и toDate. Данные агрегированы по дням, каналам продаж (Delivery, Dine-in, Takeaway), источникам заказа и способам оплаты.","Базовый URL зависит от страны и бренда: для Додо Пиццы в России — https://api.dodois.io/dodopizza/ru, для Drinkit — https://api.dodois.io/drinkit/ru."],"code":"API=https://api.dodois.io/dodopizza/ru\n\ncurl -G \"$API/units\" -H \"Authorization: Bearer $DODO_TOKEN\" \\\n  -d countryId=RU -d businessId=<businessId> -d take=100\n\ncurl -G \"$API/finances/sales/units/daily\" -H \"Authorization: Bearer $DODO_TOKEN\" \\\n  -d units=<unit_uuid_1>,<unit_uuid_2> -d fromDate=2026-10-01 -d toDate=2026-10-23","language":"bash","methods":["GET /units","GET /finances/sales/units/daily"]},{"id":"sledit-za-skorostyu-dostavki","title":"Следить за скоростью доставки","summary":"Контроль сервиса: среднее время доставки по пиццериям и разбор конкретных долгих заказов.","steps":["Получи scopes deliverystatistics и user.role:read.","Сводные метрики за период: GET /delivery/statistics с units, from и to (ISO 8601).","Детализация по каждому заказу курьеров: GET /delivery/couriers-orders с теми же units (до 30 заведений), from, to и страницами skip / take (до 1000). Время в ответе — UTC.","Листай, увеличивая skip на число полученных записей, пока не придёт isEndOfListReached = true.","Полные данные проблемного заказа — GET /orders с orderIds."],"code":"import requests\n\nAPI = \"https://api.dodois.io/dodopizza/ru\"\nH = {\"Authorization\": \"Bearer <token>\"}\nparams = {\"units\": \"<unit_uuid>\", \"from\": \"2026-10-23T00:00:00\", \"to\": \"2026-10-24T00:00:00\",\n          \"skip\": 0, \"take\": 1000}\n\nstats = requests.get(f\"{API}/delivery/statistics\", headers=H,\n                     params={k: params[k] for k in (\"units\", \"from\", \"to\")}).json()\n\npages = []\nwhile True:\n    page = requests.get(f\"{API}/delivery/couriers-orders\", headers=H, params=params).json()\n    pages.append(page)\n    if page.get(\"isEndOfListReached\", True):\n        break\n    params[\"skip\"] += params[\"take\"]","language":"python","methods":["GET /delivery/statistics","GET /delivery/couriers-orders","GET /orders"]},{"id":"poluchat-uvedomleniya-o-stop-prodazhah","title":"Получать уведомления о стоп-продажах","summary":"Управляющий сразу узнаёт, что в пиццерии закончился продукт и он в стопе, — а не из отзывов гостей.","steps":["Получи scopes stopsales и user.role:read.","Раз в несколько минут запрашивай стопы за текущий день: GET /production/stop-sales-products с units (до 30 UUID через запятую без пробелов), from и to.","Стопы сгруппированы по пиццериям и продуктам. Сравни с предыдущим опросом и отправляй в чат только новые.","Не опрашивай чаще, чем нужно: при ответе 429 увеличь интервал."],"code":"curl -G \"https://api.dodois.io/dodopizza/ru/production/stop-sales-products\" \\\n  -H \"Authorization: Bearer $DODO_TOKEN\" \\\n  -d units=<unit_uuid_1>,<unit_uuid_2> \\\n  -d from=2026-10-24T00:00:00 -d to=2026-10-24T23:59:59","language":"bash","methods":["GET /production/stop-sales-products"]},{"id":"vygruzit-smeny-sotrudnikov-dlya-rascheta","title":"Выгрузить смены сотрудников для расчёта зарплаты","summary":"Отработанные часы и доставленные заказы за период — в свою систему расчёта зарплаты или премий курьерам.","steps":["Получи scopes staffshifts:read, staffmembers:read и user.role:read.","Запроси смены: GET /staff/shifts с units, clockInFrom и clockInTo (смены выбираются по времени начала), при необходимости staffTypeName. В сменах — дневные, ночные и праздничные часы в минутах, доставленные заказы и расстояние.","Листай по skip и take до isEndOfListReached = true.","Имена и статусы сотрудников — GET /staff/members с units и statuses. Это персональные данные: храни их по правилам 152-ФЗ.","Кто сейчас на смене — GET /staff/couriers-on-shift с units."],"code":"curl -G \"https://api.dodois.io/dodopizza/ru/staff/shifts\" \\\n  -H \"Authorization: Bearer $DODO_TOKEN\" \\\n  -d units=<unit_uuid> \\\n  -d clockInFrom=2026-10-01T00:00:00 -d clockInTo=2026-10-16T00:00:00 \\\n  -d skip=0 -d take=1000","language":"bash","methods":["GET /staff/members","GET /staff/shifts","GET /staff/couriers-on-shift"]},{"id":"proverit-skladskie-ostatki","title":"Проверить складские остатки","summary":"Заказ сырья у поставщиков по фактическим остаткам, а не на глаз.","steps":["Получи scopes accounting:read и user.role:read.","Запроси остатки: GET /accounting/inventory-stocks с units, при необходимости stockItems или categories.","По умолчанию приходят только позиции, подтверждённые ревизией. Расчётные остатки между ревизиями — includeUnconfirmed = true.","Продукты, списанные на отменённые заказы, — GET /accounting/cancelled-sales с units, from и to."],"code":"curl -G \"https://api.dodois.io/dodopizza/ru/accounting/inventory-stocks\" \\\n  -H \"Authorization: Bearer $DODO_TOKEN\" \\\n  -d units=<unit_uuid> -d includeUnconfirmed=true -d take=1000","language":"bash","methods":["GET /accounting/cancelled-sales","GET /accounting/inventory-stocks"]}],"baseUrls":[{"label":"Боевой (Россия, Додо Пицца)","url":"https://api.dodois.io/dodopizza/ru"},{"label":"Боевой (Россия, Drinkit)","url":"https://api.dodois.io/drinkit/ru"},{"label":"Тестовый (mock-сервер)","url":"https://stoplight.io/mocks/dodo-brands/dodo-is/51665679"},{"label":"Для других стран","url":"https://api.dodois.io/dodopizza/{kz,by,kg,uz,tj}"}],"auth":{"type":"oauth2","description":"OAuth 2.0 Authorization Code. Приложение создаётся в личном кабинете разработчика; токен передаётся в заголовке `Authorization: Bearer <token>`.\n\n- Авторизация: `https://auth.dodois.io/connect/authorize`\n- Токен и обновление: `https://auth.dodois.io/connect/token`\n\nОсновные scopes: `shared`, `orders`, `accounting:read`, `deliverystatistics`, `sales`, `stopsales`, `staffmembers:read`, `staffshifts:read`, `unit:read`, `user.role:read`, `offline_access` (получение `refresh_token`).","example":""},"methods":[{"id":"GET /units","title":"Информация о заведениях","httpMethod":"GET","path":"/units","description":"Scope: `shared`.","params":[{"name":"countryId","in":"query","type":"string","required":true,"description":"Страна в формате ISO 3166-1 alpha-2"},{"name":"businessId","in":"query","type":"string","required":true,"description":"ID бизнеса (UUID)"},{"name":"unitTypes","in":"query","type":"string","required":false,"description":"Типы заведений"},{"name":"unitStates","in":"query","type":"string","required":false,"description":"Состояние заведения"},{"name":"units","in":"query","type":"string","required":false,"description":"Заведения (UUID)"},{"name":"organizations","in":"query","type":"string","required":false,"description":"Организации (UUID)"},{"name":"skip","in":"query","type":"integer","required":false,"description":"Сколько записей пропустить, по умолчанию 0"},{"name":"take","in":"query","type":"integer","required":false,"description":"Сколько записей выбрать, по умолчанию 100, максимум 1000"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /delivery/statistics","title":"Статистика доставки","httpMethod":"GET","path":"/delivery/statistics","description":"Основные метрики доставки за период по пиццериям. Scopes: `deliverystatistics`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID через запятую)"},{"name":"from","in":"query","type":"string","required":true,"description":"Начало периода, ISO 8601"},{"name":"to","in":"query","type":"string","required":true,"description":"Конец периода, ISO 8601"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /delivery/couriers-orders","title":"Заказы курьеров","httpMethod":"GET","path":"/delivery/couriers-orders","description":"Метрики по каждому заказу курьеров; время в ответе — UTC. `units` — не больше 30. Scopes: `deliverystatistics`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"from","in":"query","type":"string","required":true,"description":"Начало периода, ISO 8601"},{"name":"to","in":"query","type":"string","required":true,"description":"Конец периода, ISO 8601"},{"name":"skip","in":"query","type":"integer","required":false,"description":"Смещение, по умолчанию 0"},{"name":"take","in":"query","type":"integer","required":false,"description":"Размер страницы, по умолчанию 100, максимум 1000"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /orders","title":"Заказы по идентификаторам","httpMethod":"GET","path":"/orders","description":"Не постраничный: возвращаются все найденные заказы, число ID ограничено; заказы недоступных заведений и неизвестные ID в ответ не попадают. Scopes: `orders`, `user.role:read`.","params":[{"name":"orderIds","in":"query","type":"string","required":true,"description":"ID заказов (UUID)"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /accounting/sales","title":"Продажи","httpMethod":"GET","path":"/accounting/sales","description":"Продажи за период включительно. Scopes: `sales`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"from","in":"query","type":"string","required":true,"description":"Начало периода, ISO 8601"},{"name":"to","in":"query","type":"string","required":true,"description":"Конец периода, ISO 8601"},{"name":"salesChannel","in":"query","type":"string","required":false,"description":"Канал продажи"},{"name":"orderSource","in":"query","type":"string","required":false,"description":"Источник заказа"},{"name":"skip","in":"query","type":"integer","required":false,"description":"Смещение, по умолчанию 0"},{"name":"take","in":"query","type":"integer","required":false,"description":"По умолчанию 100, максимум 1000"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /accounting/cancelled-sales","title":"Отмены заказов","httpMethod":"GET","path":"/accounting/cancelled-sales","description":"Продукты, израсходованные на отменённые заказы. Scopes: `accounting:read`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"from","in":"query","type":"string","required":true,"description":"Начало периода, ISO 8601"},{"name":"to","in":"query","type":"string","required":true,"description":"Конец периода, ISO 8601"},{"name":"skip","in":"query","type":"integer","required":false,"description":"Смещение"},{"name":"take","in":"query","type":"integer","required":false,"description":"По умолчанию 100, максимум 1000"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /production/stop-sales-products","title":"Стоп-продажи по продуктам","httpMethod":"GET","path":"/production/stop-sales-products","description":"Стопы сгруппированы по пиццериям и продуктам; в `units` — до 30 UUID через запятую без пробелов. Scopes: `stopsales`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"from","in":"query","type":"string","required":true,"description":"Начало периода, ISO 8601"},{"name":"to","in":"query","type":"string","required":true,"description":"Конец периода, ISO 8601"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /staff/members","title":"Список сотрудников","httpMethod":"GET","path":"/staff/members","description":"Сортировка по дате трудоустройства (`hiredOn`); содержит персональные данные. Scopes: `staffmembers:read`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":false,"description":"Заведения (UUID)"},{"name":"staffType","in":"query","type":"string","required":false,"description":"Тип сотрудников (одно значение)"},{"name":"statuses","in":"query","type":"string","required":false,"description":"Статусы через запятую, например Dismissed, Suspended"},{"name":"hiredFrom","in":"query","type":"string","required":false,"description":"Дата трудоустройства, с"},{"name":"hiredTo","in":"query","type":"string","required":false,"description":"Дата трудоустройства, по"},{"name":"dismissedFrom","in":"query","type":"string","required":false,"description":"Дата увольнения, с"},{"name":"dismissedTo","in":"query","type":"string","required":false,"description":"Дата увольнения, по"},{"name":"lastModifiedFrom","in":"query","type":"string","required":false,"description":"Дата изменения, с"},{"name":"lastModifiedTo","in":"query","type":"string","required":false,"description":"Дата изменения, по"},{"name":"skip","in":"query","type":"integer","required":false,"description":"Смещение"},{"name":"take","in":"query","type":"integer","required":false,"description":"По умолчанию 100, максимум 1000"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /staff/shifts","title":"Смены сотрудников по пиццериям","httpMethod":"GET","path":"/staff/shifts","description":"Отработанное время (дневные, ночные, праздничные часы в минутах), доставленные заказы, расстояние. Смены выбираются по времени начала. Scopes: `staffshifts:read`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"clockInFrom","in":"query","type":"string","required":true,"description":"Начало периода, в который попадает начало смен"},{"name":"clockInTo","in":"query","type":"string","required":true,"description":"Конец периода"},{"name":"staffTypeName","in":"query","type":"string","required":false,"description":"Тип сотрудника"},{"name":"skip","in":"query","type":"integer","required":false,"description":"Смещение"},{"name":"take","in":"query","type":"integer","required":false,"description":"По умолчанию 100, максимум 1000"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /staff/couriers-on-shift","title":"Курьеры на смене","httpMethod":"GET","path":"/staff/couriers-on-shift","description":"В `units` — до 30 заведений. Scopes: `staffshifts:read`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"on","in":"query","type":"string","required":false,"description":"Момент времени в прошлом; по умолчанию — текущий"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /accounting/inventory-stocks","title":"Складские остатки","httpMethod":"GET","path":"/accounting/inventory-stocks","description":"По умолчанию — только позиции, подтверждённые ревизией (`isConfirmed = true`). Scopes: `accounting:read`, `user.role:read`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"stockItems","in":"query","type":"string","required":false,"description":"Сырьё (UUID)"},{"name":"categories","in":"query","type":"string","required":false,"description":"Категории сырья"},{"name":"includeUnconfirmed","in":"query","type":"boolean","required":false,"description":"Включать расчётные остатки, по умолчанию false"},{"name":"skip","in":"query","type":"integer","required":false,"description":"Смещение"},{"name":"take","in":"query","type":"integer","required":false,"description":"Максимум 1000"}],"requestExample":"","responseExample":"","docsUrl":""},{"id":"GET /finances/sales/units/daily","title":"Дневные продажи по заведениям","httpMethod":"GET","path":"/finances/sales/units/daily","description":"Агрегировано по дням, каналам продаж (Delivery, Dine-in, Takeaway), источникам заказа и методам оплаты. Scope: `shared`.","params":[{"name":"units","in":"query","type":"string","required":true,"description":"Заведения (UUID)"},{"name":"fromDate","in":"query","type":"string","required":true,"description":"Дата начала, ISO 8601"},{"name":"toDate","in":"query","type":"string","required":true,"description":"Дата конца, ISO 8601"}],"requestExample":"","responseExample":"","docsUrl":""}],"codeExamples":[],"errors":[{"code":"400","description":"Некорректные параметры запроса"},{"code":"401","description":"Нет авторизации"},{"code":"403","description":"Нет доступа к данным"},{"code":"429","description":"Слишком много запросов"},{"code":"500","description":"Внутренняя ошибка"}],"limits":"","gotchas":["Постраничные методы: увеличивайте `skip` на число полученных записей, пока в ответе не придёт `isEndOfListReached = true`.","Списки UUID (`units` и др.) — через запятую без пробелов; во многих методах не больше 30 заведений за запрос.","Доступ к данным ограничен ролями пользователя и его заведениями — scope `user.role:read` нужен почти везде.","Также есть Auth API (заведения и роли пользователя по токену) и Marketplace API (доступ пользователя к платным функциям приложения).","Статус работы API: `https://status.dodois.io/`."],"slug":"dodo-is","version":2,"updatedAt":"2026-10-24T17:05:32.873Z","sources":[{"title":"Документация Dodo IS API","url":"https://docs.dodois.io/","kind":"research","addedAt":"2026-10-17T07:09:30.176Z"},{"title":"Dodo IS API — базовые URL","url":"https://docs.dodois.io/docs/dodo-is/90fc31544cd42-dodo-is-api","kind":"research","addedAt":"2026-10-17T07:09:30.176Z"},{"title":"Заведения","url":"https://docs.dodois.io/docs/dodo-is/88554db5564c2-zavedeniya-informacziya-o-zavedeniyah","kind":"research","addedAt":"2026-10-17T07:09:30.176Z"},{"title":"Доставка → Статистика","url":"https://docs.dodois.io/docs/dodo-is/6149483e4dfb1-dostavka-statistika","kind":"research","addedAt":"2026-10-17T07:09:30.176Z"},{"title":"Учёт → Продажи","url":"https://docs.dodois.io/docs/dodo-is/5cdae1cb7443f-uchyot-prodazhi","kind":"research","addedAt":"2026-10-17T07:09:30.176Z"},{"title":"Команда → Список сотрудников","url":"https://docs.dodois.io/docs/dodo-is/33e626f47ca51-komanda-spisok-sotrudnikov","kind":"research","addedAt":"2026-10-17T07:09:30.176Z"},{"title":"Вставленный текст","url":"","kind":"import","addedAt":"2026-10-17T07:09:30.176Z"},{"title":"scenarios-dodo-is.md","url":"","kind":"import","addedAt":"2026-10-24T17:05:24.411Z"}],"logoUrl":null}