Characters

Import Character

Bring an existing AI-generated character over from another platform. Only on accounts we have enabled character import for.

SpicyAPI does not accept uploaded images: image editing and image-to-video only take images your own account generated. The one exception is for platforms moving to SpicyAPI with characters they already generated elsewhere. To have it enabled, email contact@spicyapi.com from your account email with your site and roughly how many characters you need to bring over. We enable it for a limited window (usually two weeks) and a set number of characters. Outside that window this endpoint returns 403 with import_not_enabled, import_window_closed or import_limit_reached; GET /v1/account shows your window as character_import.

Imports are governed by Schedule 1 (Character Import Terms) of the Terms of Service: https://www.spicyapi.com/terms-of-service. Before the first import, sign in to the dashboard and accept the current terms; until you do, this endpoint returns 403 import_terms_required. The feature is for migrating your own existing library: do not expose it to your end users or send images they supplied. Keep records of how each imported image was created, since we may ask for them.

Send 1 to 3 images of the same character: JPEG, PNG or WebP, 256 to 8192 pixels a side, at most 10 MB each, as multipart file parts or as image_urls we download from public https addresses. Multipart bodies are limited to about 4 MB in total, so send image_urls for larger files. consent: true is required on every request: it confirms the warranties in Schedule 1, that every image shows a fictional, AI-generated adult character your platform created, is not and was not made from an image of a real person, and was not supplied by an end user. It is stored with the time, the key, the terms version and the user you send.

Every image is screened before anything is rendered or charged, with the same checks as generated output (apparent minors, recognisable real people, real animals with nudity). Files that carry camera metadata are refused as photographs (422 import_photo_metadata). If an image fails screening it is deleted, nothing is charged, and character import is switched off for the account while we review it (422 import_blocked). When screening is unreachable the request returns 503 and nothing is stored or charged. Some imports are held for a person to look at: they return 202 with status: "under_review", and using the character returns 409 until it is approved, usually within one business day.

The result is an ordinary character. The uploads are rendered into a new reference sheet, billed as one spicy-image-edit-1 image, and you pass its id as character to /v1/images/generations, /v1/images/edits or /v1/videos/generations. The uploaded files are never inputs themselves: they cannot be edited or animated directly. Imported characters keep working after the window closes, and your character limit is raised by your import allowance. We review imported characters and what is generated with them; anything that breaks the acceptable use policy is taken down together with everything made from it.

POST/v1/characters/importTry it
Import Character
cURL
curl --request POST \
  --url https://api.spicyapi.com/v1/characters/import \
  --header 'Authorization: Bearer $SPICYAPI_KEY' \
  --form 'name=Mara' \
  --form 'consent=true' \
  --form 'file=@mara-front.png' \
  --form 'file=@mara-side.png'

# or from public URLs
curl --request POST \
  --url https://api.spicyapi.com/v1/characters/import \
  --header 'Authorization: Bearer $SPICYAPI_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "Mara",
    "consent": true,
    "image_urls": ["https://assets.example.com/characters/mara-front.png"]
  }'
201
JSON
{
  "id": "chr_4b7e2a9c1d3f5e60",
  "object": "character",
  "name": "Mara",
  "sheet_url": "https://cdn.spicyapi.com/outputs/a1b2/chr_4b7e2a9c1d3f5e60.png",
  "source_urls": ["https://cdn.spicyapi.com/imports/a1b2/imp_9d3c…-0.png"],
  "description": "Adult woman in her late 20s, oval face, deep-set pale blue eyes, full lips, long straight ash-blonde hair, fair skin, slim build.",
  "imported": true,
  "status": "active",
  "created": 1758553200,
  "import_id": "imp_9d3c5a1e7f2b4c68",
  "cost_usd": 0.15,
  "character_import": { "status": "open", "expires_at": 1759762800, "used": 12, "limit": 50, "remaining": 38 }
}

Authorizations

Authorizationstringheaderrequired

Bearer authentication header of the form Bearer <token>, where <token> is your SpicyAPI key (sk-spicy-…). Create one in the dashboard under API Keys.

Body

multipart/form-data

Send file parts (multipart/form-data) or image_urls (an application/json body), not both.

namestringrequired

A label, up to 60 characters.

filebinarymultipart

An image of the character: JPEG, PNG or WebP, 256 to 8192 pixels a side, at most 10 MB. Repeat the part for up to 3 images of the same character.

image_urlsstring[]json

1 to 3 public https URLs of the same character we download on your behalf (same limits; private, loopback and plain-IP hosts are refused).

consentbooleanrequired

Must be true (the string true in multipart): your attestation under Schedule 1 of the Terms of Service that every image shows a fictional, AI-generated adult character your platform created, is not and was not made from an image of a real person, and was not supplied by an end user.

userstring

Your own id for the end user making this request (up to 128 characters, hashed at rest). Send it if your product serves many people: declined-prompt history, strikes and suspensions are then kept per end user, so one person's behaviour never affects another's requests or your account. After 10 severe violations that user gets 403 end_user_suspended; the id is echoed back as user in every screening error so you can act on it.

Response

201 · application/json

Character

202 instead of 201 when the import is held for review (`status: "under_review"`, with a `note`).

idstringrequired

Character id, chr_....

namestringrequired

The label you gave.

sheet_urlstringrequired

The rendered reference sheet (also listed in GET /v1/images once the character is active).

source_urlsstring[]required

The images it was built from.

descriptionstringrequired

Text descriptor of the person, appended to prompts that use the character.

importedbooleanrequired

true for a character brought in with POST /v1/characters/import.

statusstringrequired

active, or under_review for an import a person has to approve first. Using an under_review character returns 409.

createdinteger | null

Unix timestamp.

import_idstringrequired

Import id, imp_..., for support requests.

cost_usdnumberrequired

The reference sheet render, billed as one spicy-image-edit-1 image.

character_importobjectrequired

Your import window after this request.

Was this page helpful?