Документация API
Вызывайте все возможности ИИ через API-ключ, оплата по факту, интеграция в несколько строк кода.
Аутентификация
Все запросы к API должны содержать заголовок Authorization.
Authorization: Bearer sk-xxxxxxxxxxxxxxxx
Получите API-ключ на странице «API-ключи» в консоли. Один ключ на аккаунт. Для сброса используйте консоль; старый ключ немедленно аннулируется.
Создание задачи
https://nsfwrouter.xyz/api/v1/tasks/create
Отправьте задачу ИИ в GPU-кластер. Задачи асинхронные, возвращают ID. Получите результаты через API запроса или Webhook.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| tool_id | int | Да | ID инструмента, из списка инструментов |
| params | object | Да | Параметры задачи, JSON-объект, поля зависят от инструмента |
| webhook_url | string | Нет | URL колбэка для уведомления о завершении |
| priority | int | Нет | Приоритет задачи 1-10, по умолчанию 5 |
| idempotency_key | string | Нет | Ключ идемпотентности, предотвращает дубликаты |
| execution_options | object | Нет | Опции выполнения, JSON-объект |
curl -X POST https://nsfwrouter.xyz/api/v1/tasks/create \
-H "Authorization: Bearer sk-xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"tool_id": 1,
"params": {
"image": "https://example.com/photo.jpg",
"prompt": "a beautiful landscape"
},
"webhook_url": "https://your-server.com/webhook"
}'
{
"code": 0,
"message": "success",
"data": {
"task": {
"id": 123,
"status": 0,
"consume_coins": 5
},
"message": "task_submitted"
}
}
Баланс проверяется перед вызовом. Недостаточно средств = ошибка insufficient_coins. Коины списываются при успешной отправке.
Запрос деталей задачи
https://nsfwrouter.xyz/api/v1/tasks/query
Запросите детали и статус по ID. Во время обработки последний статус берётся из GPU-кластера. Повторные запросы в течение 10 секунд возвращают кэш БД без удалённых запросов.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| id | int | Да | ID задачи |
{
"code": 0,
"message": "success",
"data": {
"task": {
"id": 123,
"status": 1,
"task_output_json": [
{
"type": "image",
"url": "https://cdn.example.com/outputs/abc123.png",
"file_name": "abc123.png",
"file_size": 1024000,
"mime_type": "image/png",
"width": 1024,
"height": 1024
}
],
"consume_coins": 5,
"created_at": 1718200000,
"completed_at": 1718200015
}
}
}
| status | Значение |
|---|---|
| 0 | Обработка |
| 1 | Завершено |
| -1 | Отменено |
| -2 | Ошибка |
Список задач
https://nsfwrouter.xyz/api/v1/tasks
Пагинированный запрос задач текущего аккаунта, с фильтрами по инструменту, статусу и периоду.
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| page | int | Нет | Номер страницы, по умолчанию 1 |
| page_size | int | Нет | Размер страницы, по умолчанию 20, максимум 50 |
| tool_id | int | Нет | Фильтр по инструменту |
| status | int | Нет | Фильтр по статусу (0/1/-1/-2) |
| days | int | Нет | Период в днях, по умолчанию 30 |
{
"code": 0,
"message": "success",
"data": {
"list": [
{
"id": 123,
"tool_id": 1,
"status": 1,
"task_output_json": [
{
"type": "image",
"url": "https://cdn.example.com/outputs/abc123.png",
"file_name": "abc123.png",
"file_size": 1024000,
"mime_type": "image/png",
"width": 1024,
"height": 1024
}
],
"error": null,
"consume_coins": 5,
"created_at": 1718200000,
"completed_at": 1718200015
},
{
"id": 122,
"tool_id": 3,
"status": 0,
"task_output_json": [],
"error": null,
"consume_coins": 10,
"created_at": 1718199000,
"completed_at": 0
}
],
"page": 1,
"page_size": 20
}
}
| Поле | Тип | Описание |
|---|---|---|
| type | string | Тип результата: image или video |
| url | string | CDN-URL файла результата |
| file_name | string | Имя файла |
| file_size | int | Размер файла (байт) |
| mime_type | string | MIME-тип, напр.: image/png, video/mp4 |
| width | int | Ширина (пиксели) |
| height | int | Высота (пиксели) |
Баланс аккаунта
https://nsfwrouter.xyz/api/v1/account/balance
Запрос баланса коинов, общей суммы пополнения и расхода текущего аккаунта.
{
"code": 0,
"message": "success",
"data": {
"remain_coins": 5000,
"total_coins": 10000,
"used_coins": 5000
}
}
Webhook-колбэк
Если указан webhook_url, при завершении, ошибке или отмене отправляется POST на этот URL. Тело — JSON.
Content-Type: application/json
Accept: application/json
User-Agent: OpenAPI-Webhook/1.0
{
"event": "task.finished",
"task": {
"id": 123,
"status": 1,
"task_output_json": [
{
"type": "image",
"url": "https://cdn.example.com/outputs/abc123.png",
"file_name": "abc123.png",
"file_size": 1024000,
"mime_type": "image/png",
"width": 1024,
"height": 1024
}
],
"consume_coins": 5,
"created_at": 1718200000,
"completed_at": 1718200015
}
}
Ваш сервер должен вернуть HTTP 2xx. При non-2xx или таймауте (10 сек) система повторяет до 5 раз с экспоненциальной задержкой (60с → 120с → 240с → 480с → 960с).
Коды ошибок
Все ошибки используют единый формат: {"code": код, "message": "идентификатор", "data": {}}
| Код ошибки | message | Описание |
|---|---|---|
| 20001 | api_key_required | API-ключ не предоставлен |
| 20001 | invalid_api_key | Недействительный API-ключ |
| 20001 | ip_not_allowed | IP не в whitelist |
| 20001 | permission_denied | Доступ запрещён |
| 30001 | tool_not_found | Инструмент не найден |
| 30001 | task_not_found | Задача не найдена |
| 30001 | insufficient_coins | Недостаточно коинов |
| 30001 | task_submit_failed | Отправка задачи не удалась |
| 30001 | task_query_failed | Запрос задачи не удался |
| 30001 | task_already_exists | Задача уже существует (идемпотентность) |
| 40001 | tool_id_required | Отсутствует параметр tool_id |
| 40001 | param_error | Ошибка параметров |
| 40001 | webhook_url_invalid | Неверный формат webhook_url |
| 40001 | params_must_be_json_object_or_array | params должен быть JSON-объектом или массивом |
| 40001 | execution_options_must_be_json_object_or_array | execution_options должен быть JSON-объектом или массивом |
| Диапазон | Категория |
|---|---|
| 1xxxx | Системная ошибка |
| 2xxxx | Ошибка аутентификации |
| 3xxxx | Ошибка бизнес-логики |
| 4xxxx | Ошибка параметров |
| 5xxxx | Ошибка внешней зависимости |