Omneky API Docs
Overview Image API Video API Billing
Omneky API

Build with the Omneky Ad APIs

Generate brand-aligned image and video ads from a single API call. Request access and we'll provision a key scoped to your brand workspace.

Omneky API

Overview

Generate brand-aligned image and video ads from a single asynchronous API call. Submit a job, get a job_id back immediately, then poll GET /jobs/{job_id} or receive a webhook when the finished creative is ready. Both APIs share the same authentication, job-status endpoint, and credit balance.

POST/create_image_ad_async
POST/create_video_ad_async
GET/jobs/{job_id}
How a request comes together
🎨
brand_dataLogo · fonts · colors · site
📦
product_metadataProduct photos & page
✏️
ad_copiesHeadline · subhead · CTA
⚙️
generation_metadataRatios · layout · direction
generate
1:14:59:16

Brighter skin in 14 days

Dermatologist tested · vegan formula

Shop Now
job 8f1d2a3e · image_ad / video_adSUCCESS

Authentication

Every request to the Omneky API — both image and video — is authenticated with an X-API-Key header. API keys are generated from the Omneky Admin Dashboard and are subject to per-key rate limits.

X-API-Key: sk-omn-api01-<your-api-key>
HeaderFormatWhere to get it
X-API-Keysk-omn-api01-<random>Omneky Admin Dashboard
Auth errors: 401 missing or invalid key · 403 account deactivated · 429 rate limit exceeded (respect the Retry-After header).
No key yet? Request API access and we'll provision a key scoped to your brand workspace.

Billing & credits

Omneky runs on a single credit balance shared across the platform and the API. Credits are spent when you generate or edit creative, and when you pull AI performance insights — connecting ad accounts, reporting, and auto-splicing are free. Here's exactly what each action costs.

Image ad generation & editing

What you generateCredits
Image Generation (1K quality) — via prompt, product data, assets, and/or reference ad style5
Image Generation (4K quality) — same as above, in 4K10
Image Edit or Upscale — prompt editing, upscale to 4K, copy & resize5
Image Layering — image deconstructed into a layered file for editing10

Video ad generation & editing

What you generateCredits
Product Animation Video with sound — 8-second image animation10
Short Commercial (formerly Professional Product Video)30
AI Avatar Video without Product — avatar video, no product, motion, or emotion15
AI Avatar Video using Product — avatar using, wearing, or in product / room / location20
Long-form Avatar Scripted Video (Standard / Fast)75
Long-form Avatar Scripted Video (Pro)60
NewLong-form Non-UGC Scripted Video (Pro)60
NewSingle Scene Regeneration20
Clone a winning video into your own branded video5 / sec
Edit a video — remove or change object, adjust color, lighting, or background2 / sec
Video Auto-Splicing into Storyboard Clips — per camera cutFree

AI insights & launching

What you doCredits
Connect ad accounts per ad network for direct-integrated launchingFree
Connect ad accounts per ad network for basic campaign / ad group / ad-level reportingFree
AI Creative Performance Insights1 / image ad · 2 / video ad
Credit costs apply to API calls the same way they do in-app. Not sure how many credits your workflow needs? Request API access and our team will help you size a plan.
Image Ads

Image Ad API

Generate brand-aligned image advertisements. Typical completion time is 2–5 minutes.

Quickstart guide

Submit a job, then poll until it reaches SUCCESS or FAILED. A minimal request only needs brand and product context.

curl -X POST https://api.omneky.com/create_image_ad_async \
  -H "X-API-Key: sk-omn-api01-<your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "brand_data": {
      "brand_url": "https://yoursite.com",
      "brand_name": "Acme Co"
    },
    "product_metadata": {
      "product_name": "Cloud Runners",
      "product_description": "Lightweight running shoes for daily training"
    }
  }'
# → { "job_id": "a1b2c3d4-5678-90ab-cdef", "type": "image_ad" }
# Poll until SUCCESS or FAILED
curl https://api.omneky.com/jobs/a1b2c3d4-5678-90ab-cdef \
  -H "X-API-Key: sk-omn-api01-<your-key>"

Rate limits

Rate limits are enforced per API key using a fixed one-minute window. When exceeded, the server responds 429 Too Many Requests with a Retry-After header indicating how many seconds until the window resets.

EndpointLimit
POST /create_image_ad_async10 requests / minute
GET /jobs/{job_id}Configurable per API key
1

Create Image Ad

Creates an asynchronous image generation job. The API immediately returns a job_id while generation continues in the background. Typical completion time is 2–5 minutes.

POST/create_image_ad_async

Request body

