Нейросеть Robotext

API Robotext

Документация по всем сервисам: тексты, изображения, презентации, песни, видео, работа с фото

Токен доступа Выдаётся сразу после активации PRO
••••••••-••••-••••-••••-••••••••••••
Без токена работать с API не получится. Документация ниже открыта полностью, но каждый запрос к сервисам требует заголовка Authorization: Bearer <токен>. Запрос без него выполняется как анонимный: демо-ограничения, чужой баланс по IP-адресу сервера.

Документация для нейросетей и агентов

Если API подключает не человек, а ИИ-агент, не пересказывайте документацию — дайте ему одну из ссылок ниже. Файлы открыты без авторизации и всегда соответствуют текущей версии сервиса.

/llms.txt
Оглавление сервиса. Короткий файл: что за API, как авторизоваться и ссылки на все разделы с пояснениями. Агент сам решит, что читать дальше. Это стандартное соглашение llms.txt — его понимают ассистенты в редакторах кода и агентные фреймворки.
Как передать: «Вот документация API: https://robotext.io/llms.txt — подключись и сделай …».
/llms-full.txt
Вся документация одним файлом. Тот же текст, что на этой странице, но плоским markdown, вместе с примерами на Python. Подходит, когда агент забирает контекст одним запросом или когда нужно вложить документацию прямо в промпт.
Как передать: дайте ссылку целиком или приложите содержимое файла в диалог с моделью.
/openapi.json
Машиночитаемый контракт (OpenAPI 3.1). Все эндпоинты со схемами запросов и ответов и полными списками допустимых значений: 44 шаблона генерации текста, 97 стилей изображений, подсервисы анализа фото, редактирования и видео. Из него генерируется клиент на любом языке, а агентные фреймворки импортируют его как готовый набор инструментов.
Как передать: укажите URL спецификации в импорте инструментов агента или в генераторе клиента.
Файлы обновляются вместе с сервисом — их достаточно один раз указать агенту, отдельные выгрузки поддерживать не нужно. Токен в них не входит: его нужно передать агенту отдельно.

Общая информация

API повторяет то же взаимодействие с сервисом, что и веб-интерфейс: те же эндпоинты, те же параметры. Отличия — авторизация по токену и несколько технических параметров.

Авторизация

Все запросы, создающие задачу, требуют Bearer-токен. Токен постоянный, находится вверху этой страницы и передаётся в заголовке:

Заголовок
Authorization: Bearer 5036e45d-53f2-4a72-92d2-8d5d79e22a72
Если заголовок не передан, запрос обрабатывается как анонимный (по IP-адресу вашего сервера) — с демо-ограничениями и чужим балансом. Неверный токен возвращает HTTP 401. Не публикуйте токен в клиентском коде: он даёт полный доступ к балансу аккаунта.

Два режима обработки

Синхронный. Одно соединение: запрос — ответ с готовым результатом. Так работают генерация текста (/create-write-sync/…), анализ фото и редактирование фото. Время ответа зависит от объёма результата, поэтому задайте таймаут клиента с запасом (по умолчанию многие библиотеки рвут соединение через 20–30 секунд).

Асинхронный. Два запроса: создание задачи возвращает job_id, затем вы опрашиваете статус до готовности. Так работают перефразирование, сокращение, изображения, презентации, песни, видео и генерация стихов/текстов песен.

При создании задачи ответ содержит "status": "completed" — это подтверждение того, что задача принята, а не готовности результата. Готовность определяется только ответом эндпоинта ping-*.

Ограничения

Одновременных задач1 на аккаунт
Частота опроса статусане чаще 1 раза в секунду
Очередь на стороне APIотсутствует
Хранение результатов24 часа (текст), 4 суток (видео)

Очереди на уровне веб-сервиса нет: в работе может быть только одна задача. Пока предыдущая не завершилась, новая либо отклоняется с notice.type = "limit" (генерация текста, изображения, презентации, песни, видео, анализ и редактирование фото), либо принимается, но ждёт своей очереди (перефразирование и сокращение).

Статус задачи опрашивайте не чаще одного раза в секунду — более частые запросы не ускоряют обработку.

API не предназначен для массовой генерации. Он рассчитан на единичные последовательные запросы: одна задача за раз, следующая — после завершения предыдущей. Попытки распараллелить нагрузку или прогнать через него большой объём не дадут выигрыша — запросы будут отклоняться с notice.type = "limit".

Если нужен объём от тысячи генераций, такие задачи специалисты сервиса выполняют отдельно и под ключ — с подходящими мощностями и сроками. За деталями услуги напишите нам через контакты.

Формат запроса

Тело передаётся как форма (application/x-www-form-urlencoded или multipart/form-data). Запросы с файлами — всегда multipart/form-data. CSRF-токен для API не нужен.

Формат ошибок

Почти все ошибки возвращаются с кодом HTTP 200 и телом с "status": "error". Ориентируйтесь на поле status, а не на HTTP-код.

JSON
{
    "status": "error",
    "message": "❌ Превышен лимит запросов. Пожалуйста, дождитесь завершения предыдущего запроса.",
    "notice": {"type": "limit"}
}

Поле message предназначено для показа человеку и может содержать HTML. Для логики используйте notice.type:

notice.typeЧто означает
validationНекорректные параметры запроса. Дополнительно приходят title и text с пояснением.
limitУже есть активная задача — дождитесь её завершения.
paywall_balanceЗакончился баланс аккаунта.
paywall_demoИсчерпаны бесплатные демо-попытки (запрос без токена).
paywall_queueПереполнена бесплатная очередь (только видео).
moderationЗапрос или результат отклонён фильтром контента.
moderation_blockТри отклонения подряд — создание запросов заблокировано.
unavailableСервис временно недоступен, повторите позже.
errorТехническая ошибка.
generating / queueНе ошибка: промежуточный статус при опросе задачи.

В ошибках, связанных с загружаемыми файлами, дополнительно приходит error_type со значением format, resolution, size или invalid.

Стоимость

Отдельного тарифа для API нет. Работа через API оплачивается так же, как работа через сайт: те же пакеты, те же цены, тот же баланс. Запросы из кода и действия в веб-интерфейсе списывают средства с одного счёта, поэтому докупать что-то отдельно «для интеграции» не нужно.

Баланс пополняется пакетами — они различаются объёмом и ценой; чем больше пакет, тем ниже стоимость единицы. Пакеты привязаны к сервису, которым вы пользуетесь (тексты, изображения, презентации, песни, видео, работа с фото), а остаток виден вверху этой страницы и в ответе GET /balance.

Актуальные тарифы и состав пакетов — на странице цен →

Сколько списывается за операцию

Баланс единый для всех сервисов и считается в символах.

ОперацияСписывается
Генерация текстадлина сгенерированного текста
Перефразированиедлина исходного текста
Сокращение текста500
Изображение500
Анализ фото500
Редактирование фото500
Презентация10 000
Песня10 000
Видео10 000
Списание с аккаунта происходит по факту успешной обработки. Если запрос отклонён фильтром контента или завершился ошибкой генерации, баланс не уменьшается.

Остаток баланса

GET /balance Bearer

Параметров нет. Возвращает остаток в единицах каждого сервиса:

JSON
{
    "balance_text": 52511,
    "balance_image": 106,
    "balance_ocr": 106,
    "balance_imgedit": 106,
    "balance_presentation": 5,
    "balance_song": 5,
    "balance_video": 5
}

История запросов

GET /jobs-list Bearer

Параметров нет. Возвращает задачи аккаунта по всем сервисам: rewrite_jobs, reduction_jobs, write_jobs, image_jobs, presentation_jobs, song_jobs, ocr_jobs, imgedit_jobs, video_jobs.

