# Avatar · Nano Banana Pro (avatar) > Create a reusable character identity with an original full-body image and a matching three-panel reference sheet. One creation quote includes both stages and the individual panel crops. The saved avatar_id works with supported image, scene, video, UGC, and lipsync endpoints. Status: roasOS API v1.1. Catalog `model-catalog@2026-10-06.v5`, pricing `customer-pricing@2026-11-05.v15`. The endpoint `POST /v1/avatar/nano-banana-pro` is live. `POST /v1/generations` has no `avatar` type, so this endpoint is the only path to this model. ## Endpoint POST https://api.roasos.com/v1/avatar/nano-banana-pro Auth: Authorization: Bearer roasos_sk_… (scope api:write). Idempotency-Key required. quote_only / quote_id / webhook_url as in https://docs.roasos.com/llms.txt. ## Good at Use this endpoint to create a consistent person for a campaign. Two sequential Nano Banana Pro calls generate a 4K vertical 2:3 original full-body image, then a matching 4K landscape 16:9 sheet using that original image as the reference. The original and sheet use a pure white seamless studio background. The sheet shows full-body front, full-body back, and a close-up frontal face. Realistic characters use natural facial texture and soft dimensional studio light; supplied character details and non-photographic styles are preserved. Cropping derives the individual views without additional image generation calls. Use manual mode with a description to invent a character; use reference mode with 1–5 photos to anchor the character's appearance. Supported image, scene, and reference-video models use the sheet as the identity reference. Kling identity elements pair the frontal crop with the sheet. Lipsync uses a single frontal crop. Provider face-reference restrictions still apply. ## Pricing Unit: avatar. Pricing key: `nano-banana-pro`. | request | credits | |---|---| | `4K_original_and_sheet` | 20 | Credits come from the roasOS pricing table (`MODEL_COSTS`) through the catalog. No other field changes the price. ## Modes - `manual` - `reference` The worker derives the mode from the media fields of the request. Provider endpoints: `fal-ai/nano-banana-pro` · `fal-ai/nano-banana-pro/edit`. ## Request fields | field | type | required | default | rule | |---|---|---|---|---| | `description` | string | yes | — | ≥ 1 character; ≤ 1,000 characters | | `mode` | enum | no | `manual` | `manual`, `reference` | | `name` | string | no | — | ≥ 1 character; ≤ 200 characters | | `quote_id` | string | no | — | UUID | | `quote_only` | boolean | no | `false` | — | | `reference_images` | string[] | no | — | 1–5 items; only in `reference` | | `wait_timeout_seconds` | integer | no | `0` | 0–60 | | `webhook_url` | string | no | — | https URL; ≤ 4,096 characters | The schema is strict: a field that is not in this table returns `400 unsupported_option`. Field names are the roasOS role names, one name per role across every family. ## Media - `reference_images` — the source images the generation is built from | role | items | max size | content types | duration | |---|---|---|---|---| | `reference_images` | ≤ 5 | 10 MB | `image/jpeg`, `image/png`, `image/webp` | — | - Refused: `avatar_id`, `elements`, `product_id`, `product_images`, `references`, `image_url`, `end_image_url`, `scene_id`, `scene_image`, `video_urls`, `video_url`, `audio_urls`, `audio_url`, `voice_id`. A refused role returns `400 unsupported_option`. - Every URL must be an immutable object on `https://cdn.roasos.com/…` that your workspace owns; any other URL is `400 reference_media_not_workspace_owned`. Upload with `POST /v1/uploads` (direct POST of the bytes to `put_url`, or a `source_url` import), then use the returned CDN URL. ## Prompt Describe one adult character in description, up to 1,000 characters. The worker adds the original-image and three-panel sheet instructions; you do not need to request separate photos or write image tags. - Describe appearance, build, hair, skin tone, wardrobe, and visual style. - Specify the wardrobe you want preserved across the sheet. - Keep scene and product direction for later image or scene requests. - In reference mode, let the supplied photos anchor identity and describe details they do not show. ## Not exposed - `output_format`: pinned to `jpeg`. - `safety_tolerance`: pinned to `4`. - `enable_web_search`: pinned to `false`. - `limit_generations`: pinned to `true`. - `system_prompt`: not accepted by this public endpoint. - `sync_mode`: not accepted by this public endpoint. - `aspect_ratio`: pinned to `2:3 original image; 16:9 reference sheet`. - `resolution`: pinned to `4K`. - `num_images`: pinned to `1 per stage; 2 sequential stages`. - `seed`: pinned to `derived from the Idempotency-Key`. ## Result Result kind `avatar`. Always present: `avatar_id`, `images`. Present when the run produces it: `full_body_url`, `portrait_url`, `reference_sheet`. ```json { "data": { "id": "gen_…", "kind": "avatar", "model": "nano-banana-pro", "status": "completed", "result": {"avatar_id":"00000000-0000-4000-8000-000000000000","full_body_url":"https://cdn.roasos.com/workspaces/ws_01/full_body_url","images":{},"portrait_url":"https://cdn.roasos.com/workspaces/ws_01/portrait_url","reference_sheet":"https://cdn.roasos.com/workspaces/ws_01/reference_sheet"} } } ``` Files live on `https://cdn.roasos.com` and are immutable; a result URL can be a media input to the next call. Poll `GET /v1/jobs/{id}/status` → `{ id, status, updated_at }`, then `GET /v1/jobs/{id}/result` (`409 run_not_completed` until the job is `completed`, `failed` or `canceled`). Statuses: `queued → processing → completed | failed | canceled`. ## Example ```bash # 1. quote — nothing is spent curl -X POST https://api.roasos.com/v1/avatar/nano-banana-pro \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-nano-banana-pro-0001" \ -H "Content-Type: application/json" \ -d '{"quote_only":true,"description":"A woman in her late twenties, shoulder-length dark hair, plain grey t-shirt, neutral expression."}' # → 200 { "data": { "kind": "quote", "quote_id": "q_7Hk…", "credits": 20, "expires_at": "…", "confirmation": { "model": "nano-banana-pro", "example": "4K_original_and_sheet" } } } # 2. run — the same body and the same Idempotency-Key, quote_id instead of quote_only curl -X POST https://api.roasos.com/v1/avatar/nano-banana-pro \ -H "Authorization: Bearer roasos_sk_live_…" \ -H "Idempotency-Key: 0f1c9e2a-nano-banana-pro-0001" \ -H "Content-Type: application/json" \ -d '{"quote_id":"q_7Hk…","description":"A woman in her late twenties, shoulder-length dark hair, plain grey t-shirt, neutral expression."}' # → 201 { "data": { "id": "gen_…", "kind": "avatar", "model": "nano-banana-pro", "status": "queued", "credits_reserved": 20, "links": { "status": "/v1/jobs/gen_…/status", "result": "/v1/jobs/gen_…/result" } } } # 3. poll curl https://api.roasos.com/v1/jobs/gen_…/status -H "Authorization: Bearer roasos_sk_live_…" curl https://api.roasos.com/v1/jobs/gen_…/result -H "Authorization: Bearer roasos_sk_live_…" ``` ## Today POST /v1/avatar/nano-banana-pro is the creation endpoint. Request quote_only first, then submit the same fields with quote_id and the same Idempotency-Key. The response is an avatar job. Its completed result exposes avatar_id, reference_sheet, portrait_url, and full_body_url. The full_body_url is the original image; portrait_url is the frontal face crop. Poll GET /v1/avatars/{avatar_id} until the saved avatar is available; publication may finish shortly after rendering. GET /v1/avatars lists saved identities and DELETE /v1/avatars/{id} removes one. One quote covers both 10-credit generation stages, for 20 credits total. There is no separate sheet purchase step. Existing avatars remain usable with their original reference images. ## See also https://docs.roasos.com/models/avatar/nano-banana-pro · https://api.roasos.com/v1/catalog/avatar/nano-banana-pro · fal-ai/nano-banana-pro · fal-ai/nano-banana-pro/edit