{
  "brand_data": {
    "brand_url": "https://yoursite.com",
    "brand_name": "Acme Co",
    "brand_images": [
      { "image_url": "https://cdn.example.com/logo.png", "labels": ["logo"] }
    ],
    "fonts": ["https://example.com/fonts/Poppins-Medium.ttf"],
    "color_swatches": [
      { "hex": "#FF5733", "label": "headline" }
    ]
  },
  "product_metadata": {
    "product_url": "https://yoursite.com/products/cloud-runner",
    "product_name": "Cloud Runners",
    "product_description": "Lightweight running shoes for daily training",
    "product_images": [
      { "image_url": "https://cdn.example.com/shoe.jpg", "labels": ["top view"] }
    ]
  },
  "ad_copies": [
    { "copy_type": "headline",    "copy_text": "Run Farther, Feel Lighter" },
    { "copy_type": "subheadline", "copy_text": "Built for everyday athletes" },
    { "copy_type": "cta",         "copy_text": "Shop Now" },
    { "copy_type": "offer",       "copy_text": "20% Off This Week", "price": "$79.99" }
  ],
  "generation_metadata": {
    "aspect_ratios": "1:1",
    "user_direction": "Outdoor trail scene with golden hour lighting",
    "language": "en-us",
    "no_text": false,
    "resolution": "1K",
    "reference_layouts": "https://cdn.example.com/reference.jpg"
  },
  "callback_url": "https://yourserver.com/webhooks/omneky"
}

brand_data

FieldRequiredDescription
brand_urlConditionalWebsite used for automatic brand extraction. Required unless brand_images are provided.
brand_nameOptionalBrand display name.
brand_imagesOptionalBrand assets such as logos or lifestyle imagery. Overrides scraped assets.
fontsOptionalBrand font URLs. Overrides fonts extracted from the website.
color_swatchesOptionalBrand colors (hex + label). Overrides colors extracted from the website.

product_metadata (optional)

FieldRequiredDescription
product_urlOptionalProduct page URL used during onboarding.
product_nameOptionalProduct name.
product_descriptionOptionalUsed for concept generation when user_direction is not provided.
product_imagesMandatoryMust be present. Pass an array, or null if unavailable.

ad_copies (optional)

FieldRequiredDescription
copy_typeMandatoryOne of headline, subheadline, cta, offer.
copy_textMandatoryCopy to display in the advertisement.
priceOptionalUsed only with the offer type.

generation_metadata

FieldRequiredDescription
aspect_ratiosOptionalOutput aspect ratio. Default 1:1.
user_directionOptionalCreative brief. When provided, automatic concept generation is skipped.
languageOptionalLanguage (BCP-47). Default en-us.
no_textOptionaltrue renders the ad without text. Default false.
resolutionOptional1K or 4K. Default 1K.
reference_layoutsOptionalReference advertisement layout URL.
callback_urlOptionalTop-level. Webhook endpoint that receives the final job result. See Webhooks.

Response — 202 Accepted

{
  "job_id": "a1b2c3d4-5678-90ab-cdef",
  "type": "image_ad"
}
2

Get job status

Returns the current status of a generation job. This endpoint is shared with video ad jobs — the type field indicates whether the job is "image_ad" or "video_ad". Jobs are private to the API key that created them.

GET/jobs/{job_id}
ParameterTypeDescription
job_idUUIDJob identifier returned during creation.
Jobs are private. The key used to poll must be the same key that created the job; any other key receives a 404.

Response — 200 OK

{
  "job_id": "a1b2c3d4-5678-90ab-cdef",
  "type": "image_ad",
  "status": "SUCCESS",
  "response": { "...": "generated ad" },
  "error": null
}

Job status values

StatusDescription
PENDINGWaiting in queue.
PROCESSINGGeneration is running.
SUCCESSGeneration completed successfully. The response field contains the result.
FAILEDGeneration failed. The error field contains the reason.

Background pipeline

Each submitted job passes through the following pipeline:

Step 1 — Brand onboarding (optional)

If brand_data.brand_url or product_metadata.product_url is supplied, Omneky extracts brand colors, fonts, logos, headlines, CTAs, and product information. Failures during onboarding do not fail the job.

Step 2 — Ad concept generation (optional)

If generation_metadata.user_direction is not supplied, Omneky generates an AI creative concept that becomes the creative brief. If user_direction is supplied, this step is skipped.

Step 3 — Image generation

The final payload — brand identity, product information, creative concept, and copy — is passed to Omneky's image generation model to produce the final advertisement.

Copy fallback logic. If headline, subheadline, or CTA are omitted, Omneky uses values extracted during brand onboarding. If those are unavailable, empty strings are sent to the generation model.

Webhooks

Instead of polling, provide a callback_url. When processing finishes, Omneky sends a POST request containing the same payload returned by the job-status endpoint.

