create_media — the front door
Say what you want. NinjaChat classifies it (make / edit / animate / options), picks the model, and stays inside your budget.
What
quality does underneath: for images it biases the auto-router (fast → speed, best → quality); for options it picks the model spread and the default budget (12¢ / 30¢ / 45¢ when max_spend_cents is omitted, always clamped to 5–100¢); for video it picks google-veo-3-fast / auto / veo-3.1.
Continuity — say it like a person
The server remembers recent results, so nobody re-pastes URLs:
Recents are kept per user and per client for 24 hours — a Cursor session doesn’t see what Claude Code made an hour ago, but generation IDs always resolve.
“Give me 4 directions for the game world.”
“Now a courier character in the style of the second one.”
One call: generate_image with source: "2". Same world, new character.
Creative memory — survives sessions
Name a keeper once, reuse it forever:use: ["Maya"] on any creation tool applies her reference images automatically. Types: project · character · product · style. Saving the same name again adds another reference (each name keeps up to 8; the oldest rotates out). Forgot the name? list_creative_entities.
Ship-ready outputs
Every image returns three fields — download, commit, done:All 18 tools
Every tool answers with JSON —
{ "ok": true, … } or { "ok": false, "error": { "code", "message", "recoverable", "next_steps", … } } — so the agent can read and recover from the payload. The one exception is argument validation: a missing or out-of-range parameter is rejected before the tool runs, as a plain-text result flagged isError: true (Input validation error: Invalid arguments for tool …) rather than the JSON envelope. Nothing is charged either way.Specialist parameters
generate_image / edit_image
generate_image / edit_image
An explicit
model is a contract — no silent substitution. auto may reroute to a compatible model if a provider fails, and the charge settles on the model that ran. Edit-only models (runway-gen4-image-turbo, qwen-image-edit-plus) return model_requires_reference without a reference.generate_video / image_to_video
generate_video / image_to_video
Video is async: the call returns a
generation_id and eta_seconds, and the agent polls get_generation_status (~15s apart). Render time depends on the model — from 20–90 seconds on seedance-lite to 2–6 minutes on kling-video; search_models lists each model’s eta_seconds. Failures refund automatically.compare_models
compare_models
Results come back numbered in pick order — choose one and continue from it with
source. A model that fails inside the bakeoff costs nothing; you’re charged for the ones that delivered.get_generation_status
get_generation_status
Returns
pending (with progress_percent and eta_seconds), succeeded (with the playable URL), or a refunded failure. Images finish synchronously and never need polling.search_creations / get_creation
search_creations / get_creation
search_creations:get_creation:save_creation_as / list_creative_entities
save_creation_as / list_creative_entities
save_creation_as:list_creative_entities:search_models / estimate_cost
search_models / estimate_cost
search_models:Each result carries
price_cents (image: per output; video: the 4-second “from” price). Video results also carry price_cents_at_default_duration and default_duration_seconds (8) — the amount you are billed when you accept the tool defaults — plus eta_seconds.estimate_cost:The estimate also reports
within_balance and within_spend_limit.upload_asset
upload_asset
Returns
upload_url (HTTP PUT, valid for 10 minutes) and the permanent public_url to pass as a reference.prepare_scrub_video / publish_page
prepare_scrub_video / publish_page
prepare_scrub_video — pass one of:publish_page:add_credits / get_account_balance
add_credits / get_account_balance
add_credits:Returns a Stripe
checkout_url for the user to open. It never turns auto-reload on.get_account_balance takes no parameters and returns the balance, what it buys, this month’s spend against your limit, and the subscriber allowance state.