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.
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.
Brighter skin in 14 days
Dermatologist tested · vegan formula
Shop NowAuthentication
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>
| Header | Format | Where to get it |
|---|---|---|
| X-API-Key | sk-omn-api01-<random> | Omneky Admin Dashboard |
Retry-After header).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 generate | Credits |
|---|---|
| Image Generation (1K quality) — via prompt, product data, assets, and/or reference ad style | 5 |
| Image Generation (4K quality) — same as above, in 4K | 10 |
| Image Edit or Upscale — prompt editing, upscale to 4K, copy & resize | 5 |
| Image Layering — image deconstructed into a layered file for editing | 10 |
Video ad generation & editing
| What you generate | Credits |
|---|---|
| Product Animation Video with sound — 8-second image animation | 10 |
| Short Commercial (formerly Professional Product Video) | 30 |
| AI Avatar Video without Product — avatar video, no product, motion, or emotion | 15 |
| AI Avatar Video using Product — avatar using, wearing, or in product / room / location | 20 |
| 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 Regeneration | 20 |
| Clone a winning video into your own branded video | 5 / sec |
| Edit a video — remove or change object, adjust color, lighting, or background | 2 / sec |
| Video Auto-Splicing into Storyboard Clips — per camera cut | Free |
AI insights & launching
| What you do | Credits |
|---|---|
| Connect ad accounts per ad network for direct-integrated launching | Free |
| Connect ad accounts per ad network for basic campaign / ad group / ad-level reporting | Free |
| AI Creative Performance Insights | 1 / image ad · 2 / video ad |
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.
| Endpoint | Limit |
|---|---|
| POST /create_image_ad_async | 10 requests / minute |
| GET /jobs/{job_id} | Configurable per API key |
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.
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
| Field | Required | Description |
|---|---|---|
| brand_url | Conditional | Website used for automatic brand extraction. Required unless brand_images are provided. |
| brand_name | Optional | Brand display name. |
| brand_images | Optional | Brand assets such as logos or lifestyle imagery. Overrides scraped assets. |
| fonts | Optional | Brand font URLs. Overrides fonts extracted from the website. |
| color_swatches | Optional | Brand colors (hex + label). Overrides colors extracted from the website. |
product_metadata (optional)
| Field | Required | Description |
|---|---|---|
| product_url | Optional | Product page URL used during onboarding. |
| product_name | Optional | Product name. |
| product_description | Optional | Used for concept generation when user_direction is not provided. |
| product_images | Mandatory | Must be present. Pass an array, or null if unavailable. |
ad_copies (optional)
| Field | Required | Description |
|---|---|---|
| copy_type | Mandatory | One of headline, subheadline, cta, offer. |
| copy_text | Mandatory | Copy to display in the advertisement. |
| price | Optional | Used only with the offer type. |
generation_metadata
| Field | Required | Description |
|---|---|---|
| aspect_ratios | Optional | Output aspect ratio. Default 1:1. |
| user_direction | Optional | Creative brief. When provided, automatic concept generation is skipped. |
| language | Optional | Language (BCP-47). Default en-us. |
| no_text | Optional | true renders the ad without text. Default false. |
| resolution | Optional | 1K or 4K. Default 1K. |
| reference_layouts | Optional | Reference advertisement layout URL. |
| callback_url | Optional | Top-level. Webhook endpoint that receives the final job result. See Webhooks. |
Response — 202 Accepted
{ "job_id": "a1b2c3d4-5678-90ab-cdef", "type": "image_ad" }
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.
| Parameter | Type | Description |
|---|---|---|
| job_id | UUID | Job identifier returned during creation. |
404.Response — 200 OK
{ "job_id": "a1b2c3d4-5678-90ab-cdef", "type": "image_ad", "status": "SUCCESS", "response": { "...": "generated ad" }, "error": null }
Job status values
| Status | Description |
|---|---|
| PENDING | Waiting in queue. |
| PROCESSING | Generation is running. |
| SUCCESS | Generation completed successfully. The response field contains the result. |
| FAILED | Generation 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.
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" }
GET /jobs/{job_id}.Error reference
| HTTP status | Description |
|---|---|
| 401 | Missing or invalid API key. |
| 403 | API key belongs to a deactivated account. |
| 404 | Job not found, or it belongs to another API key. |
| 422 | Validation error. |
| 429 | Rate limit exceeded. |
| 500 | Internal server error. |
Recommended polling strategy
- Submit the generation request.
- Store the returned
job_id. - If a webhook was configured, wait for the callback.
- Otherwise: wait 30 seconds before the first poll, then poll every 60 seconds.
- Treat the request as timed out if it has not completed within 30 minutes.
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.
| Endpoint | Limit |
|---|---|
| POST /create_video_ad_async | 10 requests / minute (hard cap) |
| GET /jobs/{job_id} | Per-key configured limit (set in admin dashboard) |
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.
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
| Parameter | Requirement | Description |
|---|---|---|
| brand_metadata | Mandatory | Container for brand identity. Must be present. |
| ↳ brand_url | Optional | Omneky scrapes this to extract colors, fonts, and copy. Supply it when brand_images is null. |
| ↳ brand_name | Optional | Brand display name used in copy and the generation prompt. |
| ↳ brand_images | Mandatory | Must be present (can be null). Explicit images override anything inferred from brand_url. |
| ↳ fonts | Optional | Explicit font list. Overrides fonts inferred from brand_url. |
| ↳ color_swatches | Optional | Explicit brand colors. Overrides colors inferred from brand_url. |
| product_metadata | Mandatory | Container for product context. |
| ↳ product_url | Optional | Product page URL. Used for the onboarding scrape when brand_url is absent. |
| ↳ product_name | Optional | Name of the product being advertised. |
| ↳ product_description | Optional | Used to generate the narrative, script, and scene descriptions. |
| ↳ product_images | Mandatory | At least one product reference image is required for video generation. |
| ad_copies | Optional | List of copy lines rendered/narrated in the video. |
| ↳ copy_type | Mandatory | One of "headline", "subheadline", "cta", "offer". |
| ↳ copy_text | Mandatory | The actual copy string. |
| ↳ price | Optional | Price to display (e.g. "$79.99"). Only meaningful on the offer type. |
| generation_metadata | Mandatory | Controls output format and duration. |
| ↳ aspect_ratio | Optional | One of "9:16", "16:9", "1:1". Default "9:16". |
| ↳ target_duration | Mandatory | Target length in seconds. Must be between 10 and 15 (inclusive). |
| ↳ locale | Optional | BCP-47 locale tag (e.g. "en-US", "es-MX"). Default "en-US". |
| ↳ user_prompt | Optional | Free-form creative direction. Guides narrative and scene generation. |
| ↳ generate_sound | Optional | true generates background audio. Default false. |
| callback_url | Optional | Webhook URL to receive the result. See Webhooks. |
Aspect ratio → orientation
| aspect_ratio | Orientation used internally |
|---|---|
| "9:16" | portrait |
| "16:9" | landscape |
| "1:1" | square |
Response — 202 Accepted
{ "job_id": "a1b2c3d4-5678-...", "type": "video_ad" }
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.
| Parameter | Type | Description |
|---|---|---|
| job_id | string (UUID) | The job_id returned by POST /create_video_ad_async. |
404.Response — 200 OK
{ "job_id": "a1b2c3d4-5678-...", "type": "video_ad", "status": "SUCCESS", "response": { "...video generation result..." }, "error": null }
Job status values
| Status | Meaning |
|---|---|
| PENDING | Job is queued; the pipeline has not started yet. |
| PROCESSING | Pipeline is actively running. |
| SUCCESS | Generation complete. The response field contains the result. |
| FAILED | Generation 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.
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" }
GET /jobs/{job_id} as a fallback.Error reference
| HTTP code | When it occurs |
|---|---|
| 401 | Missing or invalid X-API-Key header. |
| 403 | API key is valid but the account is deactivated. |
| 404 | Job not found, or it belongs to a different key. |
| 422 | Request body failed validation (e.g. missing target_duration, duration outside 10–15, no product images). |
| 429 | Rate limit exceeded — respect the Retry-After header. |
| 500 | Unexpected server error. |
Recommended polling strategy
- Submit the job and store the
job_id. - If you provided a
callback_url, wait for the webhook. - If polling: wait at least 60 seconds before the first poll, then poll every 90 seconds.
- Treat a job as timed out if it has not reached
SUCCESSorFAILEDafter 45 minutes.
Need help?
If you run into any issues integrating the Omneky Image or Video Ad API, our team is one message away.