Первая генерация
От API-ключа до готового видео. Пройдите весь путь на одном примере.
Apergrex использует FrankLab API для генерации и обработки контента из ваших приложений. Ниже — первый полный сценарий с Seedance 2.5 от BytePlus. Подключение к API объясняет общий порядок работы; генерация видео, изображения, текст и аудио и утилиты и монтаж описывают операции модулей Make как REST-запросы. Биллинг, ключи и вебхуки собраны в справочнике.
Базовый URL
https://apergrex.ru/franklab/apiТот же API доступен на https://franklab.ru/franklab/api.
Получите API-ключ
- Войдите в кабинет apergrex.ru и откройте Настройки → API.
- Нажмите «Создать ключ» — получите значение вида
fl_live_…. - Ключ показывается один раз — сохраните его сразу. Храните как пароль: ключ даёт доступ к балансу и операциям партнёра.
Список ключей доступен и программно (GET /v1/billing/api-keys, см. Справочник API → api-keys); выпуск и отзыв ключей — только из сессии кабинета, чтобы сам ключ не мог плодить новые.
Первая генерация: видео из текста
Создадим видео Seedance 2.5 от BytePlus · 4 секунды · 720p · 16:9, без загрузки файлов. Нужны Bash, cURL, jq и API-ключ с доступом к балансу. Выполняйте шаги по очереди: при ошибке остановитесь и прочитайте ответ, прежде чем переходить дальше.
В примере используются публичные маршруты Make MOON. Псевдоним moon_pro выбирает Seedance 2.5; внутренний идентификатор модели провайдера остаётся на сервере. Запрос estimate только оценивает стоимость и не запускает задачу. Сумма во Франках зависит от текущего тарифа и не фиксирует окончательную цену.
1. Подготовьте ключ
Введите ключ в терминале: ввод скрыт и не попадает в историю команд. Не вставляйте его в браузерный JavaScript или публичный репозиторий.
read -rsp 'API key: ' FRANKLAB_KEY; echo
export FRANKLAB_KEY
export FRANKLAB_BASE_URL='https://apergrex.ru/franklab/api'
export FRANKLAB_IDEMPOTENCY_KEY="apergrex-seedance-$(date +%s)-$$"2. Проверьте доступный баланс
curl --fail-with-body --max-time 30 \
-H "X-API-Key: ${FRANKLAB_KEY:?Set your API key}" \
"$FRANKLAB_BASE_URL/v1/billing/balance" \
-o balance.json
jq '{available, reserved}' balance.jsonavailable — сумма, доступная для новых операций, во Франках. reserved — уже зарезервированные средства. При недостаточном балансе пополните его в кабинете и повторите проверку.
3. Получите оценку стоимости
curl --fail-with-body --max-time 30 -X POST \
-H "X-API-Key: ${FRANKLAB_KEY:?Set your API key}" \
-H 'Content-Type: application/json' \
--data-binary @- \
"$FRANKLAB_BASE_URL/make/moon/estimate" \
-o estimate.json <<JSON
{"operation":"text_to_video","moonModel":"moon_pro","prompt":"A silver running shoe on a white pedestal, slow camera orbit in soft studio light, no logos or text.","duration":4,"resolution":"720p","ratio":"16:9","generate_audio":false,"idempotency_key":"${FRANKLAB_IDEMPOTENCY_KEY}"}
JSON
jq '.data | {estimated_cost_franks, cost_currency, cost_unit, cost_status}' estimate.jsonОстановитесь, если запрос оценки завершился ошибкой, .data.estimated_cost_franks отсутствует или не является числом либо available отсутствует, не является числом или меньше оценки. Не отправляйте задачу без успешной оценки и достаточного баланса. Оценка не создаёт задачу и не резервирует средства. Она не фиксирует цену: итог может зависеть от текущего тарифа и использования задачи. cost_unit в ответе задаёт единицу расчёта; не выводите из этого примера стоимость одной секунды.
При 401/403 проверьте ключ, при 429 дождитесь разрешённого повтора. Правила описаны в разделе ошибок.
4. Запустите один раз
Следующая команда создаёт платную задачу и может зарезервировать средства. Выполните её один раз, после проверки оценки и баланса. Параметры и ключ идемпотентности совпадают с запросом оценки.
curl --fail-with-body --max-time 120 -X POST \
-H "X-API-Key: ${FRANKLAB_KEY:?Set your API key}" \
-H 'Content-Type: application/json' \
--data-binary @- \
"$FRANKLAB_BASE_URL/make/moon/videos" \
-o submit.json <<JSON
{"operation":"text_to_video","moonModel":"moon_pro","prompt":"A silver running shoe on a white pedestal, slow camera orbit in soft studio light, no logos or text.","duration":4,"resolution":"720p","ratio":"16:9","generate_audio":false,"idempotency_key":"${FRANKLAB_IDEMPOTENCY_KEY}"}
JSON
jq '.data | {taskId, status, final_cost_franks, cost_unit, cost_status}' submit.jsonПосле успешного ответа сохраните data.taskId (или data.task_id):
FRANKLAB_TASK_ID=$(jq -er '(.data.taskId // .data.task_id) | select(type == "string" and length > 0)' submit.json)
export FRANKLAB_TASK_IDПри тайм-ауте, 5xx или ответе без ID задачи результат запуска неизвестен. Не повторяйте POST с новым ключом идемпотентности: задача могла быть принята. Сначала сверьте историю задач в кабинете; если ID не найден, обратитесь в поддержку, указав время, модель и ответ без ключа. Если согласован повтор, используйте тот же ключ идемпотентности и те же параметры запроса.
5. Проверяйте статус той же задачи
curl --fail-with-body --max-time 30 \
-H "X-API-Key: ${FRANKLAB_KEY:?Set your API key}" \
"$FRANKLAB_BASE_URL/make/moon/status/${FRANKLAB_TASK_ID:?Set the returned task ID}" \
-o status.json
jq '.data | {taskId, status, final_cost_franks, cost_unit, result, videoUrl, video_url, error_message, error}' status.jsonПовторяйте только этот GET примерно раз в 5 секунд, максимум 60 проверок за один цикл. Это ограничение клиента, а не обещанное время генерации. При 429 увеличьте паузу согласно ответу; при 401/403/404 остановитесь и разберите причину. Исчерпание цикла не отменяет задачу: сохраните ID и позже продолжите GET с ним.
data.status | Что делать |
|---|---|
queued, processing | Задача ещё выполняется; продолжать ограниченный опрос. |
completed | Получить ссылку из data.videoUrl или data.video_url (также доступна в data.result.video_url). |
failed | Прекратить опрос, прочитать data.error_message или data.error, сверить баланс и транзакции. |
| Другое значение | Сохранить ответ и ID, уточнить состояние; не создавать новую задачу автоматически. |
6. Получите видео и проверьте расчёт
jq -er '.data | select(.status == "completed") | (.videoUrl // .video_url // .result.video_url) | select(type == "string" and startswith("https://"))' status.jsonОткройте возвращённую HTTPS-ссылку или сохраните файл в своём хранилище. Если задача завершилась без ссылки, сохраните ответ и обратитесь в поддержку; повторный запуск не исправляет выдачу результата. Срок доступности ссылки не гарантируется этим руководством.
final_cost_franks — итоговая стоимость после завершения расчёта; null не означает, что генерация была бесплатной. Сверьте итог с балансом и транзакциями. Не выводите итоговую стоимость из первоначальной оценки.
Дальше
- Аутентификация — ключи, заголовки, лимиты
- Биллинг — баланс, резервы, транзакции, тарифы
- Справочник API — биллинг, ключи и вебхуки
- Цены — базовый прайс-лист