Документація 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 | Помилка зовнішньої залежності |