Документация по SUPA Render API
Авторизация
Для того, чтобы выполнять запросы к нашему API, у вас должен быть API-ключ, который вы можете запросить здесь.
- Для авторизации вы должны добавлять API-ключ к каждому запросу в заголовке Authorization, следующим образом:
Authorization: Bearer YOUR_API_KEY
Подготовка шаблона
Создание видео, изображений и PDF-файлов происходит на основе креатива-шаблона. Креативом-шаблоном может быть любой креатив, созданный в вашем аккаунте. Вам достаточно знать id креатива (design_id), чтобы использовать его как шаблон для рендера через API.
Для того, чтобы сделать изменяемыми те или иные объекты (например, тексты или изображения) внутри креатива-шаблона вам нужно проставить им названия с помощью показанного на изображении ниже инструмента, в настройках объекта. Заданные названия нужно использовать при рендере в объекте objects_overrides вместо <object_name>.


Запрос на рендер
Создание изображений и видео может занимать продолжительное время, поэтому выполняется в два этапа. Первым этапом выполняется запрос на рендер, а вторым этапом периодически запрашивается статус готовности до тех пор, пока рендер не завершится. Когда рендер завершился, в ответе на запрос о статусе готовности, вы получите url сгенерированного видео, изображения или pdf-файла.
Чтобы избежать множественных запросов на получение статуса, вы также можете использовать вебхуки, чтобы подписаться обновления статуса рендеринга. Для этого, при запросе на рендеринг, укажите webhook_url с адресом вашего скрипта. Более подробно про механизм работы вебхуков читайте ниже.
Отправляем запрос на render
POST https://api.supa.ru/public/v2/render
{
"design_id": YOUR_VIDEO_OR_IMAGE_ID, // ID креатива-шаблона
"format": "jpg", // png / pdf / mp4
"webhook_url": "https://...", // URL куда будет отправляться информация о статусе (POST)
"objects_overrides": {
...
"<object_name>": { // название первого объекта (текстовый элемент)
"text": "Новый текст взамен старого", // Заменяем текст в ролике
},
"<object2_name>": { // название второго объекта (изображение)
"path": "https://...", // Заменяем изображение
}
...
},
}
Параметры и их описания:
| Название | Обязательный | Значения | Описание |
|---|---|---|---|
| design_id | да | ID креатива | ID креатива-шаблона, принадлежащего вашему аккаунту |
| format | да | jpg, png, pdf - для изображений; mp4 - для видео | Желаемый формат итогового файла |
| webhook_url | нет | URL вашего скрипта | Скрипт, куда будут отправляться уведомления (вебхуки) об изменении статуса |
| objects_overrides | да | JSON-объект со списком изменяемых элементов в дизайне и их новой конфигурации | Замены значений и настроек объектов, в рамках данного рендеринга |
| quality | нет | от 1 до 100 | Качество JPEG. Применимо только для format=jpeg |
| transparent | нет | true или false | Сделать прозрачный фон. Применимо только для format=png |
| slides | нет | массив, состоящий из названий слайдов, заданных здесь | Укажите, если вы хотите скачать только конкретные слайды из дизайна |
Ответ в случае успеха
При отправке запроса на рендеринг, задание с идентификатором task_id ставится в очередь. Далее вы можете отслеживать статус выполнения задания через status_url, который вы получите в ответ на ваш запрос к /render.
{
"task_id": 123456,
"status_url": "https://api.supa.ru/public/v2/tasks/123456"
}
Максимальное количество заданий в очереди определяется условиями вашего тарифного плана. Задания выполняются по порядку (принцип FIFO) и одновременно будет рендериться только один креатив (если иное не предусмотрено вашим тарифным планом).
Возможные ошибки
Запрос на рендер может вернуть ошибку в таком виде:
{
"error": "validation_error",
"description": "Field \"objects_overrides.myimage.text\" not found"
}
Полный список ошибок представлен ниже:
| Ошибка | Описание | HTTP-код |
|---|---|---|
| validation_error | Неправильный запрос | 400 |
| incorrect_api_key | Неправильный API ключ или ваш доступ к API приостановлен | 401 |
| design_not_exists | Креатива с указанным design_id не существует или он не принадлежит вашему аккаунту | 400 |
| incorrect_override_url | Некорректный URL для замены изображения передан в object_overrides. Проверьте, возможно файл удален по окончанию жизненного цикла и его нужно загрузить заново. | 400 |
| incompatible_format | Ошибка появляется, когда вы пытаетесь сгенерировать анимированный креатив в статичном формате (png, jpg, pdf) или наоборот, если вы генерируете статичный креатив в формате видео (mp4) | 400 |
| queue_is_full | Превышено количество заданий в очереди, разрешенное вашим тарифным планом | 429 |
| too_many_requests | Вы превысили общее максимальное количество запросов к API | 429 |
| server_error | Ошибка сервера. Скорее всего, возникли какие-то проблемы на стороне SUPA. Попробуйте позже или обратитесь в поддержку. | 5xx |
Получение результата рендера
После того как запрос на рендеринг отправлен, можно начинать опрашивать полученный url с информацией о статусе с нужной периодичностью. Пожалуйста, не запрашивайте один и тот же url статуса чаще, чем раз в 5 секунд — это может привести к автоматическому временному ограничению доступа к API. Чтобы не опрашивать статус каждые несколько секунд, вы можете подписаться на вебхук при отправке запроса на рендеринг.
GET https://api.supa.ru/public/v2/tasks/123456
Получаем ответ
{
"id": 123456,
"state": "done" // queued, pending, error
"design_id": 23452234,
"result_url": "https://..." // только в случае, если статус "done"
}
Если ваш запрос сформирован неверно или имеет место сбой API, то вы можете получить следующий ответ:
{
"error": "task_not_found",
"description": "Task #123456 not found"
}
| Ошибка | Описание | HTTP-код |
|---|---|---|
| task_not_found | Не найден номер задачи | 404 |
| too_many_requests | Вы превысили количество запросов к API | 429 |
| server_error | Ошибка сервера. Скорее всего, возникли какие-то проблемы на стороне SUPA. Попробуйте позже или обратитесь в поддержку. | 5xx |
Вебхуки
В случае изменения статуса на done или error, вебхук присылает данные методом POST, как в ответе, указанном выше. Вебхук отправляется один раз: если запрос не удался, то вебхук не повторяется.
Схема работы с использованием вебхука может быть затруднена при локальной разработке, так как ваш скрипт не будет доступен из внешнего интернета. Чтобы решить эту проблему, вы можете использовать выделенный ip-адрес для вашей машины или ПО для проброса локального порта в интернет, вроде ngrok.
Обработка ошибок рендеринга
Вы можете получить статус со значением “error” — это значит, что произошла ошибка при рендеринге.
{
"id": 123456,
"state": "error",
"design_id": 23452234
}
При получении подобной ошибки повторите попытку генерации, а если это не поможет — обратитесь в поддержку.
Настройка текстов
Для того, чтобы заменить текст в креативе, вам необходимо передать новую текстовую строку в объекте objects_overrides при рендере. Также вы можете менять некоторые другие параметры:
...
"objects_overrides": {
"mytext": { // название объекта
"text": "Новый текст",
"text_align": "left",
}
}
...
Список параметров, доступных для изменения в текстовых элементах:
| Параметр | Значения | Описание |
|---|---|---|
| text | Текстовая строка | Новый текст, который заметит исходный |
| font_size | от 1 до 1000 | Размер шрифта. Работает только в случае config.text_replacement_strategy = “fixed-width”, так как в остальных случаях размер шрифта динамически меняется, в зависимости от содержимого |
| text_align | left / center / right / justify | Выравнивание текста внутри текстового поля |
| line_height | 0.5 - 1.7 | Высота строки |
| letter_spacing | от -100 до 100 | Межбуквенный интервал |
Стилизация текста
Для стилизации всего текста или его отдельных участков вы можете использовать сабстили, которые работают по принципу html-тегов, но выглядят немного по-другому. Например, чтобы поменять цвет у всего текста, сделать его жирным и подчеркнутым, вы можете использовать следующую конструкцию:
...
"objects_overrides": {
"mytext": {
"text": "<substyle bold=\"700\" color=\"#FF0000\" underline>Новый текст</substyle>"
}
}
...
А чтобы выделить отдельный участок другим цветом, вы можете использовать следующий код:
{
"text": "<substyle bold=\"400\" color=\"#ff0000\">Новый</substyle><substyle bold=\"400\" color=\"#000000\"> текст</substyle>"
}
Обратите внимание, что теги substyle не поддерживают вложенность, т.е. каждый участок текста должен быть обернут только в один сабстиль.
Далее представлен перечень всех возможных значений атрибутов substyle:
| Атрибут | Возможные значения |
|---|---|
| bold | 100 − 900 |
| color | Любой HEX-цвет |
| underline | нет значения, указывается только атрибут |
| strike | нет значения, указывается только атрибут |
| italic | нет значения, указывается только атрибут |
| link | см. раздел “Ссылка внутри текста” |
Ссылка внутри текста
Чтобы выделить ссылку внутри текста, используйте следующий код:
{
"text": "<substyle bold=\"400\" color=\"#000000\">Подробности смотрите </substyle><substyle bold=\"400\" color=\"#0061fe\" link=\"(url:https://supa.ru)\">здесь</substyle>"
}
Стратегии замены текста
Текст может заменяться с использованием разных стратегий, которые задаются в параметре config.text_replacement_strategy при отправке запроса на render, внутри настроек объекта.
| text_replacement_strategy | Описание поведения |
|---|---|
| fit (по умолчанию) | Если текст влезает в исходный текстовый блок, то изменение размера шрифта не происходит, а сам текстовый блок по умолчанию центрируется по вертикали в рамках высоты исходного текстового блока, ширина блока остается прежней. Если текст не влезает в исходный текстовый блок, то шрифт уменьшается до тех пор, пока текст не уместится. |
| fixed-width | Фиксированная ширина блока, при этом высота подстраивается под размер контента. Размер шрифта не изменяется, поэтому есть риск, что текст вылезет за пределы холста. |
Если стратегия замены текста не указана, то используется стратегия fit. Ниже приведен пример того, как задать другую стратегию:
...
"objects_overrides": {
"mytext": {
"text": "Новый текст",
"config": {
"text_replacement_strategy": "fixed-width",
}
}
}
...
В режиме fit, когда новый текст оказывается меньше области измененного текста, он выравнивается по вертикали, однако вы можете изменить это поведение следующим образом:
...
"objects_overrides": {
"mytext": {
"text": "Новый текст",
"config": {
"text_replacement_strategy": "fit",
"text_replacement_strategy_fit_valign": "top" // center / bottom
}
}
}
...
Настройка изображений
Для замены изображения при рендере укажите URL нового изображения, загруженного с помощью метода, указанного в разделе «Загрузка своих изображений».
В примере показана замена изображения с названием myimage:
...
"objects_overrides": {
"myimage": { // название объекта
"path": "https://...", // URL нового изображения
}
}
...
Загрузка своих изображений
Для того, чтобы заменить изображение в креативе-шаблоне, вам сначала нужно загрузить новое изображение на наш сервер. Внешние URLы на изображения использовать нельзя, вы можете использовать для замены только те изображения, которые загружены через метод, указанный ниже.
Хранилище временное: файлы хранятся 30 дней, после этого файлы будут удалены и использовать их при генерации креатива будет невозможно. Пожалуйста, учитывайте это при разработке.
POST https://api.supa.ru/public/v2/upload
Изображение отправляется как multipart/form-data в поле с названием file (cм. пример на CURL)
Пример загрузки изображения через CURL
curl -F "file=@test.jpg" -H "Authorization: Bearer <Ключ API>" https://api.supa.ru/public/v2/upload
Ответ после загрузки изображения
{
"result": "success",
"url": "https://..."
}
в случае ошибки ответ будет таким:
{
"result": "error",
"reason": "Описание ошибки"
}
Стратегии замены изображения
Изображение может заменяться тремя возможными способами, которые задаются в параметре config.media_replacement_strategy. Ниже показано поведение изображения при различных значениях этого параметра:

