Use case

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

A woman in glasses, an open black hoodie and a neon yellow sports bra sits in a gaming chair with a keyboard, as a golden beam links her screens to a small video frameUse case

Yes, 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 APIWhat it returnsWhat it is for
A listing APIVideos that already existSearch and embeds
A general AI video APINew video, with adult requests filteredAdverts, film, social clips
An adult content API that generatesNew adult clips of fictional charactersCatalogues, 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.

bash
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.

MethodPathWhat it does
GET/v1/catalogPoses, places, outfits and characters in one call
GET/v1/catalog/:setOne set, searched with ?q and paged
GET/v1/catalog/matchRanks the catalogue against a sentence
POST/v1/videosGenerates a clip from four catalogue picks
POST/v1/imagesGenerates a still from the same four picks
GET/v1/jobs/:idPolls a job until it succeeds, then gives its links
GET/v1/jobsYour jobs, newest first
POST/v1/jobs/:id/cancelStops 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.

bash
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
  }'
FieldWhat it sets
character_id, outfit_id, pose_id, place_idThe four picks, as catalogue ids
describeA sentence, when you want the service to choose the picks
promptA line of direction on top of the picks
secondsThe length of the clip
aspectThe shape, portrait or wide
sizesmall, medium or large
qualityfast, standard or high

The job comes back with the status queued. Poll it until it stops being queued or running:

js
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

WhoWhat they render
Companion appsVideo of the characters users already talk to
Adult platformsClips to fill a catalogue or a feed
Interactive storiesThe scene a player just chose
AgenciesBatches 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