An AI porn API for adult platforms and apps
Most video APIs filter adult content. Corny's API renders adult clips of fictional characters from a single request. What it does and who it is for.
Developer relations
· 5 min read · updated
Use caseYes, there is a porn API that generates new adult video. Corny's API renders clips of fictional adult characters from one request: you send the picks for a scene or a sentence that describes it, you get a job back, and the finished clip arrives on a signed link with sound. This post covers what it does, what a request looks like and who builds on it.
What people mean by a porn API
Developers who search for a porn API usually find two things: APIs that list existing videos, and AI video APIs that refuse adult requests. An API that generates new adult video on demand is rarer. Corny has one.
| Kind of API | What it returns | What it is for |
|---|---|---|
| A listing API | Videos that already exist | Search and embeds |
| A general AI video API | New video, with adult requests filtered | Adverts, film, social clips |
| An adult content API that generates | New adult clips of fictional characters | Catalogues, feeds, apps |
Most porn APIs sit in the first row. If you need footage that did not exist before the request, you need the third.
Why general video APIs do not fit
General video models filter sexual content, and the filter applies to the API as much as to the app. Building an adult product on one means building on requests that can be refused. We go through two cases in Corny vs Kling and Corny vs Runway.
What the Corny API does
It is an NSFW video generation API that renders the same clips the studio makes. A job names a character and either the picks for the scene or a sentence that describes it.
curl https://api.corny.studio/v1/videos \
-H "Authorization: Bearer $CORNY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"describe": "she stretches on a hotel balcony at sunrise", "seconds": 8, "aspect": "portrait"}'The call answers with a job id. Poll the job, and the finished clip arrives on a signed link, with sound.
A clip runs up to ten seconds, in portrait or wide. The sound is the sound of the scene. There is no speech.
The endpoints
The base URL is https://api.corny.studio/v1, and every call carries your key as a Bearer token.
| Method | Path | What it does |
|---|---|---|
| GET | /v1/catalog | Poses, places, outfits and characters in one call |
| GET | /v1/catalog/:set | One set, searched with ?q and paged |
| GET | /v1/catalog/match | Ranks the catalogue against a sentence |
| POST | /v1/videos | Generates a clip from four catalogue picks |
| POST | /v1/images | Generates a still from the same four picks |
| GET | /v1/jobs/:id | Polls a job until it succeeds, then gives its links |
| GET | /v1/jobs | Your jobs, newest first |
| POST | /v1/jobs/:id/cancel | Stops a job that has not finished |
Catalogue reads and job polls cost no credits. Only the two render calls do.
A typed request, start to finish
For a catalogue or a feed, a typed job is steadier than a sentence: the character, the outfit, the pose and the place are ids you read from GET /v1/catalog, and the format is a handful of fields.
curl https://api.corny.studio/v1/videos \
-H "Authorization: Bearer $CORNY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"character_id": "07a8f4c1-40e5-5b6e-abc2-63e341992449",
"outfit_id": "604a94f9-b9fc-5693-9938-f363f09c29fe",
"pose_id": "9067b013-3322-5e07-9fe9-9ba0bee6ef3d",
"place_id": "ef5ca658-b2e8-5291-89dc-c5764b0c9b02",
"prompt": "she laughs and looks over her shoulder",
"quality": "standard",
"aspect": "portrait",
"size": "medium",
"seconds": 8
}'| Field | What it sets |
|---|---|
character_id, outfit_id, pose_id, place_id | The four picks, as catalogue ids |
describe | A sentence, when you want the service to choose the picks |
prompt | A line of direction on top of the picks |
seconds | The length of the clip |
aspect | The shape, portrait or wide |
size | small, medium or large |
quality | fast, standard or high |
The job comes back with the status queued. Poll it until it stops being queued or running:
const api = "https://api.corny.studio/v1"
const headers = {
authorization: `Bearer ${process.env.CORNY_API_KEY}`,
"content-type": "application/json",
}
const start = await fetch(`${api}/videos`, {
method: "POST",
headers,
body: JSON.stringify({
describe: "she stretches on a hotel balcony at sunrise",
seconds: 8,
aspect: "portrait",
}),
})
let job = await start.json()
while (job.status === "queued" || job.status === "running") {
await new Promise((r) => setTimeout(r, 2000))
job = await fetch(`${api}/jobs/${job.id}`, { headers }).then((r) => r.json())
}
console.log(job.status, job.output?.video.url)A job that worked ends as succeeded, and the signed link to the clip is at output.video.url. A job can also end as failed or cancelled, so check the status before you read the link.
Who builds on it
| Who | What they render |
|---|---|
| Companion apps | Video of the characters users already talk to |
| Adult platforms | Clips to fill a catalogue or a feed |
| Interactive stories | The scene a player just chose |
| Agencies | Batches of clips for the models they run |
See the use cases for companion apps, adult platforms and interactive stories.
Characters keep their face
A character built in the studio carries her accepted face into every job that names her. Your users see the same woman on every render, with nothing for you to train or host. How that works is in how Corny keeps a character consistent.
No GPUs to run
Rendering happens on our side. You send jobs and receive clips. There is no model to deploy and no hardware to keep warm. If you are weighing that against your own stack, read Corny vs self hosting.
Getting started
Make a key under API keys in the studio, then test a scene by hand there first: the API and the studio share one engine, so the picks you approve on screen are the picks you send. The documentation has the same quickstart in cURL, Node and Python, and the API feature page has the overview. More in the same clips, from your code.
Frequently asked questions
Is there a porn API that generates video?
Yes. Corny's API renders new adult clips of fictional adult characters. You send POST /v1/videos with four catalogue picks or a sentence, and the finished clip arrives on a signed link with sound.
What is the difference between a porn API and an AI porn video API?
Most porn APIs list or embed videos that already exist. An AI porn video API renders a new clip for each request, so the scene, the character and the shape are yours to set.
How do I get the finished clip from the API?
The request returns a job with the status queued. Poll GET /v1/jobs/:id until the status is succeeded, then read the signed link at output.video.url.
Can the API render real people?
No. Every character is a fictional adult made with AI, and the content standards in the Terms apply to every API render. The API does not make clips of real people.
How is the NSFW API priced?
In credits, the same as the studio, by the length, size and quality of the take. A longer, bigger or sharper take costs more, and the current plans are on the pricing page.
Render her from your code.
Make a key in the studio and send your first job in minutes.
Read the docs