| media_replacement_strategy | Описание поведения |
|---|---|
| cover (по умолчанию) | Изображение заполняет всю область исходного изображения, сохраняя пропорции. Соответственно, часть изображения может оказаться за пределами области и будет скрыта. |
| contain | Изображение вписывается в рамки исходного изображения так, чтобы всё изображение было видно полностью |
| fill | Изображение растягивается на всю область изображения, не сохраняя пропорции. Мы видим всё изображение, но оно может быть искажено из-за несоответствия соотношения сторон исходного и нового изображений. |
Если стратегия замены текста не указана, то используется стратегия cover. Ниже приведен пример того, как задать другую стратегию:
...
"objects_overrides": {
"myimage": {
"path": "https://...", // URL нового изображения
"config": {
"media_replacement_strategy": "contain"
}
}
}
...
Настройка фигур
Вы можете программно заменять заливку и границу фигуры: давайте рассмотрим возможные варианты.
Замена заливки фигуры на изображение
Вы можете также изменить заливку фигуры на изображение, загруженное через API. Для этого сформируйте object_overrides следующим образом:
...
"objects_overrides": {
"myshape": {
"background": {
"type": "image",
"path": "https://..." // URL нового изображения
}
}
}
...
Система возьмёт центральную часть изображения, а остальная часть изображения будет скрыта, если соотношение сторон фигуры не совпадает с соотношением сторон изображения.
Замена заливки фигуры на сплошной цвет
...
"objects_overrides": {
"myshape": {
"background": {
"type": "color",
"color": "#ff0000" // Цвет в hex
}
}
}
...
Замена границы фигуры
...
"objects_overrides": {
"myshape": {
"border": {
"width": 5,
"color": "#ff0000" // Цвет в hex
"style": "solid" // или dashed
}
}
}
...
Настройка диаграмм
Если в вашем креативе есть график или диаграмма, то вы можете программно менять ее значения. В параметре chart_data вы передаёте весь набор данных для диаграммы, в том же виде, как если бы вы заполняли таблицу значений в настройках объекта. Обратите внимание, что первое значение первой строки должно быть null.

