Skip to Content

SDK и контракт OpenAPI

Вы можете обращаться к Public API по стандартному протоколу HTTP; библиотеки на этой странице берут на себя рутинную работу — управление токенами, повторные попытки запросов и пагинацию.

Машиночитаемый контракт

Спецификация OpenAPI 3.0 всегда генерируется напрямую из работающего кода. Ручных копий не ведется.

Чтобы сгенерировать клиент для языка, который мы не поддерживаем официально, передайте схему в openapi-generator:

npx @openapitools/openapi-generator-cli generate \ -i https://api.frigolive.com/api/public/schema.json \ -g go \ -o ./frigolive-go

Готовые коллекции

  • Коллекция Postman / Insomnia  — 13 групп, 66 запросов, преднастроенные переменные.
  • llms.txt  — машиночитаемый индекс для корректной работы AI-ассистентов разработки.
Единый источник истины

Схема генерируется из кода, обслуживающего API, поэтому документация, спецификация схемы и реальное поведение сервиса гарантированно согласованы.

Официальные клиенты

ЯзыкПакетУстановка
Python 3.9+frigolivepip install frigolive
Node.js 18+@frigolive/api-clientnpm install @frigolive/api-client
.NET 8Frigolive.Apidotnet add package Frigolive.Api

Все три клиента работают единообразно:

Автоматическое управление токенами

Токен доступа запрашивается, кэшируется в оперативной памяти и обновляется за 60 секунд до истечения срока действия. Параллельные запросы используют один и тот же вызов обновления токена.

Безопасные повторные попытки

Ответы 429 и 5xx повторяются с экспоненциальной задержкой и джиттером с учетом заголовка Retry-After. Запросы POST без ключа идемпотентности никогда не повторяются автоматически.

Встроенная идемпотентность

Заголовок Idempotency-Key автоматически добавляется к запросам POST, благодаря чему повторный запрос после сетевого сбоя не создаст дубликат записи.

Типизированные ошибки

HTTP-статусы преобразуются в строго типизированные исключения с сохранением request_id. Передавайте это значение при обращениях в службу поддержки.

Python

import os from frigolive import FrigoliveClient, NotFoundError client = FrigoliveClient( client_id=os.environ["FRIGOLIVE_CLIENT_ID"], client_secret=os.environ["FRIGOLIVE_CLIENT_SECRET"], scope="devices:read telemetry:read", ) client.account_id = client.accounts()[0]["id"] for device in client.iterate("/devices/"): print(device["display_serial"], device["battery_level"])

Node.js

import { FrigoliveClient } from "@frigolive/api-client"; const client = new FrigoliveClient({ clientId: process.env.FRIGOLIVE_CLIENT_ID!, clientSecret: process.env.FRIGOLIVE_CLIENT_SECRET!, scope: "devices:read telemetry:read", }); for await (const device of client.iterate("/devices/")) { console.log(device); }

.NET

await using var client = new FrigoliveClient(new FrigoliveClientOptions { ClientId = Environment.GetEnvironmentVariable("FRIGOLIVE_CLIENT_ID")!, ClientSecret = Environment.GetEnvironmentVariable("FRIGOLIVE_CLIENT_SECRET")!, Scope = "devices:read telemetry:read", }); await foreach (var device in client.IterateAsync("/devices/")) { Console.WriteLine(device.GetProperty("label").GetString()); }
Секрет остается на вашем сервере

Ни один из этих клиентов не предназначен для работы в браузере или распределенном мобильном приложении. Ваш интерфейс взаимодействует с вашим бэкендом, а бэкенд вызывает Frigolive server-to-server.

Пагинация

Каждый клиент содержит вспомогательную функцию для обхода списков. Следующая страница считывается из links.next, поэтому вам не нужно вручную увеличивать номер страницы.

Если вы не используете готовый SDK, следуйте тому же правилу: Ошибки и отказоустойчивость.