# inReels > Images, voice and video for AI agents. Ad creatives, UGC ads and faceless > videos, rendered and returned as files. Built on 28 image, video and speech > models behind one interface. ## Connect MCP (streamable HTTP, stateless): https://www.inreels.ai/api/mcp REST: https://www.inreels.ai/api/v1/{tool} Machine-readable tool list with JSON Schemas: https://www.inreels.ai/api/v1 Claude Code: claude mcp add --transport http --scope user inreels https://www.inreels.ai/api/mcp Any client that sets headers: Authorization: Bearer ir_live_... Create a key at https://www.inreels.ai/dashboard/settings/api-keys OAuth 2.1 with dynamic client registration is also supported, for clients that prefer a browser sign-in: https://www.inreels.ai/.well-known/oauth-protected-resource/mcp https://www.inreels.ai/.well-known/oauth-authorization-server ## Rules that matter 1. Every generating tool returns a run_id immediately and never blocks. Poll get_run_status; wait=true blocks up to 45 seconds. 2. Price anything first with the matching quote tool. The figure is exact for primitives and a stated estimate for capabilities. 3. Failed runs are refunded in full. 4. An unlisted model id is rejected, never substituted. Call list_models. 5. Output URLs are signed and expire after 24 hours. Use refresh_asset_url with the s3_key for a fresh link. 6. Capabilities choose the model for you. Use the primitives if you want to choose it yourself. ## Two layers Capabilities produce a finished deliverable and apply our own craft rules server-side. They expose creative controls only — no model, no voice. Primitives give direct access to a named model with its full parameter surface. ## Tool classification Each tool below is tagged read, write or sensitive_write. read retrieves information; changes nothing; spends nothing write creates or changes data; spends nothing sensitive_write spends the user's credits. Irreversible, so ask the user each time rather than taking blanket permission. ## Tools - get_account() [read] — Confirm the connection works and read the credit balance. Call this first if anything is failing. - list_models(media=image|video|speech|all?) [read] — Every image, video and speech model, with what each accepts and its price. Read this before naming a model — an id that is not listed is rejected. - list_voices() [read] — Named voices available to generate_speech. - quote(media=image|video|speech, image?, video?, speech?) [read] — Price a generate_image, generate_video or generate_speech call without spending anything. The number returned is exactly what the matching call will charge. - get_run_status(run_id, wait?) [read] — Check a submitted run. Pass wait:true to block up to 45 seconds, which usually returns a finished image in one call. Always poll before giving a user an output URL. - list_runs(limit?) [read] — The most recent runs on this account, newest first. - list_styles() [read] — The valid values for create_faceless_video. Read this before submitting — an unlisted style or music id is rejected, not substituted. - list_actors(gender=male|female?, age=young|middle|senior?, industry?, scene?) [read] — The curated faces available for create_ad_video, with filters. Pick deliberately — the actor is most of what makes a UGC ad read as real. To use a face of your own instead, call upload_image and pass its URL. - upload_image(url?, base64?, content_type?) [write] — Bring your own product shot or creator photo in, by URL or base64, and get back an inReels URL the generation tools accept. Free. PNG, JPEG or WebP, up to 10MB. - refresh_asset_url(s3_key) [read] — Output and upload URLs are signed and expire after 24 hours. Pass the s3_key to get a fresh link for the same file. - quote_ad_video(product_image_url, creator_actor_id?, creator_image_url?, brief?, script?, scene_action?, look=natural|commercial|raw_iphone?, aspect_ratio=9:16|16:9|1:1?, duration?, variations?) [read] — Price an ad without making it. Returns the model chosen, the duration the script implies, and the total for all variations. - create_ad_video(product_image_url, creator_actor_id?, creator_image_url?, brief?, script?, scene_action?, look=natural|commercial|raw_iphone?, aspect_ratio=9:16|16:9|1:1?, duration?, variations?) [sensitive_write] — A finished ad from a product image, with native audio. Add a creator (actor_id or image) and it becomes a UGC ad; leave it out for a product-led one. Supply a script and it owns the length — roughly 2.5 words per second. Ask for up to 3 variations to test angles. The model is chosen for you; use generate_video if you want to pick one yourself. Needs a paid plan. - quote_faceless_video(script, duration?, voice_id?, visual_style?, music_id?, aspect_ratio=9:16|16:9|1:1?, niche?, language?, image_quality=basic|high?, scene_count?) [read] — Estimate a full faceless video without submitting it. A short topic gets expanded into a script at submit, so for short inputs this is a floor rather than an exact figure. - create_faceless_video(script, duration?, voice_id?, visual_style?, music_id?, aspect_ratio=9:16|16:9|1:1?, niche?, language?, image_quality=basic|high?, scene_count?) [sensitive_write] — Render a complete faceless video — script to scenes to narration to captions to a finished MP4 — and return a run id. Takes several minutes. Credits are charged by the pipeline on completion, not at submit. - generate_image(prompt, aspect_ratio=9:16|16:9|1:1?, model?, ref_urls?, output_format=png|jpg?, seed?) [sensitive_write] — Render an image and return a run id. Poll get_run_status for the URL. Call quote first if the budget matters. - generate_video(prompt, model, duration?, aspect_ratio=9:16|16:9|1:1?, resolution?, generate_audio?, image_url?, end_image_url?, image_urls?, negative_prompt?, seed?) [sensitive_write] — Render a clip and return a run id. Text-to-video, or image-to-video by passing image_url. Several models produce native audio — set generate_audio and check list_models for which support it. Takes minutes; poll get_run_status. - generate_speech(text, voice_id, model?) [sensitive_write] — Speak a line in a named voice and return a run id. Poll get_run_status for the audio URL. ## Errors 400 invalid_request rejected before any charge; the message names the fix 401 unauthorized WWW-Authenticate points at the OAuth metadata 402 insufficient_credits includes required and available 403 subscription the capability needs a paid plan 404 not_found unknown tool, or a run belonging to another account 405 method_not_allowed a spending tool was called with GET 500 internal_error failed on our side; nothing was charged A failed run is refunded in full, so a failure never costs the caller credits. ## Rate limits None applied beyond the account's credit balance, which bounds usage. Any number of runs may be in flight at once; each returns immediately. get_run_status with wait=true blocks up to 45 seconds per call. ## Typical sequences Ad creative, person-led: upload_image(url=) -> url list_actors(gender=female, scene=Kitchen) -> actor ids quote_ad_video(product_image_url, creator_actor_id, script) create_ad_video(...) -> run_id get_run_status(run_id, wait=true) Faceless video: list_styles() -> visual styles, music, niches quote_faceless_video(script, duration) create_faceless_video(...) -> run_id Single image: list_models(media=image) quote(media=image, image={prompt, aspect_ratio}) generate_image(...) -> run_id ## Pricing Credits. quote and quote_* report the exact cost before anything is spent. get_account returns the balance.