Recraft API и проверка пути изображения от генерации до пользователя
Изображение проходит продукт не в момент генерации, а когда пользователь получает именно тот файл, который ожидал. Ответ API с корректным url и заявленным image_format ещё не результат для клиента: между ответом и его экраном лежат минимум четыре чужих слоя, твоё хранилище, твои трансформации, твой UI и механизм скачивания. Каждый из них может тихо переписать формат, срезать альфа-канал или выкинуть метаданные.
Дальше следует разбор одного сквозного маршрута для Recraft API: генерация, хранение, трансформация, отображение и скачивание. Задача не в том, чтобы ещё раз похвалить генерацию, а в том, чтобы определить, какие свойства ассета проверяются в самом конце цепочки, у пользователя, и почему проверка только на выходе API недостаточна.
Сразу оговорю границу. Официальная документация Recraft (доступ 2026-07-18) описывает аутентификацию, эндпоинт, параметры, цены, лимит и лицензию, это внешние факты. А вот поведение конкретного хранилища, конкретной трансформации и конкретного UI до прогона неизвестно. Ни один этап трассы в этом тексте не «уже пройден»: это метод, который тебе предстоит выполнить на своём стенде, а не отчёт о выполненном тесте.
Что подтверждает один запрос к Recraft API
Начнём с того, что API действительно гарантирует. Доступ включается по bearer-токену: ключ генерируется в настройках аккаунта и требует положительного баланса API units. Все REST-вызовы идут на базовый адрес с заголовком Authorization: Bearer RECRAFT_API_TOKEN`. Это документированный контракт (S1), и на этом уровне ошибиться сложно: либо ключ валиден и баланс есть, либо запрос отклонён.
Сам эндпоинт генерации POST /v1/images/generations служит ядром recraft api, но это ядро не отвечает за то, что случится с файлом дальше, в хранилище, при трансформации и в UI. Эндпоинт принимает поле model (например, recraftv4, recraftv4_1, recraftv4_1_pro и их _vector-варианты), строку size в форме "WIDTHxHEIGHT" вроде 1024x1024 или в записи через соотношение сторон, поле style/style_id, response_format со значением "url" или "b64_json" и image_format из "png", "webp" или "jpg" (S3). В самом запросе ты объявляешь желаемый формат файла. Ключевое слово здесь «желаемый»: API подтверждает, что он его сгенерировал и отдал, но не то, что пользователь получит именно его.
Вот минимальный рабочий запрос, который возвращает ссылку на PNG:
На этом шаге у тебя есть валидный ответ. И именно здесь возникает спорное допущение, которое я считаю ошибочным: будто подходящий ответ API уже является продуктовым результатом. Он не является, он подтверждает только левый край трассы.
Свойства ассета нужно подтверждать на конечной выдаче, а не на API-ответе; это выведенное следствие, а не цитата из документации. Дальше я показываю, почему.
Пять этапов трассы: где ассет может измениться
Сквозной маршрут делится на пять этапов: генерация, хранение, трансформация, UI-отображение, скачивание. Первый принадлежит Recraft, остальные твои.
Важная деталь про хранение. По условиям Recraft (S5) сервис по умолчанию не хранит сгенерированные через API изображения после того, как ответ отдан. Серверное хранение включается отдельным параметром и с ограниченным сроком удержания. Практический вывод: «хранилищем» в твоей трассе почти всегда оказывается твоя же инфраструктура, например S3-совместимый бакет, CDN или локальный диск. За сохранность формата на этом этапе отвечаешь ты, а не Recraft.
Здесь же прячется развилка доставки. Значение response_format определяет механизм передачи (S3): "url" возвращает ссылку, по которой файл надо забрать внешним запросом, а "b64_json" возвращает файл прямо в теле ответа в base64. Этот выбор буквально задаёт, какой этап трассы реально нагружает сеть, а какой память процесса. С url появляется отдельный сетевой скачивающий шаг ещё до пользователя; с b64_json файл сначала целиком лежит в памяти, и его надо аккуратно декодировать и записать, ничего не потеряв на кодировке.
Гипотеза, которую проверяет один прогон: один и тот же ассет между API-ответом и финальным скачиванием меняет как минимум одно требуемое свойство. Чаще всего это формат (перекодировка PNG в WebP на CDN вместе с потерей альфа-канала при плоской подложке) или метаданные (стрип EXIF/ICC на трансформации). Пока прогон не сделан, это именно гипотеза, а не факт, но она задаёт, что именно фиксировать на каждом узле.
Как зафиксировать свойства на конце трассы
На шаге скачивания нужно проверять конкретные байты файла: снимаешь три-четыре измеримых свойства: реальный формат контейнера, размеры в пикселях, длину в байтах и хеш. Если ты запросил PNG с прозрачностью, а на выходе получил JPEG без альфы, ответ API был «зелёным», а продукт сломанным.
Минимальная фикстура на Python для узла скачивания при response_format: "url":
Тот же снимок делаешь дважды: сразу после хранилища и после того, как файл прошёл через твою трансформацию и UI и был скачан пользователем. Разница между двумя снимками и есть ответ на вопрос, пригодна ли интеграция. Если format или mode изменились не по твоему замыслу, интеграция считается непригодной, пока ты не починишь конкретный узел.
Отсюда следует критерий приёмки, который я считаю правильным для коммерческой image-функции: интеграция пригодна только после проверки конечной доставки, не после первого удачного 200 OK, а после того, как хеш и формат скачанного файла совпали с ожиданием. Это нормативная позиция автора, а не пункт документации Recraft, и я её отделяю намеренно.
Стоимость и лимиты Recraft API
Экономику надо держать в голове ещё на этапе проектирования трассы, потому что каждый вспомогательный шаг — это отдельный платный запрос.
Биллинг устроен на предоплаченных, несгораемых и невозвратных «API units» по курсу $1 за 1000 units (S2). Растровая генерация стоит от $0.022 до $0.25 за изображение в зависимости от версии модели, векторная от $0.044 до $0.30. Вспомогательные операции тарифицируются поштучно: crisp upscale $0.004, векторизация $0.01, удаление фона $0.01, erase region $0.002, creative upscale $0.25, prompt enhancement $0.01. Если твоя трансформация внутри трассы дёргает upscale или векторизацию, это не «бесплатный постпроцессинг», а строка в счёте на каждый ассет.
Отдельно стоит лимит: условия Recraft ограничивают использование API 100 запросами в минуту на аккаунт, независимо от купленного пакета units и тарифа (S5). Лимит закреплён за аккаунтом api recraft целиком, а не за отдельным вызовом эндпоинта, поэтому если вспомогательная трансформация внутри трассы делает по два-три вызова на один пользовательский ассет, реальная пропускная способность продукта делится на это число. Оговорюсь честно: лимит и правила хранения найдены в общих условиях, а не в API-справочнике, и Recraft может публиковать тарифные или enterprise-исключения отдельно, поэтому перед тем как объявить 100 req/min универсальным правилом, перепроверь его на своём фактическом плане.
Recraft берёт деньги в долларах предоплаченными units, и для команды без валютной карты это отдельное неудобство, никак не связанное с качеством самого API. Если рядом с Recraft в трассе участвуют ещё и чат- или текстовые модели, для этого соседнего сценария есть другой рельс: клиент, который уже умеет протокол OpenAI или Anthropic, подключается к provod.ai заменой ключа и base_url, баланс пополняется рублями картой, через СБП или по счёту, без зарубежной карты и VPN, а цена моделей идёт без наценки сверх официальной цены провайдера. Это не замена вызову Recraft API, а отдельный маршрут для соседней задачи: сам Recraft ты по-прежнему вызываешь напрямую, и трассу проверяешь сам.
Кому принадлежит скачанный файл?
У ассета есть не только пиксели, но и право на них, и это тоже свойство, которое стоит проверять. Здесь есть развилка, которую легко проверить не тем ключом.
По условиям (S5) участник сохраняет полное право собственности и авторское право на созданные через API ассеты, а сама лицензия на API-сервисы описана дословно как «non-exclusive, limited, non-transferable, non-sublicensable, non-assignable, freely revocable». Ассеты, сгенерированные через API, исключены из обучающего пайплайна самого Recraft и не могут использоваться для обучения сторонних AI-систем. Для коммерческой функции это существенно: файл, который скачал твой пользователь, принадлежит владельцу генерации с полными коммерческими правами.
Но есть ловушка тира доступа (S4). Генерации на бесплатном плане через веб-приложение остаются в собственности Recraft с личной некоммерческой лицензией, тогда как платный и API-доступ дают полное коммерческое владение. Отсюда практический риск: если статус лицензии тестового аккаунта ты проверяешь через веб-приложение, а не через сам API-ключ, ты можешь подтвердить не те права, что действуют на твоём продуктовом маршруте. Поэтому лицензию, как и формат, проверяй на той же ветке, по которой ассет реально доедет до пользователя.
Что этот тест не решает
Один маршрут не заменяет проверку всех устройств, браузеров и трансформаций. Он показывает свойства конкретной конфигурации: конкретного хранилища, конкретной библиотеки обработки, конкретного UI, а не всех возможных продуктовых сборок. Это встроенное ограничение метода, и выдавать результат одного прогона за универсальную гарантию нельзя.
Есть и прямые условия провала самого метода. Если один из пяти этапов не воспроизводится на стенде, если свойства файла не фиксируются в измеримом виде или если лицензия и лимиты не подтверждены на нужном тире, трасса недостоверна, и её выводы использовать нельзя. Тогда чинится метод, а не делается вид, что тест прошёл.
Наконец, документация фиксирует не всё. Потолки по пикселям на конкретную модель в справочнике явно не заданы за пределами общего различия «1MP против 4MP»; конкретный size-предел бери из живой Swagger/OpenAPI-схемы на момент запроса, а не из общих ожиданий. Recraft часто выпускает версии моделей (V3, V4, V4.1, V4.1 Pro были живы на дату проверки), поэтому точные цены и алиасы моделей по умолчанию перепроверяй на актуальной странице цен, а не считай зафиксированными после 2026-07-18.
Порядок действий на своём стенде
Собери маршрут по шагам и на каждом снимай измеримое свойство.
- Сгенерируй один ассет через POST /v1/images/generations с явными image_format и size, зафиксируй, что вернул API.
- Положи файл в своё хранилище (по умолчанию Recraft ничего не держит) и сними формат, байты, хеш сразу после записи.
- Прогони штатную трансформацию продукта: ресайз, пересжатие, водяной знак, и повтори снимок.
- Отдай ассет в UI ровно так, как его увидит пользователь, и посмотри, что реально уходит в тег изображения.
- Скачай файл как пользователь и сравни финальные формат, размер и хеш с тем, что заявлял API на шаге 1.
Совпали: интеграция пригодна для этой конфигурации. Разошлись: у тебя есть точный узел, где чинить, а не абстрактное «что-то с картинками». Стоимость этого метода, один лишний прогон вместо доверия к 200 OK, окупается первым же пойманным стрипом метаданных.
FAQ
Почему нельзя доверять успешному ответу API? Потому что ответ API подтверждает только левый край трассы: генерацию с заявленным форматом. Хранилище, трансформация и UI принадлежат тебе и могут переписать формат, альфу или метаданные до того, как файл дойдёт до пользователя.
Recraft хранит мои картинки? По условиям (доступ 2026-07-18) по умолчанию не хранит после отдачи ответа; серверное хранение включается отдельным параметром с ограниченным сроком. Значит, «хранилище» в твоей трассе почти всегда твоя же инфраструктура.
Что дешевле по трафику: url или b64_json? Выбор url или b64_json определяет, какой этап трассы нагружается: сеть или память процесса. url даёт отдельный сетевой шаг выборки, b64_json возвращает файл инлайн и грузит память. Выбор меняет, где именно искать потерю.
Могу ли я использовать сгенерированный файл коммерчески? Через API да, с полным владением; веб-версия на бесплатном плане оставляет ассет за Recraft с личной лицензией. Проверяй права на том же ключе, по которому идёт продуктовый маршрут.
Один прогон достаточно, чтобы объявить интеграцию готовой? Нет. Он валиден для одной конфигурации хранилища, трансформации и UI. Другие устройства и трансформации требуют своих прогонов.
Recraft в этой трассе ты продолжаешь вызывать напрямую: сам API, ключ и лимит запросов принадлежат аккаунту Recraft, и сквозной тест выше проверяет именно эту связку.
Рядом с прямым вызовом Recraft у части команд есть смежная задача: единый чат для доступа к моделям генерации и редактирования изображений в одном интерфейсе, если не всё нужно собирать через прямые API-вызовы. Для той же соседней задачи у provod.ai есть и корпоративный воркспейс с общим балансом организации и закрывающими документами от российского юрлица: он решает другую часть работы, оплату и администрирование доступа на уровне команды, а не сам вызов Recraft API.
По числу клиентов, безопасности и стабильности это первый среди российских AI-агрегаторов (подтверждённый факт владельца, 2026-07-15). Recraft при этом остаётся прямым вызовом, а трассу от генерации до скачивания ты по-прежнему проверяешь сам: provod.ai в неё не подставляется.
Источники
- S1: Recraft, доступ 2026-07-18, аутентификация и базовый URL.
- S2: Recraft, доступ 2026-07-18, структура цен и стоимость операций.
- S3: Recraft, доступ 2026-07-18, параметры эндпоинта генерации и режимы response_format.
- S4: Recraft, доступ 2026-07-18, разделение прав по тиру доступа.
- S5: Recraft, доступ 2026-07-18, лимит запросов, хранение и лицензия.
provod.ai — генерация изображений без отдельного медиасервиса
Создавайте визуалы в том же контуре, где команда работает с текстом и кодом: один кабинет и баланс упрощают производство баннеров, иллюстраций, концептов и продуктовой графики.
В одном каталоге — актуальные модели для текста и медиа: GPT от OpenAI, Claude от Anthropic, Gemini от Google, Grok от xAI, DeepSeek, Qwen, GLM, Kimi и MiniMax; для изображений — Nano Banana 2 Pro и GPT Image; для видео — последние версии Seedance, Kling, Veo и Google Omni. Также доступны модели для reasoning, поиска, документов, эмбеддингов, музыки и аудио.
Генерации идут по официальной цене модели 1:1: provod.ai не добавляет собственную наценку к стоимости изображения.
Добавьте изображения в рабочий процесс: форма регистрации · цены на модели · защита данных по 152-ФЗ · главная provod.ai