Skip to main content

Build with nocensor.ai

REST API for image generation, video, face swap, enhance, and multi-stage pipelines. Scoped API key auth, async job polling, webhooks — same credit system as the UI.

API key auth

Bearer token with per-key rate limits. Max 5 keys per account.

Async jobs

202 Accepted + polling. No blocking requests. Signed URLs when complete.

Same credit system

Credits deducted on submission. Failed jobs auto-refunded by cron.

Prompt safety

Same content filter as the UI. CSAM blocked at all tiers.

Authentication

All endpoints (except /api/v1/health) require a Bearer token:

Authorization: Bearer nc_live_<your_key>

API keys are generated in Settings → API Keys. Keys are shown once at creation — store them securely.

Each key carries one or more scopes. Using a key on an endpoint outside its scope returns 403 INSUFFICIENT_SCOPE.

ScopeGrants access to
generationPOST /generate, /video, /face-swap, /enhance, /pipelines, /undress
mgmtGET /jobs, /jobs/{id}, /account, /credits, /payments, /models, /characters, /pipelines/{id}; DELETE /jobs/{id}
webhooksAll /webhooks/* endpoints

API Reference

Full OpenAPI 3.1 spec available at /openapi.yaml.

Generation

POST/api/v1/generate

Generate an image

POST/api/v1/video

Generate a video

POST/api/v1/undress

AI undress

POST/api/v1/face-swap

Swap faces in an image

POST/api/v1/enhance

Enhance / upscale an image

Pipelines

POST/api/v1/pipelines

Submit a multi-stage image pipeline

Add `?dry_run=true` to get a cost breakdown (200) without submitting the job (202).

GET/api/v1/pipelines/{id}

Get pipeline status

Jobs

GET/api/v1/jobs

List generation jobs

GET/api/v1/jobs/{id}

Get job status / result

DELETE/api/v1/jobs/{id}

Cancel a pending job

Webhooks

GET/api/v1/webhooks

List webhooks

POST/api/v1/webhooks

Create a webhook

The `secret` field is only returned at creation time.

GET/api/v1/webhooks/{id}

Get webhook details

PATCH/api/v1/webhooks/{id}

Update a webhook

DELETE/api/v1/webhooks/{id}

Delete a webhook

GET/api/v1/webhooks/{id}/deliveries

List webhook delivery attempts

POST/api/v1/webhooks/{id}/test

Send a test delivery

Account

GET/api/v1/account

Get account details

GET/api/v1/credits

Get credit balance

GET/api/v1/payments

List payment history

GET/api/v1/characters

List available characters

GET/api/v1/models

List available models

System

GET/api/v1/health

Health check

Quick start

Use the official TypeScript SDK (@nocensor/sdk) for end-to-end type safety, retries, and polling — or hit the REST API directly with curl.

SDK (Node, browsers, Deno, Bun, Workers)

npm install @nocensor/sdk

import { NoCensor } from '@nocensor/sdk'

const nc = new NoCensor({ apiKey: process.env.NOCENSOR_API_KEY })

const job = await nc.generate.createAndWait({
  prompt: 'beautiful woman, photorealistic',
  model: 'realistic',
})

console.log(job.outputs[0].url)

1. Submit a job with curl (202 Accepted)

curl -X POST https://nocensor.ai/api/v1/generate \
  -H "Authorization: Bearer nc_live_<your_key>" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "beautiful woman, photorealistic", "model": "realistic"}'

# 202 Accepted
# {
#   "data": { "id": "job_...", "status": "pending" },
#   "meta": { "poll_url": "/api/v1/jobs/job_...", "credits_remaining": 490 }
# }

2. Poll until complete

curl https://nocensor.ai/api/v1/jobs/<job_id> \
  -H "Authorization: Bearer nc_live_<your_key>"

# 200 OK — when done:
# {
#   "data": {
#     "id": "job_...", "status": "completed",
#     "outputs": [{ "url": "https://...", "media_type": "image", "expires_at": "..." }]
#   }
# }

Rate limits

LimitValueScope
Generation10 rpmPOST /generate, /video, /face-swap, /enhance, /pipelines, /undress
Management60 rpmGET /jobs, /jobs/{id}, /account, /credits, /payments, /models, /characters, /pipelines/{id}; DELETE /jobs/{id}
Webhooks10 rpmAll /webhooks/* endpoints
Active keys5 maxPer account

All responses include X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset headers. Rate-limited responses include a Retry-After header.

Error codes

CodeHTTPTrigger
UNAUTHORIZED401Missing, invalid, or revoked API key
FORBIDDEN403Account suspended or key missing required scope
INSUFFICIENT_SCOPE403API key lacks the required scope for this endpoint
INSUFFICIENT_CREDITS402Not enough credits for the workflow
PURCHASE_REQUIRED402Endpoint requires a prior real purchase (e.g. /undress)
VIDEO_REQUIRES_PAID_TIER402/video — paid tier required; route the user to the /credits upsell page
RATE_LIMITED429Per-key or per-user rate limit exceeded
VALIDATION_ERROR422Request body failed schema validation (some endpoints return 400)
INVALID_REQUEST400Malformed or unparseable JSON body
INVALID_INPUT400Invalid or missing request field
INVALID_WORKFLOW400Unknown model or workflow id in the request
PROMPT_BLOCKED400Content policy filter triggered
PROMPT_REJECTED400Content policy filter triggered (enhance operations)
CONSENT_REQUIRED400/video img2video submitted without biometricConsent: true
PAYLOAD_TOO_LARGE413Image exceeds 3.5MB
NOT_FOUND404Job does not exist or not owned by caller
SOURCE_NOT_FOUND404job_<uuid> source reference not owned by caller or has no output
PIPELINE_NOT_FOUND404Pipeline correlation_id has no jobs owned by caller
LORA_NOT_FOUND404LoRA id in `loras[]` not owned by caller
JOB_NOT_CANCELLABLE409DELETE on a job already completed, failed, or cancelled
LORA_NOT_READY409LoRA is soft-deleted, still training, failed, or missing output
LORA_NOT_OWNED403LoRA id in a pipeline stage not owned by caller
LORA_INCOMPATIBLE400LoRA base model doesn't match the target model/endpoint
TOO_MANY_LORAS400More loras[] than the model allows (max 2 for images, max 1 for video)
PIPELINE_TOO_MANY_STAGES400Pipeline exceeds the 5-stage max
PIPELINE_INVALID_STAGE_ORDER400Image stage placed after a video-producing stage
CHARACTER_LOCKED403Character has not been unlocked by this account
REGION_BLOCKED451Feature unavailable in the caller's region (e.g. AI undress in banned US states, or restricted countries)
WEBHOOK_URL_INVALID400Webhook URL failed validation
WEBHOOK_LIMIT_REACHED409Maximum webhooks per account reached
WEBHOOK_INACTIVE409Webhook is disabled — reactivate before test or deliveries
GPU_UNAVAILABLE503All GPU workers throttled — retry shortly
FEATURE_UNAVAILABLE503Endpoint temporarily gated — retry later
STORAGE_ERROR500Transient storage failure signing a source URL — retry
DB_ERROR500Transient database error — retry
INTERNAL_ERROR500Unexpected server error — retry

Ready to build?

Create an account, get your API key, and start generating.

Get started free
Developer API | Build with nocensor.ai