{
  "job_id": "a1b2c3d4-5678-90ab-cdef",
  "type": "image_ad",
  "status": "SUCCESS",
  "response": { "...": "generated ad" },
  "error": null
}
{
  "job_id": "a1b2c3d4-5678-90ab-cdef",
  "type": "image_ad",
  "status": "FAILED",
  "response": null,
  "error": "Downstream generation model returned an error"
}
Webhook delivery failures are logged but do not affect the job result. Clients may always retrieve the final state via GET /jobs/{job_id}.

Error reference

HTTP statusDescription
401Missing or invalid API key.
403API key belongs to a deactivated account.
404Job not found, or it belongs to another API key.
422Validation error.
429Rate limit exceeded.
500Internal server error.

Recommended polling strategy

  1. Submit the generation request.
  2. Store the returned job_id.
  3. If a webhook was configured, wait for the callback.
  4. Otherwise: wait 30 seconds before the first poll, then poll every 60 seconds.
  5. Treat the request as timed out if it has not completed within 30 minutes.
Video Ads

Video Ad API

Generate brand-aligned, multi-scene product video ads. Typical completion time is 3–7 minutes.

Quickstart guide

Submit a job, then poll until it succeeds or fails. A minimal request needs brand, product, and generation metadata.

curl -X POST https://api.omneky.com/create_video_ad_async \
  -H "X-API-Key: sk-omn-api01-<your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "brand_metadata": {
      "brand_url": "https://yoursite.com",
      "brand_name": "Acme Co",
      "brand_images": null
    },
    "product_metadata": {
      "product_name": "Cloud Runners",
      "product_description": "Lightweight running shoes for daily training",
      "product_images": [
        { "image_url": "https://cdn.example.com/shoe.jpg" }
      ]
    },
    "generation_metadata": {
      "aspect_ratio": "9:16",
      "target_duration": 12,
      "locale": "en-US",
      "user_prompt": "Energetic morning run, urban trail setting"
    }
  }'
# → { "job_id": "a1b2c3d4-...", "type": "video_ad" }
# Poll until SUCCESS or FAILED
curl https://api.omneky.com/jobs/a1b2c3d4-... \
  -H "X-API-Key: sk-omn-api01-<your-key>"

Rate limits

Rate limits are enforced per API key using a fixed per-minute window. When the limit is hit, the server responds 429 with a Retry-After: N header indicating how many seconds until the window resets.

EndpointLimit
POST /create_video_ad_async10 requests / minute (hard cap)
GET /jobs/{job_id}Per-key configured limit (set in admin dashboard)
1

Create Video Ad

Submits a video generation job. Returns immediately with 202 Accepted and a job_id; generation runs in the background and typically completes in 3–7 minutes.

POST/create_video_ad_async

Request body

{
  "brand_metadata": {
    "brand_url": "https://www.peets.com",
    "brand_name": "Peet's Coffee",
    "brand_images": [
      { "image_url": "https://cdn.example.com/logo.png", "description": "Brand logo", "labels": ["logo"] },
      { "image_url": "https://cdn.example.com/lifestyle.jpg", "description": "Morning coffee ritual", "labels": ["lifestyle"] }
    ],
    "fonts": ["Montserrat", "Roboto"],
    "color_swatches": [
      { "hex": "#1A1A1A", "label": "Primary Black" },
      { "hex": "#C4A35A", "label": "Gold Accent" }
    ]
  },
  "product_metadata": {
    "product_url": "https://www.peets.com/products/big-bang",
    "product_name": "Peet's Big Bang Coffee",
    "product_description": "Bold whole bean coffee with a smooth finish and rich aroma.",
    "product_images": [
      { "image_url": "https://cdn.example.com/product-front.png", "description": "Product front view", "labels": ["top view"] },
      { "image_url": "https://cdn.example.com/product-closeup.png", "description": "Bean close-up", "labels": ["detail"] }
    ]
  },
  "ad_copies": [
    { "copy_type": "headline",    "copy_text": "Start Your Morning Bold" },
    { "copy_type": "subheadline", "copy_text": "Whole bean coffee, rich aroma" },
    { "copy_type": "cta",         "copy_text": "Shop Now" }
  ],
  "generation_metadata": {
    "aspect_ratio": "9:16",
    "target_duration": 12,
    "locale": "en-US",
    "user_prompt": "Lean into the morning ritual angle",
    "generate_sound": false
  },
  "callback_url": "https://yourserver.com/webhooks/omneky"
}

Field reference

