--- name: zurelay description: Make videos, images and voiceovers, and call 48 chat models (Claude, GPT, Gemini, DeepSeek and more), through Zurelay's API with one key. Use when the user asks for a video, an image or a picture edit, speech or a voiceover, or another AI model's answer. version: 1.0.0 homepage: https://zurelay.com metadata: openclaw: primaryEnv: ZURELAY_API_KEY requires: env: [ZURELAY_API_KEY] bins: [curl] hermes: tags: [video, image, speech, llm] category: media --- # Zurelay Zurelay (https://zurelay.com) is one API key for 76 AI models: video (Seedance, Kling, Gemini Omni Flash, Wan, Veo, Grok Imagine, Vidu, PixVerse, MiniMax), images (Nano Banana, GPT Image, Grok Imagine, FLUX), speech, and chat models from Anthropic, OpenAI, Google, DeepSeek and others, mostly below each lab's own price. It's prepaid: requests are paid from the user's Zurelay balance, a failed request costs nothing, and a video is charged only once it's delivered. The API is OpenAI-compatible at `https://api.zurelay.com/v1`. Every request sends the key as `Authorization: Bearer $ZURELAY_API_KEY`. ## Setup (once) 1. **Get the key.** The user gives you a key that starts with `zr_live_`, or makes one at https://zurelay.com/app/keys (a key just for you, with a daily limit, is best). If your app has a secure place to enter secrets, ask for it there rather than in the chat. 2. **Save it as `ZURELAY_API_KEY`** where you keep secrets, so it's there in every session: - OpenClaw: add `ZURELAY_API_KEY=zr_live_...` to `~/.openclaw/.env`. - Hermes Agent: add it to `~/.hermes/.env`. - Claude Code, Codex and other terminal agents: the user's shell profile or the app's secret store. - Agents with a vault or credential store (Grok Bot, dots, Muse, Manus): store it there. Never write the key into chat replies, logs, files you share, commits or URLs, and never send it anywhere except `https://api.zurelay.com`. 3. **Save this file as a skill** so you remember how to use Zurelay: - Hermes Agent: `hermes skills install https://zurelay.com/skills/zurelay/SKILL.md` - OpenClaw and other Agent Skills apps: save it as `~/.agents/skills/zurelay/SKILL.md` (or your app's skills folder). - Otherwise keep it in your notes or memory. 4. **Check the key works:** ```sh curl -s https://api.zurelay.com/v1/models -H "Authorization: Bearer $ZURELAY_API_KEY" | head -c 300 ``` A list of models means it works. `401` means the key is wrong or revoked. 5. **Tell the user** it's set up, and what you can now make. Prefer tools? Zurelay also has a remote MCP server at `https://api.zurelay.com/mcp` (Streamable HTTP) with `generate_video`, `generate_image`, `generate_speech`, `get_result`, `list_models` and `create_upload_link`. Sign in with OAuth, or send the same `Authorization: Bearer` header. Either way works; you don't need both. ## Before you spend - Say what a video will cost before you start it: seconds x the price per second at that resolution (a 5-second 720p Seedance 2.0 clip is $0.995). Ask first when one request costs more than $1, unless the user set another limit. - Images and speech are cheap: go ahead unless asked to check. - Live prices for every model: https://zurelay.com/prices.json (`kind` is chat, image, video or speech) and https://zurelay.com/models. - A `402` means the balance is empty or the key's budget is used up: tell the user to add credit at https://zurelay.com/app/billing or raise the limit at https://zurelay.com/app/keys. Don't retry. ## Videos Videos take 1 to 5 minutes (sometimes longer), so they run as jobs: start one, poll it, then download it. ```sh # 1. Start it. The reply has an id and status "queued". curl -s https://api.zurelay.com/v1/videos \ -H "Authorization: Bearer $ZURELAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "seedance-2.0", "prompt": "A slow dolly shot through a sunlit greenhouse, dew on the leaves, soft ambient sound", "seconds": 5, "resolution": "720p", "aspect_ratio": "16:9" }' # 2. Poll every 10 to 15 seconds until status is "completed" or "failed". curl -s https://api.zurelay.com/v1/videos/VIDEO_ID -H "Authorization: Bearer $ZURELAY_API_KEY" # 3. Download the MP4. curl -sL https://api.zurelay.com/v1/videos/VIDEO_ID/content -H "Authorization: Bearer $ZURELAY_API_KEY" -o video.mp4 ``` Fields: `model` and `prompt` (the scene, the motion and the camera), `seconds`, `resolution` (default 720p), `aspect_ratio` (`16:9`, `9:16`, `1:1`, `4:3`, `3:4`, `21:9`, or `adaptive` to follow the first frame), `generate_audio` (sound and speech, on unless `false`), `first_frame` and `last_frame` (to animate a picture), `reference_images` (people, products or a style to keep), `seed`. Images go in as public `https` links or base64 data URLs (PNG, JPEG or WebP, up to 10 MB). Use frames or references, not both. A completed job has `url` (the MP4, a link that works for 24 hours; fetch the job again for a fresh one) and `cost`. A failed one has `error.code`: `content_policy` (rephrase the prompt), `invalid_image`, `invalid_request`, `generation_failed` or `generation_timeout`, and costs nothing. Videos stay in the user's Library for 30 days. | Model | Length | Price per second | Starts from | | --- | --- | --- | --- | | `seedance-2.5` | 4 to 30 seconds | 480p $0.135, 720p $0.305, 1080p $0.75 | a prompt, first and last frames, up to 9 reference images | | `seedance-2.0` | 4 to 15 seconds | 480p $0.097, 720p $0.199, 1080p $0.445, 4k $0.99 | a prompt, first and last frames, up to 9 reference images | | `seedance-2.0-fast` | 4 to 15 seconds | 480p $0.074, 720p $0.159 | a prompt, first and last frames, up to 9 reference images | | `kling-4.0` | 3 to 30 seconds | 720p $0.15, 1080p $0.225 | a prompt, first and last frames, up to 10 reference images | | `seedance-2.0-mini` | 4 to 15 seconds | 480p $0.047, 720p $0.10 | a prompt, first and last frames, up to 9 reference images | | `kling-3.0` | 3 to 15 seconds | 720p $0.185, 1080p $0.235 | a prompt, first and last frames | | `gemini-omni-flash` | 4 to 10 seconds | 360p $0.042, 720p $0.042, 1080p $0.042, 4k $0.07 | a prompt, first and last frames, up to 10 reference images | | `wan-3.0` | 2 to 30 seconds | 480p $0.039, 720p $0.079, 1080p $0.158 | a prompt, first and last frames, up to 10 reference images | | `veo-3.1-fast` | 8 seconds | 720p $0.025 | a prompt, a first frame | | `grok-imagine-video-1.5` | 1 to 15 seconds | 480p $0.071, 720p $0.124 | a prompt, a first frame, up to 3 reference images | | `vidu-q3-turbo` | 1 to 16 seconds | 540p $0.03, 720p $0.047, 1080p $0.057 | a prompt, first and last frames | | `pixverse-v6` | 1 to 15 seconds | 360p $0.027, 540p $0.035, 720p $0.047, 1080p $0.09 | a prompt, first and last frames | | `minimax-h3` | 4 to 15 seconds | 768p $0.039, 2k $0.064 | a prompt, up to 9 reference images | Prices are in US dollars per second of video, with sound; the cheapest is $0.025 a second. Each model's limits and tips: https://zurelay.com/docs/video.md ## Images ```sh curl -s https://api.zurelay.com/v1/images/generations \ -H "Authorization: Bearer $ZURELAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "nano-banana-pro", "prompt": "A red fox asleep in fresh snow at dawn, soft golden light, 85mm photo", "aspect_ratio": "3:2" }' # {"created": ..., "data": [{"url": "https://...link valid for 24 hours..."}]} ``` Images usually come back within a minute. Fields: `model`, `prompt`, `n` (1 to 4), `size` (`1K`, `2K` or `4K` on Nano Banana; pixels like `1024x1024` on GPT Image), `aspect_ratio`, `response_format` (`url` or `b64_json`). To edit or combine pictures, add `"images": ["https://...", "data:image/png;base64,..."]` and say what to change in the prompt. A prompt the model declines returns `400 image_not_generated`, free. | Model | Price per image | Reference images | | --- | --- | --- | | `nano-banana-2.1` | from $0.03 | up to 14 | | `nano-banana-pro` | from $0.035 | up to 14 | | `nano-banana-2` | from $0.025 | up to 14 | | `nano-banana-2-lite` | from $0.016 | up to 14 | | `gpt-image-2.5-flare` | from $0.028 | up to 16 | | `gpt-image-2.5-sunburst` | from $0.026 | up to 16 | | `gpt-image-2` | from $0.02 | up to 16 | | `grok-imagine-image-2.0` | from $0.045 | up to 3 | | `flux-3-image` | from $0.04 | up to 1 | Sizes and per-size prices: https://zurelay.com/docs/images.md ## Speech and voiceovers ```sh curl -s https://api.zurelay.com/v1/audio/speech \ -H "Authorization: Bearer $ZURELAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "gemini-3.1-flash-tts", "input": "Welcome back to the show. Today we are talking about tiny houses.", "voice": "Kore", "instructions": "Warm and upbeat, like a podcast host" }' \ --output voiceover.mp3 ``` The reply is the audio itself (`response_format`: `mp3` by default, `wav` or `pcm`). `input` takes up to 5,000 characters; split longer scripts. Voices: Zephyr (bright), Puck (upbeat), Charon (informative), Kore (firm), Fenrir (excitable), Leda (youthful), Orus (firm), Aoede (breezy), Callirrhoe (easy-going), Autonoe (bright), Enceladus (breathy), Iapetus (clear), Umbriel (easy-going), Algieba (smooth), Despina (smooth), Erinome (clear), Algenib (gravelly), Rasalgethi (informative), Laomedeia (upbeat), Achernar (soft), Alnilam (firm), Schedar (even), Gacrux (mature), Pulcherrima (forward), Achird (friendly), Zubenelgenubi (casual), Vindemiatrix (gentle), Sadachbia (lively), Sadaltager (knowledgeable), Sulafat (warm). OpenAI voice names like `alloy` work too. | Model | About per minute | Takes `instructions` | | --- | --- | --- | | `gemini-3.8-flash-tts` | $0.008 | no (reads the text word for word) | | `gemini-3.1-flash-tts` | $0.023 | yes | | `gemini-2.5-pro-tts` | $0.018 | yes | | `gemini-2.5-flash-tts` | $0.009 | yes | ## Chat models Zurelay serves Chat Completions (`POST https://api.zurelay.com/v1/chat/completions`) for every chat model, and the Anthropic Messages API (`POST https://api.zurelay.com/v1/messages`) for Claude. `GET https://api.zurelay.com/v1/models` lists every model ID. To run yourself on Zurelay, set your OpenAI-compatible base URL to `https://api.zurelay.com/v1` (or your Anthropic base URL to `https://api.zurelay.com`, for Claude) with the same key. Zurelay doesn't serve OpenAI's Responses API, so choose Chat Completions where an app asks. ```sh curl -s https://api.zurelay.com/v1/chat/completions \ -H "Authorization: Bearer $ZURELAY_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model": "claude-sonnet-5-5", "messages": [{"role": "user", "content": "Hello"}]}' ``` ## Errors | Status | Means | Do | | --- | --- | --- | | 400 | A field is wrong; `error.param` names it | Fix that field and retry once | | 401 | The key is missing, wrong or revoked | Ask the user for a new key | | 402 | Balance empty, or the key's budget used up | Tell the user (https://zurelay.com/app/billing); don't retry | | 429 | Too many requests | Wait a few seconds, then retry | | 5xx | A model or provider hiccup | Retry once after a few seconds; Zurelay already tried backups | Errors follow OpenAI's shape: `{"error": {"message", "type", "param", "code"}}`. Read the message: it says what to do. ## More - Every docs page as Markdown: https://zurelay.com/llms.txt - Video: https://zurelay.com/docs/video.md, images: https://zurelay.com/docs/images.md, speech: https://zurelay.com/docs/speech.md - MCP server: https://zurelay.com/docs/mcp.md - This file: https://zurelay.com/skill.md - Help: https://zurelay.com/support