Creative API
Premium GenAI creative generation backed by module-f (Vertex Imagen / Veo) and the fleet orchestration chain module-a → module-BDE → module-f. Routes are served under /v1/creative.
Async operations return a job_id; poll it at GET /v1/jobs/{job_id}.
Authentication
Authorization: Bearer ai92_live_<key> # production
Authorization: Bearer ai92_test_<key> # sandboxMutating requests support Idempotency-Key and are brand-gated.
Credit costs at a glance
| Endpoint | Cost |
|---|---|
POST /v1/creative/generate | Image: 50 cr · Video: 50 cr/second, 400 cr floor (8s) |
GET /v1/creative/assets | Free |
POST /v1/creative/newsletter | 15 cr (async) |
POST /v1/creative/campaigns | 250 cr per 7-day week (async) |
POST /v1/creative/generate
Cost: Image = 50 credits. Video = max(400, 50 × duration_s) — i.e. 8s/12s/16s/20s → 400 / 600 / 800 / 1000 credits.
Generate creative assets. Image runs the premium DCO pipeline; video runs Veo. Credits are deducted after a successful render (no charge on backend failure).
Sandbox timing. Creative generation is asynchronous (the call is accepted and returns a
job_idprefixedf_; poll it atGET /v1/jobs/{job_id}). In the sandbox the render pipeline can be slow and a job may reachstatus: TIMED_OUT. When that happens the reserved credits are automatically refunded and you can simply retry the call. Production turnaround is significantly faster.
Auth: Bearer
| Field | Type | Required | Description |
|---|---|---|---|
brand_id | string | Yes | The brand. |
prompt | string | Yes | Generation prompt. Length 1–2000. |
asset_type | string | No | image (default) or video. |
duration_s | integer | No | Video duration in seconds: one of 8 (default), 12, 16, 20. Ignored for images. |
Request
curl https://api.ai92.ai/v1/creative/generate \
-H "Authorization: Bearer ai92_test_51a9c0de…" \
-H "Content-Type: application/json" \
-d '{"brand_id": "acme", "prompt": "cinematic product hero shot, golden hour", "asset_type": "video", "duration_s": 12}'Response 200 OK
{
"asset_id": "ast_v12",
"type": "video",
"duration_s": 12,
"url": "https://cdn.ai92.ai/ast_v12.mp4",
"credits_charged": 600
}Errors
| Status | Code | When |
|---|---|---|
402 | INSUFFICIENT_CREDITS | Balance below the computed cost. |
GET /v1/creative/assets
Cost: Free
List generated creative assets.
Auth: Bearer
_No parameters._
Request
curl https://api.ai92.ai/v1/creative/assets \
-H "Authorization: Bearer ai92_test_51a9c0de…"Response 200 OK
{
"assets": [
{ "asset_id": "ast_v12", "type": "video", "url": "https://cdn.ai92.ai/ast_v12.mp4", "created_at": "2026-06-20T10:00:00Z" }
]
}POST /v1/creative/newsletter
Cost: 15 credits (async)
Kick off async newsletter banner generation. Credits are reserved now, consumed on success, refunded on backend failure. Poll the result at GET /v1/jobs/{job_id}.
Auth: Bearer
| Field | Type | Required | Description |
|---|---|---|---|
brand_id | string | Yes | The brand. |
topic | string | Yes | Newsletter topic. Length 1–500. |
Request
curl https://api.ai92.ai/v1/creative/newsletter \
-H "Authorization: Bearer ai92_test_51a9c0de…" \
-H "Content-Type: application/json" \
-d '{"brand_id": "acme", "topic": "Summer product roundup"}'Response 200 OK
{
"job_id": "f_7c1d0a92…",
"status": "queued",
"service": "creative",
"credits_reserved": 15
}Errors
| Status | Code | When |
|---|---|---|
402 | INSUFFICIENT_CREDITS | Balance below 15 credits. |
POST /v1/creative/campaigns
Cost: 250 credits per 7-day week (async) — 250 × ceil(window_days / 7); planning window capped at 31 days
Generate a full creative campaign (a calendar of premium assets). 923 orchestrates the fleet chain module-a → module-BDE → module-f and returns a job to poll at GET /v1/jobs/{job_id}. Credits are reserved now, consumed on success, refunded on any failure.
Auth: Bearer
| Field | Type | Required | Description |
|---|---|---|---|
brand_id | string | Yes | The brand. Min length 1. |
planning_window_start | string | Yes | ISO date, e.g. 2026-06-20. |
planning_window_end | string | Yes | ISO date, e.g. 2026-06-27. On/after start; window ≤ 31 days. |
schedule_type | string | No | MOD80 (default) or MOD60. |
channels | string[] / null | No | Target channels. |
Request
curl https://api.ai92.ai/v1/creative/campaigns \
-H "Authorization: Bearer ai92_test_51a9c0de…" \
-H "Content-Type: application/json" \
-d '{"brand_id": "acme", "planning_window_start": "2026-06-20", "planning_window_end": "2026-07-03", "schedule_type": "MOD80", "channels": ["instagram", "email"]}'Response 200 OK
{
"job_id": "bde_4af09c11…",
"status": "queued",
"service": "creative",
"credits_reserved": 500
}Errors
| Status | Code | When |
|---|---|---|
422 | INVALID_PLANNING_WINDOW | End before start, or window exceeds 31 days. |
402 | INSUFFICIENT_CREDITS | Balance below the computed cost. |
503 | ENQUEUE_FAILED | Job could not be queued; credits were refunded. |