ParameterRequirementDescription
brand_metadataMandatoryContainer for brand identity. Must be present.
brand_urlOptionalOmneky scrapes this to extract colors, fonts, and copy. Supply it when brand_images is null.
brand_nameOptionalBrand display name used in copy and the generation prompt.
brand_imagesMandatoryMust be present (can be null). Explicit images override anything inferred from brand_url.
fontsOptionalExplicit font list. Overrides fonts inferred from brand_url.
color_swatchesOptionalExplicit brand colors. Overrides colors inferred from brand_url.
product_metadataMandatoryContainer for product context.
product_urlOptionalProduct page URL. Used for the onboarding scrape when brand_url is absent.
product_nameOptionalName of the product being advertised.
product_descriptionOptionalUsed to generate the narrative, script, and scene descriptions.
product_imagesMandatoryAt least one product reference image is required for video generation.
ad_copiesOptionalList of copy lines rendered/narrated in the video.
copy_typeMandatoryOne of "headline", "subheadline", "cta", "offer".
copy_textMandatoryThe actual copy string.
priceOptionalPrice to display (e.g. "$79.99"). Only meaningful on the offer type.
generation_metadataMandatoryControls output format and duration.
aspect_ratioOptionalOne of "9:16", "16:9", "1:1". Default "9:16".
target_durationMandatoryTarget length in seconds. Must be between 10 and 15 (inclusive).
localeOptionalBCP-47 locale tag (e.g. "en-US", "es-MX"). Default "en-US".
user_promptOptionalFree-form creative direction. Guides narrative and scene generation.
generate_soundOptionaltrue generates background audio. Default false.
callback_urlOptionalWebhook URL to receive the result. See Webhooks.

Aspect ratio → orientation

aspect_ratioOrientation used internally
"9:16"portrait
"16:9"landscape
"1:1"square

Response — 202 Accepted

{
  "job_id": "a1b2c3d4-5678-...",
  "type": "video_ad"
}
2

Get job status

Poll this endpoint to check generation progress. It is shared with image ad jobs — the type field indicates whether the job is "video_ad" or "image_ad". For long-running jobs, prefer setting a callback_url instead of busy-polling.

GET/jobs/{job_id}
ParameterTypeDescription
job_idstring (UUID)The job_id returned by POST /create_video_ad_async.
Jobs are private. The key used to poll must be the same key that created the job; any other key receives a 404.

Response — 200 OK

{
  "job_id": "a1b2c3d4-5678-...",
  "type": "video_ad",
  "status": "SUCCESS",
  "response": { "...video generation result..." },
  "error": null
}

Job status values

StatusMeaning
PENDINGJob is queued; the pipeline has not started yet.
PROCESSINGPipeline is actively running.
SUCCESSGeneration complete. The response field contains the result.
FAILEDGeneration failed. The error field contains the reason.

Background pipeline

When a job is submitted, the following steps run in the background:

Step 1 — Brand onboarding (optional, non-fatal)

If brand_metadata.brand_url or product_metadata.product_url is provided, Omneky scrapes it to extract colors, fonts, headlines, CTAs, and product info. Explicit fonts and color_swatches override scraped values. Failure here is non-fatal — generation continues with what was supplied directly.

Step 2 — Narrative & script (mandatory)

Omneky's AI generates a narrative, voiceover script, and scene segments based on product info, images, target_duration, locale, and user_prompt.

Step 3 — Video generation (mandatory)

The assembled payload (brand identity + narrative + segments + copy) is passed to the multi-scene video generation model to produce the final product video.

Copy fallback chain. If ad_copies is not supplied, Omneky falls back to copy extracted during onboarding. If onboarding also has nothing, those fields are omitted. Product images: if product_images is empty but product_url is set, the product page is used as a fallback reference image.

Webhooks

Set callback_url in your request to receive a POST notification when the job finishes (success or failure) — the recommended alternative to polling. The payload is identical to the GET /jobs/{job_id} response.

{
  "job_id": "a1b2c3d4-5678-...",
  "type": "video_ad",
  "status": "SUCCESS",
  "response": { "...video generation result..." },
  "error": null
}
{
  "job_id": "a1b2c3d4-5678-...",
  "type": "video_ad",
  "status": "FAILED",
  "response": null,
  "error": "No narratives found"
}
Webhook delivery failures are logged but do not affect the job record. If your endpoint is temporarily unavailable, check GET /jobs/{job_id} as a fallback.

Error reference

HTTP codeWhen it occurs
401Missing or invalid X-API-Key header.
403API key is valid but the account is deactivated.
404Job not found, or it belongs to a different key.
422Request body failed validation (e.g. missing target_duration, duration outside 10–15, no product images).
429Rate limit exceeded — respect the Retry-After header.
500Unexpected server error.

Recommended polling strategy

  1. Submit the job and store the job_id.
  2. If you provided a callback_url, wait for the webhook.
  3. If polling: wait at least 60 seconds before the first poll, then poll every 90 seconds.
  4. Treat a job as timed out if it has not reached SUCCESS or FAILED after 45 minutes.

Need help?

If you run into any issues integrating the Omneky Image or Video Ad API, our team is one message away.

Contact support