JSON
{
    "rewrite_jobs": [
        {
            "id": "5036e45d-53f2-4a72-92d2-8d5d79e22a72",
            "created_at": "2026-08-31 12:43:34",
            "source_text_short": "Как эффективно пропиарить свой бизнес в Москве? В...",
            "status": "Готово"
        }
    ],
    "reduction_jobs": []
}

Проверка подключения

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

Python
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"

resp = requests.get(f"{BASE}/balance", headers={"Authorization": f"Bearer {TOKEN}"})
resp.raise_for_status()          # 401 означает, что токен неверный

balance = resp.json()
print("Символов:", balance["balance_text"])
print("Изображений:", balance["balance_image"])
print("Видео:", balance["balance_video"])

Перефразирование текста

Асинхронный сервис: создаём задачу, получаем job_id, опрашиваем статус. На выходе — несколько вариантов перефразированного текста и разбор по предложениям.

В этом сервисе токен учитывается только вместе с параметром api=1. Без api=1 заголовок авторизации игнорируется, и запрос выполняется от анонимного пользователя по IP-адресу.

Создание задачи

POST /create-rewrite-job Bearer form-data
ПолеОбяз.ТипОписание
api Да Integer Технический параметр, всегда 1. Включает API-режим: авторизацию по токену и результат без служебной HTML-разметки.
mode Да String Режим: simple — поверхностное перефразирование, deep — глубокое. Другое значение вернёт ошибку.
html Да String Текст для обработки — обычный текст или HTML. HTML будет разобран, перефразирован и возвращён с сохранением исходной разметки.
stop_words Нет String JSON-массив строкой: ["стоп слово 1", "стоп слово 2"].

Ответ:

JSON
{
    "status": "completed",
    "message": "Идет подготовка к перефразированию текста, пожалуйста, ожидайте...",
    "job_id": "5036e45d-53f2-4a72-92d2-8d5d79e22a72"
}

Получение результата

GET /ping-rewrite-job?job_id=<job_id> без токена

Пока задача обрабатывается:

JSON
{
    "status": "continue",
    "progress": "Нейросеть Robotext перефразирует текст... ✏️",
    "notice": {"type": "generating", "progress": 40}
}

Поле progress предназначено для показа человеку и содержит HTML с разметкой прогресс-бара. Число процентов берите из notice.progress.

По готовности:

JSON
{
    "status": "completed",
    "result_text": [
        "Доброе утро, друзья. Давайте поработаем над этим.",
        "Доброе утро, товарищи! Давайте поработаем над проектами.",
        "Доброе утро, коллеги. Давайте поработаем над проектом!"
    ],
    "sentences_variat": {
        "sentence-1": ["Добрый день, товарищи.", ["Доброе утро, друзья."], ["Доброе утро, коллеги."]]
    },
    "balance_message": "52511 символов",
    "result_len": 78,
    "keys": {}
}
ПолеОписание
result_textМассив вариантов перефразированного текста (при api=1).
sentences_variatРазбор по предложениям: исходное предложение и варианты его замены.
result_lenДлина исходного текста в символах — именно столько списано с баланса.
balance_messageОстаток баланса после списания.
keysЗарезервировано, всегда пустой объект.
Если задача создана, когда предыдущая ещё не завершилась, запрос не отклоняется: задача принимается и ждёт своей очереди. В этом случае при опросе приходит notice.type = "limit" — это нормальное ожидание, а не ошибка.

Ограничения

Стоимостьдлина исходного текста
Одновременных задач1
Частота опросане чаще 1 раза в секунду
Хранение результата24 часа

Пример на Python

Python
import time
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# 1. Создаём задачу. Очереди на стороне сервиса нет: пока эта задача
#    не завершится, новые создавать нельзя.
payload = {
    "api": "1",                                  # обязателен для работы по токену
    "mode": "simple",                            # simple — поверхностное, deep — глубокое
    "html": "Добрый день, товарищи. Давайте займемся проектом.",
}

resp = requests.post(f"{BASE}/create-rewrite-job", headers=headers, data=payload)
resp.raise_for_status()
created = resp.json()
if created.get("status") == "error":
    raise SystemExit(created.get("message"))

job_id = created["job_id"]
print("Задача создана:", job_id)

# 2. Опрашиваем статус — не чаще одного раза в секунду.
while True:
    time.sleep(1)

    ping = requests.get(f"{BASE}/ping-rewrite-job", params={"job_id": job_id})
    ping.raise_for_status()
    data = ping.json()

    if data["status"] == "completed":
        for i, variant in enumerate(data["result_text"], 1):
            print(f"Вариант {i}: {variant}")
        print("Списано символов:", data["result_len"])
        break

    if data["status"] == "error":
        raise SystemExit(data.get("message"))

Сокращение текста

Асинхронный сервис: сжимает исходный текст до заданной длины с сохранением смысла.

Создание задачи

POST /create-reduction-job Bearer form-data
ПолеОбяз.ТипОписание
text Да String Исходный текст, обычный текст без разметки. От 400 до 24 000 символов.
requiredLength Да Integer Желаемая длина результата в символах. Допустимый диапазон зависит от длины исходного текста — см. таблицу ниже.
mode Нет String Режим сокращения, значение whole. Значение по умолчанию, менять не требуется.
output_format Нет String plain (сплошной текст, по умолчанию) или bullet (маркированный список).

Допустимая длина результата

Длина исходного текстаДопустимые значения requiredLength
400 – 3 000 символов200 – не более 50% от длины исходного текста
3 000 – 6 000 символов200 – 1 500
6 000 – 24 000 символов400 – 3 000
При подсчёте длины исходного текста переводы строк считаются за один символ. Значение requiredLength вне допустимого диапазона вернёт ошибку с notice.type = "validation" и пояснением в notice.text.

Ответ:

JSON
{
    "status": "completed",
    "message": "Идет подготовка к сокращению текста, пожалуйста, ожидайте...",
    "notice": {"type": "generating"},
    "job_id": "ef3d4aa6-169a-470e-9814-cd93de65c341"
}

Получение результата

GET /ping-reduction-job?job_id=<job_id> без токена

Пока задача обрабатывается:

JSON
{
    "status": "continue",
    "progress": "Нейросеть Robotext сокращает текст... ✏️",
    "notice": {"type": "generating", "progress": null}
}

По готовности:

JSON
{
    "status": "completed",
    "result_text": "Сокращённый текст.",
    "balance_message": "52011 символов"
}

Ограничения

Стоимость500 символов за запрос
Длина исходного текста400 – 24 000 символов
Одновременных задач1
Частота опросане чаще 1 раза в секунду
Хранение результата24 часа

Стоимость фиксированная и не зависит от объёма текста. Как и в перефразировании, задача, созданная во время обработки предыдущей, не отклоняется, а ждёт своей очереди (notice.type = "limit" при опросе).

Пример на Python

Python
import time
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

text = (
    "Искусственный интеллект объединяет в себе несколько научных направлений: "
    "нейронные сети, машинное обучение, обработку естественного языка, когнитивные "
    "вычисления и компьютерное зрение. Однако чёткого представления о том, что именно "
    "входит в понятие искусственного интеллекта, нет, так как нет общепринятых критериев "
    "разумности и соответствия человеческому интеллекту."
) * 3   # исходный текст должен быть не короче 400 символов

# 1. Создаём задачу. В работе может быть только одна задача.
payload = {
    "text": text,
    "requiredLength": "250",     # см. таблицу допустимых значений
    "mode": "whole",
}

resp = requests.post(f"{BASE}/create-reduction-job", headers=headers, data=payload)
resp.raise_for_status()
created = resp.json()
if created.get("status") == "error":
    raise SystemExit(created.get("message"))

