Import Character
Bring an existing AI-generated character over from your own platform. Only for verified businesses with an open import window.
SpicyAPI does not accept uploaded images: image editing and image-to-video only take images your own account generated. spicy-image-reference-1 takes a picture only to recreate it as new people (the upload is never kept or reusable); use that if you have a picture rather than a platform. The other exception is for registered businesses moving their own platform's existing AI-generated characters to SpicyAPI. Apply in the dashboard under Settings, Character import (https://www.spicyapi.com/dashboard/import): the account needs at least $50 of paid balance, you prove a mailbox on your platform's domain (your account email if it is on that domain, or any address there we send a code to), you upload the certificate of incorporation and an official list of current directors from the last 3 months, and the director you name signs the Character Import Agreement (https://www.spicyapi.com/import-agreement) from a link we email them, with a drawn signature. We read the documents and check them against the company's registry record, the website and the Internet Archive; when everything matches, the window opens straight away for 7 days, otherwise a person reviews the application, usually within one business day.
Outside the 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. The limit grows with evidence: you start with 10 imports, and every import whose source page verifies (or that we approve) gives its place back. Moving a large library? Say how many characters when you apply, or email contact@spicyapi.com, and we can set a larger allowance up front. If any image fails screening, import is paused for the account while we review it.
Imports are governed by Schedule 1 (Character Import Terms) of the Terms of Service (https://www.spicyapi.com/terms-of-service) and the Character Import Agreement. Until the account has accepted terms that include Schedule 1, 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, and never a real person, whatever permission they gave. Keep records of how each imported character was created, since we may ask for them.
Every import names source_url, the public page where that character appears on your verified website. A URL on another domain is refused (422 import_source_mismatch), and so is a page that does not exist (422 import_source_not_found); nothing is stored or charged. We fetch the page, look for the uploaded image on it, and check that the Internet Archive has the page (or that image) from at least 30 days before the import. When any of that cannot be confirmed, the import is held for review rather than refused.
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.
Stylised characters (anime, cartoon, illustration, 3D) with a verified source page are ready at once. Every photorealistic character waits for a person, and we also search the web for the image (whole-image matching, never face recognition): an exact copy on a stock photo site or on several other sites is refused (422 import_found_elsewhere, nothing stored or charged). Held imports return 202 with status: "under_review" and no sheet_url until approved, 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; how many you can import is set 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.
curl --request POST \
--url https://api.spicyapi.com/v1/characters/import \
--header 'Authorization: Bearer $SPICYAPI_KEY' \
--form 'name=Mara' \
--form 'source_url=https://example.com/characters/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",
"source_url": "https://example.com/characters/mara",
"consent": true,
"image_urls": ["https://assets.example.com/characters/mara-front.png"]
}'{
"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.09,
"provenance": { "source_url": "https://example.com/characters/mara", "verified": true },
"character_import": { "status": "open", "expires_at": 1759762800, "used": 12, "limit": 21, "remaining": 9 }
}Body
multipart/form-dataSend file parts (multipart/form-data) or image_urls (an application/json body), not both.
A label, up to 60 characters.
The public https page where this character appears on your platform, on the website verified in your application. We look for the uploaded image on it and in the Internet Archive.
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.
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).
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.
Your own id for the end user making this request (up to 128 characters; send an opaque id, not an email). 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. It is stored with the requests it was sent on, so DELETE /v1/end-users/{user} can erase that person's data.
Response
201 · application/jsonCharacter
202 instead of 201 when the import is held for review (`status: "under_review"`, with a `note`).
Character id, chr_....
The label you gave.
The rendered reference sheet (also listed in GET /v1/images once the character is active). null while the character is under_review.
The images it was built from. Empty while the character is under_review.
Text descriptor of the person, appended to prompts that use the character.
true for a character brought in with POST /v1/characters/import.
active, or under_review for an import a person has to approve first. Using an under_review character returns 409.
Unix timestamp.
Import id, imp_..., for support requests.
The reference sheet render, billed as one spicy-image-edit-1 image.
source_url, and verified: whether the image was found on that page and the page is in the Internet Archive from at least 30 days ago. Unverified imports are held for review.
Your import window after this request.
Was this page helpful?