Give your Claude a Risovator key and it will create images and short videos with sound for you: it picks the model, writes the prompt, and pays from your balance. Or call the same thing over plain HTTP.
Log in at risovator.com/app, top up the balance, find the Claude and API block and press Create key. The key starts with rz_ and is shown once. You can set a daily spending limit per key and delete a key at any time.
Nothing to install and no connector to set up. Works in Claude Code everywhere: the Code tab of the Claude app, the terminal and the browser. Copy the message from your account as it is – a placeholder such as <your key> instead of the real key only gives errors.
The message looks like this, with your key instead of rz_YOUR_KEY:
Connect Risovator so you can make images and videos for me. My API key: rz_YOUR_KEY. Save it to ~/.risovator-key readable only by me and never show it anywhere else. Read the docs at https://risovator.com/api-docs/ (HTTP API section). From now on, when I ask for an image or a video, make it yourself through this API: send requests with the Authorization: Bearer header and the key from the file, save the results to a risovator folder next to the project and show them to me. Check the connection by requesting my balance.
Only if you want the Risovator tools inside a plain Claude chat without the Code tab, or in another MCP client.
Risovator. URL: https://risovator.com/mcp/rz_YOUR_KEY (the cabinet gives you this link ready to copy).The key is part of this URL, so treat the URL like a password.
claude mcp add --transport http --scope user risovator https://risovator.com/mcp \
--header "Authorization: Bearer rz_YOUR_KEY"
Then ask Claude Code for an image. It can save files to your project with the download link it gets back.
Streamable HTTP endpoint https://risovator.com/mcp with header Authorization: Bearer rz_..., or https://risovator.com/mcp/rz_... without a header. Stateless, JSON responses, no SSE stream.
| Tool | What it does |
|---|---|
list_models | Models, prices in ₽, formats, which ones accept an input photo |
get_balance | Balance in ₽ and the top-up link |
generate_image | One image from a prompt, optionally from a photo (photo_url, photo_base64 or photo_id). Waits and returns a download link valid 24 hours; small images are also shown to Claude directly |
generate_video | A 4, 6 or 8 second video with sound, from a prompt or by animating a photo. Returns an id |
get_generation | Status by id, waits up to 50 s for a video; returns the link when done |
list_generations | Recent work with ids, prompts and prices |
Base URL https://risovator.com/v1. Send the key as Authorization: Bearer rz_.... Requests and responses are JSON. Errors look like {"ok":false,"error":{"code":"NO_BALANCE","message":"..."}}.
curl https://risovator.com/v1/generations \
-H "Authorization: Bearer $RISOVATOR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-image-2-medium","aspect":"16:9",
"prompt":"Coffee shop banner, cappuccino on a wooden table, big text \"20% OFF\""}'
{"ok":true,"id":"75bb0794-…","type":"image","status":"done","model":"gpt-image-2-medium",
"price_rub":11,"balance_rub":489,"mime":"image/png","width":1536,"height":1024,
"url":"https://…","url_expires_in_sec":86400}
Pass a public link, base64, or the id of an upload or of your earlier image (to keep editing it):
curl https://risovator.com/v1/generations -H "Authorization: Bearer $RISOVATOR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gemini-2.5-flash-image","prompt":"Replace the background with a sunny beach, keep the face unchanged",
"photo_url":"https://example.com/me.jpg"}'
Upload a local file first and use the returned photo_id:
curl https://risovator.com/v1/uploads -H "Authorization: Bearer $RISOVATOR_KEY" \
-H "Content-Type: image/jpeg" --data-binary @me.jpg
# {"ok":true,"photo_id":"ec2fb398-…"}
curl https://risovator.com/v1/generations -H "Authorization: Bearer $RISOVATOR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"veo-fast","aspect":"9:16","seconds":6,"prompt":"Steam rising from a cup of coffee, soft morning light, cafe ambience"}'
# {"ok":true,"id":"31ca79eb-…","type":"video","status":"processing",...}
curl "https://risovator.com/v1/generations/31ca79eb-…?wait=50" -H "Authorization: Bearer $RISOVATOR_KEY"
# repeat until "status":"done", then:
curl -o video.mp4 https://risovator.com/v1/generations/31ca79eb-…/file -H "Authorization: Bearer $RISOVATOR_KEY"
| Request | Description |
|---|---|
GET /v1/models | Models and prices, no key needed |
GET /v1/balance | Balance in ₽ |
POST /v1/uploads | Raw image body (JPG, PNG, WEBP up to 10 MB) or JSON {photo_url} / {photo_base64}. Returns photo_id |
POST /v1/generations | model, prompt, optional aspect (1:1, 16:9, 9:16; video: 16:9, 9:16), seconds (video: 4, 6, 8), one of photo_id / photo_url / photo_base64. Images answer when ready (5–40 s, up to 2 min for GPT Image 2 High) |
GET /v1/generations/{id} | Status and link. ?wait=N waits up to N seconds (max 50) while a video is processing |
GET /v1/generations/{id}/file | The file itself |
GET /v1/generations | Recent work, ?limit= up to 100, ?offset= |
| Loading… |
|---|
| HTTP | code | Meaning |
|---|---|---|
| 401 | BAD_API_KEY | No key, wrong key or deleted key |
| 402 | NO_BALANCE | Not enough money; the answer has balance_rub and price_rub |
| 402 | KEY_DAILY_LIMIT | The daily limit set for this key is reached |
| 400 | BAD_MODEL, BAD_ASPECT, BAD_DURATION, EMPTY_PROMPT, MODEL_NO_PHOTO, BAD_PHOTO_URL | Fix the request |
| 422 | PROVIDER_REJECTED | The model refused the prompt. Nothing charged |
| 429 | RATE_LIMIT | More than 20 generations a minute |
| 502 | GENERATION_FAILED | Provider error. Nothing charged, try again |
| 503 | PAUSED | Generation paused for now |
/file works as long as the work exists.