Automated Adult Content Generation API: Submit, Poll, Scale
Key Takeaways
- Adult generation is not a separate API surface. The endpoints whose IDs end in -spicy post to the same paths as every other image and video model; only the model string in the body changes.
- One poller covers image, video and 3D. The status values and the response envelope are byte-identical across all three.
- No endpoint accepts a webhook, callback or notify field. Polling is the only completion signal, and the docs put the cadence at 3 to 5 seconds.
There Is No Separate Adult API
Read on August 14, 2026 from the request schemas at docs.siray.ai/api-reference/openapi-spec/, 180 endpoints are callable. Fifteen of them carry -spicy or -uncensored in the ID, and all fifteen use exactly the same paths as the other 102 media endpoints. Twelve are Spicy endpoints: seven video across Seedance 2.0, Seedance 2.5 and Wan 2.7, plus five Seedream Spicy image.
The integration you built for a safe-for-work model is the one an adult model needs. What changes is the model string and what it costs — the video pricing guide covers the second part, and the 2026 NSFW model roundup covers which string to put there.
The URL Will Not Tell You Sync from Async
Submit | Poll | Endpoints |
POST /v1/video/generations | GET /v1/video/generations/{task_id} | 66 |
POST /v1/images/generations/async | GET /v1/images/generations/async/{task_id} | 48 |
POST /v1/3d/generations | GET /v1/3d/generations/{task_id} | 3 |
117 media endpoints, three submit paths, three poll paths. The remaining 63 endpoints are chat and embeddings, and those return synchronously.
Notice what the table gives away: the image path contains /async/ and the video path does not, yet both are asynchronous. Submitting a video job returns a task_id, not video bytes. Reading the URL for a hint about response shape gets it backwards.

One Poller Covers Image, Video and 3D
The poll response is the same object regardless of modality: code, message, and a data block holding task_id, status, progress, outputs, fail_reason, and three timestamps — submit_time, start_time, finish_time. The outputs array carries public URLs once the job lands.
Status | Meaning |
NOT_START | accepted, preprocessing has not begun |
SUBMITTED | stored, waiting to enter the queue |
QUEUED | scheduled, waiting for compute |
IN_PROGRESS | generating |
SUCCESS | read outputs |
FAILURE | read fail_reason |
Those six values are byte-identical across the image, video and 3D task documentation. Write one state machine and point it at whichever poll path the job came from. The task_id prefix — image_, video_, 3d_ — is the only other tell.
Store the three timestamps. Queue wait is start_time minus submit_time; generation is finish_time minus start_time. One combined latency number hides which of the two is slow.
There Are No Webhooks
Across all 180 callable endpoints, zero request bodies accept a webhook, callback or notify field. Polling is not the recommended pattern, it is the only one. Both the image and video docs say to query every 3 to 5 seconds.
For a scaled pipeline, that shapes the design: you need durable storage of every task_id at submit time, a worker that walks open tasks on that interval, and a terminal-state rule that treats FAILURE as data rather than an exception. Errors on the submit call itself are a separate problem with its own retry rules.

FAQ
Does Siray have a separate API for adult content generation?
No. The endpoints whose IDs end in -spicy use the same submit and poll paths as every other image and video model. The model string in the request body is the only difference.
Does the adult image or video API support webhooks?
No endpoint on the platform does. A sweep of all 180 callable request schemas found zero webhook, callback or notify fields, so completion is detected by polling the task at the documented 3 to 5 second interval.
Can one poller handle both image and video jobs?
Yes. The six status values and the full response envelope are identical across image, video and 3D, so a single state machine works for all three. Only the poll URL and the task_id prefix differ.
Summary
Automating adult generation is not a special integration. Submit, store the task_id, poll every 3 to 5 seconds, read outputs or fail_reason. Build it once and every model is a string swap away, including the batch production workflows on top of it.
Get Started
Create your free Siray account and submit your first task — the API quickstart walks through authentication and the first request.
Compliance: Siray refuses all illegal content and enforces zero tolerance for CSAM. Every endpoint above is intended for lawful adult content involving consenting adults only, and never for a real person's likeness without documented consent. "Uncensored" and "Spicy" mean no excess filtering within the law — not the absence of it.