{"components":{"schemas":{"Actor":{"properties":{"age_band":{"enum":["18-24","25-34","35-44","45-54","55+"],"type":"string"},"attributes":{"additionalProperties":true,"type":"object"},"created_at":{"format":"date-time","type":"string"},"ethnicity":{"type":"string"},"gender_presentation":{"nullable":true,"type":"string"},"id":{"format":"uuid","type":"string"},"name":{"nullable":true,"type":"string"},"primary_variant":{"allOf":[{"$ref":"#/components/schemas/ActorVariant"}],"nullable":true},"prompt":{"type":"string"},"status":{"enum":["draft","generating","ready","failed","archived"],"type":"string"},"updated_at":{"format":"date-time","type":"string"},"user_id":{"format":"uuid","type":"string"},"variant_count":{"type":"integer"},"variants":{"items":{"$ref":"#/components/schemas/ActorVariant"},"type":"array"}},"type":"object"},"ActorVariant":{"properties":{"actor_id":{"format":"uuid","type":"string"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"image_url":{"nullable":true,"type":"string"},"is_primary":{"type":"boolean"},"metadata":{"additionalProperties":true,"type":"object"},"prompt":{"type":"string"},"replicate_model":{"nullable":true,"type":"string"},"replicate_prediction_id":{"nullable":true,"type":"string"},"seed":{"nullable":true,"type":"string"},"status":{"enum":["generating","ready","failed"],"type":"string"},"thumbnail_url":{"nullable":true,"type":"string"},"updated_at":{"format":"date-time","type":"string"},"user_id":{"format":"uuid","type":"string"}},"type":"object"},"AgentOutputs":{"properties":{"meta":{"additionalProperties":true,"type":"object"},"script_writer":{"additionalProperties":true,"type":"object"},"story_writer":{"additionalProperties":true,"type":"object"}},"type":"object"},"ErrorResponse":{"properties":{"error":{"type":"string"},"message":{"type":"string"}},"required":["error"],"type":"object"},"Job":{"properties":{"actor_variant_id":{"format":"uuid","nullable":true,"type":"string"},"created_at":{"format":"date-time","type":"string"},"id":{"format":"uuid","type":"string"},"image_url":{"nullable":true,"type":"string"},"output_video_url":{"nullable":true,"type":"string"},"prompt":{"nullable":true,"type":"string"},"replicate_prediction_id":{"nullable":true,"type":"string"},"status":{"enum":["draft","processing","succeeded","failed"],"type":"string"}},"type":"object"},"LoginRequest":{"properties":{"password":{"type":"string"},"username":{"type":"string"}},"required":["username","password"],"type":"object"},"TokenResponse":{"properties":{"token":{"type":"string"}},"required":["token"],"type":"object"},"VoiceOption":{"properties":{"name":{"type":"string"},"voice_id":{"type":"string"}},"required":["name","voice_id"],"type":"object"}},"securitySchemes":{"bearerAuth":{"bearerFormat":"JWT","scheme":"bearer","type":"http"}}},"info":{"description":"API for authentication, reusable synthetic actors, UGC ad generation, audio generation, and full pipeline orchestration.","title":"Adbase Backend API","version":"1.0.0"},"openapi":"3.0.3","paths":{"/api/actors":{"get":{"parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"type":"integer"}},{"in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"actors":{"items":{"$ref":"#/components/schemas/Actor"},"type":"array"},"total":{"type":"integer"}},"type":"object"}}},"description":"Actor list"}},"security":[{"bearerAuth":[]}],"summary":"List actors","tags":["Actors"]}},"/api/actors/generate":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"age_band":{"enum":["18-24","25-34","35-44","45-54","55+"],"type":"string"},"ethnicity":{"type":"string"},"gender_presentation":{"type":"string"},"image_count":{"minimum":1,"type":"integer"},"model":{"type":"string"},"name":{"type":"string"},"prompt_override":{"type":"string"},"traits":{"oneOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"},{"additionalProperties":true,"type":"object"}]}},"required":["age_band","ethnicity"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"},"generation_model":{"type":"string"},"warnings":{"items":{"type":"string"},"type":"array"}},"type":"object"}}},"description":"Actor created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Validation error"}},"security":[{"bearerAuth":[]}],"summary":"Create a synthetic actor and generate portrait variants","tags":["Actors"]}},"/api/actors/{actor_id}":{"get":{"parameters":[{"in":"path","name":"actor_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"}},"type":"object"}}},"description":"Actor details"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Actor not found"}},"security":[{"bearerAuth":[]}],"summary":"Get actor details and variants","tags":["Actors"]}},"/api/actors/{actor_id}/select-primary":{"post":{"parameters":[{"in":"path","name":"actor_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"actor_variant_id":{"format":"uuid","type":"string"}},"required":["actor_variant_id"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"}},"type":"object"}}},"description":"Primary variant updated"}},"security":[{"bearerAuth":[]}],"summary":"Mark one variant as the actor's primary portrait","tags":["Actors"]}},"/api/actors/{actor_id}/variants":{"post":{"parameters":[{"in":"path","name":"actor_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"image_count":{"minimum":1,"type":"integer"},"model":{"type":"string"},"prompt_override":{"type":"string"},"variation_prompt":{"type":"string"}},"type":"object"}}},"required":false},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"actor":{"$ref":"#/components/schemas/Actor"},"created_variants":{"items":{"$ref":"#/components/schemas/ActorVariant"},"type":"array"},"generation_model":{"type":"string"},"warnings":{"items":{"type":"string"},"type":"array"}},"type":"object"}}},"description":"Variants created"}},"security":[{"bearerAuth":[]}],"summary":"Generate more variants for an existing actor","tags":["Actors"]}},"/api/agents/generate":{"post":{"requestBody":{"content":{"application/json":{"schema":{"properties":{"duration_target_sec":{"type":"integer"},"image_url":{"type":"string"},"prompt":{"type":"string"},"tone":{"type":"string"}},"required":["prompt"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgentOutputs"}}},"description":"Agent outputs"}},"security":[{"bearerAuth":[]}],"summary":"Generate ad script and story outputs from a freeform prompt","tags":["Agents"]}},"/api/auth/login":{"post":{"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}},"description":"JWT issued"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Invalid credentials"}},"summary":"Log in with username and password","tags":["Auth"]}},"/api/data":{"get":{"responses":{"200":{"description":"Sample payload"}},"summary":"Legacy sample data endpoint","tags":["Utility"]}},"/api/jobs":{"get":{"parameters":[{"in":"query","name":"limit","schema":{"default":50,"maximum":100,"type":"integer"}},{"in":"query","name":"offset","schema":{"default":0,"minimum":0,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"jobs":{"items":{"$ref":"#/components/schemas/Job"},"type":"array"},"total":{"type":"integer"}},"type":"object"}}},"description":"Job list"}},"security":[{"bearerAuth":[]}],"summary":"List jobs","tags":["Jobs"]}},"/api/jobs/upload":{"post":{"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"image":{"format":"binary","type":"string"},"prompt":{"type":"string"}},"required":["image"],"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"image_url":{"type":"string"},"job_id":{"format":"uuid","type":"string"},"prompt":{"type":"string"},"status":{"type":"string"}},"type":"object"}}},"description":"Draft job created"}},"security":[{"bearerAuth":[]}],"summary":"Upload a single product image and create a draft job","tags":["Jobs"]}},"/api/jobs/upload-full":{"post":{"requestBody":{"content":{"multipart/form-data":{"schema":{"properties":{"actor_image":{"format":"binary","type":"string"},"actor_variant_id":{"format":"uuid","type":"string"},"image":{"format":"binary","type":"string"},"product_images":{"items":{"format":"binary","type":"string"},"type":"array"},"product_info":{"type":"string"},"prompt":{"type":"string"},"voice":{"type":"string"}},"type":"object"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"properties":{"actor_image_url":{"nullable":true,"type":"string"},"actor_variant_id":{"format":"uuid","nullable":true,"type":"string"},"job_id":{"format":"uuid","type":"string"},"manifest_url":{"type":"string"},"product_image_urls":{"items":{"type":"string"},"type":"array"},"product_info":{"nullable":true},"prompt":{"type":"string"},"status":{"type":"string"},"voice":{"nullable":true,"type":"string"}},"type":"object"}}},"description":"Draft full-pipeline job created"}},"security":[{"bearerAuth":[]}],"summary":"Upload product assets and optional actor input for the full pipeline","tags":["Jobs"]}},"/api/jobs/{job_id}":{"get":{"parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Job"}],"type":"object"}}},"description":"Job status"}},"security":[{"bearerAuth":[]}],"summary":"Get job status","tags":["Jobs"]}},"/api/jobs/{job_id}/agents":{"post":{"parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"duration_target_sec":{"type":"integer"},"prompt_override":{"type":"string"},"tone":{"type":"string"}},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"agent_outputs":{"$ref":"#/components/schemas/AgentOutputs"},"job_id":{"format":"uuid","type":"string"}},"type":"object"}}},"description":"Agent outputs"}},"security":[{"bearerAuth":[]}],"summary":"Generate script and story outputs for an existing job","tags":["Agents"]}},"/api/jobs/{job_id}/audio":{"post":{"parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"duration_target_sec":{"type":"integer"},"language_code":{"type":"string"},"prompt_override":{"type":"string"},"similarity_boost":{"type":"number"},"speed":{"type":"number"},"stability":{"type":"number"},"style":{"type":"number"},"text":{"type":"string"},"tone":{"type":"string"},"use_agents":{"type":"boolean"},"voice":{"type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"agent_outputs":{"$ref":"#/components/schemas/AgentOutputs"},"audio_url":{"type":"string"},"job_id":{"format":"uuid","type":"string"},"replicate_audio_url":{"type":"string"},"status":{"type":"string"},"text":{"type":"string"},"voice":{"type":"string"}},"type":"object"}}},"description":"Audio generated"}},"security":[{"bearerAuth":[]}],"summary":"Generate TTS audio for a job","tags":["Jobs"]}},"/api/jobs/{job_id}/pipeline":{"get":{"parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"job_id":{"format":"uuid","type":"string"},"pipeline":{"additionalProperties":true,"type":"object"}},"type":"object"}}},"description":"Pipeline manifest"}},"security":[{"bearerAuth":[]}],"summary":"Get the stored full-pipeline manifest","tags":["Jobs"]}},"/api/jobs/{job_id}/result":{"get":{"parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"output_video_url":{"type":"string"}},"type":"object"}}},"description":"Job result is ready"},"202":{"content":{"application/json":{"schema":{"properties":{"message":{"type":"string"},"status":{"type":"string"}},"type":"object"}}},"description":"Job still processing"}},"security":[{"bearerAuth":[]}],"summary":"Get the final job result URL when ready","tags":["Jobs"]}},"/api/jobs/{job_id}/start":{"post":{"parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"duration_target_sec":{"type":"integer"},"prompt_override":{"type":"string"},"tone":{"type":"string"},"use_agents":{"type":"boolean"}},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"agent_outputs":{"$ref":"#/components/schemas/AgentOutputs"},"job_id":{"format":"uuid","type":"string"},"prediction_id":{"type":"string"},"status":{"type":"string"},"used_prompt":{"type":"string"}},"type":"object"}}},"description":"Job started"}},"security":[{"bearerAuth":[]}],"summary":"Start a single image-to-video job","tags":["Jobs"]}},"/api/jobs/{job_id}/start-full":{"post":{"parameters":[{"in":"path","name":"job_id","required":true,"schema":{"format":"uuid","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"actor_image_url":{"type":"string"},"actor_variant_id":{"format":"uuid","type":"string"},"duration_target_sec":{"type":"integer"},"hook_text":{"type":"string"},"language_code":{"type":"string"},"product_image_urls":{"items":{"type":"string"},"type":"array"},"product_info":{"additionalProperties":true,"type":"object"},"prompt_override":{"type":"string"},"similarity_boost":{"type":"number"},"speed":{"type":"number"},"stability":{"type":"number"},"story_prompt":{"type":"string"},"style":{"type":"number"},"tone":{"type":"string"},"ugc_prompt":{"type":"string"},"use_agents":{"type":"boolean"},"voice":{"type":"string"}},"type":"object"}}},"required":false},"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"actor_variant_id":{"format":"uuid","nullable":true,"type":"string"},"agent_outputs":{"$ref":"#/components/schemas/AgentOutputs"},"artifacts":{"additionalProperties":true,"type":"object"},"job_id":{"format":"uuid","type":"string"},"manifest_url":{"type":"string"},"output_video_url":{"type":"string"},"status":{"type":"string"}},"type":"object"}}},"description":"Full pipeline completed"}},"security":[{"bearerAuth":[]}],"summary":"Run the full UGC ad generation pipeline","tags":["Jobs"]}},"/api/voices/elevenlabs-v3":{"get":{"responses":{"200":{"content":{"application/json":{"schema":{"properties":{"default_voice":{"$ref":"#/components/schemas/VoiceOption"},"voices":{"items":{"$ref":"#/components/schemas/VoiceOption"},"type":"array"}},"type":"object"}}},"description":"Voice options"}},"security":[{"bearerAuth":[]}],"summary":"List supported TTS voices","tags":["Voices"]}}},"servers":[{"url":"https://backend.tryadbase.com"}],"tags":[{"name":"Auth"},{"name":"Actors"},{"name":"Jobs"},{"name":"Agents"},{"name":"Voices"},{"name":"Utility"}]}
