Character API
Generation with characters, plus the mechanism for paying rights holders for that use.
What you can do
- Generate images that keep a character's appearance, using a reference image (GPT-Image-2.5 Flare / Sunburst, GPT-Image-2, Nano Banana 2)
- Per-character usage records — the ledger keeps track of which character was used how much
- Royalty allocation — apply a rate to the amount used and compute what each rights holder is owed
When you work with characters in AI generation, the hard part in practice is not the technology but who gets paid how much. api.aicu.ai writes the character to a ledger on every generation, so payouts can be calculated afterwards with evidence behind them.
Basics: draw your own character in one request
The question this page answers most often: "I want an illustration of my character for a blog post. Can it use GPT-Image-2.5, and what do I send?" Yes — one JSON body with a picture of the character, the scene, and the model.
import base64, requests
ref = base64.b64encode(open("luc4.png", "rb").read()).decode() # one picture of the character
res = requests.post(
"https://api.aicu.ai/v1/images/generations",
headers={"Authorization": "Bearer aicu_live_xxx"},
json={
"model": "gpt-image-2.5-flare", # or gpt-image-2.5-sunburst / gpt-image-2 / nano-banana
"character": "luc4", # ← who the picture is of, and who gets credited
"reference_image": ref, # the look comes from here
"prompt": "Anime style. LuC4: 20-year-old kind boyfriend, (streaked hair), "
"red short hair with a light highlight streak, red eyes, hoodie. "
"Scene: sitting at a sunny cafe table, typing a blog post on a laptop, "
"looking up with a big smile and a thumbs-up. No text.",
"size": "1536x1024",
"quality": "high",
"visibility": "public", # public: listed in the gallery with the credit line. private: nothing kept, ×2
},
timeout=240,
)
j = res.json()
open("cover.png", "wb").write(base64.b64decode(j["data"][0]["b64_json"]))
print(j["ap_cost"], j["data"][0]["url"]) # 5100 https://api.aicu.ai/v1/images/file/<id>
This exact request is the sample on the top page: 1536×1024 high costs 5,100 AP and took about 25 seconds on Flare.
characteris who the royalty is attributed to. Unregistered names are accepted as long as you also sendreference_image, so you can bring your own characters. Sending an unknown name with no reference image returns an error — that is deliberate, to catch typos.modelis honoured whenever you bring your own reference image. A registered preset carries its own model (see Presets).- Put the character's official appearance words in front of the scene. The reference sets the overall look; the words keep details such as a highlight streak stable from picture to picture.
- The response carries
id,data[0].url,data[0].b64_jsonandap_cost; the cost is also in theX-AICU-AP-Costheader. If the connection drops after 100 seconds, fetch the result withGET /v1/images/status/{id}. - Using the OpenAI SDK?
images.edit()works againstbase_url="https://api.aicu.ai/v2.5", but that surface has nocharacterfield, so royalties are not attributed. Use/v1when the character matters.
Partial edits (masking)
You can redraw just part of something you already generated. Pass a PNG mask where white = keep / black = redraw.
res = requests.post(
"https://api.aicu.ai/v1/images/generations",
headers={"Authorization": "Bearer aicu_live_xxx"},
json={
"model": "gpt-image-2",
"character": "nao",
"prompt": "change the background to a night city",
"reference_image": base64.b64encode(previous_image).decode(),
"mask": base64.b64encode(mask_png).decode(),
},
)
Setting the aspect ratio (Nano Banana 2)
json={"model": "nano-banana", "character": "nao",
"prompt": "...", "reference_image": ref, "aspect_ratio": "16:9"}
Useful where the ratio is fixed by the destination — social headers, blog cover images and so on.
Presets
Characters registered in GET /v1/images/characters can be called with character alone, with no reference image. The server already holds the reference image, a base prompt and the model, and the listed ap_cost is the price per image.
curl https://api.aicu.ai/v1/images/characters
{ "character": "MeiSoleil", "prompt": "waving hello at a summer festival", "visibility": "public" }
Registration is by review. Rights holders can get in touch; the registered set is shown on Character IP.
Royalty allocation
Every successful generation is written to the append-only AP ledger with the character name attached.
character | model | amount | description
hakase | gpt-image-2 | -2400 | Image: gpt-image-2
The payout is the amount used multiplied by the rate held in the rights-holder master table (character_rights).
| Character | Rights holder | Generations | Amount used | Rate | Royalty |
|---|---|---|---|---|---|
| Mei Soleil | AICU Inc. | 3 | ¥60.00 | 40% of gross margin | ¥9.60 |
This table and the figures below are rough examples used to explain the mechanism. Actual unit prices are set in AP (denominated in USD, 10,000 AP = $1) and are subject to price revision. Yen figures move with the exchange rate.
The split is applied to gross margin (revenue − API cost).
Revenue ¥100 − API cost ¥50 = gross margin ¥50
├ Platform fee (incl. patent royalty) 20% = ¥10 → AICU
├ Royalty to the copyright holder 40% = ¥20 → rights holder
└ Remainder 40% = ¥20 → AICU's profit
Rates are configurable per character, so whatever you agreed with the rights holder is what gets applied. Totals also roll up per payee (rights holder), which matches the unit you invoice on.
Credit lines
Rights metadata is kept separately from the payee, because the payee (a company) and the original author (the person named in the credit) are not necessarily the same.
| Field | Purpose |
|---|---|
holder | Who the royalty is paid to |
original_author | The original creator or designer (for the credit line) |
credit_text | The exact wording to display on images and in galleries |
license | Identifier for the terms of use |
source_url | Primary source for the rights information |
Published gallery entries freeze the credit as it stood at publication time: if the rights notice changes later, the text attached to already-published images stays as it was.
Note that output from api.aicu.ai is not C2PA-compliant. If you need signed provenance, use cert.aicu.ai.
Design guarantees
- The ledger is append-only. Nothing is rewritten after the fact; corrections are made by appending an offsetting row
- api.aicu.ai does not hold funds. The ledger is a record for calculating payouts, not a custodial balance
- Cache hits are not billed, so no royalty accrues either — you only re-fetched the same image
How caching works
A generation with identical parameters (model, prompt, reference image, mask, size) is served from the R2 cache and comes back with cached: true. Neither billing nor royalties apply. Add force: true when you want it regenerated.
Support
- Dashboard: https://api.aicu.ai/dashboard
- Usage history: https://api.aicu.ai/dashboard/history
© 2026 AICU Inc.