Личный кабинет API
Интеграция: получение списка заказов (get_order_list)
Документ для внешнего сервиса, который получает список заказов торговых точек из личного кабинета Юпитер.
1. Общие сведения
| Параметр | Значение |
|---|---|
| Адрес | POST https://<домен>/index.php |
| Формат | JSON, кодировка UTF-8 |
| Заголовки | Content-Type: application/json |
| Авторизация | JWT в заголовке Authorization: Bearer <token>
|
| Срок жизни токена | 15 минут (expires_in: 900) |
Все запросы выполняются только по HTTPS.
2. Авторизация
Авторизация выполняется в два шага.
Шаг 1. Получение токена
Вам выдаётся ключ интеграции (строка из 32 символов). Он используется только для получения токена.
curl -X POST "https://<домен>/index.php" \
-H "Content-Type: application/json" \
-d '{"type":"auth_token","key":"<ваш ключ интеграции>"}'
Ответ:
{
"status": "ok",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImsxIn0....",
"token_type": "Bearer",
"expires_in": 900
}
Шаг 2. Запросы с токеном
Токен передаётся в заголовке Authorization. Ключ интеграции в теле запроса больше не нужен и не должен передаваться.
Authorization: Bearer <access_token>
Обновление токена
Токен действует 15 минут. Когда срок истекает, сервер возвращает ошибку NO_AUTH (HTTP 401). В этом случае нужно заново выполнить шаг 1 и повторить запрос.
Рекомендуемая схема: получать новый токен за 1–2 минуты до истечения expires_in, либо получать его при каждой ошибке 401.
Важно
- Ключ интеграции является секретом. Не передавайте его в URL, не храните в открытом виде в коде и не отправляйте в логи.
- Не используйте ключ интеграции для запросов данных, только для
auth_token. Запросget_order_listс ключом в теле вернёт ошибку прав. - Токен нельзя использовать для получения нового токена.
- Если ключ скомпрометирован, сообщите нам. Ключ будет перевыпущен, старый перестанет работать.
3. Запрос get_order_list
Параметры
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
type |
string | да | Всегда "get_order_list"
|
from_data_date |
string | да | Начало периода, дата YYYY-MM-DD (включительно) |
to_data_date |
string | да | Конец периода, дата YYYY-MM-DD (включительно) |
data_tt |
string | нет | ID торговой точки или несколько ID через запятую, например "12,15". Если не указано, возвращаются заказы всех торговых точек, доступных вашей учётке |
order_list |
array of string | нет | Список order_uid конкретных заказов. Передавайте значения в том виде, в котором получили их в ответе |
Сопоставление периода с заказом выполняется по полю date заказа.
Пример: заказы за день
curl -X POST "https://<домен>/index.php" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <access_token>" \
-d '{
"type": "get_order_list",
"from_data_date": "2026-11-01",
"to_data_date": "2026-11-01"
}'
Пример: несколько торговых точек
{
"type": "get_order_list",
"from_data_date": "2026-11-01",
"to_data_date": "2026-11-02",
"data_tt": "12,15"
}
Торговые точки в data_tt должны быть доступны вашей учётке. Иначе вернётся ошибка.
Пример: конкретные заказы
{
"type": "get_order_list",
"from_data_date": "2026-10-24",
"to_data_date": "2026-10-24",
"order_list": ["5-872-0-9982839"]
}
4. Ответ
При успехе возвращается HTTP 200 и JSON-массив заказов. Если заказов нет, возвращается пустой массив [].
Заказы идут по времени открытия (open) по возрастанию. Удалённые заказы (deleted: 1) по порядку в ответе не выделяются.
Пример: доставка (канал «Новое Приложение»)
[
{
"order_id": "64131187",
"order_uid": "5-872-0-9982839",
"tt_id": "672",
"tt_name": "(Ф) г. Зарайск, ул. Мерецкова, д. 27/19",
"num": "NP3343042",
"date": "2026-10-24",
"hour": "11",
"open": "2026-10-24 11:31:12",
"close": "2026-10-24 13:15:48",
"type": "Заказ",
"vid": "Доставка",
"name": "NP3343042",
"source": "Новое Приложение",
"waiter": "Официант 1",
"cashier": "Официант 1",
"client_name": "Имя Клиента",
"client_phone": "8 (900) 000-00-00",
"summ_fakt": 1693,
"summ_rozn": 1693,
"summ_skidki": 0,
"address": "г Зарайск ул. Примерная д. 5 под. 4 дмф. 1234 эт. 1 кв. 49",
"deleted": 0,
"overtime": 0,
"timeline": "Создан: 11:31 → Пришёл на точку: 11:32 → Отправлен в работу: 11:34",
"aggregator_id": "",
"courier_uid": "",
"courier_name": "",
"payment": [{"name": "КРЕД КАРТА КУРЬЕРУ", "summ": 1693}],
"discounts": [],
"goods": [
{
"product_name": "СЕТ \"ТОП ЗАПЕЧЕННЫЙ\"",
"deleted": 0,
"quantity": 1,
"summ_fakt": 1619,
"summ_rozn": 1619,
"price_fakt": 1619,
"price_rozn": 1619
},
{
"product_name": "СОУС ЯКИ",
"deleted": 0,
"quantity": 1,
"summ_fakt": 49,
"summ_rozn": 49,
"price_fakt": 49,
"price_rozn": 49
},
{
"product_name": "Сервисный сбор",
"deleted": 0,
"quantity": 1,
"summ_fakt": 25,
"summ_rozn": 25,
"price_fakt": 25,
"price_rozn": 25
},
{
"product_name": "Бокс Большой Желтый 210х145х50 СУШИСЕТ *140",
"deleted": 0,
"quantity": 2,
"summ_fakt": 0,
"summ_rozn": 0,
"price_fakt": 0,
"price_rozn": 0
}
]
}
]
Пример: удалённая позиция
{
"product_name": "ФИШ ЭНД ЧИПС 280 Г",
"deleted": 1,
"quantity": 1,
"summ_fakt": 680,
"summ_rozn": 680,
"price_fakt": 680,
"price_rozn": 680,
"why_deleted": "Отказ гостя без списания продуктов",
"who_deleted": "Сотрудник 1",
"deleted_type": "2"
}
Описание полей заказа
| Поле | Тип | Описание |
|---|---|---|
order_id |
string | Внутренний ID заказа. Числовая строка, например "64131187" или "25469250"
|
order_uid |
string | Уникальный ID заказа вида 5-872-0-9982839. Используется в order_list
|
tt_id |
string | ID торговой точки, числовая строка ("672", "28", "294") |
tt_name |
string | Название торговой точки. |
num |
string | Номер заказа |
date |
string | Дата рабочего дня заказа, YYYY-MM-DD. |
hour |
string | Час открытия заказа ("11"). |
open |
string | Время открытия, YYYY-MM-DD HH:MM:SS
|
close |
string | Время закрытия, YYYY-MM-DD HH:MM:SS. Для незакрытого заказа значение 0000-00-00 00:00:00
|
type |
string | Тип документа, Заказ или Возврат
|
vid |
string | Вид заказа: Обычный заказ (зал, касса), На вынос, Доставка
|
name |
string | Название заказа в кассе. Для зала: номер стола или бара (Стол № 17, Бар 6). Для самовывоза: номер в очереди (1, 2, 3). Для онлайн-заказов совпадает с num
|
source |
string | Имя источника заказа |
waiter |
string | Имя официанта (сотрудник который открыл заказ) |
cashier |
string | Имя кассира (сотрудник, который закрыл заказ) |
client_name |
string | Имя клиента |
client_phone |
string | Телефон клиента в формате 8 (XXX) XXX-XX-XX. |
summ_fakt |
number | Фактическая сумма заказа, после скидок |
summ_rozn |
number | Сумма заказа по розничным ценам, до скидок |
summ_skidki |
number | Сумма скидок. |
address |
string | Адрес доставки в свободной форме. Сокращения: под. — подъезд, дмф. — домофон, эт. — этаж, кв. — квартира. Для зала, самовывоза и заказов на вынос пустая строка |
deleted |
number |
0 — заказ действителен, 1 — заказ удалён. |
overtime |
number | Просрочка доставки, в минутах. |
timeline |
string | Хронология статусов в формате Статус: HH:MM → Статус: HH:MM. Встречаются статусы: Создан, Пришёл на точку, Отправлен в работу, Приготовлен и собран, Назначен курьеру. Для зала — только Создан и Отправлен в работу. Время без даты, поэтому возможен переход через полночь (например, Создан: 12:42 → Отправлен в работу: 00:43) |
aggregator_id |
string | ID заказа в системе агрегатора формата YYMMDD-NNNNNNN (например, 261024-6371662). |
courier_uid |
string | ID курьера, например 4:98:0:9241. |
courier_name |
string | Имя курьера |
payment |
array | Оплаты заказа: name — тип оплаты, summ — сумма. Пустой массив [] для незакрытых заказов и заказов, полностью оплаченных скидкой или бонусами |
discounts |
array | Скидки и бонусные операции: name, summ. Значение summ может быть отрицательным |
goods |
array | Позиции заказа |
Описание позиции (goods)
| Поле | Тип | Описание |
|---|---|---|
product_name |
string | Название товара или набора. Чаще в верхнем регистре |
price_rozn |
number | Розничная цена (до скидок) |
price_fakt |
number | Фактическая цена (после скидок) |
quantity |
number | Количество |
summ_fakt |
number | Фактическая сумма позиции. 0 для позиций, входящих в набор |
summ_rozn |
number | Сумма позиции по розничным ценам |
deleted |
number |
0 — позиция в заказе, 1 — удалённая позиция. Сумма удалённой позиции не входит в итог заказа |
why_deleted |
string | Причина удаления. Только у deleted: 1, например Отказ гостя без списания продуктов
|
who_deleted |
string | Сотрудник, удаливший позицию. Только у deleted: 1
|
deleted_type |
string | Код типа удаления, числовая строка (в примерах "2"). Не текстовое описание |
Одинаковые позиции в заказе объединяются в одну строку с суммарным количеством. Удалённые позиции передаются отдельными строками. В выборке они идут после неудалённых.
Важные особенности разбора ответа
- Суммы и количества приходят числами.
-
Пустые строки вместо
null. Отсутствующие значения (aggregator_id,courier_uid,courier_name,address,client_name) передаются как"". Не полагайтесь наnull. -
Отрицательные скидки. В
discountsмогут быть записи с отрицательнымsumm. Таким образом передаются наценки. - Новые поля могут появиться в будущих версиях. Игнорируйте неизвестные поля.
5. Ограничения
-
Не более 200 заказов за один ответ. Лимит общий для открытых, закрытых и удалённых заказов. Признака «ответ обрезан» и общего количества в ответе нет. Если за период заказов больше, часть из них не попадёт в ответ.
- Запрашивайте данные по одному дню или по конкретным торговым точкам.
- Для выборки конкретных заказов используйте
order_list.
- Пагинации нет.
- Период. Укажите разумный период: большие диапазоны выполняются дольше.
- Частота запросов. Не запрашивайте одни и те же данные чаще, чем нужно. Лимиты частоты сейчас не настроены, но могут быть введены.
6. Ошибки
Ошибка возвращается в JSON:
{
"status": "error",
"message": "GDD93 Не получена дата",
"error": "Не получена дата",
"error_num": "GDD93"
}
Поле error_num содержит код ошибки. Поле message начинается с этого же кода.
| HTTP | Код | Причина | Что делать |
|---|---|---|---|
| 401 | NO_AUTH |
Токен истёк, отозван или неверен | Получить новый токен (шаг 1) и повторить запрос |
| 400 | AS… |
Операция не разрешена для вашей учётки | Проверьте type. Для вашей учётки разрешён только get_order_list
|
| 400 | CA… |
Не получен ключ запроса | Проверьте заголовок Authorization
|
| 400 |
GDD… Не получена дата
|
Не передан from_data_date или to_data_date
|
Передайте оба параметра |
| 400 |
GDD… Выбранная торговая точка … не доступна
|
data_tt содержит ТТ, недоступную вашей учётке |
Уточните список торговых точек |
| 400 |
GOL… Ошибка при выполнении запроса
|
Ошибка на стороне сервера | Повторите запрос позже. Если ошибка повторяется, сообщите код |
Пример ошибки прав
Запрос с ключом интеграции в теле вместо токена:
{
"status": "error",
"message": "AS1234 Недостаточно прав для выполнения операции",
"error": "Недостаточно прав для выполнения операции",
"error_num": "AS1234"
}
7. Пример клиента (псевдокод)
token = None
token_expires_at = 0
def get_token():
response = post({"type": "auth_token", "key": API_KEY})
return response["access_token"], time() + response["expires_in"]
def get_orders(date_from, date_to, data_tt=None):
global token, token_expires_at
if token is None or time() > token_expires_at - 60:
token, token_expires_at = get_token()
body = {"type": "get_order_list", "from_data_date": date_from, "to_data_date": date_to}
if data_tt:
body["data_tt"] = data_tt
response = post(body, headers={"Authorization": f"Bearer {token}"})
if response.status_code == 401:
token, token_expires_at = get_token()
response = post(body, headers={"Authorization": f"Bearer {token}"})
return response.json()
Система JUPITER www.jupiter.systems (с) 2024г.
Нет комментариев