Содержание(12)
Что изменилось в этом обновлении
- Обновлён раздел API: бесплатные изображения API теперь содержат водяной знак Roomagen до покупки пакета, и каждый инструмент задокументирован
- Добавлен список предупреждений с указанием параметров, которые игнорируются конкретным инструментом
Предыдущие обновления(1)
- Все примеры кода приведены в точное соответствие с актуальным API Roomagen: параметры в camelCase (такие как roomType), UUID идентификаторы задач, заголовок Idempotency-Key и подпись вебхука v1=, вычисляемая по метке времени и необработанному телу запроса
- Обновлена информация о доступе и ценах: самостоятельный выпуск ключей с 30 августа 2026 года вместо листа ожидания, единоразовые 50 бесплатных изображений для первого ключа, бессрочные пакеты и шесть задокументированных инструментов вместо 40+
- Раздел о раскрытии информации переписан с учётом требований AB 723 об обязательном заявлении и ссылке на оригинал, калифорнийского закона AB 2025 для объявлений об аренде с января 2027 года, несовпадающих правил размещения пометки в MLS и статьи 50 EU AI Act
- Добавлены таблица кодов ошибок, ограничения частоты запросов, раздел об ограничениях API и чеклист перед запуском; удалены неподтверждённые данные об объёме рынка, а также заявления о бесплатных повторных генерациях и автоматических пометках раскрытия информации
- Скорректировано время выполнения задач до документированных 20–60 секунд, а интервал опроса — до 2–5 секунд, с указанием реальных замеров медианного времени API для стейджинга, перевода из дня в сумерки и конвертации планов этажей в 3D
Чтобы добавить виртуальный стейджинг в приложение, ваш бэкенд отправляет каждое фото комнаты в API виртуального стейджинга как асинхронную задачу, получает результат через подписанный вебхук или опрос статуса, а затем сохраняет его рядом с оригиналом вместе с данными для раскрытия информации.
AI виртуальный стейджинг — Обставьте пустые комнаты меньше чем за минуту
Виртуальный стейджинг пустых комнат с помощью AI, обычно меньше чем за минуту. 13 стилей дизайна, 15 типов комнат, готовые для объявлений фото для недвижимости, аренды и гостиничного бизнеса. 6 бесплатных кредитов, без кредитной карты.
Добавление виртуального стейджинга в приложение сводится к одному циклу: ваш бэкенд отправляет фотографию комнаты в API виртуального стейджинга в виде задачи (job), поставщик рендерит её в фоновом режиме, а ваше приложение забирает результат, сохраняет его рядом с оригиналом и отображает с тем раскрытием информации, которого требует площадка назначения. В этом руководстве мы построим такой цикл на базе Roomagen API с примерами кода на cURL, Node.js и Python, сохранив архитектуру переносимой на решения других поставщиков.
Интеграция в двух словах
- Отправляйте каждую фотографию со своего сервера как задачу:
POST /v1/jobsс заголовкомIdempotency-Key. - Сохраняйте возвращенный
job_id, прежде чем выполнять любые другие действия. - Получайте завершенную задачу через подписанный вебхук и устраняйте пропуски с помощью
GET /v1/jobs/{id}. - Повторно размещайте результат в своем хранилище, храните оригинал рядом с ним и передавайте данные для раскрытия информации в каждый канал экспорта.
Что вы создаете: архитектура функции стейджинга
К концу этого руководства ваше приложение будет принимать фотографию комнаты и показывать меблированную версию той же комнаты — обычно через 20–60 секунд, согласно документации Roomagen. Все остальное здесь служит для того, чтобы сделать этот цикл надежным при производственных нагрузках. Этот же цикл подходит для порталов объявлений, платформ доставки фотографий, программного обеспечения для управления недвижимостью при рекламе свободных объектов, приложений для дизайна интерьера при презентации концепции прямо в комнате клиента и мебельных ритейлеров, демонстрирующих комнату, оформленную в выбранном стиле.
Рендеринг занимает десятки секунд, что слишком долго для открытого HTTP-запроса, поэтому архитектура сделана асинхронной: отправьте задачу, немедленно получите идентификатор задачи, заберите результат позже. Стейджинг выполняет многоэтапный конвейер (анализ сцены, затем промпт, затем генерация), поэтому он работает медленнее таких инструментов, как Редактирование & Конвертация Фото из Дня в Сумерки: по производственным данным Roomagen за 30 дней до 1 октября 2026 года медианная задача стейджинга через API занимала около 45 секунд, тогда как для инструментов день в сумерки и План этажа в 3D — около 25 секунд.
| Этап | Где выполняется | Что важно сделать правильно |
|---|---|---|
| Отправка задачи | Ваш бэкенд → POST /v1/jobs |
Ключ остается на стороне сервера; Idempotency-Key; сохранение job_id |
| Рендеринг | Roomagen | Обычно 20–60 секунд; стейджинг всегда рендерится в 2K |
| Получение уведомления о завершении | Вебхук (push) плюс опрос (pull) | Проверка подписи; дедупликация по job_id |
| Сохранение и отображение | Ваше хранилище и UI | Повторное размещение результата у себя; сохранение оригинала; раскрытие информации |
Roomagen — это платформа AI-редактирования фотографий и виртуального стейджинга с более чем 40 инструментами в веб-приложении; в API за единым эндпоинтом задач задокументирован каждый поддерживаемый инструмент (65 по состоянию на октябрь 2026 года). Инструменты для работы с изображениями функционируют на базе визуальных моделей Gemini от Google, а API добавляет конвейер стейджинга, управление задачами, автоматический возврат средств за неудачные рендеры и подписанные вебхуки.
Перед началом работы: ключи, окружения и требования к изображениям
Получение ключа. API Roomagen работает в режиме самообслуживания с момента публичного запуска 30 августа 2026 года; списков ожидания нет. Войдите в портал для разработчиков с учетной записью Roomagen, подтвердите адрес электронной почты и создайте ключ, как описано в кратком руководстве по API. Ваш первый ключ дает 50 бесплатных изображений (один раз на аккаунт), чего достаточно для создания и тестирования всего, что описано в этом руководстве. Пока для аккаунта не приобретен пакет, каждый рендер содержит водяной знак Roomagen, поэтому используйте их для разработки и тестирования, а не для публикации.
Ключи представляют собой префикс rmg_live_ плюс 64 шестнадцатеричных символа, передаются в заголовке X-Api-Key, и портал показывает каждый ключ только один раз. Храните его в секретном хранилище на стороне сервера; никогда не встраивайте его в браузерный JavaScript или мобильное приложение, где любой желающий сможет извлечь его и потратить ваш баланс.
Окружения. В одном аккаунте может быть до 10 активных ключей, поэтому создавайте по одному на каждое окружение и отзывайте любой из них, не затрагивая другой. Тестового режима нет: каждый ключ является боевым (live), а ключи аккаунта делят единый баланс изображений, один вебхук портала и один секрет подписи, поэтому для задач разработки указывайте собственный webhook_url для конкретной задачи. Кнопка ротации отсутствует намеренно: создайте новый ключ, разверните его и затем отзовите старый.
Требования к входным изображениям.
| Требование | Roomagen API |
|---|---|
| Форматы и размер | JPEG, PNG или WebP, до 20 МБ; строго один из параметров: image_url или image_base64 |
image_url (предпочтительно) |
Публичный URL-адрес https, загружаемый во время обработки вашего POST-запроса: таймаут 10 секунд, до 3 перенаправлений, приватные хосты отклоняются |
image_base64 |
Необязательный префикс data-URI; тело запроса может достигать 30 МБ, но только при наличии заголовка X-Api-Key (без него — 1 МБ) |
Отдавайте предпочтение image_url: запросы остаются компактными, вы избегаете 33%-ного оверхеда base64, а поскольку загрузка происходит во время выполнения вашего POST-запроса, подписанный URL должен быть действителен только на время этого запроса. Отправляйте полноразмерный исходник, по одной комнате на кадр, снятый прямо и с приемлемым освещением; модель может сохранить только те детали, которые способна различить.
Проверка баланса в коде. GET /v1/account возвращает image_credits — количество изображений, которое вы еще можете сгенерировать на текущем балансе. Настройте оповещение о низком балансе сразу: если баланс не покрывает задачу, POST /v1/jobs вернет 402 insufficient_credits, и задача создана не будет.
Шаг 1: Отправка задачи стейджинга
Один POST-запрос создает задачу: инструмент, изображение, параметры и, при необходимости, webhook_url для конкретной задачи (без него Roomagen использует вебхук аккаунта, сохраненный в портале, либо вам придется опрашивать статус вручную).
curl -X POST https://api.roomagen.com/api/v1/jobs \
-H "X-Api-Key: $ROOMAGEN_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: photo-4821-3-stage" \
-d '{
"tool": "virtual-staging",
"image_url": "https://cdn.example.com/rooms/4821-3.jpg",
"options": { "style": "scandinavian", "roomType": "living-room", "mode": "empty-room" },
"webhook_url": "https://app.example.com/hooks/roomagen"
}'
Ответ приходит со статусом 201 еще до завершения рендеринга:
{ "job_id": "3f1c9d4e-5b2a-4c8e-9f10-7d6a2b3c4e5f", "status": "processing", "images_charged": 1 }
Тот же вызов из бэкенда на Node.js 18+:
async function submitStagingJob(photo) {
const res = await fetch("https://api.roomagen.com/api/v1/jobs", {
method: "POST",
headers: {
"X-Api-Key": process.env.ROOMAGEN_API_KEY,
"Content-Type": "application/json",
"Idempotency-Key": `photo-${photo.id}-stage`, // формируется на основе вашей записи, никогда не случайно
},
body: JSON.stringify({
tool: "virtual-staging",
image_url: photo.signedUrl,
options: { style: photo.style, roomType: photo.roomType, mode: "empty-room" },
webhook_url: "https://app.example.com/hooks/roomagen",
}),
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
await db.query(
"INSERT INTO staging_jobs (photo_id, job_id, status, images_charged) VALUES ($1, $2, 'processing', $3)",
[photo.id, body.job_id, body.images_charged],
);
return body.job_id;
}
Стейджинг более строг к параметрам, чем другие инструменты. Поле style обязательно, параметры пишутся в camelCase, а любой ключ вне приведенного ниже списка, включая room_type, resolution, tier и customPrompt, отклоняется с ошибкой invalid_request. Стейджинг всегда рендерится в разрешении 2K и стоит одно изображение.
| Параметр | Значения | По умолчанию |
|---|---|---|
style (обязательно) |
modern, scandinavian, industrial, traditional, minimalist, bohemian, mid-century-modern, coastal, farmhouse, luxury, japandi, art-deco, mediterranean или custom, чтобы выбор сделала модель |
отсутствует |
roomType |
15 типов, таких как living-room, bedroom, kitchen, home-office, kids-room и terrace |
определяется по фото |
mode |
empty-room меблирует пустую комнату; restyle меняет интерьер в уже меблированной; recreate перестраивает её в комнату другого типа |
empty-room |
furnitureMode, furniture |
ai или manual со списком вроде "sectional sofa, floor lamp, rug" |
ai |
changeWalls, changeFloor |
Значение true разрешает модели перекрашивать стены или заменять напольное покрытие |
false |
Эти три режима соответствуют режимам стейджинга в веб-приложении Roomagen, так что ваша продуктовая команда может опробовать их до того, как вы напишете код: виртуальный стейджинг с AI для пустых комнат, Редизайн меблированных комнат для restyle и Перепрофилирование комнаты для recreate.
Сохраняйте данные в базу в первую очередь. Сохраните job_id и images_charged в привязке к вашей собственной записи. Заголовок Idempotency-Key (до 128 символов, изолирован в рамках вашего API-ключа) делает повторные попытки безопасными: тот же ключ с тем же телом запроса возвращает исходную задачу без повторного списания. Формируйте ключи на основе ваших записей, чтобы их можно было восстановить после сбоя, и отправляйте повторно в точности то же самое тело запроса: отправка того же ключа с измененным телом, включая повторно подписанный image_url, вернет 409 idempotency_conflict.
Шаг 2: Обработка завершения — вебхуки против опроса
Существует два способа узнать о завершении задачи, и в производственных интеграциях используются оба.
| Критерий | Вебхуки (push) | Опрос (pull) |
|---|---|---|
| Задержка | Отправляется после завершения задачи, без дополнительных запросов с вашей стороны | До одного интервала опроса; Roomagen рекомендует 2–5 секунд |
| Инфраструктура | Публичный https-эндпоинт, отвечающий кодом 2xx в течение 10 секунд | Воркер или планировщик задач |
| Надежность | At-least-once (как минимум один раз); 5 попыток в течение примерно 36 минут, затем прекращение | Вы полностью контролируете цикл |
| Оптимально для | Эксплуатации в проде под нагрузкой | Разработки, интерактивного ожидания, сверки данных |
Используйте вебхуки как основной канал, а опрос — как страховку. Документация Roomagen называет вебхуки «оптимизацией, а не системой учета», поскольку попытки доставки прекращаются по истечении окна повторов. Один лишь опрос также не масштабируется: при 3-секундном интервале каждая задача требует 20 запросов в минуту, поэтому лимит в 300 запросов в минуту на GET /v1/jobs/{id} покроет одновременный опрос лишь около 15 задач.
Настройка эндпоинта. Сохраните адрес https-эндпоинта в карточке Webhook в портале, указав конечный URL, так как перенаправления не поддерживаются. Храните секрет подписи whsec_ как пароль и отправьте тестовое событие job.test с помощью кнопки Send test event, пока отлаживаете проверку подписи. Вебхук, заданный индивидуально для задачи через webhook_url, использует тот же секрет.
const crypto = require("crypto");
const express = require("express");
const app = express();
// Необработанное тело (raw body) на этом маршруте, подключенном до глобального express.json()
app.post("/hooks/roomagen", express.raw({ type: "application/json" }), async (req, res) => {
const ts = req.get("X-Roomagen-Timestamp");
const sig = req.get("X-Roomagen-Signature");
if (!ts || !sig) return res.sendStatus(401);
const expected = "v1=" + crypto
.createHmac("sha256", process.env.ROOMAGEN_WEBHOOK_SECRET) // whsec_...
.update(`${ts}.`)
.update(req.body) // исходные байты, ни в коем случае не повторно сериализованный JSON
.digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
if (sig.length !== expected.length || !fresh ||
!crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected))) {
return res.sendStatus(401);
}
const job = JSON.parse(req.body);
if (job.event === "job.test") return res.sendStatus(200);
// Идемпотентность: только первая доставка (или опрос) переводит строку из статуса "processing"
const { rowCount } = await db.query(
"UPDATE staging_jobs SET status = $1, result_urls = $2, error = $3 WHERE job_id = $4 AND status = 'processing'",
[job.status, job.result_urls, job.error, job.job_id],
);
if (rowCount === 1 && job.status === "completed") {
await queue.add("store-results", { jobId: job.job_id }); // скачивание вне пути обработки веб-запроса
}
res.sendStatus(200);
});
Принципиально важны четыре детали:
- Проверяйте подпись по исходным байтам. Заголовок содержит префикс
v1=и шестнадцатеричный HMAC-SHA256 от{X-Roomagen-Timestamp}.{raw body}; повторно сериализованный JSON не совпадет. - Сравнивайте за постоянное время, затем проверяйте актуальность. Метод Node
timingSafeEqualвыбрасывает исключение при разной длине буферов, поэтому сначала сравните длину. Отклонение временных меток старше примерно пяти минут защищает от атак повторного воспроизведения (replay attacks) — это та же защита, что описана в документации по вебхукам Stripe; следите за синхронизацией часов на серверах. - Отвечайте быстро. Roomagen ожидает статус 2xx в течение 10 секунд; любой другой ответ, включая таймаут, считается неудачной попыткой и отправляется повторно.
- Обеспечьте идемпотентность. Доставка осуществляется по модели at-least-once и без соблюдения порядка, к тому же ваш фоновый опрос мог завершить задачу раньше, поэтому выполняйте дедупликацию по
job_id.
Для опроса (во время разработки или в качестве механизма сверки) код на Python выглядит лаконично:
import os, time, requests
API = "https://api.roomagen.com/api/v1"
HEADERS = {"X-Api-Key": os.environ["ROOMAGEN_API_KEY"]}
def wait_for_job(job_id, interval=3, max_wait=300):
deadline = time.time() + max_wait
while time.time() < deadline:
r = requests.get(f"{API}/jobs/{job_id}", headers=HEADERS, timeout=30)
r.raise_for_status()
job = r.json()
if job["status"] != "processing":
return job # "completed" или "failed"; оба статуса финальные
time.sleep(interval)
return None # всё ещё обрабатывается: оставляем задачу механизму сверки
Задача завершается либо со статусом completed с массивом result_urls, либо со статусом failed с причиной в поле error и автоматическим возвратом списания; логируйте processing_ms, чтобы отслеживать задержку. Запускайте механизм сверки каждые 1–2 минуты для задач, которые всё ещё находятся в статусе processing спустя несколько минут. Не помечайте медленную задачу как завершившуюся ошибкой только потому, что истек таймер: она все еще может успешно завершиться, а списание средств за нее произошло при создании.
Шаг 3: Доставка результатов вашим пользователям
Завершенная задача возвращает result_urls — массив сгенерированных изображений JPEG. Не используйте прямые ссылки на них (hotlinking).
Переразмещайте результаты у себя. Roomagen отдает результаты из собственного хранилища с учетом срока хранения данных аккаунта, поэтому фоновая задача должна скачать каждое изображение сразу после завершения рендеринга, записать его в ваше собственное хранилище (S3, R2, GCS или аналогичное) и раздавать через вашу CDN. В этом случае доступность ваших изображений никогда не будет зависеть от политик хранения поставщика.
Храните оригинал рядом с результатом. Сохраняйте исходную фотографию и изображение с виртуальным стейджингом как связанную пару. Эта пара обеспечивает работу интерактивного слайдера «до/после», позволяет пользователям откатить изменения и требуется правилами раскрытия информации в объявлениях (Шаг 4).
Учитывайте вариативность. Результаты генерации могут различаться, и иногда диван получается неподходящим. Повторный запуск — это новая задача, за которую списывается еще одно изображение, поскольку Roomagen компенсирует рендеры, завершившиеся системной ошибкой, а не результаты, которые не понравились пользователю. Присваивайте каждому повторному запуску собственный Idempotency-Key, например photo-4821-stage-2: повторное использование первого ключа вернет исходную задачу либо ошибку 409, если тело запроса изменилось. Предусмотрите кнопку «Попробовать снова» и решите, будет ли эта стоимость видна пользователям или она уже заложена в ваши тарифы.
Продумайте интерфейс ожидания и обработки ошибок. Стейджинг обычно выполняется в пределах минуты, что довольно долго с точки зрения интерфейса. До запуска спроектируйте индикатор прогресса, состояние ошибки («рендер не удался, списание возвращено на баланс») и возможность повтора.
Шаг 4: Встройте раскрытие информации в модель данных
Если ваши пользователи публикуют фотографии с виртуальным стейджингом в объявлениях о недвижимости, раскрытие информации — их юридическая обязанность, и от вашей модели данных зависит, насколько легко им будет её исполнять. API Roomagen не добавляет пометку о раскрытии информации и не формирует пары «оригинал/обработанное фото», а условия использования Roomagen возлагают обязанность по раскрытию информации на пользователя, поэтому ваша интеграция должна взять это на себя.
- Закон Калифорнии AB 723, действующий с 1 января 2026 года. Брокер или агент по продажам, либо лицо, действующее от их имени, использующие цифровым образом измененное изображение в рекламе продажи недвижимости, обязаны указать на самом изображении или рядом с ним, что оно было изменено, а также добавить ссылку, URL-адрес или QR-код на общедоступный сайт с оригинальным, неизмененным изображением. Регулятор рынка недвижимости штата Калифорния добавляет: в случаях, когда инструмент AI создает вводящую в заблуждение рекламу, ответственность ложится «на лицензиата и его ответственного брокера, а не на поставщика технологии».
- Объявления об аренде в Калифорнии с 1 января 2027 года. Закон AB 2025 распространяет аналогичные требования о раскрытии информации на рекламу аренды, охватывая наймодателей жилья и других лиц, а не только лицензиатов.
- Правила MLS расходятся в требованиях к размещению. Canopy MLS требует наличия пометки на самом изображении, а не только в подписях к нему, в то время как NWMLS не принимает фотографии с наложенной графикой или текстом.
- Продукты, ориентированные на ЕС. Со 2 августа 2026 года Статья 50 Закона ЕС об AI (EU AI Act) требует от лиц, применяющих систему AI (deployers), которые генерируют или модифицируют дипфейк-изображения (контент, имеющий сходство с существующими местами или объектами и способный ложно восприниматься как подлинный), раскрывать этот факт. Обработанные с помощью AI фотографии объекта недвижимости вполне могут подпадать под это определение (подробнее — в нашем руководстве по статье 50 EU AI Act).
Поэтому храните данные о раскрытии информации в виде структурированных данных, а не в пикселях: публичный URL-адрес исходной фотографии, флаг altered с указанием использованного инструмента и настроек, а также текст раскрытия информации и позицию пометки для каждой площадки. Накладывайте пометку на этапе экспорта, а не при сохранении в базу.
| Инструмент | Как применяется определение цифровым образом измененного изображения по закону AB 723 |
|---|---|
virtual-staging |
Добавляет мебель, которая прямо упомянута в законе: раскрывайте факт изменения и давайте ссылку на оригинал |
item-removal |
Удаляет элементы с изображения: раскрывайте |
virtual-renovation |
Изменяет встроенное оборудование, напольные покрытия, стены или цвет краски (все эти элементы прямо названы): раскрывайте |
day-to-dusk |
Исключение для корректировки освещения распространяется только на правки, не меняющие представление о недвижимости, а новый параметр viewType заменяет вид из окон (прямо упомянутый элемент): безопаснее раскрывать |
image-enhancement |
Освещение, баланс белого, цветокоррекция и экспозиция исключены из требований, если они не меняют представление о недвижимости |
floor-plan-to-3d |
Планы этажей прямо названы в законе; представляйте рендер как иллюстрацию, а не как фотографию |
Это краткая сводка для разработчиков, а не юридическая консультация; в наших руководстве по закону AB 723 и правилам MLS для AI-фотографий и руководстве по требованиям MLS к фотографиям и раскрытию информации при виртуальном стейджинге тема разобрана подробнее.
Вопросы эксплуатации: лимиты запросов, повторные попытки и расчет бюджета
Лимиты запросов (Rate limits). На каждый ключ в скользящем 60-секундном окне: 60 запросов в минуту для POST /v1/jobs, 300 для GET /v1/jobs/{id} и 120 для GET /v1/tools и GET /v1/account, плюс общий лимит 600 запросов в минуту на IP-клиента, разделяемый всеми серверами за одним NAT-адресом. Успешные ответы содержат заголовки X-RateLimit-Limit и X-RateLimit-Remaining; ответ 429 rate_limited содержит Retry-After в секундах — ориентируйтесь на него, а не изобретайте собственную логику задержек. Для пакетных задач выстраивайте отправку в очередь: при лимите в 60 задач в минуту отправка 500 фотографий займет чуть больше восьми минут.
Повторные попытки и коды ошибок. Каждая ошибка возвращается в формате { "error": { "code", "message", "doc_url" } }. Ветвите логику по значению code, ни в коем случае не по message:
| Ответ | Что должен делать ваш код |
|---|---|
400 invalid_request, invalid_tool |
Исправьте запрос (названия параметров, значения или название с сайта вместо слага API); не повторяйте запрос без изменений |
400 invalid_image, image_fetch_failed |
Передавайте строго один источник изображения по публичному URL-адресу https, отдающему файл напрямую |
401 invalid_api_key, key_revoked |
Отправьте оповещение дежурному инженеру; не делайте повторных попыток |
402 insufficient_credits |
Задача не была создана: пополните баланс, затем повторите запрос |
409 idempotency_conflict |
Отправьте исходное тело запроса повторно либо используйте новый ключ для действительно нового запроса |
413 payload_too_large |
Перейдите на использование image_url и проверьте, был ли передан заголовок X-Api-Key |
429 rate_limited, 500 internal_error |
Подождите (значение Retry-After при ошибке 429), затем повторите попытку с тем же Idempotency-Key |
Задача со status: "failed" |
Средства возвращены автоматически; повторите попытку один раз, и если ошибка повторится, проверьте саму фотографию |
Экономика ошибок. За задачу, завершившуюся сбоем на этапе генерации, средства возвращаются автоматически, однако поле images_charged в объекте задачи не перезаписывается, поэтому считайте GET /v1/account единственным достоверным источником данных о вашем балансе. Сравнивая поставщиков, обращайте внимание на правила обработки сбоев наряду с ценами.
Расчет бюджета кредитов. В API Roomagen биллинг ведется в изображениях, которые покупаются заранее пакетами в портале для разработчиков:
| Пакет | Изображения | Цена | За изображение |
|---|---|---|---|
| Бесплатный бонус (первый ключ, единоразово) | 50 | $0 | — |
| Pilot | 500 | $125 | $0,25 |
| Growth | 2 500 | $550 | $0,22 |
| Scale | 10 000 | $2 000 | $0,20 |
| Volume | от 50 000 | По договоренности | — |
Срок действия пакетов не ограничен, а изображения суммируются. Каждый задокументированный инструмент расходует одно изображение за рендер в 2K, параметр resolution: "4K" удваивает списание для инструментов, поддерживающих его, а стейджинг всегда стоит одно изображение. При планировании бюджета закладывайте повторные генерации: платформе, выполняющей виртуальный стейджинг 1 200 фотографий в месяц с ожиданием, что каждая десятая будет запущена повторно, потребуется около 1 320 изображений, то есть пакета Growth хватит почти на два месяца.
Опубликованные цены сильно различаются (данные проверены в октябре 2026 года): у ModelsLab указано $0,02 за рендер интерьера, у Decor8 — $0,20 за изображение для всех операций API, а у AI HomeDesign — $0,24 за фото при годовой оплате или около $0,49 при помесячной. Сравнивайте набор инструментов, поддержку вебхуков, правила возврата при сбоях и качество результатов, а не только цену за единицу; в наших руководстве по ценам на API виртуального стейджинга и сравнении API стейджинга каждый поставщик разобран подробно.
Честно о зрелости решения. API Roomagen появился недавно: версия 1 была запущена 30 августа 2026 года с единым эндпоинтом задач, а документация охватывает все поддерживаемые инструменты только с 3 октября 2026 года, поэтому сервису присущи современные конвенции, но пока нет многолетней публичной истории. О критических изменениях владельцы аккаунтов с активными ключами предупреждаются по электронной почте до релиза; обратно совместимые дополнения могут выходить в любое время, поэтому просто игнорируйте неизвестные поля в ответах.
Расширение интеграции: другие документированные инструменты
Как только базовый цикл для стейджинга заработает, добавление кнопок «сумеречная версия» или «убрать лишние вещи» потребует лишь изменения полей tool и options:
| Инструмент | Слаг | Параметры |
|---|---|---|
| Виртуальная реконструкция и ремонт | virtual-renovation |
style (10 значений), roomType (8 значений) |
| Улучшение фото | image-enhancement |
intensity: light, medium (по умолчанию) или heavy |
| Редактирование & Конвертация Фото из Дня в Сумерки | day-to-dusk |
timeShift (час 0–23, по умолчанию 20), viewType, season, hasWindows |
| Удаление объектов и предметов с фотографий | item-removal |
Нет: опустите options, чтобы убрать очевидный беспорядок, или передайте tier: "custom" с промптом customPrompt, указав конкретный предмет |
| План этажа в 3D | floor-plan-to-3d |
outputStyle, interiorStyle, furnitureMode, fp3dOutdoor, fp3dLabels, inputType |
Эти инструменты также принимают параметры resolution (2K или 4K), tier (auto, guided или custom) и customPrompt (до 500 символов). В отличие от стейджинга, они игнорируют неизвестные ключи, перечисляя каждый из них в массиве warnings в ответе, но при этом отклоняют недопустимые значения параметров. Для комнат без окон передавайте hasWindows: false в инструмент день в сумерки, чтобы промпт не содержал инструкций относительно окон и вида из них.
Эндпоинт GET /v1/tools возвращает все слаги, доступные для вызова с вашим ключом, с их стоимостью в изображениях, и каждый возвращенный слаг задокументирован. Читайте этот список программно, а не зашивайте значения жестко в код, и помните, что названия инструментов на сайте roomagen.com отличаются от слагов в API.
Чего API не умеет
- Нет пакетного эндпоинта. Одна задача — это обработка одного изображения через один инструмент; пакетная обработка из веб-приложения не входит в API, поэтому выстраивайте задачи в очередь с соблюдением лимитов запросов.
- Нет меток о раскрытии информации. Результаты не содержат пометок о раскрытии информации или готовых пар «до/после». До покупки пакета на рендеры накладывается водяной знак, а после покупки любое брендирование Roomagen отсутствует.
- Нет бесплатных повторных генераций. Повторный запуск — это новая задача, за которую списываются кредиты как за отдельную операцию.
- Нет замеров помещений или CAD-файлов. На выходе вы получаете изображения JPEG, а не размеры, векторную графику или файлы DWG. Если вам нужны замеры комнаты по фото, генеративный API изображений для этого не предназначен.
- Нет гарантии идеального результата. Генеративные модели могут допускать артефакты или неточности, поэтому проверяйте результат перед публикацией в объявлении.
- Нет эксклюзивных функций веб-интерфейса. Кнопка Доработать, Библиотека и чат Дизайн-помощник доступны только в веб-приложении Roomagen.
Частые ошибки при интеграции API стейджинга
- Блокировка потока запроса. Удержание клиентского соединения открытым на время рендеринга приводит к таймаутам балансировщика нагрузки. Возвращайте
202 Acceptedиз собственного API и отправляйте обновления клиенту асинхронно. - Неверные имена параметров. Указание
room_typeилиresolutionв задаче стейджинга вернет ошибкуinvalid_request; стейджинг требует ключи в camelCase из строго определенного списка и обязательно параметрstyle. - Надежда исключительно на вебхуки. Примерно через 36 минут повторных попыток Roomagen прекращает отправку вебхука. Без механизма периодической сверки задача останется в статусе "processing" навсегда.
- Ошибки в проверке подписи. Хеширование распарсенного JSON, потеря префикса с меткой времени, сравнение через обычное равенство
===или отказ от проверки актуальности временной метки делают верификацию уязвимой. - URL вебхука с перенаправлением. Обычный протокол http и приватные хосты сразу отклоняются с ошибкой
webhook_url_rejected, а перенаправления не поддерживаются, поэтому редирект из-за слеша на конце или префикса www приведет к сбою каждой доставки. - Случайные ключи идемпотентности или повторно подписанные URL. Ключ, который вы не сохранили, нельзя воспроизвести повторно, поэтому повтор приведет к новому списанию; повторно подписанный
image_urlс тем же ключом вернет ошибку409. - Прямые ссылки (hotlinking) на URL результатов. Доступность результатов ограничена политикой хранения поставщика. Скачивайте и переразмещайте их у себя сразу после завершения.
- Единый водяной знак для всех площадок. Впеченная в изображение пометка «Virtually Staged» («С виртуальным стейджингом») может нарушать правила MLS, запрещающие наложение текста, а без ссылки на оригинал сама по себе не выполняет требований закона AB 723.
Чек-лист перед запуском в продакшн
- API-ключ хранится исключительно на ваших серверах, по одному на каждое окружение.
- Запросы на стейджинг всегда содержат обязательный параметр
styleи не содержат параметров вне разрешенного списка. - Каждая задача имеет
Idempotency-Key, сформированный на основе ваших записей, а повторные попытки отправляют исходное тело запроса. - Эндпоинт для вебхука указывает на финальный URL https, проверяет подписи
v1=по исходным байтам, отклоняет устаревшие временные метки и отвечает в течение 10 секунд. - Тестовое событие
job.testиз портала успешно проходит проверку подписи. - Механизм сверки регулярно проверяет задачи, зависшие в статусе обработки дольше нескольких минут.
- Результаты переразмещаются в собственном хранилище, и оригинал всегда сохраняется рядом с результатом.
- Данные для раскрытия информации (URL оригинала, флаг изменения, пометка под конкретную площадку) передаются во все сценарии экспорта.
- Настроено оповещение о низком остатке
image_credits, а каждый код ошибки транслируется в понятное пользователю сообщение.
Главный вывод: запустите базовый цикл, затем расширяйте
Добавление виртуального стейджинга в приложение требует небольшой интеграции: один POST-запрос с ключом идемпотентности, один верифицируемый обработчик вебхуков с механизмом сверки и этап сохранения оригинала рядом с результатом. Основная логика укладывается в несколько десятков строк; большая часть работы уходит на обеспечение надежности в продакшне и работу с данными для раскрытия информации. Ничто из этого не привязано жестко к одному поставщику: асинхронная отправка, гибрид push- и pull-уведомлений о завершении, переразмещение результатов и хранение пар «оригинал/результат» подходят для любого API стейджинга.
Чтобы реализовать интеграцию по описанному примеру, получите API-ключ Roomagen: первый ключ включает 50 бесплатных изображений, а краткое руководство, руководство по вебхукам и справочник ошибок содержат все технические детали. В рамках одной интеграции этот же цикл задач позволяет использовать виртуальный стейджинг, Редактирование & Конвертация Фото из Дня в Сумерки, Удаление объектов и предметов с фотографий, улучшение фото, Виртуальная реконструкция и ремонт и План этажа в 3D.
Готовы преобразить ваши объявления?
Попробуйте бесплатно виртуальный стейджинг Roomagen с ИИ. Загрузите первое фото — результат обычно готов меньше чем за минуту.
Начать бесплатноИсточники и ссылки
- 1.California Legislature – текст законопроекта AB 723 (Business and Professions Code §10140.8)
- 2.California DRE – Artificial Intelligence in California Real Estate (информационное письмо, 17 марта 2026 г.)
- 3.California Apartment Association – правило раскрытия информации AB 2025 для изменённых объявлений об аренде (с 1 января 2027 г.)
- 4.Canopy MLS – Изображения в объявлениях: инструкции и частые вопросы
- 5.NWMLS – Real Estate Photography 101
- 6.EU AI Act – Статья 50: Обязательства по обеспечению прозрачности для поставщиков и лиц, применяющих системы AI (deployer)
- 7.Stripe Docs – Получение событий вебхуков (проверка подписи и защита от атак повторного воспроизведения)
- 8.ModelsLab – Interior Design API ($0,02 за рендер)
- 9.Decor8 AI – Цены (API: $0,20 за изображение)
- 10.AI HomeDesign – Тарифные планы B2B и API
Часто задаваемые вопросы
Автор
Roomagen Team
Команда Roomagen создаёт подробные руководства по виртуальному стейджингу с ИИ, фотографии недвижимости и маркетинговым стратегиям.