job_id = created["job_id"]
print("Задача создана:", job_id)

# 2. Опрашиваем статус не чаще одного раза в секунду.
while True:
    time.sleep(1)

    ping = requests.get(f"{BASE}/ping-reduction-job", params={"job_id": job_id})
    ping.raise_for_status()
    data = ping.json()

    if data["status"] == "completed":
        print("Результат:", data["result_text"])
        print("Баланс:", data["balance_message"])
        break

    if data["status"] == "error":
        raise SystemExit(data.get("message"))

Генерация текста

44 шаблона генерации: тексты, письма, рефераты, посты, описания товаров, стихи. Основной способ — синхронный запрос: одно соединение, в ответ приходит готовый текст.

Синхронная генерация

Работает для всех шаблонов, кроме poem и song-text.

POST /create-write-sync/<идентификатор-шаблона> Bearer form-data

Идентификатор шаблона подставляется в URL — например /create-write-sync/text-generator. Полный список идентификаторов и их параметров — в таблицах ниже.

ПолеОбяз.ТипОписание
is_stream Да String Для API всегда 0 — ответ придёт одним готовым JSON. Без этого параметра сервис отдаёт текст потоком по мере генерации.
Да Параметры конкретного шаблона — см. таблицу «Параметры шаблонов».
Параметр is_stream читается только из тела формы. Если отправить запрос в формате JSON, он не будет учтён и ответ придёт потоком. Отправляйте тело как application/x-www-form-urlencoded или multipart/form-data.

Ответ при is_stream=0:

JSON
{
    "status": "completed",
    "data": "Сгенерированный текст",
    "job_id": "94d5be99-b9c1-442b-9218-29fc9b3de0b3",
    "balance": "95068 символов"
}

Готовый текст находится в поле data. Время ответа зависит от объёма результата, поэтому задайте таймаут клиента с запасом — 120 секунд и более.

Ошибки этого эндпоинта возвращаются с суффиксом-разделителем --END-- в конце тела — он используется в потоковом режиме. При разборе ответа отбрасывайте этот суффикс, если он есть (в примере ниже это учтено).

Асинхронная генерация

Единственный способ для шаблонов poem (стихи) и song-text (текст песни); для остальных шаблонов тоже доступен.

POST /create-write-job/<идентификатор-шаблона> Bearer form-data

Параметры — те же, что у синхронного метода, но без is_stream. Ответ:

JSON
{
    "status": "completed",
    "message": "Идет подготовка к обработке, пожалуйста, ожидайте...",
    "job_id": "ef3d4aa6-169a-470e-9814-cd93de65c341"
}
GET /ping-write-job?job_id=<job_id> без токена

Пока задача обрабатывается:

JSON
{
    "status": "continue",
    "message": "Нейросеть Robotext генерирует текст... ✏️",
    "notice": {"type": "generating", "seconds": 30}
}

По готовности:

JSON
{
    "status": "completed",
    "result": "Сгенерированный текст",
    "result_len": 1024,
    "balance": "95068 символов"
}
Обратите внимание на разные имена полей: в синхронном ответе текст лежит в data, в асинхронном — в result.

Ограничения

Стоимостьдлина сгенерированного текста
Одновременных задач1
Частота опросане чаще 1 раза в секунду
Хранение результата24 часа

Если предыдущая генерация ещё не завершилась, новый запрос отклоняется с notice.type = "limit" — дождитесь её окончания. Запрос также проходит проверку контента: при отклонении приходит notice.type = "moderation".

Идентификаторы шаблонов и их параметры

Общие шаблоны

ИдентификаторНазначениеПараметры
text-generatorГенератор текстаtext — требования к тексту, до 24 000
phrase-generatorГенератор фраз и предложенийlang0 русский, 1 английский; text — исходные слова, до 1 000
continue-textПродолжение текстаtext — исходный текст, до 4 000
create-questionsГенератор вопросовtext — исходный текст, до 24 000
create-dialogueГенератор диалоговpeople — участники, до 200; theme — тема, до 400; add — детали, до 1 500 (необяз.)
synonymizerСинонимайзерtext — слово или фраза, до 140
keywordsВписать ключевые словаkeywords — ключи, до 500; text — исходный текст, до 10 000
expand-textРасширение текстаtext — исходный текст, до 2 000
nicknameГенератор никнеймовtext — описание, до 2 000; radiovalue1 английский, value2 русский
team-nameНазвание командыtext — детали, до 2 000; radiovalue1 английский, value2 русский

Бизнес и работа

ИдентификаторНазначениеПараметры
commercial-offerКоммерческое предложениеservice — предложение, до 300; client — получатель, до 200 (необяз.); add — детали, до 2 000 (необяз.)
emailГенератор письмаtext — суть письма, до 2 000; client — получатель, до 200 (необяз.)
complaintЖалоба, претензия, заявлениеstyle0 жалоба, 1 претензия, 2 заявление; name — кому, до 200 (необяз.); text — детали, до 2 000
namingНеймингstyle0 бренд, 1 магазин, 2 Telegram-канал, 3 YouTube-канал; text — детали, до 2 000
business-planБизнес-планtext — детали о бизнесе, до 2 000
marketing-planМаркетинговый планtext — детали о бизнесе, до 2 000
sloganГенератор слогановtext — детали бренда, до 2 000

Учёба

ИдентификаторНазначениеПараметры
paperГенератор рефератовtext — тема, до 2 000
introГенератор введенияtext — тема текста, до 12 000
essayГенератор эссеtext — тема эссе, до 2 000
compositionГенератор сочиненийtext — тема сочинения, до 2 000
annotationГенератор аннотацийtext — тема, до 2 000; text_type0 диплом, 1 статья, 2 книга

Творчество

ИдентификаторНазначениеПараметры
storyГенератор историйtext — тема истории, до 2 000
ideaИдеи и сюжеты для книгtext — тема сюжета, до 2 000
character-historyИстория персонажаname — имя, до 200; text — детали, до 2 000
scenarioГенератор сценарияname — имена персонажей, до 400; text — детали сюжета, до 2 000
poem (только асинхронно)Генератор стиховradiovalue1 тема, value2 первая строчка; keys — тема или строка, до 80
poem-ideaИдеи для стиховtext2 — требования, до 2 000 (необяз.)
song-text (только асинхронно)Генератор текста песниradiovalue1 тема, value2 первая строчка; keys — тема или строка, до 80
song-ideaТемы для песенtext2 — требования, до 2 000 (необяз.)
fanfictionГенератор фанфиковname — имена персонажей, до 400; text — детали сюжета, до 2 000
song-rapТекст для рэпаtext — тема трека, до 2 000; keys2 — ключевые слова, до 500 (необяз.)
quoteГенератор цитатtext2 — тема, до 500 (необяз.); source — автор или произведение, до 500 (необяз.)
quizГенератор викторинtext — тема викторины, до 500
Шаблоны poem и song-text доступны только через асинхронный эндпоинт /create-write-job/…; синхронный вернёт для них 404. Кроме того, для них действует более строгая проверка языка: доля русского текста в запросе должна быть не меньше 50%.

Социальные сети

ИдентификаторНазначениеПараметры
post-headerГенератор заголовковstyle0 статья, 1 новость, 2 видео; name — тема, до 200; keys2 — ключевые слова, до 2 000 (необяз.)
create-postГенератор постовtext — тема поста, до 500; keys2 — ключевые слова, до 2 000 (необяз.)
post-planПлан статьиtext — тема статьи, до 500; keys2 — ключевые слова, до 2 000 (необяз.)
content-planКонтент-планtext — детали о блоге, до 2 000

SEO и вебсайты

