Понадобится пара client_id и client_secret, её выдаёт менеджер Rentu
(см. Доступ и ключи), и любой HTTP-клиент.
Первые запросы#
1. Получение токена#
curl -X POST https://api.rentu.ru/api/external/v2/auth/token \
-H 'Content-Type: application/json' \
-d '{"client_id":"YOUR_CLIENT_ID","client_secret":"YOUR_CLIENT_SECRET"}'{
"success": true,
"access_token": "eyJhbGciOiJIUzUxMiJ9...",
"token_type": "Bearer",
"expires_in": 3600
}Токен живёт час. Хранить его стоит в памяти процесса: запрашивать новый на каждый вызов не нужно и вредно, выдача токенов ограничена десятью попытками в минуту.
2. Список торговых центров#
curl https://api.rentu.ru/api/external/v2/shopping_centers \
-H 'Authorization: Bearer YOUR_TOKEN'{
"success": true,
"data": [
{
"id": "6512a1f0b3c4d5e6f7a8b901",
"title": "ТЦ Галерея",
"time_zone": "Europe/Moscow",
"...": "..."
}
]
}Это точка входа: id отсюда становится sc_id во всех остальных запросах. Список
определяется ролями сотрудника, которому принадлежит ключ. Нет центра в выдаче, значит
у сотрудника нет к нему доступа.
3. Поиск торговой точки#
SC=6512a1f0b3c4d5e6f7a8b901
curl -G "https://api.rentu.ru/api/external/v2/sc/$SC/shops" \
-d per_page=200 \
-H 'Authorization: Bearer YOUR_TOKEN'{
"success": true,
"data": [
{
"id": "6512a2000000000000000101",
"name": "Zarina",
"external_id": "SL-101",
"is_archived": false,
"position": {
"name": "1-14"
}
}
],
"meta": {
"pagination": {
"page": 1,
"per_page": 200,
"total": 137
}
}
}В external_id лежит идентификатор точки во внешней системе, если он был передан нам.
По нему удобно сопоставлять точки, не храня наши id.
4. Выгрузка выручки#
SHOP=6512a2000000000000000101
curl -G "https://api.rentu.ru/api/external/v2/sc/$SC/reports/shops/$SHOP/by_days" \
-d start_date=2026-07-01 \
-d end_date=2026-07-31 \
-H 'Authorization: Bearer YOUR_TOKEN'{
"success": true,
"data": [
{
"date": "2026-07-01",
"receipts_count": 314,
"income_sum": 4512300,
"turnover": 4493400,
"...": "..."
}
],
"meta": {
"pagination": {
"page": 1,
"per_page": 100,
"total": 31
},
"time_zone": "Europe/Moscow"
}
}Суммы приходят в копейках. income_sum: 4512300 это 45 123 рубля. Так во всех методах, включая средний чек и выручку на квадратный метр.
Что дальше#
Минимальный клиент целиком#
import time, requests
BASE = "https://api.rentu.ru/api/external/v2"
class Rentu:
def __init__(self, client_id, client_secret):
self.auth = (client_id, client_secret)
self.token, self.expires_at = None, 0
def _headers(self):
if time.time() > self.expires_at - 60: # обновляем заранее
cid, secret = self.auth
body = requests.post(
f"{BASE}/auth/token",
json={"client_id": cid, "client_secret": secret},
).json()
self.token = body["access_token"]
self.expires_at = time.time() + body["expires_in"]
return {"Authorization": f"Bearer {self.token}", "Accept": "application/json"}
def get(self, path, **params):
while True:
resp = requests.get(
f"{BASE}{path}", headers=self._headers(), params=params
)
if resp.status_code == 429:
time.sleep(int(resp.headers.get("Retry-After", 60)))
continue
body = resp.json()
if body.get("success"):
return body
err = body["error"]
raise RuntimeError(f"{err['code']}: {err['message']}")
api = Rentu("YOUR_CLIENT_ID", "YOUR_CLIENT_SECRET")
for sc in api.get("/shopping_centers")["data"]:
print(sc["id"], sc["title"], sc["time_zone"])