{"openapi":"3.0.3","info":{"title":"SexyGen API","version":"1.0.0","description":"Public API surface for SexyGen (sexygen.io) — an AI-assisted content creation platform for OnlyFans agencies. Authenticate with a personal X-API-Key created at /dashboard/developer. This document covers only the self-serve product API and the MCP server; it intentionally excludes internal/session-only routes. Current version is 1, sent as the X-Api-Version response header on every /api/* response; no endpoint is deprecated today — see https://sexygen.io/llms.txt#api-versioning for the deprecation-signaling policy. See https://sexygen.io/llms.txt for an agent-oriented overview and https://sexygen.io/llms-full.txt for a worked integration walkthrough.","contact":{"name":"SexyGen Support","email":"info@sexygen.io","url":"https://sexygen.io/contact"},"termsOfService":"https://sexygen.io/terms"},"servers":[{"url":"https://sexygen.io","description":"Production"}],"tags":[{"name":"MCP"},{"name":"Studio"},{"name":"Creators"},{"name":"AI Creators"},{"name":"Dating Profiles"},{"name":"Batch & Verification"},{"name":"Images & Utilities"},{"name":"Live Image Gen (Public API)"}],"paths":{"/api/mcp":{"post":{"operationId":"post_mcp","summary":"SexyGen MCP server (Streamable HTTP, JSON-RPC).","description":"Model Context Protocol endpoint for agent clients. Authenticate with \"Authorization: Bearer sk_live_...\". Exposes list_api_endpoints, read_api_endpoint, mutate_api_endpoint, generate_creator_photos, download_generated_image, get_generated_image_url, and get_generated_video_url tools.","tags":["MCP"],"security":[{"McpBearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"JSON-RPC 2.0 request body."}}}},"responses":{"200":{"description":"JSON-RPC response.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/studio/presets":{"get":{"operationId":"get_studio_presets","summary":"List all available video presets with their variable definitions, reference image options, and supported video types. Use the key field as presetKey in generate requests.","description":"List all available video presets with their variable definitions, reference image options, and supported video types. Use the key field as presetKey in generate requests.\n\nNew presets will appear here automatically — no client code changes needed.\n\nEach preset includes: key (use as presetKey), label, videoType, variables (with key/label/type/options), referenceImages (with key, required flag, and selectable options).\n\nThe durations array lists valid targetDurationSeconds values with their token costs.\n\nFor referenceImages options, pass the option imageUrl as the value in referenceImages and the option label as variableValues.dildo_reference.","tags":["Studio"],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators":{"get":{"operationId":"get_creators","summary":"List real creators scoped to the authenticated user.","description":"List real creators scoped to the authenticated user.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"post_creators","summary":"Create a real creator record before avatar/photo setup.","description":"Create a real creator record before avatar/photo setup.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"description":"Creates a creator seat and returns the new creator record.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Sophia Rose","description":"Display name for the creator. — string"},"plan":{"type":"string","enum":["Starter","Pro","Agency"],"description":"Seat tier used for billing/limits. — string"}},"required":["name","plan"]},"example":{"name":"Sophia Rose","plan":"Starter"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}":{"get":{"operationId":"get_creators_id","summary":"Fetch a single creator by internal creator id.","description":"Fetch a single creator by internal creator id.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id returned from the creators list/create endpoints.","schema":{"type":"string","description":"Creator id returned from the creators list/create endpoints. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"operationId":"patch_creators_id","summary":"Update mutable creator settings.","description":"Update mutable creator settings.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id to update.","schema":{"type":"string","description":"Creator id to update. — string"}}],"requestBody":{"description":"Send only the fields you want to change.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"age":{"type":"number","example":"27","description":"Creator age. Set null to clear it. — number | null — If provided as a number, it must be between 18 and 120."},"plan":{"type":"string","enum":["Starter","Pro","Agency"],"description":"Change the creator seat tier. — string"}}},"example":{"age":27,"plan":"Pro"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"operationId":"delete_creators_id","summary":"Delete a creator owned by the authenticated user.","description":"Delete a creator owned by the authenticated user.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id to delete.","schema":{"type":"string","description":"Creator id to delete. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/generate/photos":{"post":{"operationId":"post_creators_id_generate_photos","summary":"Queue photo generation for a real creator with an approved avatar setup.","description":"Queue photo generation for a real creator with an approved avatar setup.\n\nDo not send promptType. The backend classifies prompt as sfw/nsfw immediately before calling the generation service.\n\nCharges 50 creator tokens per image from the creator's pool. Returns 402 if the pool balance is insufficient.\n\nPoll GET /creators/:id/jobs/:jobId to track progress until the job reaches completed or failed.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id to generate for.","schema":{"type":"string","description":"Creator id to generate for. — string"}}],"requestBody":{"description":"The route validates count/theme locally, classifies prompt safety server-side, and submits a normalized generation request.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number","default":"1","description":"How many images to queue. — number — Clamped to an integer between 1 and 4."},"theme":{"type":"string","enum":["professional","casual","adventure","romantic","lifestyle"],"description":"Predefined style theme used by the generation endpoint. — string"},"prompt":{"type":"string","example":"mirror selfie. cozy bedroom. red lingerie bra","description":"Optional scene prompt. The dashboard builds this from the Type of Photo, Location, and Clothing selectors (admin-managed Studio Options) joined as \"<type>. <location>. <clothing>\"; API clients may send any equivalent descriptive string. — string — Trimmed and capped at 500 characters."}}},"example":{"count":3,"theme":"casual","prompt":"mirror selfie. cozy bedroom. red lingerie bra"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/active-job":{"get":{"operationId":"get_creators_id_active_job","summary":"Return the currently active (pending or processing) photo generation job for a real creator, or null when none is running.","description":"Return the currently active (pending or processing) photo generation job for a real creator, or null when none is running.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/jobs/{jobId}":{"get":{"operationId":"get_creators_id_jobs_jobId","summary":"Read a specific real-creator photo generation job and its approved images. Poll until the job status is completed or failed.","description":"Read a specific real-creator photo generation job and its approved images. Poll until the job status is completed or failed.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}},{"name":"jobId","in":"path","required":true,"description":"Generation job id returned by POST /creators/:id/generate/photos.","schema":{"type":"string","description":"Generation job id returned by POST /creators/:id/generate/photos. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/images":{"get":{"operationId":"get_creators_id_images","summary":"List generated images for a creator.","description":"List generated images for a creator.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/videos":{"get":{"operationId":"get_creators_id_videos","summary":"List generated videos for a creator.","description":"List generated videos for a creator.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}},{"name":"videoType","in":"query","required":false,"description":"Optional filter for returned videos.","schema":{"type":"string","enum":["sfw","nsfw"],"description":"Optional filter for returned videos. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/videos/generate":{"post":{"operationId":"post_creators_id_videos_generate","summary":"Start creator video generation. Returns a video record with status \"generating\". Poll GET /creator-videos/:videoId until status is \"image_ready\", then approve or reject the base image.","description":"Start creator video generation. Returns a video record with status \"generating\". Poll GET /creator-videos/:videoId until status is \"image_ready\", then approve or reject the base image.\n\nCharges tokens upfront before queueing generation: 100 tok for 10s, 280 tok for 30s, 500 tok for 60s.\n\nPoll GET /creator-videos/:videoId every few seconds. When status becomes \"image_ready\" a base image is ready for review.\n\nCall POST /creator-videos/:videoId/approve to start video rendering without a second charge, or POST .../reject to discard the base image and refund the linked upfront charge.\n\nAfter approval, keep polling until status is \"completed\" (videoUrl populated) or \"failed\".","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id. The creator must have at least 2 approved photos.","schema":{"type":"string","description":"Creator id. The creator must have at least 2 approved photos. — string"}}],"requestBody":{"description":"Requires presetKey and currently only accepts nsfw as videoType. Returns { video: { id, status, ... } } with HTTP 201.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"presetKey":{"type":"string","example":"riding_dildo","description":"Preset identifier that selects the video scenario/template. — string"},"videoType":{"type":"string","enum":["nsfw"],"description":"Video mode validated by the route. — string"},"targetDurationSeconds":{"type":"number","enum":["10","30","60"],"default":"10","description":"Target video duration. Values outside the allowed set are clamped to 10. — number"},"variableValues":{"type":"object","example":"{ \"duration\": \"30s\", \"clothing\": \"Lingerie\" }","description":"Scenario variables keyed by preset variable name. Non-string values are dropped. Common keys: duration (e.g. \"30s\"), clothing, riding_position. — Record<string, string>"},"referenceImages":{"type":"object","example":"{ \"dildo_base\": \"https://cdn.example.com/dildo-reference.png\" }","description":"Reference image URLs keyed by input slot name. Empty strings are dropped. — Record<string, string>"}},"required":["presetKey","videoType"]},"example":{"presetKey":"dildo-riding","videoType":"nsfw","targetDurationSeconds":30,"variableValues":{"duration":"30s","clothing":"Lingerie"},"referenceImages":{"dildo_base":"https://cdn.example.com/dildo-reference.png"}}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creator-videos/{videoId}":{"get":{"operationId":"get_creator_videos_videoId","summary":"Poll the status of a video generation job. Use this after POST /creators/:id/videos/generate to track progress.","description":"Poll the status of a video generation job. Use this after POST /creators/:id/videos/generate to track progress.\n\nStatus flow: generating → image_ready → generating_video → generating_long_video (if applicable) → completed | failed.\n\nOn failure the route automatically refunds any token charge for this video.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"videoId","in":"path","required":true,"description":"Video id returned by the generate endpoint.","schema":{"type":"string","description":"Video id returned by the generate endpoint. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creator-videos/{videoId}/approve":{"post":{"operationId":"post_creator_videos_videoId_approve","summary":"Approve the base image and start video rendering. Precharged videos are not charged again.","description":"Approve the base image and start video rendering. Precharged videos are not charged again.\n\nLegacy uncharged videos are charged on approval as a fallback: 100 tok for 10s, 280 tok for 30s, 500 tok for 60s.\n\nReturns 402 only when a legacy fallback charge is needed and the token balance is insufficient.\n\nContinue polling GET /creator-videos/:videoId after approving.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"videoId","in":"path","required":true,"description":"Video id. Must be in image_ready status.","schema":{"type":"string","description":"Video id. Must be in image_ready status. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creator-videos/{videoId}/reject":{"post":{"operationId":"post_creator_videos_videoId_reject","summary":"Reject the base image. Discards the current generation and refunds the linked upfront charge.","description":"Reject the base image. Discards the current generation and refunds the linked upfront charge.\n\nThe route refunds the active token charge linked to this video, then you can start a fresh generation via POST /creators/:id/videos/generate.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"videoId","in":"path","required":true,"description":"Video id. Must be in image_ready status.","schema":{"type":"string","description":"Video id. Must be in image_ready status. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/voice":{"get":{"operationId":"get_creators_id_voice","summary":"List uploaded creator voice tracks.","description":"List uploaded creator voice tracks.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"post_creators_id_voice","summary":"Upload one or more MP3 voice files for a creator.","description":"Upload one or more MP3 voice files for a creator.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}}],"requestBody":{"description":"Upload files under the form field name files. Use multipart/form-data rather than JSON. The route reads formData.getAll(\"files\").","required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"string","description":"One or more MP3 files. — File[] — At least one file is required. Each file must be MP3 and 25MB or smaller."}},"required":["files"]}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/voice/clone/instant":{"get":{"operationId":"get_creators_id_voice_clone_instant","summary":"Read the saved instant voice clone state for a creator.","description":"Read the saved instant voice clone state for a creator.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"post_creators_id_voice_clone_instant","summary":"Create an instant clone from already-uploaded voice tracks.","description":"Create an instant clone from already-uploaded voice tracks.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}}],"requestBody":{"description":"No request body is required. The route uses the creator's existing uploaded voice tracks. Upload voice tracks first via POST /creators/:id/voice. If a clone already exists, the route returns 409.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/creators/{id}/voice/message":{"post":{"operationId":"post_creators_id_voice_message","summary":"Generate an MP3 voice message using the creator's instant voice clone.","description":"Generate an MP3 voice message using the creator's instant voice clone.","tags":["Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Creator id.","schema":{"type":"string","description":"Creator id. — string"}}],"requestBody":{"description":"Supply the message text to synthesize.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string","example":"Hey babe, I just recorded this for you.","description":"Voice message text to synthesize. — string"}},"required":["text"]},"example":{"text":"Hey babe, I just recorded this for you."}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators":{"get":{"operationId":"get_ai_creators","summary":"List AI creators owned by the authenticated user.","description":"List AI creators owned by the authenticated user.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"operationId":"post_ai_creators","summary":"Create an AI creator with appearance filters and a billing plan.","description":"Create an AI creator with appearance filters and a billing plan.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"description":"Creates an AI creator seed record. Appearance fields are optional; name and plan are required.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"Luna Vale","description":"Display name for the AI creator. — string"},"plan":{"type":"string","enum":["Starter","Pro","Agency"],"description":"Seat tier used for entitlement checks. — string"},"gender":{"type":"string","enum":["male","female"],"description":"Preferred gender filter for generated profiles or creators. — string"},"ethnicity":{"type":"string","enum":["white","latina","asian","black"],"description":"Preferred ethnicity filter. — string"},"hairColor":{"type":"string","example":"blonde","description":"Free-form hair color hint for generation. — string"},"bodyType":{"type":"string","enum":["slim","medium","big"],"description":"Body shape filter. — string"},"minAge":{"type":"number","description":"Minimum age filter. — number"},"maxAge":{"type":"number","description":"Maximum age filter. — number"},"personalityDescription":{"type":"string","example":"Flirty, witty, outdoorsy, and confident","description":"Optional personality prompt used to steer generated profile text or behavior. — string"}},"required":["name","plan"]},"example":{"name":"Luna Vale","plan":"Starter","gender":"female","ethnicity":"latina","hairColor":"black","bodyType":"slim","minAge":24,"maxAge":30,"personalityDescription":"Playful, luxurious, and slightly mysterious"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators/{id}":{"get":{"operationId":"get_ai_creators_id","summary":"Fetch a single AI creator.","description":"Fetch a single AI creator.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"operationId":"patch_ai_creators_id","summary":"Update mutable AI creator fields supported locally by the route.","description":"Update mutable AI creator fields supported locally by the route.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}}],"requestBody":{"description":"Currently only age is updated by this route.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"age":{"type":"number","description":"AI creator age. Set null to clear it. — number | null — If provided as a number, it must be between 18 and 120."}}},"example":{"age":26}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"operationId":"delete_ai_creators_id","summary":"Delete an AI creator.","description":"Delete an AI creator.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators/{id}/generate":{"post":{"operationId":"post_ai_creators_id_generate","summary":"Generate training-reference or content images for an AI creator. Charges 50 creator tokens per image (training-reference is free).","description":"Generate training-reference or content images for an AI creator. Charges 50 creator tokens per image (training-reference is free).","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}}],"requestBody":{"description":"When purpose is training_reference and no prompt is provided, the route auto-builds a training prompt and forces one NSFW full-body image. Content prompts are classified server-side. For training_reference mode without a custom prompt, the route auto-generates a full-body reference prompt and forces count = 1. Training-reference generations are not charged. Returns 402 if the creator token pool has insufficient balance (content_generation only).","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"purpose":{"type":"string","enum":["training_reference","content_generation"],"default":"training_reference","description":"Generation mode. — string"},"count":{"type":"number","default":"1","description":"Requested number of images. — number — Clamped to an integer between 1 and 4."},"prompt":{"type":"string","example":"mirror selfie. cozy bedroom. red lingerie bra","description":"Optional scene prompt. For content_generation the dashboard builds this from the Type of Photo, Location, and Clothing selectors (admin-managed Studio Options) joined as \"<type>. <location>. <clothing>\"; the backend classifies it as sfw/nsfw before generation. API clients may send any equivalent descriptive string. — string — Trimmed and capped at 500 characters."}}},"example":{"purpose":"content_generation","count":2,"prompt":"mirror selfie. cozy bedroom. red lingerie bra"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators/{id}/images":{"get":{"operationId":"get_ai_creators_id_images","summary":"List generated AI creator images.","description":"List generated AI creator images.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators/{id}/videos":{"get":{"operationId":"get_ai_creators_id_videos","summary":"List generated videos for an AI creator.","description":"List generated videos for an AI creator.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}},{"name":"videoType","in":"query","required":false,"description":"Optional filter for returned videos.","schema":{"type":"string","enum":["sfw","nsfw"],"description":"Optional filter for returned videos. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators/{id}/videos/generate":{"post":{"operationId":"post_ai_creators_id_videos_generate","summary":"Start AI creator video generation. Same contract as POST /creators/:id/videos/generate. Poll GET /ai-creator-videos/:videoId to track progress.","description":"Start AI creator video generation. Same contract as POST /creators/:id/videos/generate. Poll GET /ai-creator-videos/:videoId to track progress.\n\nCharges tokens upfront before queueing generation: 100 tok for 10s, 280 tok for 30s, 500 tok for 60s.\n\nPoll GET /ai-creator-videos/:videoId until status is \"image_ready\", then approve to start rendering without a second charge or reject to refund the linked upfront charge.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}}],"requestBody":{"description":"Identical contract to the real-creator generate endpoint. Returns { video: { id, status, ... } } with HTTP 201.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"presetKey":{"type":"string","example":"riding_dildo","description":"Preset identifier that selects the video scenario/template. — string"},"videoType":{"type":"string","enum":["nsfw"],"description":"Video mode validated by the route. — string"},"targetDurationSeconds":{"type":"number","enum":["10","30","60"],"default":"10","description":"Target video duration. Values outside the allowed set are clamped to 10. — number"},"variableValues":{"type":"object","example":"{ \"duration\": \"30s\", \"clothing\": \"Lingerie\" }","description":"Scenario variables keyed by preset variable name. Non-string values are dropped. — Record<string, string>"},"referenceImages":{"type":"object","example":"{ \"dildo_base\": \"https://cdn.example.com/dildo-reference.png\" }","description":"Reference image URLs keyed by input slot name. Empty strings are dropped. — Record<string, string>"}},"required":["presetKey","videoType"]},"example":{"presetKey":"dildo-riding","videoType":"nsfw","targetDurationSeconds":30,"variableValues":{"duration":"30s","clothing":"Lingerie"},"referenceImages":{"dildo_base":"https://cdn.example.com/dildo-reference.png"}}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creator-videos/{videoId}":{"get":{"operationId":"get_ai_creator_videos_videoId","summary":"Poll the status of an AI creator video generation job.","description":"Poll the status of an AI creator video generation job.\n\nStatus flow: generating → image_ready → generating_video → generating_long_video → completed | failed.\n\nOn failure the route automatically refunds any token charge.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"videoId","in":"path","required":true,"description":"Video id returned by the AI creator generate endpoint.","schema":{"type":"string","description":"Video id returned by the AI creator generate endpoint. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creator-videos/{videoId}/approve":{"post":{"operationId":"post_ai_creator_videos_videoId_approve","summary":"Approve the base image for an AI creator video and start rendering. Precharged videos are not charged again.","description":"Approve the base image for an AI creator video and start rendering. Precharged videos are not charged again.\n\nLegacy uncharged videos are charged on approval as a fallback: 100 tok for 10s, 280 tok for 30s, 500 tok for 60s.\n\nReturns 402 only when a legacy fallback charge is needed and the token balance is insufficient.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"videoId","in":"path","required":true,"description":"Video id. Must be in image_ready status.","schema":{"type":"string","description":"Video id. Must be in image_ready status. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creator-videos/{videoId}/reject":{"post":{"operationId":"post_ai_creator_videos_videoId_reject","summary":"Reject the base image for an AI creator video and refund the linked upfront charge.","description":"Reject the base image for an AI creator video and refund the linked upfront charge.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"videoId","in":"path","required":true,"description":"Video id. Must be in image_ready status.","schema":{"type":"string","description":"Video id. Must be in image_ready status. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators/{id}/jobs/active":{"get":{"operationId":"get_ai_creators_id_jobs_active","summary":"Read the currently active generation job for an AI creator.","description":"Read the currently active generation job for an AI creator.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/ai-creators/{id}/jobs/{jobId}":{"get":{"operationId":"get_ai_creators_id_jobs_jobId","summary":"Read a specific AI creator generation job.","description":"Read a specific AI creator generation job.","tags":["AI Creators"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"AI creator public id.","schema":{"type":"string","description":"AI creator public id. — string"}},{"name":"jobId","in":"path","required":true,"description":"Generation job id returned by queue responses.","schema":{"type":"string","description":"Generation job id returned by queue responses. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles":{"get":{"operationId":"get_dating_profiles","summary":"List dating profiles visible to the user.","description":"List dating profiles visible to the user.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Page size applied after local filtering.","schema":{"type":"number","default":"24","description":"Page size applied after local filtering. — number"}},{"name":"offset","in":"query","required":false,"description":"Zero-based offset applied after local filtering.","schema":{"type":"number","default":"0","description":"Zero-based offset applied after local filtering. — number"}},{"name":"search","in":"query","required":false,"description":"Optional search term.","schema":{"type":"string","description":"Optional search term. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}":{"get":{"operationId":"get_dating_profiles_id","summary":"Fetch dating profile details.","description":"Fetch dating profile details.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"operationId":"delete_dating_profiles_id","summary":"Delete a dating profile and all its images.","description":"Delete a dating profile and all its images.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/options":{"get":{"operationId":"get_dating_profiles_options","summary":"Fetch the available option set used for dating-profile generation filters — matches what the dashboard's own create form offers.","description":"Fetch the available option set used for dating-profile generation filters — matches what the dashboard's own create form offers.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/generate-pack":{"post":{"operationId":"post_dating_profiles_generate_pack","summary":"Generate a complete dating-profile image pack from appearance filters. Billed 50 tokens per image (sfwCount + sexyCount + nsfwCount).","description":"Generate a complete dating-profile image pack from appearance filters. Billed 50 tokens per image (sfwCount + sexyCount + nsfwCount).\n\nEvery profile gets a generated personality (occupation, vibe, styling, bio) — this always happens, it is not optional. Pass personalityDescription to steer it; omit it and one is generated for you.\n\npersonalityDescription only applies here, at creation. The generated personality (occupation, vibe, styling) is then locked to the profile — every later call to /:id/generate, /:id/pack, or a re-generate action reuses that same personality automatically. There is no way to re-enter or change it after creation.\n\nReturns 422 with code no_matching_face when no stock face matches the requested filters (a real inventory shortage for that combo) — relax hairColor, bodyType, ethnicity, or the age range and retry.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"description":"Accepts appearance filters plus optional image-count settings. profileType is forced to dating server-side.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Optional custom name for the profile. Takes priority over everything else — set this and it is used exactly as given. Leave it out to auto-name the profile from the pinned stock face (or a freshly generated name if that face has no usable name on file). — string"},"gender":{"type":"string","enum":["male","female"],"description":"Preferred gender filter for generated profiles or creators. — string"},"ethnicity":{"type":"string","enum":["white","latina","asian","black"],"description":"Preferred ethnicity filter. — string"},"hairColor":{"type":"string","example":"blonde","description":"Free-form hair color hint for generation. — string"},"bodyType":{"type":"string","enum":["slim","medium","big"],"description":"Body shape filter. — string"},"minAge":{"type":"number","description":"Minimum age filter. — number"},"maxAge":{"type":"number","description":"Maximum age filter. — number"},"personalityDescription":{"type":"string","example":"Flirty, witty, outdoorsy, and confident","description":"Optional personality prompt used to steer generated profile text or behavior. — string"},"sfwCount":{"type":"number","default":"6","description":"Requested number of SFW images. — number"},"sexyCount":{"type":"number","default":"3","description":"Requested number of sexy images. — number"},"nsfwCount":{"type":"number","default":"0","description":"Requested number of NSFW images. — number"}}},"example":{"name":"Sophia","gender":"female","ethnicity":"white","hairColor":"blonde","bodyType":"slim","minAge":22,"maxAge":29,"personalityDescription":"High-energy, glamorous, and flirty","sfwCount":6,"sexyCount":3,"nsfwCount":0}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}/generate":{"post":{"operationId":"post_dating_profiles_id_generate","summary":"Queue image generation for an existing dating profile. Charges 50 tokens per image from the shared pool.","description":"Queue image generation for an existing dating profile. Charges 50 tokens per image from the shared pool.\n\nSpends 50 tokens per image from the shared account token pool.\n\nReturns 402 if the token balance is insufficient.\n\nThis endpoint has no personality field — a profile's personality (occupation, vibe, styling) is generated once, the first time it's created, and reused for every later generate/pack/regenerate call on the same profile. It cannot be re-entered or changed per-request.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}}],"requestBody":{"description":"The route normalizes count/theme/prompt and submits a generation request. theme and prompt only apply to legacy (pre-v2) profiles — every profile created via generate-pack today is silently unaffected by them; use count only for those.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number","default":"4","description":"How many images to queue. — number — Clamped to an integer between 1 and 10."},"theme":{"type":"string","enum":["professional","casual","adventure","romantic","lifestyle"],"description":"Predefined style theme used by the generation endpoint. Legacy profiles only — ignored on current (v2) profiles. — string"},"prompt":{"type":"string","example":"Rooftop dinner date, soft candlelight, city skyline in the background","description":"Optional custom prompt. Legacy profiles only — ignored on current (v2) profiles. — string — Trimmed and capped at 500 characters."}}},"example":{"count":4,"theme":"romantic","prompt":"Rooftop dinner date, soft candlelight, city skyline in the background"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}/images":{"get":{"operationId":"get_dating_profiles_id_images","summary":"List generated images for a dating profile.","description":"List generated images for a dating profile.\n\nThe `images` array only ever contains approved images — a rendered-but-unreviewed image never appears there, since a rejected/pending image may be exactly the kind of content it shouldn't be.\n\nResponse also includes `pendingReviewCount` (number still awaiting a review decision), `reviewQueue` (every non-approved image, each with `status`: processing | pending_review | rejected | failed, plus `failureReason` and `reviewedAt`), and `allTerminal` (true only once every image is approved or permanently settled — check this, not just `images.length`, before concluding generation is done).","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}/active-job":{"get":{"operationId":"get_dating_profiles_id_active_job","summary":"Return the currently active generation job for a dating profile, or null when none is running.","description":"Return the currently active generation job for a dating profile, or null when none is running.\n\n\"Active\" accounts for review state, not just rendering: a profile whose images have all finished rendering but are still awaiting approval/rejection is still reported as active (status \"processing\") rather than null — poll GET /:id/images for the per-image review breakdown behind that.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}/jobs/{jobId}":{"get":{"operationId":"get_dating_profiles_id_jobs_jobId","summary":"Read a specific dating-profile generation job.","description":"Read a specific dating-profile generation job.\n\nSame review-state-aware status as GET /:id/active-job — a job with every image rendered but still unreviewed stays \"processing\", not \"completed\".","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}},{"name":"jobId","in":"path","required":true,"description":"Generation job id.","schema":{"type":"string","description":"Generation job id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}/pack":{"post":{"operationId":"post_dating_profiles_id_pack","summary":"Regenerate the saved pack for an existing dating profile. Billed 50 tokens per image (6 sfw + 3 sexy) on current (v2) profiles.","description":"Regenerate the saved pack for an existing dating profile. Billed 50 tokens per image (6 sfw + 3 sexy) on current (v2) profiles.\n\nNo request body. The route triggers pack regeneration for the given profile id.\n\nSpends 50 tokens per image from the shared account token pool on v2 profiles. Returns 402 if the token balance is insufficient.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}/download":{"get":{"operationId":"get_dating_profiles_id_download","summary":"Download a dating profile export or asset bundle.","description":"Download a dating profile export or asset bundle.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}},{"name":"type","in":"query","required":false,"description":"Asset flavor to download.","schema":{"type":"string","example":"photos","default":"photos","description":"Asset flavor to download. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/{id}/export":{"get":{"operationId":"get_dating_profiles_id_export","summary":"Export dating profile JSON.","description":"Export dating profile JSON.","tags":["Dating Profiles"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Dating profile id.","schema":{"type":"string","description":"Dating profile id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/batch":{"post":{"operationId":"post_dating_profiles_batch","summary":"Create a self-serve batch of up to 50 independent dating profiles that share one filter set and image split. Billed 50 tokens per image per billed profile; batches of 10+ include free profiles.","description":"Create a self-serve batch of up to 50 independent dating profiles that share one filter set and image split. Billed 50 tokens per image per billed profile; batches of 10+ include free profiles.\n\nReturns { success: true, batch } with HTTP 200. The batch record carries id, requestedCount, createdCount, failedCount, creditsCharged, notifiedAt and members[] — one { profileId, error } per slot. A slot that failed to create (e.g. no matching stock face) has profileId null plus its error and is not charged; the rest of the batch still proceeds.\n\nPricing: (sfwCount + sexyCount + nsfwCount) × 50 tokens per billed profile. Free profiles per batch: 10–19 → 1, 20–29 → 3, 30–39 → 5, 40–49 → 8, 50 → 12. The full amount is checked up front — returns 402 with code insufficient_tokens (plus required/available) when the balance is short.\n\nUnlike single profiles, batch profiles go through human QA review (rendered with a 20% over-generation buffer so rejections can be absorbed). The batch is delivered — notifiedAt set, one \"batch ready\" email/notification sent — only once every member profile has cleared review and met its per-tier targets. Until then the member profiles are hidden from GET /dating-profiles, and GET /dating-profiles/:id/images lists their photos under reviewQueue rather than images.\n\nPoll GET /dating-profiles/batches and treat notifiedAt !== null as \"delivered\". Review is done by people, so expect hours, not minutes.\n\nReturns 503 while dating-profile generation is in maintenance mode.","tags":["Batch & Verification"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"description":"Appearance filters plus the batch size and the per-profile image split. Every profile in the batch uses the same filters and counts.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number","default":"1","description":"How many profiles to create. — number — Clamped to an integer between 1 and 50."},"gender":{"type":"string","enum":["male","female"],"description":"Preferred gender filter for generated profiles or creators. — string"},"ethnicity":{"type":"string","enum":["white","latina","asian","black"],"description":"Preferred ethnicity filter. — string"},"hairColor":{"type":"string","example":"blonde","description":"Free-form hair color hint for generation. — string"},"bodyType":{"type":"string","enum":["slim","medium","big"],"description":"Body shape filter. — string"},"minAge":{"type":"number","description":"Minimum age filter. — number"},"maxAge":{"type":"number","description":"Maximum age filter. — number"},"personalityDescription":{"type":"string","example":"Flirty, witty, outdoorsy, and confident","description":"Optional personality prompt used to steer generated profile text or behavior. — string"},"sfwCount":{"type":"number","default":"6","description":"SFW images per profile. — number"},"sexyCount":{"type":"number","default":"3","description":"Sexy images per profile. — number"},"nsfwCount":{"type":"number","default":"0","description":"NSFW images per profile. — number"}}},"example":{"count":20,"gender":"female","ethnicity":"latina","bodyType":"slim","minAge":22,"maxAge":29,"sfwCount":6,"sexyCount":3,"nsfwCount":0}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/batch-requests":{"post":{"operationId":"post_dating_profiles_batch_requests","summary":"Order a batch of profiles. Up to 50 profiles it runs immediately as a real batch (identical to POST /dating-profiles/batch, tokens charged); larger orders, or ones the account cannot afford yet, are filed for the team.","description":"Order a batch of profiles. Up to 50 profiles it runs immediately as a real batch (identical to POST /dating-profiles/batch, tokens charged); larger orders, or ones the account cannot afford yet, are filed for the team.\n\nResponse: { success: true, executed, request, batch, reason? }. When executed is true, batch is the same record POST /dating-profiles/batch returns and request.status is \"executed\" with request.batchId pointing at it — poll GET /dating-profiles/batches/:id for delivery (notifiedAt). When executed is false, batch is null, request.status is \"pending\" and reason is one of above_self_serve_cap, insufficient_tokens (plus required/available) or error; the team is notified and handles it manually.\n\nAuto-run charges tokens exactly like POST /dating-profiles/batch — (sfwCount + sexyCount + nsfwCount) × 50 per billed profile, with the same free-profile tiers. If the balance is short the order is NOT rejected: it is filed as a manual request instead, so top up and ask the team to run it, or resubmit.\n\nIf you only ever order 50 or fewer, prefer POST /dating-profiles/batch — it returns 402 instead of silently filing when tokens are short.\n\nReturns 503 while dating-profile generation is in maintenance mode.","tags":["Batch & Verification"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"description":"Appearance filters, the order size, an optional per-profile image split and free-form notes.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"number","default":"1","description":"Requested number of profiles. — number — Clamped to an integer between 1 and 100. Orders of 1–50 run automatically; 51–100 are handled manually."},"gender":{"type":"string","enum":["male","female"],"description":"Preferred gender filter for generated profiles or creators. — string"},"ethnicity":{"type":"string","enum":["white","latina","asian","black"],"description":"Preferred ethnicity filter. — string"},"hairColor":{"type":"string","example":"blonde","description":"Free-form hair color hint for generation. — string"},"bodyType":{"type":"string","enum":["slim","medium","big"],"description":"Body shape filter. — string"},"minAge":{"type":"number","description":"Minimum age filter. — number"},"maxAge":{"type":"number","description":"Maximum age filter. — number"},"personalityDescription":{"type":"string","example":"Flirty, witty, outdoorsy, and confident","description":"Optional personality prompt used to steer generated profile text or behavior. — string"},"sfwCount":{"type":"number","default":"6","description":"SFW images per profile. — number"},"sexyCount":{"type":"number","default":"3","description":"Sexy images per profile. — number"},"nsfwCount":{"type":"number","default":"0","description":"NSFW images per profile. — number"},"notes":{"type":"string","example":"Prefer upscale nightlife / travel aesthetic","description":"Optional free-form notes or special wishes. — string"}}},"example":{"count":40,"gender":"female","ethnicity":"latina","bodyType":"slim","sfwCount":1,"sexyCount":0,"nsfwCount":0,"notes":"Prefer upscale nightlife / travel aesthetic"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/batches":{"get":{"operationId":"get_dating_profiles_batches","summary":"List locally tracked dating-profile batches (newest first, up to 50).","description":"List locally tracked dating-profile batches (newest first, up to 50).\n\nnotifiedAt is the delivery signal: null while the batch is still generating or in QA review, an ISO timestamp once every member profile is approved and the batch-ready notice went out. Member profiles stay out of GET /dating-profiles until then.\n\nmembers[] lists every slot as { profileId, error }; createdCount and failedCount summarise them. viewedAt records when the batch was first opened in the dashboard.","tags":["Batch & Verification"],"security":[{"ApiKeyAuth":[]}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/dating-profiles/batches/{id}":{"get":{"operationId":"get_dating_profiles_batches_id","summary":"Fetch one dating-profile batch with its members.","description":"Fetch one dating-profile batch with its members.\n\nSame record shape as the list endpoint; 404 when the batch does not belong to the caller.\n\nReading a batch here also stamps its viewedAt (first read only) — the same \"opened\" marker the dashboard sets.","tags":["Batch & Verification"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Batch id returned by POST /dating-profiles/batch.","schema":{"type":"string","description":"Batch id returned by POST /dating-profiles/batch. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"operationId":"delete_dating_profiles_batches_id","summary":"Delete a locally tracked dating-profile batch record.","description":"Delete a locally tracked dating-profile batch record.","tags":["Batch & Verification"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"id","in":"path","required":true,"description":"Local batch record id.","schema":{"type":"string","description":"Local batch record id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/images/single/{imageId}":{"get":{"operationId":"get_images_single_imageId","summary":"Fetch metadata for a single generated image.","description":"Fetch metadata for a single generated image.","tags":["Images & Utilities"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"imageId","in":"path","required":true,"description":"Generated image id.","schema":{"type":"string","description":"Generated image id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/images/single/{imageId}/thumbnail":{"get":{"operationId":"get_images_single_imageId_thumbnail","summary":"Resolve the thumbnail URL for a generated image.","description":"Resolve the thumbnail URL for a generated image.","tags":["Images & Utilities"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"imageId","in":"path","required":true,"description":"Generated image id.","schema":{"type":"string","description":"Generated image id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/images/single/{imageId}/preview":{"get":{"operationId":"get_images_single_imageId_preview","summary":"Resolve the preview URL for a generated image.","description":"Resolve the preview URL for a generated image.","tags":["Images & Utilities"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"imageId","in":"path","required":true,"description":"Generated image id.","schema":{"type":"string","description":"Generated image id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/images/single/{imageId}/content":{"get":{"operationId":"get_images_single_imageId_content","summary":"Stream the raw image bytes for a generated image.","description":"Stream the raw image bytes for a generated image.","tags":["Images & Utilities"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"imageId","in":"path","required":true,"description":"Generated image id.","schema":{"type":"string","description":"Generated image id. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/live-image-gen/profiles":{"post":{"operationId":"post_live_image_gen_profiles","summary":"Create or update a persona your chat platform sends photos as. Call this once before submitting any messages for that persona.","description":"Create or update a persona your chat platform sends photos as. Call this once before submitting any messages for that persona.\n\nReturns { \"platform\": \"...\", \"username\": \"...\" } on success — no internal id. That platform + username pair is your permanent handle for this persona going forward.\n\nUpdating a field: resubmit with the same platform + username and only the fields you want changed, plus the two always-required fields (gender, age). Fields you omit are left untouched, not cleared.\n\nError shape depends on where the request is rejected. Structural failures caught before your request is even processed — wrong type, missing required field, age under 18, referencePhotoUrl not a URL — return HTTP 400 with { success: false, error: { code: \"validation_error\", message, statusCode } }. Everything else (unreachable/unsafe referencePhotoUrl, rate limiting, disabled API) returns { success: false, error: { code, message } } with code one of: unauthorized, moderator_not_found, invalid_request, rate_limited, disabled, internal_error. Treat any success: false response as failure regardless of which shape it is.","tags":["Live Image Gen (Public API)"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"description":"platform + username together identify the persona under your account. Calling this again with the same platform + username updates that same persona in place — it never creates a duplicate.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","example":"example.com","description":"Your own identifier for the site/app this persona belongs to (e.g. your domain). Scoped to your account — other accounts using the same string never collide with you. — string"},"username":{"type":"string","example":"persona-1","description":"The persona’s identifier on that platform. Unique per (your account, platform) — the same username on a different platform value is currently a separate persona. — string"},"gender":{"type":"string","enum":["male","female","transgender"],"description":"Persona gender. — string"},"age":{"type":"number","description":"Persona age. — number — Must be 18 or older. Enforced server-side, not optional."},"referencePhotoUrl":{"type":"string","description":"Publicly reachable http(s) URL to a reference photo establishing this persona’s face/identity. — string — Must resolve to an actual image, capped around 10MB, fetched with a short timeout. Private/internal IP ranges and non-http(s) schemes are rejected."},"name":{"type":"string","description":"Optional display name. — string"},"physicalDescription":{"type":"string","description":"Optional free-form body/appearance description used to steer generation. — string"},"eyeColor":{"type":"string","description":"Optional. — string"},"hairColor":{"type":"string","description":"Optional. — string"},"height":{"type":"string","description":"Optional. — string"},"bodyType":{"type":"string","description":"Optional. — string"},"hasTattoo":{"type":"boolean","description":"Optional. — boolean"},"country":{"type":"string","description":"Optional. — string"},"city":{"type":"string","description":"Optional. — string"},"location":{"type":"string","description":"Optional. — string"},"relationshipStatus":{"type":"string","description":"Optional. — string"},"occupation":{"type":"string","description":"Optional. — string"},"religion":{"type":"string","description":"Optional. — string"},"zodiac":{"type":"string","description":"Optional. — string"},"hobbies":{"type":"string","description":"Optional. — string"},"personality":{"type":"string","description":"Optional free-form personality description used to steer generation. — string"}},"required":["platform","username","gender","age","referencePhotoUrl"]},"example":{"platform":"example.com","username":"persona-1","gender":"female","age":29,"referencePhotoUrl":"https://cdn.example.com/persona-1.jpg","physicalDescription":"Slim build, shoulder-length blonde hair","personality":"Flirty, witty, confident"}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/live-image-gen/messages":{"post":{"operationId":"post_live_image_gen_messages","summary":"Submit recent chat history for a persona’s conversation. Triggers an async photo-generation job based on the latest customer message.","description":"Submit recent chat history for a persona’s conversation. Triggers an async photo-generation job based on the latest customer message.\n\nReturns { \"jobId\": \"...\" } immediately — generation is asynchronous. Poll GET /live-image-gen/status/:jobId with it.\n\nRate limit: 20 requests/minute per account. Max 2 concurrent in-flight jobs per account. Max 1 in-flight job per persona+chatId — a second message on the same conversation while one is still processing is rejected, not queued.\n\nNo server-side retry/dedup — if you retry a submission, that is a new, independent generation.\n\nmessages must include at least one entry with type \"received\", messageType \"text\", and non-empty text — an array of only \"sent\"/\"system\"/\"image\" entries is rejected with invalid_request.\n\nSee the error-shape note on POST /live-image-gen/profiles — messages/chatId length and count limits are structural (validation_error, HTTP 400); an empty account balance returns { code: \"insufficient_balance\" } instead.","tags":["Live Image Gen (Public API)"],"security":[{"ApiKeyAuth":[]}],"requestBody":{"description":"Identifies the persona via platform + username (must already exist via POST /live-image-gen/profiles) and the conversation via chatId. messages is the recent chat history for that conversation, oldest first.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"platform":{"type":"string","description":"Same value used when the persona was created. — string"},"username":{"type":"string","description":"Same value used when the persona was created. — string"},"chatId":{"type":"string","description":"Your own identifier for this specific conversation — keeps continuity (outfit, location) consistent within one conversation across multiple photos. — string — Max 200 characters."},"messages":{"type":"string","description":"Recent chat history for this conversation, ordered oldest to newest. Only the last 6 are ever used for context, so sending more than 6 gains you nothing. — array — 1 to 6 items."},"messages[].text":{"type":"string","description":"Message text. For an image message this can be empty/caption-only. — string — Max 2000 characters."},"messages[].type":{"type":"string","enum":["received","sent","system"],"description":"\"received\" = from the customer, \"sent\" = from the persona, \"system\" = platform notices. The photo is generated from the LAST entry with type \"received\" and messageType \"text\" — by array position, not by timestamp, so an out-of-order array silently picks the wrong trigger. — string"},"messages[].messageType":{"type":"string","enum":["text","image"],"description":"Whether this entry is text or an image the customer/persona sent. — string"},"messages[].timestamp":{"type":"string","description":"Optional ISO 8601 timestamp. Accepted and stored, but not used by any generation logic — purely for your own record-keeping. — string"},"messages[].imageSrc":{"type":"string","description":"Optional image URL, only meaningful when messageType is \"image\". Never fetched server-side — stored as-is, not used to influence generation today. — string — Max 2000 characters."}},"required":["platform","username","chatId","messages","messages[].text","messages[].type","messages[].messageType"]},"example":{"platform":"example.com","username":"persona-1","chatId":"151106778","messages":[{"text":"hey, what are you up to today?","type":"sent","messageType":"text","timestamp":"2026-09-15T09:12:00.000Z"},{"text":"just got back from a hike, feeling great","type":"received","messageType":"text","timestamp":"2026-09-15T09:14:00.000Z"},{"text":"send me a pic of what you're wearing","type":"received","messageType":"text","timestamp":"2026-09-15T09:15:00.000Z"}]}}}},"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/live-image-gen/status/{jobId}":{"get":{"operationId":"get_live_image_gen_status_jobId","summary":"Poll the status of a generation job started by POST /live-image-gen/messages.","description":"Poll the status of a generation job started by POST /live-image-gen/messages.\n\nstatus is one of \"pending\", \"processing\", \"completed\", \"failed\". Pending/processing responses carry no resultImagePath and no error: { \"status\": \"pending\", \"error\": null }.\n\nOn \"completed\", the response adds resultImagePath: { \"status\": \"completed\", \"error\": null, \"resultImagePath\": \"https://cpg-storage.groupredstone.com/<imageId>\" }.\n\nOn \"failed\", error carries the failure reason and resultImagePath is absent: { \"status\": \"failed\", \"error\": \"<failure reason>\" }.\n\nresultImagePath is a permanent public image URL (not a path on this API) — no API key needed to fetch it and it never expires, so it can be handed straight to a chat platform’s \"send image by URL\" call.\n\nA jobId belonging to a different account returns 404, the same as one that does not exist — this endpoint never confirms another account’s data exists.","tags":["Live Image Gen (Public API)"],"security":[{"ApiKeyAuth":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"description":"The jobId returned by POST /live-image-gen/messages.","schema":{"type":"string","description":"The jobId returned by POST /live-image-gen/messages. — string"}}],"responses":{"200":{"description":"Successful response. See https://sexygen.io/llms-full.txt for the exact JSON shape.","headers":{"X-Api-Version":{"$ref":"#/components/headers/ApiVersion"}},"content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Validation error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"Missing or invalid credentials.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Insufficient tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden for the current account/billing state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Resource not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited, where enforced. See https://sexygen.io/llms.txt#rate-limits for which endpoints currently enforce limits and which headers (RateLimit-*, Retry-After) they return.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Unexpected server error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Self-serve API key (sk_live_...) issued from https://sexygen.io/dashboard/developer."},"McpBearerAuth":{"type":"http","scheme":"bearer","description":"Same self-serve API key as ApiKeyAuth, sent as a Bearer token for the MCP endpoint."}},"headers":{"ApiVersion":{"description":"Current API version. Bumped only on breaking changes; see the versioning policy at https://sexygen.io/llms.txt#api-versioning.","schema":{"type":"string","example":"1"}}},"schemas":{"ErrorResponse":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message."},"code":{"type":"string","description":"Machine-readable error code, when available."},"errorDetails":{"type":"object","description":"Additional structured error context, when available."}}}}}}