ИдентификаторНазначениеПараметры
seo-textГенератор SEO-текстаtext — тема текста, до 500; seo_keys — ключевые слова, до 2 000 (необяз.)
html-descriptionМета-тег Descriptiontext — детали страницы, до 16 000
html-keywordsКлючевые слова для страницыradiovalue1 простой список, value2 мета-тег Keywords; text — детали текста, до 16 000

Маркетплейсы

ИдентификаторНазначениеПараметры
product-descriptionОписание товараname — название, до 200; product_keys — ключевые слова, до 2 000 (необяз.)
product-reviewГенератор отзывовstyle0 товар, 1 услуга; mood0 позитивный, 1 негативный, 2 нейтральный; name — название, до 200; product_keys — ключевые слова, до 2 000 (необяз.)

Праздники

ИдентификаторНазначениеПараметры
congratulationГенератор поздравленийperson — кого поздравить, до 500; text — с чем, до 1 000; who — от кого, до 500 (необяз.)

Пример на Python: синхронная генерация

Python
import json
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# is_stream=0 — получить готовый текст одним ответом.
# Тело обязательно form-encoded: в JSON параметр is_stream не читается.
payload = {
    "is_stream": "0",
    "text": "Напиши историю о путешествии на Байкал",
}

resp = requests.post(
    f"{BASE}/create-write-sync/text-generator",
    headers=headers,
    data=payload,
    timeout=180,          # генерация длинного текста занимает время
)
resp.raise_for_status()

# Ошибки приходят с техническим суффиксом-разделителем — отбрасываем его.
body = resp.text.split("--END--")[0]
data = json.loads(body)

if data["status"] == "error":
    raise SystemExit(data.get("data") or data.get("message"))

print(data["data"])
print("Баланс:", data["balance"])

Пример на Python: асинхронная генерация (стихи)

Python
import time
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# 1. Создаём задачу. Очереди на стороне сервиса нет: в работе только одна задача,
#    новый запрос до её завершения будет отклонён.
payload = {
    "radio": "value1",                 # value1 — задаём тему, value2 — первую строчку
    "keys": "Осень в горах",           # не длиннее 80 символов
}

resp = requests.post(f"{BASE}/create-write-job/poem", headers=headers, data=payload)
resp.raise_for_status()
created = resp.json()
if created.get("status") == "error":
    raise SystemExit(created.get("message"))

job_id = created["job_id"]

# 2. Опрашиваем статус не чаще одного раза в секунду.
while True:
    time.sleep(1)

    ping = requests.get(f"{BASE}/ping-write-job", params={"job_id": job_id})
    ping.raise_for_status()
    data = ping.json()

    if data["status"] == "completed":
        print(data["result"])                     # в асинхронном ответе поле result
        print("Символов:", data["result_len"])
        break

    if data["status"] == "error":
        raise SystemExit(data.get("message"))

Генерация изображений

Асинхронный сервис: создаём задачу, опрашиваем статус, скачиваем готовое изображение по своей ссылке.

Создание задачи

POST /create-image-job Bearer form-data
ПолеОбяз.ТипОписание
text Да String Описание изображения. От 4 до 900 символов, доля букв в тексте — не менее 30%.
aspect Нет String Формат изображения, по умолчанию 1x1. Допустимые значения — в таблице ниже.
style Нет String Стиль обработки, по умолчанию nostyle. Допустимые значения — в таблице ниже.

Ответ:

JSON
{
    "status": "completed",
    "message": "Идет подготовка к обработке, пожалуйста, ожидайте...",
    "job_id": "ef3d4aa6-169a-470e-9814-cd93de65c341"
}

Получение результата

GET /ping-image-job?job_id=<job_id> без токена

Пока идёт генерация:

JSON
{
    "status": "continue",
    "message": "Нейросеть Robotext генерирует изображение... 🖌️",
    "notice": {"type": "generating", "seconds": 10}
}

По готовности:

JSON
{
    "status": "completed",
    "result": "ef3d4aa6-169a-470e-9814-cd93de65c341",
    "balance": "106 🖼️"
}

Поле result совпадает с job_id и используется для скачивания.

Скачивание изображения

GET /im/<job_id>.png Bearer
Скачивание требует Bearer-токен: сгенерированные изображения недоступны по прямой ссылке — так они остаются приватными. Без токена сервис вернёт «Задание не найдено».

В ответе приходят байты изображения. Несмотря на расширение .png в адресе, фактический тип файла указан в заголовке Content-Type и может быть image/jpeg.

Форматы изображения

aspectРазрешениеaspectРазрешение
1x11024 × 102421x91344 × 576
9x21576 × 134416x91280 × 720
9x16720 × 12803x21248 × 832
2x3832 × 12484x31152 × 864
3x4864 × 11529x71152 × 896
7x9896 × 1152

Стили обработки

Значение style передаётся строкой. Без стиля — nostyle.

Популярные

nostyle, misc-anime, vector, game-gta, photo-hdr

Художественные стили

artstyle-abstract, artstyle-abstract_expressionism, artstyle-art_deco, artstyle-art_nouveau, artstyle-constructivist, artstyle-cubist, artstyle-expressionist, artstyle-graffiti, artstyle-hyperrealism, artstyle-impressionist, artstyle-pixelart, artstyle-pointillism, artstyle-pop_art, artstyle-psychedelic, artstyle-renaissance, artstyle-steampunk, artstyle-surrealist, artstyle-typography, artstyle-watercolor

Фото

photo-alien, photo-analog_film, photo-film_noir, photo-glamour, photo-iphone_photographic, photo-long_exposure, photo-neon_noir, photo-silhouette, photo-tilt-shift

Разное

misc-3d, misc-architectural, misc-disco, misc-dreamscape, misc-dystopian, misc-fairy_tale, misc-gothic, misc-grunge, misc-horror, misc-kawaii, misc-lovecraftian, misc-macabre, misc-manga, misc-metropolis, misc-minimalist, misc-monochrome, misc-nautical, misc-space, misc-stained_glass, misc-techwear_fashion, misc-tribal, misc-zentangle

Игры

game-warhammer40, game-fortnite, game-bubble_bobble, game-cyberpunk_game, game-fighting_game, game-mario, game-minecraft, game-pokemon, game-retro_arcade, game-retro_game, game-rpg_fantasy_game, game-strategy_game, game-streetfighter, game-zelda

Реклама

ads-advertising, ads-automotive, ads-corporate, ads-fashion_editorial, ads-food_photography, ads-gourmet_food_photography, ads-luxury, ads-real_estate, ads-retail

Футуризм

futuristic-biomechanical, futuristic-biomechanical_cyberpunk, futuristic-cybernetic, futuristic-cybernetic_robot, futuristic-cyberpunk_cityscape, futuristic-futuristic, futuristic-retro_cyberpunk, futuristic-retro_futurism, futuristic-sci-fi, futuristic-vaporwave

Бумага

papercraft-collage, papercraft-flat_papercut, papercraft-kirigami, papercraft-paper_mache, papercraft-paper_quilling, papercraft-papercut_collage, papercraft-papercut_shadow box, papercraft-stacked_papercut, papercraft-thick_layered_papercut

Ограничения

Стоимость500 символов за изображение
Одновременных задач1
Частота опросане чаще 1 раза в секунду
Длина описания4 – 900 символов

Запрос проходит проверку контента. При отклонении приходит notice.type = "moderation", баланс не списывается.

Пример на Python

Python
import time
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# 1. Создаём задачу. Очереди на стороне сервиса нет: пока эта задача
#    не завершится, новые запросы будут отклонены.
payload = {
    "text": "Девушка гуляет по новогодней Москве",
    "aspect": "1x1",          # формат из таблицы форматов
    "style": "nostyle",       # стиль из таблицы стилей
}

