для разработчиков На сайт Rentu

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

Путь от ключа до первого ответа с данными: токен, список центров, отчёт.

Понадобится пара client_id и client_secret, её выдаёт менеджер Rentu (см. Доступ и ключи), и любой HTTP-клиент.

Первые запросы#

1. Получение токена#

bash
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"}'
json
{
  "success": true,
  "access_token": "eyJhbGciOiJIUzUxMiJ9...",
  "token_type": "Bearer",
  "expires_in": 3600
}

Токен живёт час. Хранить его стоит в памяти процесса: запрашивать новый на каждый вызов не нужно и вредно, выдача токенов ограничена десятью попытками в минуту.

2. Список торговых центров#

bash
curl https://api.rentu.ru/api/external/v2/shopping_centers \
  -H 'Authorization: Bearer YOUR_TOKEN'
json
{
  "success": true,
  "data": [
    {
      "id": "6512a1f0b3c4d5e6f7a8b901",
      "title": "ТЦ Галерея",
      "time_zone": "Europe/Moscow",
      "...": "..."
    }
  ]
}

Это точка входа: id отсюда становится sc_id во всех остальных запросах. Список определяется ролями сотрудника, которому принадлежит ключ. Нет центра в выдаче, значит у сотрудника нет к нему доступа.

3. Поиск торговой точки#

bash
SC=6512a1f0b3c4d5e6f7a8b901

curl -G "https://api.rentu.ru/api/external/v2/sc/$SC/shops" \
  -d per_page=200 \
  -H 'Authorization: Bearer YOUR_TOKEN'
json
{
  "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. Выгрузка выручки#

bash
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'
json
{
  "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 рубля. Так во всех методах, включая средний чек и выручку на квадратный метр.

Минимальный клиент целиком#

python
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"])