Beta · API reference
iArt API and MCP server
Make motion graphics videos with voice-over from a written brief, from your own code (REST) or your AI agent (MCP). A video takes a few minutes; you get an MP4, an unlisted share link and a link to keep editing it in iArt. Part of the Pro, Ultra and Max plans; videos use your account’s credits, as in the app.
Overview
REST base URL https://app.iart.ai/api/v1. MCP server https://app.iart.ai/api/mcp. Requests and answers are JSON. The flow is always the same: create a video, then read it every 30–60 seconds until its status is done, failed or stopped. A finished video can be revised; each revision is made, and charged, again.
Authentication
Create a key on the API page in iArt (account menu → API); it is shown once. Send it as Authorization: Bearer YOUR_API_KEY or x-api-key: YOUR_API_KEY. An account can hold 10 keys; revoke one any time. A key keeps working for reading your videos if your plan lapses, but creating, revising and uploading need an active Pro, Ultra or Max plan.
MCP server
Streamable HTTP, stateless, no OAuth: the key goes in a header. Listing the tools needs no key; calling one does. The tools are create_video, get_video, revise_video, stop_video and upload_file, with the same fields as the REST calls below. A refusal comes back as a tool error whose text is the error body (see Errors), so your agent can read it. Setup for Claude Code, Codex, Cursor and VS Code is on the MCP page.
claude mcp add --transport http iart https://app.iart.ai/api/mcp --header "Authorization: Bearer YOUR_API_KEY"Create a video
POST/api/v1/videos· MCP tool create_video
Starts a video and answers at once (201) with its id and status writing. Refused before anything starts when your plan, credits, videos-at-once limit, resolution or files don’t allow it.
| Field | Type | Description |
|---|---|---|
| prompt | string, required | The brief, up to 8,000 characters. Be specific: scenes, the exact on-screen words, colors (hex), length and the voice-over script. |
| aspect_ratio | "16:9" | "9:16" | "1:1" | Default "16:9". 1920×1080, 1080×1920 or 1080×1080. |
| voiceover | boolean | AI narration. Default true. |
| model | string | The model that writes the animation: deepseek-4.1, haiku-5.5, sonnet-5.5, opus-5.5, fable-5.2, gemini-4-argon. Default sonnet-5.5. |
| resolution | "720p" | "1080p" | "4k" | The MP4’s resolution. Default "720p". Up to your plan’s highest: Pro 1080p, Ultra and Max 4K; above it the request is refused before anything starts. The price does not change with resolution. |
| files | string[] | Up to 10 files for the video: public https URLs, or file_url values from an upload. Name each one in the prompt and say how to use it. See Files. |
curl -X POST https://app.iart.ai/api/v1/videos \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{
"prompt": "A 15-second launch video for Acme Notes. Scene 1: logo.png on #0f172a. Scene 2: the headline \"Notes that write themselves\" types on in white. Voice-over: …",
"aspect_ratio": "16:9",
"model": "sonnet-5.5",
"resolution": "1080p",
"files": ["https://acme.example/brand/logo.png"]
}'{
"id": "7bac47f8-c9e4-4c80-862f-baf7a9ecdb95",
"status": "writing",
"progress": 0,
"scenes": 0,
"error": null,
"mp4_url": null,
"share_url": null,
"edit_url": null,
"estimated_cost": 1.11
}Get a video
GET/api/v1/videos/{id}· MCP tool get_video
The video’s state. Read it every 30–60 seconds; 300 reads a minute per key are allowed. A video whose run has ended without finishing is marked failed when read.
curl https://app.iart.ai/api/v1/videos/VIDEO_ID -H "Authorization: Bearer YOUR_API_KEY"{
"id": "7bac47f8-c9e4-4c80-862f-baf7a9ecdb95",
"status": "done",
"progress": 1,
"scenes": 2,
"error": null,
"mp4_url": "https://…/video.mp4",
"share_url": "https://app.iart.ai/share/…",
"edit_url": "https://app.iart.ai/p/…"
}Revise or retry
POST/api/v1/videos/{id}/revise· MCP tool revise_video
For a done video, instructions (required) say what to change, and files can add up to 10 more. For a failed or stopped video, send neither: it is retried as it was, from where it stopped. It is made, and charged, again, at the resolution it was made at.
curl -X POST https://app.iart.ai/api/v1/videos/VIDEO_ID/revise \
-H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{"instructions": "Make the logo bigger and use photo.jpg in scene 2", "files": ["https://acme.example/photo.jpg"]}'Stop a video
POST/api/v1/videos/{id}/stop· MCP tool stop_video
Stops a video being made, for example when the brief was wrong. What it used so far is charged; retry it later with revise. Stopping a video that isn’t being made changes nothing and answers its state.
curl -X POST https://app.iart.ai/api/v1/videos/VIDEO_ID/stop -H "Authorization: Bearer YOUR_API_KEY"Files
A video can use your logo, screenshots, product photos, a voice recording or a PDF. Put up to 10 in files, and name each in the brief with what to do with it. A file is either:
- A public https URL, fetched when the video starts, up to the limits below. It must be reachable without signing in, on the standard port, and may redirect up to 3 times; all of a request’s URLs must download within 2 minutes. Private and local addresses are never fetched.
- An upload of a file on your computer, up to 4 MB. Over REST, send the file as the body; over MCP,
upload_filegives your agent a link to send it to with curl, valid for 15 minutes, no key needed. Either way the answer’sfile_urlgoes infiles; uploads are kept 7 days.
curl -X POST "https://app.iart.ai/api/v1/files?name=logo.png" \
-H "Authorization: Bearer YOUR_API_KEY" --data-binary @logo.png
# → 201 {"file_url": "https://…/logo.png", "name": "logo.png", "size": 48213}# upload_file {"name": "logo.png"} answers with a link valid for 15 minutes:
curl -sS -T logo.png 'https://app.iart.ai/api/v1/files?token=…'
# → 201 {"file_url": "https://…/logo.png", …}; pass file_url in files| Type | Extensions | Largest by URL |
|---|---|---|
| Images | .png .jpg .jpeg .webp .gif .svg | 10 MB |
| Audio | .mp3 .wav .m4a .ogg .aac | 30 MB |
| Video | .mp4 .mov .m4v .webm .mkv .avi .ogv .wmv .flv .3gp .3g2 | 100 MB |
| 20 MB | ||
| Slides | .pptx | 30 MB |
| Text and data | .txt .md .csv .json | 2 MB |
| Fonts | .woff2 .woff .otf .ttf | 5 MB |
Every file is checked before it is used. Its content must be the type its name says (a renamed file is refused), and it is served as that type. An SVG must be a plain image: no scripts, event handlers, links to other files or embedded content; export it as a plain SVG, or as a PNG. Two files can’t share a name. Each account can add 200 files or 1 GB in any 24 hours.
The video object
Every call that concerns a video answers with it.
| Field | Type | Description |
|---|---|---|
| id | string | The video’s id. |
| status | string | writing → rendering → done; or failed, or stopped. |
| progress | number | 0 to 1 while rendering. |
| scenes | number | Scenes written so far. |
| error | string | null | Why it failed, when status is failed. |
| mp4_url | string | null | The finished MP4 at the resolution asked for, once status is done. |
| share_url | string | null | An unlisted page anyone with the link can watch, once done. Turned on the first time you read a finished video; null if you make the project private again. |
| edit_url | string | null | Opens the project in the iArt editor (for the account owner, signed in). |
| estimated_cost | number | Create and revise answers only: a rough guide in USD. What is used is what is charged. |
Errors
An error is an HTTP status with a JSON body: error (what happened, in words you can show), code when there is one, and upgrade_url on 402. Over MCP the same body is the tool error’s text.
{
"error": "Your plan makes videos up to 1080p. Use a lower resolution or upgrade.",
"code": "RESOLUTION_NOT_ALLOWED"
}| Status | Code | Meaning |
|---|---|---|
| 400 | — | A field is missing or invalid; the message says which. |
| 400 | FILE_REJECTED | A file’s content doesn’t match its extension, or an SVG isn’t inert. |
| 400 | FILE_URL_REJECTED | A file URL can’t be fetched: not https, a private address, too many redirects, too slow, or the server answered an error. |
| 401 | — | The API key is missing, invalid or revoked. |
| 402 | UPGRADE | The API needs a Pro, Ultra or Max plan. upgrade_url links to billing. |
| 402 | INSUFFICIENT_CREDITS | Your credits can’t cover this video on top of the ones in progress. The message says how much; add credits, wait, or pick a cheaper model. |
| 403 | RESOLUTION_NOT_ALLOWED | The resolution is above your plan’s highest. |
| 403 | INVALID_UPLOAD_URL | An upload URL is invalid or older than 15 minutes. Ask for a new one. |
| 404 | — | No such video for this account. |
| 409 | IN_PROGRESS | The video is still being made. Revise it once it is done, or stop it. |
| 409 | PROJECT_DELETED | The video’s project was deleted in the editor, so it can’t be revised. |
| 413 | FILE_TOO_LARGE | A file is over its type’s limit (uploads: 4 MB). |
| 429 | TOO_MANY_IN_PROGRESS | Your plan’s videos-at-once limit is reached (API and Batch together). Wait for one to finish. |
| 429 | RATE_LIMITED | Too many requests with this key. Retry-After says when to try again. |
| 429 | FILE_QUOTA | The day’s file limit is reached: 200 files or 1 GB per account in any 24 hours. |
Limits
| Plan | Videos at once | Highest resolution |
|---|---|---|
| Pro | 3 | 1080p |
| Ultra | 6 | 4K |
| Max | 15 | 4K |
Videos at once count every video your account is making, here and with Batch in the app. Per key: 300 reads and 60 creates, revisions, stops or uploads a minute. Per account: 10 keys; 200 files or 1 GB of files in any 24 hours. A prompt or instructions: up to 8,000 characters.
Pricing
Videos use your credits at the same prices as the app, charged as they are used: the model’s tokens, plus $0.09 per rendered scene and $0.045 to combine them, at any resolution; voice-over as in the app. A video is refused up front when your credits can’t cover it on top of the videos you have in progress.
| model | Input | Output |
|---|---|---|
| deepseek-4.1 | $0.45 /1M tokens | $1.8 /1M tokens |
| haiku-5.5 | $0.15 /1M tokens | $0.75 /1M tokens |
| sonnet-5.5 (default) | $3 /1M tokens | $15 /1M tokens |
| opus-5.5 | $6 /1M tokens | $30 /1M tokens |
| fable-5.2 | $12 /1M tokens | $60 /1M tokens |
| gemini-4-argon | $3 /1M tokens | $15 /1M tokens |
Prices include the service fee. See plans.