resp = requests.post(f"{BASE}/create-image-job", headers=headers, data=payload)
resp.raise_for_status()
created = resp.json()
if created.get("status") == "error":
    raise SystemExit(created.get("message"))

job_id = created["job_id"]
print("Задача создана:", job_id)

# 2. Опрашиваем статус не чаще одного раза в секунду.
while True:
    time.sleep(1)

    ping = requests.get(f"{BASE}/ping-image-job", params={"job_id": job_id})
    ping.raise_for_status()
    data = ping.json()

    if data["status"] == "completed":
        image_id = data["result"]        # совпадает с job_id
        break

    if data["status"] == "error":
        raise SystemExit(data.get("message"))

# 3. Скачиваем изображение — обязательно с токеном.
img = requests.get(f"{BASE}/im/{image_id}.png", headers=headers)
img.raise_for_status()

with open("image.png", "wb") as f:
    f.write(img.content)

print("Изображение сохранено в image.png")

Редактирование фото

Синхронный сервис: загружаете фото, указываете инструмент — и получаете обработанное изображение одним запросом. 41 инструмент в 7 категориях.

Исходные фото нигде не сохраняются: файлы проверяются в памяти и передаются обработчику. Хранится только результат.

Обработка

POST /image-edit/process Bearer multipart/form-data
ПолеОбяз.ТипОписание
page Да String Идентификатор инструмента из списка ниже. От него зависит, какие ещё параметры принимаются.
images Да File[] Файлы изображений. Для большинства инструментов — до 3 файлов, для «удалить фон» и «увеличить разрешение» — ровно 1. Поле повторяется для каждого файла.
main Нет Integer Индекс основного фото в списке, по умолчанию 0. Основное фото используется как база, остальные — как референсы.
query Нет String Свой запрос на русском, обычно 10–300 или 10–400 символов в зависимости от инструмента. Если не передан — используется стандартный запрос инструмента.
resolution Нет String Разрешение результата, по умолчанию source (как в исходном фото). См. ниже.
background Нет String Только для udalit-fon-tovara: transparent (по умолчанию) или white.
scale Нет String Только для uvelichit-razreshenie: 2 (по умолчанию) или 4 — во сколько раз увеличить.

Значения resolution

source — сохранить пропорции исходного фото (по умолчанию). Либо один из форматов: 1x1, 9x7, 7x9, 4x3, 3x4, 3x2, 2x3, 16x9, 9x16, 21x9, 9x21. Либо точный размер вида 1024x768 — каждая сторона от 16 до 1536 пикселей.

Ответ:

JSON
{
    "status": "completed",
    "job_id": "3d1f8c2b-7a45-4e19-b0d3-6f2a9c81e5b7",
    "image_url": "https://robotext.io/ime/3d1f8c2b-7a45-4e19-b0d3-6f2a9c81e5b7.png",
    "balance": 4500
}

Поле image_url приходит только при запросе с токеном. Обработка занимает до двух минут — установите таймаут клиента не менее 180 секунд.

Скачивание результата

GET /ime/<job_id>.png Bearer

Тот же адрес, что в поле image_url. Требует Bearer-токен: результаты недоступны по прямой ссылке.

Инструменты

Значение параметра page. В колонке «Текст» указано, принимает ли инструмент параметр query.

Товары и маркетплейсы

pageЧто делаетФотоТекст
udalit-fon-tovaraУдалить фон1нет, вместо него background
zamena-fona-tovaraЗаменить фон товарадо 3да, 10–400
foto-tovara-wildberriesФото для Wildberriesдо 3да, 10–300
foto-tovara-ozonФото для Ozonдо 3да, 10–300
odezhda-na-ai-modelОдежда на моделидо 3да, 10–400

Деловое фото и портреты

pageЧто делаетФотоТекст
biznes-portretДеловой портретдо 3да, 10–300
foto-na-rezyumeФото для резюмедо 3да, 10–300
avatar-dlya-profilyaАватар для профилядо 3да, 10–300
retush-portretaРетушь портретадо 3да, 10–300

Реставрация и качество

pageЧто делаетФотоТекст
restavratsiya-fotoРеставрация старого фотодо 3да, 10–300
kolorizatsiya-fotoРаскрасить чёрно-белое фотодо 3да, 10–300
uluchshit-kachestvo-fotoУлучшить качестводо 3да, 10–300
uvelichit-razreshenieУвеличить разрешение1нет, вместо него scale

Объекты и сцена

pageЧто делаетФотоТекст
udalit-obekt-s-fotoУдалить объектдо 3да, 10–400
udalit-cheloveka-s-fotoУбрать человекадо 3да, 10–300
ubrat-vodyanoy-znakУбрать водяной знакдо 3да, 10–300
udalit-tekst-s-fotoУдалить текст с фотодо 3да, 10–300
rasshirit-fotoРасширить кадрдо 3да, 10–300
otredaktirovat-fotoПроизвольное редактированиедо 3да, 3–300

Склейка и объединение

pageЧто делаетФотоТекст
obedinit-dva-fotoОбъединить два фотодо 3да, 10–300
zamena-litsaЗаменить лицодо 3да, 10–300
sovmestnoe-fotoСовместное фотодо 3да, 10–300
kollazh-iz-fotoКоллаж из фотодо 3да, 10–300
primerit-odezhduПримерить одеждудо 3да, 10–300
primerit-pricheskuПримерить причёскудо 3да, 10–400
semeynyy-portretСемейный портретдо 3да, 10–300

Интерьер и недвижимость

pageЧто делаетФотоТекст
dizayn-intereraДизайн интерьерадо 3да, 10–400
virtualnyy-steydzhingОбставить пустую комнатудо 3да, 10–400
dizayn-remontaПоказать ремонтдо 3да, 10–400
dizayn-kuhniДизайн кухнидо 3да, 10–400
dizayn-spalniДизайн спальнидо 3да, 10–400
dizayn-detskoyДизайн детскойдо 3да, 10–400
dizayn-vannoyДизайн ваннойдо 3да, 10–400
dizayn-fasadaДизайн фасададо 3да, 10–400

Креатив и стилизация

pageЧто делаетФотоТекст
foto-v-stile-animeФото в стиле анимедо 3да, 10–300
foto-v-multikФото в мультикдо 3да, 10–300
sharzh-iz-fotoШарж из фотодо 3да, 10–400
foto-v-risunokФото в рисунокдо 3да, 10–400
ai-avatarАватар по фотодо 3да, 10–400
portret-pitomtsaПортрет питомцадо 3да, 10–400
vozrastnoy-filtrВозрастной фильтрдо 3да, 10–300

Требования к изображениям

Размер файладо 15 МБ
Разрешениедо 10000 × 10000 px
Разрешение для увеличениядо 1200 × 1200 px
ФорматыJPEG, PNG, WEBP, GIF, BMP, TIFF, HEIC/HEIF

Ограничения

Стоимость500 символов за запрос
Одновременных задач1
Максимум фото за запрос3

Результат проходит проверку контента: при отклонении приходит notice.type = "moderation", изображение не отдаётся и баланс не списывается. Три отклонения подряд блокируют новые запросы.

Пример на Python

Python
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# Запрос синхронный: обработанное фото возвращается сразу.
# Очереди на стороне сервиса нет — в работе может быть только одна задача.
with open("product.jpg", "rb") as f:
    resp = requests.post(
        f"{BASE}/image-edit/process",
        headers=headers,
        files=[("images", f)],          # для нескольких фото повторите поле images
        data={
            "page": "udalit-fon-tovara",
            "background": "transparent",   # transparent | white
        },
        timeout=180,
    )

