{"openapi":"3.1.0","info":{"title":"Sume Public API","version":"1.0.0","summary":"Programmatic access to Sume generation jobs, credits, avatars, Brand DNA profiles, uploads, results, and Asset Library scenes.","description":"Use the Sume Public API from your server to create image, video, AI Ads video, and Face Swap generation jobs, run Reference Analysis, list usable avatars, read workspace Brand DNA profiles, upload videos for Asset Library processing or Face Swap source clips, poll job status, and retrieve generated outputs. The production base URL is `https://www.sume.so/api/v1`.\n\nAuthentication uses a workspace API key. Send `Authorization: Bearer <sume_api_key>` from a server-side environment. The legacy `X-Api-Key: <sume_api_key>` header is still accepted for existing dashboard-issued keys, but Bearer auth is the preferred format.\n\nPublic API calls are scoped to the workspace that owns the API key. Do not send user IDs or workspace IDs in request bodies; the server resolves scope from the key. Generation endpoints may reserve or spend credits according to the same billing paths used by the Sume web app. Jobs are asynchronous: create a job, poll `GET /jobs/{jobId}`, then retrieve outputs from `GET /jobs/{jobId}/result` or the returned public output URLs.\n\nList endpoints use cursor pagination with `limit` and `cursor` and return `{ \"object\": \"list\", \"data\": [], \"has_more\": false, \"next_cursor\": null }`. Error responses use `{ \"error\": { \"code\": \"...\", \"message\": \"...\", \"details\": {} }, \"request_id\": \"...\" }`.\n\nSume CLI wrappers should treat this OpenAPI document as the source of truth. Concrete public CLI commands are intentionally omitted until the public `sume-cli` surface is released."},"servers":[{"url":"https://www.sume.so/api/v1","description":"Production"}],"security":[{"BearerAuth":[]},{"LegacyApiKey":[]}],"tags":[{"name":"Account","description":"Inspect the workspace, user, API key, and credit balance resolved from the current API key."},{"name":"Brand","description":"Read sanitized website-derived Brand DNA profiles scoped to the API key workspace."},{"name":"Avatars","description":"List public and workspace-owned avatars that can be used by public generation endpoints."},{"name":"Generation","description":"Create asynchronous generation jobs and poll/retrieve their outputs."},{"name":"Uploads","description":"Create temporary upload URLs and finalize uploaded videos for Asset Library processing when applicable."},{"name":"Assets","description":"List and fetch Asset Library scene-level metadata derived from uploaded or generated videos."}],"paths":{"/me":{"get":{"tags":["Account"],"summary":"Get current API account context","description":"Returns the workspace, user, and API key metadata resolved from the API key. The full API secret is never returned.","operationId":"getCurrentAccount","responses":{"200":{"description":"Account context","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"},"examples":{"account":{"value":{"object":"account","request_id":"req_123","workspace":{"object":"workspace","id":"workspace_123","name":"Acme","slug":"acme"},"user":{"object":"user","id":"user_123","email":"developer@example.com"},"api_key":{"object":"api_key","id":"api_key_123","key_prefix":"sume_live_xxxxxxxxx","scopes":["avatars:read","avatars:write"],"last_used_at":"2026-06-22T00:00:00.000Z"}}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/credits":{"get":{"tags":["Account"],"summary":"Get credit balance","description":"Returns the current billing plan and monthly/bonus credit balance for the API key owner.","operationId":"getCredits","responses":{"200":{"description":"Credit summary","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Credits"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/brand":{"get":{"tags":["Brand"],"summary":"List Brand DNA profiles","description":"Lists sanitized website-derived Brand DNA profiles scoped to the API key workspace, newest first and deduplicated by domain. The first unfiltered profile has `current: true`, matching the Brand app's server fallback when no browser-local selection is available. Use `domain` to filter to one brand. This read-only endpoint does not expose raw crawl pages, provider usage, workflow ids, private storage keys, or signed media URLs.","operationId":"listBrands","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"domain","in":"query","description":"Optional domain or URL to filter by, for example `example.com` or `https://example.com/products/demo`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated Brand DNA profile list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrandList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/brand/current":{"get":{"tags":["Brand"],"summary":"Get current Brand DNA profile","description":"Returns the current Brand DNA profile for the API key workspace. Public API keys cannot read the browser-local Brand picker selection, so current means the freshest workspace Brand profile after the same per-domain dedupe used by the Brand app's initial server render.","operationId":"getCurrentBrand","responses":{"200":{"description":"Current Brand DNA profile","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Brand"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/avatars":{"get":{"tags":["Avatars"],"summary":"List usable avatars","description":"Lists public preset avatars plus workspace-owned UGC avatars available to the API key. Use the returned `id` or `slug` with AI Ads video and Face Swap creation endpoints.","operationId":"listAvatars","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["en","ko"],"default":"en"},"description":"Controls curated avatar ordering."}],"responses":{"200":{"description":"Avatar list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AvatarList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/avatars/{avatarId}":{"get":{"tags":["Avatars"],"summary":"Get an avatar","description":"Fetches one public-safe avatar record by avatar `id` or `slug`, scoped to the API key workspace.","operationId":"getAvatar","parameters":[{"name":"avatarId","in":"path","required":true,"schema":{"type":"string"},"description":"Avatar id or slug returned by `GET /avatars`."}],"responses":{"200":{"description":"Avatar details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Avatar"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/jobs":{"get":{"tags":["Generation"],"summary":"List generation jobs","description":"Lists jobs in the API key workspace, ordered newest first. Use public `type` values and `status` as filters when needed.","operationId":"listJobs","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"type","in":"query","description":"Public job type filter. Legacy internal type values are accepted for backward compatibility, but responses always use public types.","schema":{"type":"string","enum":["image_generation","video_generation","reference_analysis","audio_generation","face_swap","generation"]}},{"name":"status","in":"query","description":"Exact job status filter, for example `queued`, `processing`, `completed`, or `failed`.","schema":{"type":"string"}}],"responses":{"200":{"description":"Paginated job list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobList"}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/jobs/{jobId}":{"get":{"tags":["Generation"],"summary":"Get job status","description":"Fetches a single generation job in the API key workspace. Result payloads are omitted here; use `/jobs/{jobId}/result` when you need expanded result metadata.","operationId":"getJob","parameters":[{"$ref":"#/components/parameters/JobId"}],"responses":{"200":{"description":"Generation job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/jobs/{jobId}/result":{"get":{"tags":["Generation"],"summary":"Get job result","description":"Fetches a job with expanded result metadata when available. Reference Analysis jobs include `result.object = reference_analysis_result`; other job types expose public output URLs through `result_urls` and `output_urls`.","operationId":"getJobResult","parameters":[{"$ref":"#/components/parameters/JobId"}],"responses":{"200":{"description":"Generation job with result metadata","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Job"},{"type":"object","required":["result"],"properties":{"result":{"oneOf":[{"$ref":"#/components/schemas/ReferenceAnalysisResult"},{"type":"null"}]}}}]}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/images/generations":{"post":{"tags":["Generation"],"summary":"Create an image generation job","description":"Creates an asynchronous paid-ads image generation job. This endpoint may reserve/spend credits through the shared generation billing path.","operationId":"createImageGeneration","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGenerationRequest"},"examples":{"basic":{"value":{"prompt":"Create a clean skincare product ad on a white bathroom counter.","aspect_ratio":"1:1","image_count":1}}}}}},"responses":{"202":{"description":"Image job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImageGeneration"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/videos/generations":{"post":{"tags":["Generation"],"summary":"Create a video generation job","description":"Creates an asynchronous paid-ads video generation job. This endpoint may reserve/spend credits and returns the reserved credit count when available.","operationId":"createVideoGeneration","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGenerationRequest"},"examples":{"basic":{"value":{"prompt":"A creator demonstrates a vitamin serum in a bright studio.","aspect_ratio":"9:16","duration":5,"generate_audio":false}}}}}},"responses":{"202":{"description":"Video job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoGeneration"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/ads/videos":{"post":{"tags":["Generation"],"summary":"Create an AI Ads video job","description":"Creates an asynchronous AI Ads video job using the same Paid Ads service path as the web app. Use `GET /avatars` to select an avatar for `talking_heads` or `ugc_ads` formats. This endpoint may reserve/spend credits.","operationId":"createAdVideoGeneration","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdVideoGenerationRequest"},"examples":{"ugcAd":{"value":{"ad_format":"ugc_ads","avatar_id":"avatar_123","script":"Try this sunscreen before your morning commute.","duration_seconds":8,"aspect_ratio":"9:16","reference_image_urls":["https://media.sume.so/path-from-upload/product.png"]}},"talkingHead":{"value":{"ad_format":"talking_heads","avatar_slug":"sume-f-hana-kim","script":"This is the fastest way to introduce a new product benefit.","locale":"en"}}}}}},"responses":{"202":{"description":"AI Ads video job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdVideoGeneration"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/InternalError"}}}},"/face-swap":{"post":{"tags":["Generation"],"summary":"Create Face Swap jobs","description":"Creates one asynchronous Face Swap job per requested avatar using an uploaded source video. First create an upload URL with `POST /uploads/presign` using `purpose: \"face_swap_source_video\"`, upload the video bytes, then pass the returned `media_url` as `source_video_url`.","operationId":"createFaceSwap","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceSwapRequest"},"examples":{"basic":{"value":{"source_video_url":"https://media.sume.so/path-from-upload/source.mp4","source_file_name":"source.mp4","avatar_ids":["avatar_123"],"duration_seconds":6,"aspect_ratio":"9:16","locale":"ko"}}}}}},"responses":{"202":{"description":"Face Swap jobs accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceSwapGeneration"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"422":{"$ref":"#/components/responses/BadRequest"},"429":{"$ref":"#/components/responses/RateLimited"},"503":{"$ref":"#/components/responses/InternalError"}}}},"/reference-analysis":{"post":{"tags":["Generation"],"summary":"Create a Reference Analysis job","description":"Analyzes a public TikTok or Instagram Reel URL and creates an asynchronous Reference Analysis job. The current implementation returns `required_credits: 5` on accepted jobs and Korean output can be requested with `locale: \"ko\"`.","operationId":"createReferenceAnalysis","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceAnalysisRequest"},"examples":{"tiktok":{"value":{"url":"https://www.tiktok.com/@brand/video/1234567890","locale":"ko"}}}}}},"responses":{"202":{"description":"Reference Analysis job accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferenceAnalysis"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"402":{"$ref":"#/components/responses/InsufficientCredits"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/uploads/presign":{"post":{"tags":["Uploads"],"summary":"Create an upload URL","description":"Creates a temporary signed upload URL. Use `purpose: \"asset_library_video\"` for videos that will be finalized with `POST /assets`, or `purpose: \"face_swap_source_video\"` for source clips passed directly to `POST /face-swap`. Treat `upload_url` as sensitive.","operationId":"createUploadUrl","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPresignRequest"},"examples":{"video":{"value":{"purpose":"asset_library_video","file_name":"ad-reference.mp4","content_type":"video/mp4","size_bytes":12000000}},"faceSwapSource":{"value":{"purpose":"face_swap_source_video","file_name":"face-swap-source.mp4","content_type":"video/mp4","size_bytes":12000000}}}}}},"responses":{"200":{"description":"Temporary upload URL","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadPresign"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"}}}},"/assets":{"get":{"tags":["Assets"],"summary":"List Asset Library scenes","description":"Lists indexed scene-level Asset Library metadata for the API key workspace. Asset Library access may be feature-gated by workspace/user policy. Newly uploaded or generated videos may not appear until processing and scene indexing complete.","operationId":"listAssets","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"type","in":"query","description":"Optional exact filter against scene segment type or source video type. `scene` is accepted and treated as the default scene list.","schema":{"type":"string"}},{"name":"q","in":"query","description":"Optional natural-language or keyword query over indexed scene metadata. Public API search currently uses text/metadata search. Assets without scene metadata are not returned until indexing creates scene rows.","schema":{"type":"string"}},{"name":"search_mode","in":"query","description":"`auto` and `text` use text/metadata search.","schema":{"type":"string","enum":["auto","text"],"default":"auto"}},{"name":"source_type","in":"query","description":"Exact filter for the source video type, such as `upload` or `generated`.","schema":{"type":"string"}},{"name":"segment_type","in":"query","description":"Exact filter for the indexed scene segment type, such as `hook`, `product_demo`, or `cta`.","schema":{"type":"string"}},{"name":"brand","in":"query","description":"Case-insensitive substring filter against indexed brand mentions.","schema":{"type":"string"}},{"name":"product","in":"query","description":"Case-insensitive substring filter against indexed product mentions.","schema":{"type":"string"}},{"name":"tag","in":"query","description":"Case-insensitive substring filter against reusable asset tags.","schema":{"type":"string"}},{"name":"keyword","in":"query","description":"Case-insensitive substring filter against indexed search keywords.","schema":{"type":"string"}},{"name":"cta_present","in":"query","description":"Filter scenes by whether a call to action is present.","schema":{"type":"boolean"}},{"name":"min_duration_seconds","in":"query","description":"Minimum scene duration in seconds.","schema":{"type":"number"}},{"name":"max_duration_seconds","in":"query","description":"Maximum scene duration in seconds.","schema":{"type":"number"}},{"name":"created_after","in":"query","description":"Include scenes created at or after this ISO timestamp.","schema":{"type":"string","format":"date-time"}},{"name":"created_before","in":"query","description":"Include scenes created at or before this ISO timestamp.","schema":{"type":"string","format":"date-time"}},{"name":"sort","in":"query","description":"Sort order. `relevance` applies when `q` is present; otherwise results default to newest first.","schema":{"type":"string","enum":["relevance","created_at_desc","created_at_asc","duration_desc"],"default":"created_at_desc"}}],"responses":{"200":{"description":"Paginated asset scene list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetList"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}},"post":{"tags":["Uploads"],"summary":"Finalize uploaded asset","description":"Registers a previously uploaded video object, verifies that it is readable, and starts Asset Library processing. Use the `object_key` returned by `POST /uploads/presign`.","operationId":"finalizeUploadedAsset","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFinalizeRequest"}}}},"responses":{"202":{"description":"Asset upload accepted for processing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUpload"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"413":{"$ref":"#/components/responses/PayloadTooLarge"},"429":{"$ref":"#/components/responses/RateLimited"},"502":{"$ref":"#/components/responses/BadGateway"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/assets/{assetId}":{"get":{"tags":["Assets"],"summary":"Get Asset Library scene","description":"Fetches one scene-level Asset Library asset in the API key workspace.","operationId":"getAsset","parameters":[{"$ref":"#/components/parameters/AssetId"}],"responses":{"200":{"description":"Asset scene","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Asset"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","description":"Preferred API key transport: `Authorization: Bearer <sume_api_key>`."},"LegacyApiKey":{"type":"apiKey","in":"header","name":"X-Api-Key","description":"Legacy API key header supported for existing dashboard-issued keys."}},"parameters":{"Limit":{"name":"limit","in":"query","description":"Page size. Invalid or missing values default to 20. Values above 100 are clamped to 100.","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},"Cursor":{"name":"cursor","in":"query","description":"Opaque cursor returned as `next_cursor` from the previous page.","schema":{"type":"string"}},"JobId":{"name":"jobId","in":"path","required":true,"description":"Generation job ID.","schema":{"type":"string"}},"AssetId":{"name":"assetId","in":"path","required":true,"description":"Asset Library scene ID.","schema":{"type":"string"}}},"responses":{"BadRequest":{"description":"Malformed request, invalid JSON, or invalid input.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"Unauthorized":{"description":"Missing, invalid, or revoked API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"},"examples":{"missing":{"value":{"error":{"code":"missing_api_key","message":"Provide a Sume API key with Authorization: Bearer <key>."},"request_id":"req_123"}}}}}},"Forbidden":{"description":"The API key is valid but the workspace/user does not have access to this feature.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"NotFound":{"description":"Resource not found in the API key workspace or feature unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"Conflict":{"description":"Request conflicts with current account/job state, commonly due to active-generation limits or credit reservation conflicts.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"InsufficientCredits":{"description":"The account does not have enough credits for the requested generation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"PayloadTooLarge":{"description":"Uploaded video exceeds the current 50MB limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"RateLimited":{"description":"Request exceeded the configured route rate limit. Responses include `RateLimit-*` headers and may include `Retry-After`.","headers":{"RateLimit-Limit":{"schema":{"type":"integer"}},"RateLimit-Remaining":{"schema":{"type":"integer"}},"RateLimit-Reset":{"schema":{"type":"integer"}},"Retry-After":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"BadGateway":{"description":"Upstream or media processing failure.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"ServiceUnavailable":{"description":"Sume accepted prerequisite state but could not start the requested backend work.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}},"InternalError":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicApiError"}}}}},"schemas":{"PublicApiError":{"type":"object","required":["error","request_id"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object","additionalProperties":true}}},"request_id":{"type":"string"}}},"WorkspaceRef":{"type":"object","required":["object","id"],"properties":{"object":{"const":"workspace"},"id":{"type":"string"},"name":{"type":"string"},"slug":{"type":"string"}}},"UserRef":{"type":"object","required":["object","id"],"properties":{"object":{"const":"user"},"id":{"type":"string"},"email":{"type":["string","null"],"format":"email"}}},"Account":{"type":"object","required":["object","request_id","workspace","user","api_key"],"properties":{"object":{"const":"account"},"request_id":{"type":"string"},"workspace":{"$ref":"#/components/schemas/WorkspaceRef"},"user":{"$ref":"#/components/schemas/UserRef"},"api_key":{"type":"object","required":["object","id","key_prefix","scopes","last_used_at"],"properties":{"object":{"const":"api_key"},"id":{"type":"string"},"key_prefix":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"last_used_at":{"type":["string","null"],"format":"date-time"}}}}},"Credits":{"type":"object","required":["object","request_id","workspace","user","plan","plan_tier","billing_interval","month_key","monthly_credit_limit","monthly_credits_used","monthly_credits_remaining","bonus_credit_limit","bonus_credits_remaining","total_credit_limit","total_credits_remaining","max_active_generations"],"properties":{"object":{"const":"credits"},"request_id":{"type":"string"},"workspace":{"$ref":"#/components/schemas/WorkspaceRef"},"user":{"$ref":"#/components/schemas/UserRef"},"plan":{"type":["string","null"]},"plan_tier":{"type":["string","null"]},"billing_interval":{"type":["string","null"]},"month_key":{"type":"string"},"monthly_credit_limit":{"type":"integer"},"monthly_credits_used":{"type":"integer"},"monthly_credits_remaining":{"type":"integer"},"bonus_credit_limit":{"type":"integer"},"bonus_credits_remaining":{"type":"integer"},"total_credit_limit":{"type":"integer"},"total_credits_remaining":{"type":"integer"},"max_active_generations":{"type":"integer"}}},"Job":{"type":"object","required":["object","id","type","status","created_at","updated_at","result_urls","output_urls","error"],"properties":{"object":{"const":"job"},"id":{"type":"string"},"type":{"type":"string","enum":["image_generation","video_generation","reference_analysis","audio_generation","face_swap","generation"],"description":"Public Sume job type. Internal implementation task names are not exposed."},"status":{"type":"string","description":"Current job state, for example queued, processing, completed, failed, or canceled."},"created_at":{"type":["string","null"],"format":"date-time"},"updated_at":{"type":["string","null"],"format":"date-time"},"result_urls":{"type":"array","items":{"type":"string","format":"uri"}},"output_urls":{"type":"array","items":{"type":"string","format":"uri"}},"error":{"oneOf":[{"type":"null"},{"type":"object","required":["code","message","retryable"],"properties":{"code":{"type":["string","null"]},"message":{"type":"string"},"retryable":{"type":["boolean","null"]}}}]},"result":{"oneOf":[{"$ref":"#/components/schemas/ReferenceAnalysisResult"},{"type":"null"}]},"request_id":{"type":"string"}}},"JobList":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Job"}}}}]},"ReferenceAnalysisResult":{"type":"object","required":["object","source","persisted_media","analysis"],"properties":{"object":{"const":"reference_analysis_result"},"source":{"oneOf":[{"type":"null"},{"type":"object","additionalProperties":false,"properties":{"platform":{"type":"string"},"canonical_url":{"type":"string","format":"uri"},"platform_post_id":{"type":"string"},"author_handle":{"type":"string"},"duration_seconds":{"type":"number"},"stats":{"type":"object","additionalProperties":true}}}]},"persisted_media":{"oneOf":[{"type":"null"},{"type":"object","additionalProperties":false,"properties":{"asset_id":{"type":"string"},"source_kind":{"type":"string"},"content_type":{"type":"string"}}}]},"analysis":{"oneOf":[{"type":"null"},{"type":"object","additionalProperties":true,"properties":{"analysis":{"type":"object","additionalProperties":true},"markdown":{"type":"string"}}}]}}},"AvatarTags":{"type":["object","null"],"additionalProperties":false,"properties":{"gender":{"type":"string"},"ageRange":{"type":"string"},"vibe":{"type":"array","items":{"type":"string"}},"setting":{"type":"string"},"productFit":{"type":"array","items":{"type":"string"}},"languages":{"type":"array","items":{"type":"string"}},"description":{"type":"string"}}},"Avatar":{"type":"object","required":["object","id","slug","display_name","visibility","tags","media","capabilities","created_at"],"properties":{"object":{"const":"avatar"},"id":{"type":"string"},"slug":{"type":"string"},"display_name":{"type":"string"},"visibility":{"type":"string","enum":["public","workspace"]},"tags":{"$ref":"#/components/schemas/AvatarTags"},"media":{"type":"object","required":["thumbnail_url","card_image_url","preview_video_url","reference_image_urls"],"properties":{"thumbnail_url":{"type":["string","null"],"format":"uri"},"card_image_url":{"type":["string","null"],"format":"uri"},"preview_video_url":{"type":["string","null"],"format":"uri"},"reference_image_urls":{"type":"array","items":{"type":"string","format":"uri"}}},"additionalProperties":false},"capabilities":{"type":"object","required":["talking_head_video","ugc_ad_video","face_swap"],"properties":{"talking_head_video":{"type":"boolean"},"ugc_ad_video":{"type":"boolean"},"face_swap":{"type":"boolean"}},"additionalProperties":false},"created_at":{"type":["string","null"],"format":"date-time"}},"additionalProperties":false},"AvatarList":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Avatar"}}}}]},"ImageGenerationRequest":{"type":"object","properties":{"prompt":{"type":"string"},"model":{"type":"string","description":"Advanced Sume model alias. Omit this unless Sume support has provided a stable alias for your workspace."},"image_model":{"type":"string","description":"Deprecated alias for `model`; prefer omitting it unless Sume support has provided a stable alias."},"aspect_ratio":{"type":"string"},"image_aspect_ratio":{"type":"string"},"resolution":{"type":"string"},"image_resolution":{"type":"string"},"quality":{"type":"string"},"image_quality":{"type":"string"},"n":{"type":"integer","minimum":1},"image_count":{"type":"integer","minimum":1},"template_id":{"type":"string"},"template_title":{"type":"string"},"reference_image_urls":{"type":"array","description":"HTTPS image reference URLs. `Brand.images[].reference_url` values may be used here when present.","items":{"type":"string","format":"uri"}},"referenceImageUrls":{"type":"array","description":"CamelCase alias for `reference_image_urls`.","items":{"type":"string","format":"uri"}},"brand_context_job_id":{"type":"string"}},"additionalProperties":true},"ImageGeneration":{"type":"object","required":["object","id","job_id","status","reused","request_id"],"properties":{"object":{"const":"image_generation"},"id":{"type":"string"},"job_id":{"type":"string"},"status":{"type":"string"},"reused":{"type":"boolean"},"request_id":{"type":"string"}}},"VideoGenerationRequest":{"type":"object","properties":{"prompt":{"type":"string"},"template_id":{"type":"string"},"template_title":{"type":"string"},"aspect_ratio":{"type":"string"},"duration":{"type":"number"},"generate_audio":{"type":"boolean"},"generateAudio":{"type":"boolean"},"resolution":{"type":"string"},"model":{"type":"string","description":"Advanced Sume model alias. Omit this unless Sume support has provided a stable alias for your workspace."},"video_model":{"type":"string","description":"Deprecated alias for `model`; prefer omitting it unless Sume support has provided a stable alias."},"avatar_slug":{"type":"string"},"cast_id":{"type":"string"}},"additionalProperties":true},"VideoGeneration":{"type":"object","required":["object","id","job_id","status","reused","reserved_credits","request_id"],"properties":{"object":{"const":"video_generation"},"id":{"type":"string"},"job_id":{"type":"string"},"status":{"type":"string"},"reused":{"type":"boolean"},"reserved_credits":{"type":["integer","null"]},"request_id":{"type":"string"}}},"AdVideoGenerationRequest":{"type":"object","required":["script"],"properties":{"ad_format":{"type":"string","enum":["talking_heads","ugc_ads","video"],"default":"talking_heads","description":"`talking_heads` and `ugc_ads` require an avatar. `video` creates a prompt-only paid-ads video."},"avatar_id":{"type":"string","description":"Avatar id returned by `GET /avatars`."},"avatar_slug":{"type":"string","description":"Avatar slug returned by `GET /avatars`."},"script":{"type":"string","minLength":3,"maxLength":1800},"prompt":{"type":"string","deprecated":true,"description":"Deprecated alias for `script`."},"locale":{"type":"string","enum":["en","ko"],"default":"en"},"duration_seconds":{"type":"number","description":"Requested duration in seconds. Sume may clamp to supported durations by ad format."},"aspect_ratio":{"type":"string","default":"9:16"},"resolution":{"type":"string","enum":["480p","720p"],"default":"480p"},"generate_audio":{"type":"boolean","default":true},"reference_image_urls":{"type":"array","maxItems":9,"description":"HTTPS image references such as uploaded product images.","items":{"type":"string","format":"uri"}},"prompt_reference_image_count":{"type":"integer","minimum":0,"description":"Number of trailing `reference_image_urls` addressed by @ref1, @ref2, ... tokens in the script."},"reference_audio_urls":{"type":"array","maxItems":3,"items":{"type":"string","format":"uri"}},"reference_video_urls":{"type":"array","maxItems":3,"description":"Only supported for `ad_format: \"video\"`.","items":{"type":"string","format":"uri"}}},"additionalProperties":false},"AdVideoGeneration":{"type":"object","required":["object","id","job_id","status","ad_format","avatar_id","avatar_slug","reserved_credits","billing_mode","duration_seconds","request_id"],"properties":{"object":{"const":"ad_video_generation"},"id":{"type":"string"},"job_id":{"type":"string"},"status":{"type":"string","enum":["queued"]},"ad_format":{"type":"string","enum":["talking_heads","ugc_ads","video"]},"avatar_id":{"type":["string","null"]},"avatar_slug":{"type":["string","null"]},"reserved_credits":{"type":"integer"},"billing_mode":{"type":"string","enum":["plan_credits","promotional_grant"]},"duration_seconds":{"type":"number"},"request_id":{"type":"string"}},"additionalProperties":false},"FaceSwapRequest":{"type":"object","required":["source_video_url","avatar_ids","duration_seconds"],"properties":{"source_video_url":{"type":"string","format":"uri","description":"Sume media URL returned by `POST /uploads/presign` with `purpose: \"face_swap_source_video\"`."},"sourceVideoUrl":{"type":"string","format":"uri","deprecated":true},"source_file_name":{"type":"string"},"sourceFileName":{"type":"string","deprecated":true},"avatar_ids":{"type":"array","minItems":1,"maxItems":5,"items":{"type":"string"}},"avatarIds":{"type":"array","deprecated":true,"items":{"type":"string"}},"avatar_id":{"type":"string","description":"Single-avatar shorthand."},"avatarId":{"type":"string","deprecated":true},"duration_seconds":{"type":"number","maximum":15},"durationSeconds":{"type":"number","maximum":15,"deprecated":true},"trim_start_seconds":{"type":"number","minimum":0,"default":0},"trimStartSeconds":{"type":"number","minimum":0,"deprecated":true},"trim_end_seconds":{"type":["number","null"],"minimum":0},"trimEndSeconds":{"type":["number","null"],"minimum":0,"deprecated":true},"aspect_ratio":{"type":"string","enum":["16:9","9:16","1:1","4:3","3:4","21:9"],"default":"9:16"},"aspectRatio":{"type":"string","deprecated":true},"locale":{"type":"string","enum":["en","ko"],"default":"en"}},"additionalProperties":false},"FaceSwapGeneration":{"type":"object","required":["object","id","job_id","job_ids","status","reserved_credits","reserved_credits_per_job","duration_seconds","billable_duration_seconds","request_id"],"properties":{"object":{"const":"face_swap"},"id":{"type":["string","null"]},"job_id":{"type":["string","null"]},"job_ids":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"reserved_credits":{"type":"integer"},"reserved_credits_per_job":{"type":"integer"},"duration_seconds":{"type":"number"},"billable_duration_seconds":{"type":"number"},"request_id":{"type":"string"}}},"ReferenceAnalysisRequest":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Public TikTok or Instagram Reel URL."},"locale":{"type":"string","enum":["en","ko"],"default":"en"}},"additionalProperties":false},"ReferenceAnalysis":{"type":"object","required":["object","id","job_id","status","required_credits","request_id"],"properties":{"object":{"const":"reference_analysis"},"id":{"type":"string"},"job_id":{"type":"string"},"status":{"type":"string"},"required_credits":{"type":"integer","example":5},"request_id":{"type":"string"}}},"UploadPresignRequest":{"type":"object","required":["file_name","content_type","size_bytes"],"properties":{"purpose":{"type":"string","enum":["asset_library_video","face_swap_source_video"],"default":"asset_library_video"},"file_name":{"type":"string"},"fileName":{"type":"string"},"content_type":{"type":"string","example":"video/mp4"},"contentType":{"type":"string"},"size_bytes":{"type":"number","maximum":52428800},"sizeBytes":{"type":"number","maximum":52428800}}},"UploadPresign":{"type":"object","required":["object","purpose","upload_url","object_key","media_url","required_headers","request_id"],"properties":{"object":{"const":"upload"},"purpose":{"type":"string","enum":["asset_library_video","face_swap_source_video"]},"upload_url":{"type":"string","format":"uri","description":"Temporary signed URL. Treat as sensitive."},"object_key":{"type":"string"},"media_url":{"type":"string","format":"uri"},"required_headers":{"type":"object","additionalProperties":{"type":"string"}},"request_id":{"type":"string"}}},"AssetFinalizeRequest":{"type":"object","required":["object_key","file_name","content_type","size_bytes"],"properties":{"object_key":{"type":"string"},"objectKey":{"type":"string"},"file_name":{"type":"string"},"fileName":{"type":"string"},"content_type":{"type":"string"},"contentType":{"type":"string"},"size_bytes":{"type":"number","maximum":52428800},"sizeBytes":{"type":"number","maximum":52428800}}},"AssetUpload":{"type":"object","required":["object","id","video_id","media_asset_id","status","request_id"],"properties":{"object":{"const":"asset_upload"},"id":{"type":"string"},"video_id":{"type":"string"},"media_asset_id":{"type":"string"},"status":{"type":"string","example":"processing","description":"Public processing state for the uploaded asset."},"request_id":{"type":"string"}}},"Asset":{"type":"object","required":["object","id","type","title","media_url","thumbnail_url","source_type","search","source_video","scene","created_at"],"properties":{"object":{"const":"asset"},"id":{"type":"string"},"type":{"const":"scene"},"title":{"type":"string"},"media_url":{"type":["string","null"],"format":"uri"},"thumbnail_url":{"type":["string","null"],"format":"uri"},"source_type":{"type":["string","null"]},"search":{"type":"object","required":["mode","score","query"],"properties":{"mode":{"type":"string","enum":["none","text","vector"],"description":"Search strategy used for this result. Public API list/search currently returns `none` for latest/list rows or `text` for query/filter rows. `vector` is reserved for a future guarded semantic-search path."},"score":{"type":["number","null"],"description":"Relevance score when a search query was used."},"query":{"type":["string","null"],"description":"Normalized search query that produced this result."}}},"source_video":{"type":"object","required":["object","id","media_asset_id","file_name","media_url","duration_seconds","generation_job_id"],"properties":{"object":{"const":"asset_video"},"id":{"type":"string"},"media_asset_id":{"type":["string","null"]},"file_name":{"type":["string","null"]},"media_url":{"type":["string","null"],"format":"uri","description":"Safe public URL for the full source video when available. Signed/private URLs are omitted."},"duration_seconds":{"type":["number","null"]},"generation_job_id":{"type":["string","null"]}}},"scene":{"$ref":"#/components/schemas/AssetSceneMetadata"},"created_at":{"type":["string","null"],"format":"date-time"},"request_id":{"type":"string"}}},"AssetSceneMetadata":{"type":"object","required":["index","start_seconds","end_seconds","duration_seconds","segment_type","transcript","visual_description","action_description","on_screen_text","product_mentions","brand_mentions","narrative_role","camera_framing","camera_motion","setting","people_or_subjects","cta_present","confidence","confidence_label","lighting","emotion_or_tone","wardrobe_or_styling","product_state","scene_transition_reason","reusable_asset_tags","search_keywords","recommended_clip_title","boundary_confidence"],"properties":{"index":{"type":"integer"},"start_seconds":{"type":"number"},"end_seconds":{"type":"number"},"duration_seconds":{"type":["number","null"]},"segment_type":{"type":["string","null"]},"transcript":{"type":["string","null"]},"visual_description":{"type":["string","null"]},"action_description":{"type":["string","null"]},"on_screen_text":{"type":"array","items":{"type":"string"}},"product_mentions":{"type":"array","items":{"type":"string"}},"brand_mentions":{"type":"array","items":{"type":"string"}},"narrative_role":{"type":["string","null"]},"camera_framing":{"type":["string","null"]},"camera_motion":{"type":["string","null"]},"setting":{"type":["string","null"]},"people_or_subjects":{"type":"array","items":{"type":"string"}},"cta_present":{"type":["boolean","null"]},"confidence":{"type":["number","null"]},"confidence_label":{"type":["string","null"]},"lighting":{"type":["string","null"]},"emotion_or_tone":{"type":["string","null"]},"wardrobe_or_styling":{"type":["string","null"]},"product_state":{"type":["string","null"]},"scene_transition_reason":{"type":["string","null"]},"reusable_asset_tags":{"type":"array","items":{"type":"string"}},"search_keywords":{"type":"array","items":{"type":"string"}},"recommended_clip_title":{"type":["string","null"]},"boundary_confidence":{"type":["number","null"]}}},"AssetList":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Asset"}}}}]},"ListEnvelope":{"type":"object","required":["object","data","has_more","next_cursor","request_id"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{}},"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]},"request_id":{"type":"string"}}},"BrandTypography":{"type":"object","required":["primary","notes"],"properties":{"primary":{"type":["string","null"]},"notes":{"type":["string","null"]}}},"BrandColors":{"type":"object","required":["primary","accent","notes"],"properties":{"primary":{"type":"array","items":{"type":"string"}},"accent":{"type":"array","items":{"type":"string"}},"notes":{"type":["string","null"]}}},"BrandVisuals":{"type":"object","required":["logo_url","brand_image_urls","product_image_urls"],"properties":{"logo_url":{"type":["string","null"],"format":"uri"},"brand_image_urls":{"type":"array","items":{"type":"string","format":"uri"}},"product_image_urls":{"type":"array","items":{"type":"string","format":"uri"}}}},"BrandProfile":{"type":"object","required":["brand_name","one_line_summary","company_description","product_name","product_description","business_type","product_category","target_customers","buyer_personas","value_props","products_or_services","brand_voice","offer_hints","proof_points","paid_ad_angles","cautions","typography","colors","visuals"],"properties":{"brand_name":{"type":["string","null"]},"one_line_summary":{"type":["string","null"]},"company_description":{"type":["string","null"]},"product_name":{"type":["string","null"]},"product_description":{"type":["string","null"]},"business_type":{"type":["string","null"]},"product_category":{"type":["string","null"]},"target_customers":{"type":"array","items":{"type":"string"}},"buyer_personas":{"type":"array","items":{"type":"string"}},"value_props":{"type":"array","items":{"type":"string"}},"products_or_services":{"type":"array","items":{"type":"string"}},"brand_voice":{"type":"array","items":{"type":"string"}},"offer_hints":{"type":"array","items":{"type":"string"}},"proof_points":{"type":"array","items":{"type":"string"}},"paid_ad_angles":{"type":"array","items":{"type":"string"}},"cautions":{"type":"array","items":{"type":"string"}},"typography":{"$ref":"#/components/schemas/BrandTypography"},"colors":{"$ref":"#/components/schemas/BrandColors"},"visuals":{"$ref":"#/components/schemas/BrandVisuals"}}},"BrandProductDetails":{"type":"object","required":["hero_product_name","form_factor","ingredients_or_materials","how_to_use","use_cases","variants","sizes_or_specs","price_and_offers","shipping_and_returns","claims_and_benefits","proof_points","source_urls"],"properties":{"hero_product_name":{"type":["string","null"]},"form_factor":{"type":["string","null"]},"ingredients_or_materials":{"type":"array","items":{"type":"string"}},"how_to_use":{"type":"array","items":{"type":"string"}},"use_cases":{"type":"array","items":{"type":"string"}},"variants":{"type":"array","items":{"type":"string"}},"sizes_or_specs":{"type":"array","items":{"type":"string"}},"price_and_offers":{"type":"array","items":{"type":"string"}},"shipping_and_returns":{"type":"array","items":{"type":"string"}},"claims_and_benefits":{"type":"array","items":{"type":"string"}},"proof_points":{"type":"array","items":{"type":"string"}},"source_urls":{"type":"array","items":{"type":"string","format":"uri"}}}},"BrandProduct":{"type":"object","required":["object","name","title","description","url","short_description","price","compare_at_price","currency","form_factor","application_areas","texture","color_or_appearance","scent","finish","routine_step","usage_amount","avoid_areas","ingredients_or_materials","how_to_use","use_cases","variants","sizes_or_specs","claims_and_benefits","proof_points","hero_image_url","gallery_image_urls","reference_image_urls","images"],"properties":{"object":{"const":"brand_product"},"name":{"type":"string"},"title":{"type":"string"},"description":{"type":["string","null"]},"url":{"type":["string","null"],"format":"uri"},"short_description":{"type":["string","null"]},"price":{"type":["string","null"]},"compare_at_price":{"type":["string","null"]},"currency":{"type":["string","null"]},"form_factor":{"type":["string","null"]},"application_areas":{"type":"array","items":{"type":"string"}},"texture":{"type":["string","null"]},"color_or_appearance":{"type":["string","null"]},"scent":{"type":["string","null"]},"finish":{"type":["string","null"]},"routine_step":{"type":["string","null"]},"usage_amount":{"type":["string","null"]},"avoid_areas":{"type":"array","items":{"type":"string"}},"ingredients_or_materials":{"type":"array","items":{"type":"string"}},"how_to_use":{"type":"array","items":{"type":"string"}},"use_cases":{"type":"array","items":{"type":"string"}},"variants":{"type":"array","items":{"type":"string"}},"sizes_or_specs":{"type":"array","items":{"type":"string"}},"claims_and_benefits":{"type":"array","items":{"type":"string"}},"proof_points":{"type":"array","items":{"type":"string"}},"hero_image_url":{"type":["string","null"],"format":"uri"},"gallery_image_urls":{"type":"array","items":{"type":"string","format":"uri"}},"reference_image_urls":{"type":"array","items":{"type":"string","format":"uri"}},"images":{"type":"array","description":"Structured product image references. When `reference_url` is non-null, it may be passed to image generation `reference_image_urls`.","items":{"$ref":"#/components/schemas/BrandImage"}}}},"BrandImage":{"type":"object","required":["object","role","source","url","reference_url","usable_as_reference","title","alt","product_name"],"properties":{"object":{"const":"brand_image"},"role":{"type":"string","enum":["logo","brand","product","product_hero","product_gallery","product_reference"]},"source":{"type":"string","enum":["brand_profile","product_catalog"]},"url":{"type":"string","format":"uri"},"reference_url":{"type":["string","null"],"format":"uri","description":"HTTPS public URL that can be passed to image generation `reference_image_urls` when present."},"usable_as_reference":{"type":"boolean","description":"True when `reference_url` is present and safe for current public image generation reference input."},"title":{"type":["string","null"]},"alt":{"type":["string","null"]},"product_name":{"type":["string","null"]}}},"Brand":{"type":"object","required":["object","current","domain","source_url","status","crawl_up_to_date","has_crawl_output","updated_at","completed_at","profile","product_details","products","images"],"properties":{"object":{"const":"brand"},"current":{"type":"boolean","description":"True for the current server-fallback Brand profile: the freshest workspace Brand after per-domain dedupe."},"domain":{"type":"string"},"source_url":{"type":["string","null"],"format":"uri"},"status":{"type":"string"},"crawl_up_to_date":{"type":"boolean"},"has_crawl_output":{"type":"boolean"},"updated_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"profile":{"$ref":"#/components/schemas/BrandProfile"},"product_details":{"oneOf":[{"$ref":"#/components/schemas/BrandProductDetails"},{"type":"null"}]},"products":{"type":"array","items":{"$ref":"#/components/schemas/BrandProduct"}},"images":{"type":"array","description":"Structured Brand and product image references. Use `reference_url` values with image generation `reference_image_urls` when present.","items":{"$ref":"#/components/schemas/BrandImage"}}}},"BrandList":{"allOf":[{"$ref":"#/components/schemas/ListEnvelope"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Brand"}}}}]}}}}