Skip to main content

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:
Then 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

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.
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.
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.
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:
save_creation_as:list_creative_entities:
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.
Returns upload_url (HTTP PUT, valid for 10 minutes) and the permanent public_url to pass as a reference.
prepare_scrub_video — pass one of:publish_page:
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.