resp.raise_for_status()
data = resp.json()

if data["status"] == "error":
    raise SystemExit(data.get("message"))

# Результат скачиваем по ссылке из ответа — тоже с токеном.
image = requests.get(data["image_url"], headers=headers)
image.raise_for_status()

with open("result.png", "wb") as f:
    f.write(image.content)

print("Готово, сохранено в result.png. Остаток символов:", data["balance"])

Анализ фото (OCR)

Синхронный сервис: загружаете изображение, выбираете подсервис — и получаете текстовый ответ одним запросом. Каждый подсервис решает свою задачу: распознать текст, определить растение, решить задачу с фото.

Изображение нигде не сохраняется: файл проверяется в памяти, отправляется в модель и стирается. В историю запросов попадает только имя файла и текст ответа.

Обработка изображения

POST /ocr/process Bearer multipart/form-data
ПолеОбяз.ТипОписание
image Да File Один файл изображения. Ограничения — в таблице ниже.
page Да String Идентификатор подсервиса из списка ниже. Определяет, что именно модель сделает с изображением.
query Нет String Собственный запрос к изображению, от 10 до 300 символов. Если не передан — используется стандартный запрос выбранного подсервиса.

Ответ приходит одним JSON — это синхронный запрос, опрашивать статус не нужно:

JSON
{
    "status": "completed",
    "text": "Полный текст ответа модели",
    "job_id": "0f4c8e2a-6b1d-4f77-9c3e-2a5b7d8e1f04",
    "balance": 4500
}

Поле balance — остаток баланса в символах (число).

Ответ модели формируется постепенно, поэтому запрос может выполняться десятки секунд. Установите таймаут клиента не менее 120 секунд.

Подсервисы

Значение параметра page:

pageЧто делает
opisat-izobrazhenieОписать изображение
proanalizirovat-izobrazhenieПроанализировать изображение
raspoznat-tekst-s-fotoРаспознать текст с фото
perevesti-tekst-s-fotoПеревести текст с фото
raspoznat-rukopisnyy-tekstРаспознать рукописный текст
opredelit-obekt-na-fotoОпределить объект на фото
nayti-mesto-po-fotoНайти место по фото
opisat-vneshnost-chelovekaОписать внешность человека
opredelit-tip-lica-po-fotoОпределить тип лица
opredelit-shrift-po-fotoОпределить шрифт
opredelit-rastenie-po-fotoОпределить растение
opredelit-bolezn-rasteniyaОпределить болезнь растения
opredelit-pticu-po-fotoОпределить птицу
opredelit-zhivotnoe-po-fotoОпределить животное
opredelit-porodu-po-fotoОпределить породу
reshit-zadachu-po-fotoРешить задачу по фото

Требования к изображению

Размер файладо 15 МБ
Разрешениедо 10000 × 10000 px
ФорматовJPEG, PNG, WEBP, GIF, BMP, TIFF, HEIC/HEIF
Файлов за запрос1

Векторные форматы (SVG) не принимаются. При ошибке файла в ответе приходит error_type: size — превышен размер, resolution — превышено разрешение, format — неподдерживаемый формат, invalid — файл не является изображением.

Ограничения

Стоимость500 символов за запрос
Одновременных задач1
Длина своего запроса10 – 300 символов

Результат проходит проверку контента: при отклонении приходит notice.type = "moderation" и баланс не списывается. Три отклонения подряд блокируют новые запросы (notice.type = "moderation_block").

Пример на Python

Python
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# Запрос синхронный: ответ приходит сразу, опрашивать статус не нужно.
# В работе может быть только одна задача — дождитесь ответа перед следующим запросом.
with open("photo.jpg", "rb") as f:
    resp = requests.post(
        f"{BASE}/ocr/process",
        headers=headers,
        files={"image": f},
        data={
            "page": "raspoznat-tekst-s-foto",
            # "query": "Извлеки только числа из таблицы",   # необязательный свой запрос
        },
        timeout=180,
    )

resp.raise_for_status()
data = resp.json()

if data["status"] == "error":
    raise SystemExit(data.get("message"))

print(data["text"])
print("Остаток символов:", data["balance"])

Генерация презентаций

Асинхронный сервис: по теме или готовому тексту собирается презентация с текстом и изображениями. Результат доступен в форматах PPTX и PDF.

Создание задачи

POST /create-presentation-job Bearer form-data
ПолеОбяз.ТипОписание
topic Да* String Тема презентации, до 300 символов. *Нужно передать topic или text — хотя бы одно из двух.
text Да* String Готовый текст, по которому собирается презентация, до 24 000 символов.
slide_count Да String Количество слайдов: 10, 15 или 20.
template Да String Шаблон оформления — см. таблицу ниже.

Шаблоны оформления

templateОформление
basicБазовый
organicБежевый
colorЦветной
modernСтрогий
blackЧёрный
plainБез стиля

Ответ:

JSON
{
    "status": "completed",
    "message": "Подготовка к генерации примера",
    "job_id": "ef3d4aa6-169a-470e-9814-cd93de65c341"
}

Получение результата

GET /ping-presentation-job?job_id=<job_id> без токена

Пока идёт генерация — в ответе есть числовой прогресс от 1 до 100:

JSON
{
    "status": "continue",
    "message": "Генерация слайда 4/10",
    "progress": 38,
    "notice": {"type": "generating", "progress": 38, "label": "Генерация слайда 4/10"}
}

По готовности:

JSON
{
    "status": "completed",
    "result": {
        "job_id": "ef3d4aa6-169a-470e-9814-cd93de65c341",
        "title": "Дореволюционная Москва"
    },
    "balance": "5 🖥"
}

Идентификатор презентации совпадает с job_id, а title — это сгенерированное название, оно же станет именем скачиваемого файла.

Скачивание презентации

GET /download-presentation?job_id=<job_id>&format=pptx Bearer
ПолеОбяз.ТипОписание
job_id Да String Идентификатор задачи.
format Нет String pptx или pdf. По умолчанию — pdf.
Скачивание требует Bearer-токен — презентации недоступны по прямой ссылке. Файл отдаётся как вложение, имя файла — название презентации из поля title.

Ограничения

Стоимость10 000 символов за презентацию
Одновременных задач1
Частота опросане чаще 1 раза в секунду
Слайдов10, 15 или 20

Генерация презентации доступна только при балансе от 10 000 символов. Если баланса не хватает, приходит ошибка с notice.type = "paywall_balance".

Пример на Python

Python
import time
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# 1. Создаём задачу. Очереди на стороне сервиса нет: в работе только одна задача.
payload = {
    "topic": "Дореволюционная Москва",   # либо text — готовый текст до 24 000 символов
    "slide_count": "10",                 # 10, 15 или 20
    "template": "organic",               # basic | organic | color | modern | black | plain
}

resp = requests.post(f"{BASE}/create-presentation-job", headers=headers, data=payload)
resp.raise_for_status()
created = resp.json()
if created.get("status") == "error":
    raise SystemExit(created.get("message"))

job_id = created["job_id"]
print("Задача создана:", job_id)

# 2. Опрашиваем статус не чаще одного раза в секунду.
while True:
    time.sleep(1)

    ping = requests.get(f"{BASE}/ping-presentation-job", params={"job_id": job_id})
    ping.raise_for_status()
    data = ping.json()

    if data["status"] == "completed":
        print("Готово:", data["result"]["title"])
        break

    if data["status"] == "error":
        raise SystemExit(data.get("message"))

    print("Прогресс:", data.get("progress"), data.get("message"))

