API и интеграция
Play2Go AI предоставляет REST API. OpenAPI-спецификация публикуется открыто — на её основе можно сгенерировать клиентский SDK на любом языке.
Эндпоинты API
- Базовый URL:
https://api.play2go.ai. Ресурсы по схеме/v1/<resource>. - OpenAPI:
https://api.play2go.ai/openapi.json+/docs(Swagger UI с интерактивными запросами).
Аутентификация
API-ключ выпускается через «API-ключи». Создание ключа возвращает секрет ровно один раз — сохраните его в менеджере секретов.
# Все запросы — с заголовком Authorization
curl -H "Authorization: Bearer $PLAY2GO_AI_API_KEY" https://api.play2go.ai/v1/pods?projectId=prj_...Ключ привязан к организации; роль ключа определяет, что он может (см. таблицу ролей в «Аккаунт»). Опционально ключ можно ограничить одним проектом — тогда он не сможет работать с ресурсами других проектов организации.
Скоупы
Скоупы — это узкий слой ограничений поверх роли. Если у ключа есть скоупы — он может только то, что в них перечислено, даже если роль позволяет больше. Без скоупов — действует только роль.
Примеры:
pods:read— список и просмотр подов;pods:write— создание/изменение/удаление;endpoints:invoke— отправка задач в эндпоинты;billing:read— чтение биллинга.
Идемпотентность
Все мутирующие методы принимают idempotencyKey — произвольную строку (мы используем UUID). Платформа хранит её и:
- при первом запросе — выполняет операцию;
- при повторе с тем же ключом — возвращает предыдущий результат, ничего не делая.
Это позволяет безопасно ретраить запросы при сетевых сбоях. Ключ генерируется на стороне клиента до отправки запроса.
Формат ошибок
Ошибки возвращаются как JSON с кодом и человекочитаемым сообщением:
{
"code": 9,
"message": "spend limit reached: projected spend exceeds the configured limit",
"details": []
}Используйте HTTP-статус для маршрутизации (400 — некорректный запрос, 401 — нет аутентификации, 403 — нет прав, 404 — не найдено, 412 — нарушено предусловие, например достигнут лимит расходов). Поле message можно показывать пользователю как есть.
Примеры curl
Создать под
curl -X POST https://api.play2go.ai/v1/pods \
-H "Authorization: Bearer $PLAY2GO_AI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "training-01",
"projectId": "prj_...",
"image": "docker.io/library/python:3.12",
"skuId": "sku_rtx4090",
"gpuCount": 1,
"command": ["python"],
"args": ["-c", "print(\"hi\")"],
"idempotencyKey": "<uuid>"
}'Отправить задачу в эндпоинт
curl -X POST https://api.play2go.ai/v1/endpoints/ep_.../runsync \
-H "Authorization: Bearer $PLAY2GO_AI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"input": {"prompt": "Hello"}, "waitTimeoutSeconds": 30, "idempotencyKey": "<uuid>"}'Запросить URL для скачивания файла с тома
curl -X POST https://api.play2go.ai/v1/volumes/vol_.../objects:download-url \
-H "Authorization: Bearer $PLAY2GO_AI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"objectKey": "results/model.safetensors"}'