...
"objects_overrides": {
"mychart": {
"chart_data": [
[null, "Столбец 1", "Столбец 2", "Столбец 3"]
["Элемент 1", 3, 6, 3],
["Элемент 2", 5, 10, 6],
["Элемент 3", 4, 8, 5]
]
}
}
...
Настройка мокапов
Мокапы состоят из слоев, поэтому для замены изображения на мокапе или замены цвета в элементах мокапа, вам нужно указать ID слоя, который показан на изображении ниже.
Пример настройки слоев мокапа:

...
"objects_overrides": {
"mymockup": {
"mockup_data": {
"<layer_id>": {
"image_url": "https://..." // id слоя мокапа с изображением
},
"<layer_id>": {
"color": "#ff0000" // id слоя мокапа с настройкой цвета
},
"<layer_id>": {
"hidden": true // скрыть слой
}
}
}
}
...
Полный список возможных параметров для слоя мокапа:
| Параметр | Значения | Описание |
|---|---|---|
| image_url | URL изображения, загруженного через API | Ссылка на изображение, которые мы ставим вместо плейсхолдера. Только для слоев с заменяемым изображением. |
| scale | от 0 до 3,5; 1 - это оригинальный размер | Увеличение изображения. Только для слоев с заменяемым изображением. |
| rotate | от -180 до 180 | Поворот изображения. Только для слоев с заменяемым изображением. |
| offsetX | от -100 до 100 | Сдвиг изображения в процентах по оси X. Только для слоев с заменяемым изображением. |
| offsetY | от -100 до 100 | Сдвиг изображения в процентах по оси Y. Только для слоев с заменяемым изображением. |
| color | Цвет в формате HEX | Цвет слоя. Только для слоев с заменяемым цветом. |
| hidden | true / false | Скрыть слой мокапа |
Общие параметры
Есть параметры, которые применимы к объектам вне зависимости от их типа. В основном, они касаются местоположения, размера и других общих свойств:
...
"objects_overrides": {
"anyobjectname": {
"x": 34,
"y": 234,
"width": 325
}
}
...
Полный список параметров:
| Параметр | Значения | Описание |
|---|---|---|
| x | от -10000 до 10000 | X-координата объекта |
| y | от -10000 до 10000 | Y-координата объекта |
| width | от 1 до 10000 | Ширина объекта |
| height | от 1 до 10000 | Высота объекта, игнорируется для текстов |
| opacity | от 0 до 100 | Прозрачность |
| reflect_x | true / false | Отразить объект по горизонтали |
| reflect_y | true / false | Отразить объект по вертикали |
| link | http://…, https://…, mailto:…, | Сделать объект ссылкой. Работает только для PDF-формата |
| hidden | true / false | Скрыть объект |
Ограничения API
-
Нельзя создавать видео длиннее 15 секунд
-
Скачивание в формате анимационного GIF пока недоступно
-
Максимальный размер загружаемых на сервер файлов - 10 мегабайт
-
Нет возможности загружать через API видеоролики на сервер для замены имеющихся видео на холсте
-
API доступно только для администратора аккаунта и недоступно для участников команды
-
Запрещено выполнять более 50 запросов к API в минуту (если иное не предусмотрено вашим тарифным планом)
Правила API
-
Если ваши конечные пользователи (клиенты) будут иметь доступ к инструменту созданному на основе SUPA Render API, то требуется дополнительное разрешение со стороны SUPA. При этом если возможностями SUPA Render API будете пользоваться исключительно вы или ваши сотрудники, а инструмент не будет доступен публично, то согласование не требуется. В случае нарушения данного правила, доступ к API может быть приостановлен.
-
Запрещено передавать / перепродавать доступ к API третьей стороне
-
Запрещено использовать функционал API, который не указан в данной документации
-
Запрещено предпринимать действия, направленных на подрыв сетевой безопасности, либо нарушения работы программно-технических средств сервиса SUPA
-
Запрещено использовать API в целях, нарушающих законы РФ
-
Запрещено загружать в API материалы, противоречащие законам РФ