API
Обновлено: 5 августа 2026

API нужен, чтобы получать данные аккаунта в свои системы: вывести список сайтов на внутренний дашборд, следить за остатком кредитов, забирать историю платежей в бухгалтерию.
Что умеет API и кому он доступен
Через API вы читаете то, что и так видно в кабинете: профиль, остаток кредитов, тариф, проекты, файлы проектов, уведомления и платежи. Разница только в том, что данные приходят в машинном виде и их можно подставить в свою программу, таблицу или отчёт.
Доступ к API включён на тарифе «Бизнес». Что входит в остальные тарифы — в разделе «Тарифы».
Ключи доступа
Любой запрос к API подписывается ключом. Ключи создаются и удаляются в кабинете.
- Откройте «API-ключи» в меню слева и нажмите «Создать ключ».
- Назовите ключ так, чтобы потом было понятно, где он используется — например, «Интеграция с CRM».
- При желании задайте срок действия — 30, 90 или 365 дней. По истечении ключ перестаёт работать.
- Скопируйте и сохраните ключ Он показывается один раз, сразу после создания.


Аутентификация и лимиты
Базовый адрес
https://app.wuna.ai/api/v1
Заголовок авторизации
Ключ передаётся в заголовке Authorization как Bearer-токен:
Authorization: Bearer sk_ваш_ключ
Accept: application/json
Ограничение частоты
На каждый ключ действует лимит 60 запросов в минуту. Текущее состояние возвращается в заголовках ответа:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
При превышении приходит ответ 429 с заголовком Retry-After — в нём число секунд до следующей попытки.
Постраничная выдача
Списочные методы отдают данные страницами. Управляют этим параметры page и per_page (максимум 50). Рядом с данными приходят блоки links и meta с общим количеством записей и ссылками на соседние страницы.
Проверка запросов прямо в кабинете
В разделе «Документация API» есть встроенная песочница: вставляете ключ и выполняете запросы, не выходя из браузера. Ключ хранится только в памяти вкладки.