# 3. Скачиваем оба формата — обязательно с токеном.
for fmt in ("pptx", "pdf"):
    file_resp = requests.get(
        f"{BASE}/download-presentation",
        headers=headers,
        params={"job_id": job_id, "format": fmt},
    )
    file_resp.raise_for_status()

    with open(f"presentation.{fmt}", "wb") as f:
        f.write(file_resp.content)

    print(f"Сохранено: presentation.{fmt}")

Генерация песен

Асинхронный сервис: по тексту песни и музыкальному стилю генерируется готовый аудиотрек с вокалом или без него.

Создание задачи

POST /create-song-job Bearer form-data
ПолеОбяз.ТипОписание
preset_style Да String Музыкальный пресет из списка ниже либо __custom__ — тогда стиль берётся из поля genre.
genre Да String Описание музыкального стиля своими словами, до 250 символов. Учитывается только при preset_style=__custom__, но передать поле нужно всегда.
text Да* String Текст песни, от 10 до 2 500 символов. *Не требуется при vocals=none (инструментал).
title Да String Название песни, от 3 до 50 символов.
vocals Да String Вокал: random — случайный, female — женский, male — мужской, none — без вокала.
time_period Да Integer Длительность песни в секундах, от 30 до 240.
format_file Да String Формат файла: mp3 или wav.

Музыкальные пресеты

Значение preset_style передаётся строкой ровно как написано:

Поп, K-pop, Романтическая, Народная, Военно-патриотическая, Шансон, Детская, Хип-хоп / Рэп, Трэп, Дрилл, Фонк, Рок, Альтернативный рок, Панк, Металл, R&B, Соул, Регги, Реггетон, EDM, Диско, Хаус, Техно, Drum & Bass

Чтобы задать стиль своими словами, передайте preset_style=__custom__ и опишите звучание в поле genre — например: «поп, данс-поп, яркие синты, ритм-гитары, хлопки, 115 bpm, бодрый, радиоформат».

Ответ:

JSON
{
    "status": "completed",
    "message": "Подготовка к генерации",
    "job_id": "ef3d4aa6-169a-470e-9814-cd93de65c341"
}

Получение результата

GET /ping-song-job?job_id=<job_id> без токена

Пока идёт генерация:

JSON
{
    "status": "continue",
    "message": "Генерация песни",
    "progress": 57,
    "notice": {"type": "generating", "progress": 57, "label": "Генерация песни"}
}

По готовности:

JSON
{
    "status": "completed",
    "result": {
        "job_id": "ef3d4aa6-169a-470e-9814-cd93de65c341",
        "title": "Моя первая песня",
        "audio_data": "https://s3.timeweb.cloud/2b659743-song100/...",
        "video_data": "https://s3.timeweb.cloud/2b659743-song100/..."
    },
    "balance": "5 🎶"
}
ПолеОписание
audio_dataПрямая ссылка на аудиофайл. Подписанная, действует 1 час, дополнительная авторизация не нужна.
video_dataСсылка на видеоверсию песни (аудио с фоном).
titleНазвание песни — оно же имя файла при скачивании через /download-song.

Скачивание песни

Есть два способа: перейти по ссылке audio_data в течение часа либо скачать файл через эндпоинт с токеном — эта ссылка не истекает.

GET /download-song?job_id=<job_id>&format=mp3 Bearer
ПолеОбяз.ТипОписание
job_id Да String Идентификатор задачи.
format Нет String mp3 или wav — тот же формат, что запрашивали при создании. По умолчанию mp3.

Ограничения

Стоимость10 000 символов за песню
Одновременных задач1
Частота опросане чаще 1 раза в секунду
Длительность30 – 240 секунд
Текст песни10 – 2 500 символов
Срок действия audio_data1 час

Пример на Python

Python
import time
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# 1. Создаём задачу. Очереди на стороне сервиса нет: в работе только одна задача.
payload = {
    "preset_style": "__custom__",        # либо готовый пресет, например "Поп"
    "genre": "поп, данс-поп, яркие синты, бодрый хит, 115 bpm",
    "title": "Моя первая песня",         # 3–50 символов
    "text": "Один два три четыре пять\nШесть семь восемь девять десять",
    "vocals": "female",                  # random | female | male | none
    "time_period": "60",                 # секунды, 30–240
    "format_file": "mp3",                # mp3 | wav
}

resp = requests.post(f"{BASE}/create-song-job", headers=headers, data=payload)
resp.raise_for_status()
created = resp.json()
if created.get("status") == "error":
    raise SystemExit(created.get("message"))

job_id = created["job_id"]
print("Задача создана:", job_id)

# 2. Опрашиваем статус не чаще одного раза в секунду.
while True:
    time.sleep(1)

    ping = requests.get(f"{BASE}/ping-song-job", params={"job_id": job_id})
    ping.raise_for_status()
    data = ping.json()

    if data["status"] == "completed":
        print("Готово:", data["result"]["title"])
        break

    if data["status"] == "error":
        raise SystemExit(data.get("message"))

    print("Прогресс:", data.get("progress"))

# 3. Скачиваем файл через эндпоинт с токеном — эта ссылка не истекает,
#    в отличие от audio_data (она действует 1 час).
song = requests.get(
    f"{BASE}/download-song",
    headers=headers,
    params={"job_id": job_id, "format": "mp3"},
)
song.raise_for_status()

with open("song.mp3", "wb") as f:
    f.write(song.content)

print("Песня сохранена в song.mp3")

Генерация видео

Асинхронный сервис: ролик генерируется по текстовому описанию, по фото или по фото вместе с описанием. Создаём задачу, опрашиваем статус, скачиваем готовый MP4.

Создание задачи

POST /create-video-job Bearer multipart/form-data
ПолеОбяз.ТипОписание
query Да String Описание сцены на русском, от 10 до 20 000 символов. Описание автоматически дорабатывается перед генерацией.
page Нет String Идентификатор подсервиса из списка ниже. От него зависит, сколько фото принимается и как обрабатывается кадр.
seconds Нет Integer Длительность ролика в секундах, от 4 до 12. По умолчанию 4.
resolution Нет String Формат кадра, по умолчанию 16x9. Значение auto подбирает формат по пропорциям первого фото.
images Нет File[] Фото для первого кадра. Максимум зависит от подсервиса (1–3). Поле повторяется для каждого файла.
main Нет Integer Индекс основного фото, по умолчанию 0.
image_last Нет File Последний кадр — только для подсервиса video-mezhdu-dvumya-kadrami. Требует загруженного первого кадра.

Форматы кадра

resolutionРазрешениеОриентация
16x91344 × 768горизонтальное
3x21152 × 768горизонтальное
4x31024 × 768горизонтальное
9x7992 × 768горизонтальное
1x1768 × 768квадратное
7x9768 × 992вертикальное
3x4768 × 1024вертикальное
2x3768 × 1152вертикальное
9x16768 × 1344вертикальное
autoпо пропорциям фото

Ответ:

JSON
{
    "status": "completed",
    "message": "Подготовка к генерации",
    "job_id": "8ac2f1e0-3d54-4b8a-9e17-c05f2b6d4a93"
}

Получение результата

GET /ping-video-job?job_id=<job_id> Bearer

Пока идёт генерация — прогресс от 0 до 100:

JSON
{
    "status": "continue",
    "message": "Генерация видео",
    "progress": 42,
    "notice": {"type": "generating", "progress": 42, "label": "Генерация видео"}
}

По готовности:

JSON
{
    "status": "completed",
    "balance": "5 🎬",
    "result": {
        "job_id": "8ac2f1e0-3d54-4b8a-9e17-c05f2b6d4a93",
        "video_url": "/vid/8ac2f1e0-3d54-4b8a-9e17-c05f2b6d4a93.mp4",
        "seconds": 8,
        "width": 1344,
        "height": 768,
        "seed": 1837462913,
        "demo": false
    }
}
ПолеОписание
video_urlОтносительный путь к ролику — добавьте адрес сервиса, чтобы получить полную ссылку.
seconds, width, heightФактические параметры готового ролика.
seedЗерно генерации — по нему сцену можно воспроизвести повторно.
demotrue — укороченный демо-ролик, скачивание недоступно.

Скачивание ролика

GET /vid/<job_id>.mp4?download=1 Bearer

Требует Bearer-токен. Параметр download=1 отдаёт файл вложением; без него ролик отдаётся для просмотра. Поддерживается заголовок Range — можно скачивать файл частями.

Генерация занимает от одной до нескольких минут. Скачивание доступно при активной подписке; демо-ролики (demo: true) вернут HTTP 403 с notice.type = "paywall_demo". Готовый ролик хранится на сервере 4 суток.

Подсервисы

Значение параметра page. В колонке «Фото» — сколько изображений принимает подсервис.

Основные форматы

pageЧто делаетФото
tekst-v-videoВидео по текстовому описанию
foto-v-videoОживить фото1
video-po-foto-i-opisaniyuВидео по фото и описаниюдо 3
video-mezhdu-dvumya-kadramiПереход между двумя кадрами2 + image_last
video-so-zvukomВидео со звуком

Товар и продажи

pageЧто делаетФото
video-dlya-kartochki-wildberriesВидео для карточки Wildberriesдо 3
video-dlya-kartochki-ozonВидео для карточки Ozonдо 3
ozhivit-foto-tovaraОживить фото товарадо 3
ugc-reklama-s-ii-akteromUGC-реклама с ИИ-актёромдо 3
reklamnyy-rolik-dlya-biznesaРекламный ролик для бизнесадо 3

Оживление фото

pageЧто делаетФото
ozhivit-staroe-fotoОживить старое фото1
memorialnoe-videoМемориальное видео1
govoryashchee-fotoГоворящее фото1
poyushchee-i-tancuyushchee-fotoПоющее и танцующее фото1

Эффекты и тренды

pageЧто делаетФото
ai-obyatieИИ-объятие2
ai-poceluyИИ-поцелуй2
video-s-pitomcemВидео с питомцем1
kakim-budet-nash-rebenokКаким будет наш ребёнок2
kak-ya-budu-vyglyadet-v-starostiКак я буду выглядеть в старости1
sovmestnoe-video-iz-dvuh-fotoСовместное видео из двух фото2
video-so-znamenitostyuВидео со знаменитостью2
figurka-i-kukla-iz-fotoФигурка или кукла из фото1
omolodit-fotoОмолодить фото1
sebya-v-stile-videoigryСебя в стиле видеоигры1
prevrashchenie-v-supergeroyaПревращение в супергероя1
kak-ya-budu-vyglyadet-esli-pohudeyuКак я буду выглядеть, если похудею1

Анимация

pageЧто делаетФото
anime-video-iz-fotoАниме-видео из фото1
ozhivit-risunokОживить рисунок1

Аватары и бизнес-видео

pageЧто делаетФото
ii-diktor-v-kadreИИ-диктор в кадре
cifrovoy-dvoynik-iz-fotoЦифровой двойник из фото1
video-vizitkaВидеовизитка1

Поздравления и события

pageЧто делаетФото
videopozdravlenie-s-dnem-rozhdeniyaПоздравление с днём рождения1
videopozdravlenie-s-novym-godomПоздравление с Новым годом1
videopozdravlenie-s-8-martaПоздравление с 8 Марта1
videopozdravlenie-s-23-fevralyaПоздравление с 23 Февраля1
svadebnoe-video-i-priglashenieСвадебное видео и приглашение2
video-na-yubileyВидео на юбилей1
video-na-godovshchinuВидео на годовщину2
video-na-vypusknoyВидео на выпускной1
videootkrytkaВидеооткрытка1

Видео для соцсетей

pageЧто делаетФото
video-dlya-reels-shorts-tiktokВидео для Reels, Shorts и TikTokдо 3

Требования к фото

Размер файладо 15 МБ
Разрешениедо 10000 × 10000 px
ФорматыJPEG, PNG, WEBP, GIF, BMP, TIFF, HEIC/HEIF

Ограничения

Стоимость10 000 символов за ролик
Одновременных задач1
Частота опросане чаще 1 раза в секунду
Длительность4 – 12 секунд
Описание сцены10 – 20 000 символов
Хранение ролика4 суток

Описание и загруженные фото проходят проверку контента до начала генерации. При отклонении приходит notice.type = "moderation", баланс не списывается.

Пример на Python

Python
import time
import requests

TOKEN = "ВАШ_API_ТОКЕН"
BASE = "https://robotext.io"
headers = {"Authorization": f"Bearer {TOKEN}"}

# 1. Создаём задачу. Очереди на стороне сервиса нет: в работе только одна задача,
#    новый запрос до её завершения будет отклонён.
data = {
    "page": "foto-v-video",
    "query": "Камера медленно приближается, лёгкий ветер колышет листву",
    "seconds": "8",              # 4–12
    "resolution": "16x9",        # либо auto — по пропорциям фото
}

with open("photo.jpg", "rb") as f:
    resp = requests.post(
        f"{BASE}/create-video-job",
        headers=headers,
        files=[("images", f)],   # для генерации по одному тексту фото можно не передавать
        data=data,
    )

resp.raise_for_status()
created = resp.json()
if created.get("status") == "error":
    raise SystemExit(created.get("message"))

job_id = created["job_id"]
print("Задача создана:", job_id)

# 2. Опрашиваем статус не чаще одного раза в секунду.
#    Генерация занимает от одной до нескольких минут.
while True:
    time.sleep(1)

    ping = requests.get(
        f"{BASE}/ping-video-job",
        headers=headers,
        params={"job_id": job_id},
    )
    ping.raise_for_status()
    status = ping.json()

    if status["status"] == "completed":
        result = status["result"]
        print("Готово:", result["width"], "x", result["height"], result["seconds"], "сек")
        break

    if status["status"] == "error":
        raise SystemExit(status.get("message"))

    print("Прогресс:", status.get("progress"), status.get("message"))

# 3. Скачиваем ролик — обязательно с токеном.
video = requests.get(
    f"{BASE}{result['video_url']}",
    headers=headers,
    params={"download": "1"},
    stream=True,
)
video.raise_for_status()

with open("video.mp4", "wb") as f:
    for chunk in video.iter_content(chunk_size=256 * 1024):
        f.write(chunk)

print("Видео сохранено в video.mp4")
31 августа 2026
Документация API теперь на сайте

Актуальная документация по API опубликована прямо на этой странице — во вкладке «Документация». Присылать её файлом по запросу больше не нужно: страница всегда соответствует текущей версии сервиса.

Что появилось в документации впервые:

  • Анализ фото (OCR) — распознавание и анализ изображений, 16 подсервисов;
  • Редактирование фото — 41 инструмент, включая удаление фона и увеличение разрешения;
  • Генерация видео — ролики по тексту и фото, 41 подсервис.

Также в каждом разделе теперь есть готовый пример на Python, полные списки допустимых значений параметров и точные форматы ответов.

31 августа 2026
Метод /balance показывает остаток по всем сервисам

Раньше GET /balance отдавал только символы и изображения. Теперь в ответе есть остаток по каждому сервису: balance_ocr, balance_imgedit, balance_presentation, balance_song, balance_video.

Прежние поля balance_text и balance_image сохранены — менять существующий код не нужно.

Готовы подключиться?
Документация и файлы для нейросетей открыты всем. Чтобы отправить первый запрос, нужен токен — он выдаётся сразу после активации PRO вместе с балансом на все сервисы.