Список методов
Все методы работают только на чтение и вызываются методом GET от базового адреса. Ниже — полный список с примерами ответов.
GET /me — данные аккаунта
{
"data": {
"id": 15,
"name": "Иван Петров",
"email": "user@example.com",
"locale": "ru",
"plan": "Стандарт",
"created_at": "2026-07-27T09:50:16+00:00"
}
}
GET /credits — остаток кредитов
{
"data": {
"credits_remaining": 470935,
"purchased_credits": 0,
"credits_used": 29065,
"monthly_limit": 500000,
"is_unlimited": false,
"usage_percentage": 5.8,
"using_own_key": false,
"resets_at": "2026-08-01T00:00:00+00:00"
}
}
resets_at — когда лимит обновится, usage_percentage — процент израсходованного.
GET /subscription — тариф и подписка
{
"data": {
"plan": {
"name": "Pro",
"slug": "pro",
"price": "990.00",
"billing_period": "monthly"
},
"subscription": {
"status": "active",
"starts_at": "2026-07-01T10:00:00+00:00",
"renewal_at": "2026-08-01T10:00:00+00:00",
"ends_at": null,
"cancelled_at": null
}
}
}
Если действующего тарифа нет — например, пробный период закончился, — subscription равен null.
GET /projects — список проектов
Параметры: page, per_page (по умолчанию 15, максимум 50). Сортировка — по дате изменения, свежие первыми.
{
"data": [
{
"id": "019fa2fb-758d-72a3-8614-3a474cb0f59f",
"name": "Кофейня Roasted",
"description": "Лендинг с меню и картой",
"build_status": "completed",
"output_target": "website",
"is_public": true,
"subdomain": "roasted",
"custom_domain": null,
"public_url": "https://roasted.wuna.ai",
"published_at": "2026-07-27T10:14:02+00:00",
"created_at": "2026-07-27T09:50:16+00:00",
"updated_at": "2026-07-27T10:14:02+00:00"
}
],
"links": { "first": "...", "last": "...", "prev": null, "next": null },
"meta": { "current_page": 1, "per_page": 15, "total": 2, "last_page": 1 }
}
Поле public_url заполняется только у опубликованных проектов; если подключён свой домен, там будет он.
GET /projects/{id} — один проект
Возвращает те же поля, что и список, но одним объектом в data. Чужой или несуществующий проект отдаёт 404.
GET /projects/{id}/files — файлы проекта
{
"data": [
{
"id": 41,
"name": "logo.png",
"size": 18422,
"mime_type": "image/png",
"source": "upload",
"checksum": "9f2c...",
"url": "https://app.wuna.ai/api/files/...",
"created_at": "2026-07-27T09:58:41+00:00"
}
]
}
size — в байтах.
GET /projects/{id}/files/{fileId} — один файл
Карточка файла. Файл из другого проекта отдаёт 404, даже если он ваш.
GET /notifications — уведомления
{
"data": [
{
"id": 7,
"type": "build_completed",
"title": "Сборка завершена",
"message": "Проект «Кофейня Roasted» готов",
"action_url": "/project/019fa2fb-...",
"read_at": null,
"created_at": "2026-07-27T10:02:11+00:00"
}
]
}
По умолчанию 20 записей на страницу. read_at равен null у непрочитанных.
GET /invoices — история платежей
{
"data": [
{
"id": 12,
"invoice_number": "INV-2026-0012",
"amount": "990.00",
"currency": "RUB",
"status": "completed",
"type": "subscription",
"payment_method": "yookassa",
"plan": "Стандарт",
"transaction_date": "2026-07-01T10:00:00+00:00"
}
]
}
Отдаются только успешные платежи, свежие первыми.
Ошибки
API отвечает стандартными кодами HTTP. Тело ошибки — JSON с полем message:
{ "message": "Project not found." }
| Код | Что означает | Что делать |
|---|---|---|
401 |
Ключ не передан, недействителен или просрочен. | Проверьте заголовок Authorization и срок действия ключа. |
403 |
Тариф не включает доступ к API. | Перейдите на тариф с поддержкой API. |
404 |
Объект не существует или принадлежит другому аккаунту. | Проверьте идентификатор проекта или файла. |
429 |
Превышен лимит 60 запросов в минуту. | Подождите столько секунд, сколько указано в Retry-After. |
Примеры кода
curl
curl https://app.wuna.ai/api/v1/projects
-H "Authorization: Bearer sk_ваш_ключ"
-H "Accept: application/json"
JavaScript
const res = await fetch('https://app.wuna.ai/api/v1/credits', {
headers: {
Authorization: `Bearer ${process.env.WUNA_API_KEY}`,
Accept: 'application/json',
},
});
if (!res.ok) throw new Error(`Wuna API: ${res.status}`);
const { data } = await res.json();
console.log(`Осталось кредитов: ${data.credits_remaining}`);
Python
import os, requests
headers = {
"Authorization": f"Bearer {os.environ['WUNA_API_KEY']}",
"Accept": "application/json",
}
r = requests.get("https://app.wuna.ai/api/v1/projects", headers=headers, timeout=15)
r.raise_for_status()
for p in r.json()["data"]:
print(p["name"], "→", p["public_url"] or "не опубликован")
Обход всех страниц
async function allProjects(key) {
const out = [];
let page = 1;
while (true) {
const res = await fetch(
`https://app.wuna.ai/api/v1/projects?page=${page}&per_page=50`,
{ headers: { Authorization: `Bearer ${key}`, Accept: 'application/json' } },
);
const body = await res.json();
out.push(...body.data);
// meta.last_page — сколько всего страниц
if (page >= body.meta.last_page) break;
page++;
}
return out;
}
Создайте свой проект
уже сегодня
Опишите задачу одним предложением и получите готовый продукт через несколько минут. Это бесплатно.
Начать бесплатно