Docs

One API for every asset an app ships with — how it looks and how it sounds. Call it over HTTP, or connect the MCP server and let your coding agent do it.

Start here

Quickstart

Sign in to mint an API key, then point the MCP server at it. Every generation returns a durable URL you can drop straight into your app.

mcp-config.json
{
  "mcpServers": {
    "media": {
      "command": "node",
      "args": ["/abs/path/to/apps/mcp/dist/index.js"],
      "env": {
        "MEDIA_API_URL": "https://your-api.workers.dev",
        "MEDIA_API_KEY": "mk_your_key_here"
      }
    }
  }
}
curl
curl -X POST $MEDIA_API_URL/v1/generate \
  -H "authorization: Bearer $MEDIA_API_KEY" \
  -H "content-type: application/json" \
  -d '{"type":"speech","brief":"Your order is on its way.","voice":"narrator"}'

New

Voice, sound and music

Six audio types, powered by ElevenLabs. Speech is spoken exactly as written — the engine never rewrites a script. Sound effects and music get the same intent presets and prompt enhancement as images.

typeWhat you getNotes
speechSpoken text`brief` is the script, spoken verbatim. Pick a `voice` by alias, name or id.
dialogueMulti-speaker conversationPass `lines`. Turns without a voice alternate between two speakers.
sfxOne sound effectUI blips, whooshes, impacts, or a seamless ambience loop.
soundpackA whole interaction sound packEvery clip in one style + a manifest mapping name → URL.
musicA music track or loop10s–5min. Background beds, menu loops, audio logos.
voiceA designed voiceCandidate previews; `saveVoiceAs` returns a reusable voice id.

Sound packs

One call renders every clip an app's interaction layer needs, in a single style, and returns a manifest.json mapping name → URL. Your brief is the shared style (“soft glassy minimal”, “warm retro arcade”).

packSounds included
ui-essentialstap · toggle-on · toggle-off · success · error · notification · swipe · refresh
mobile-applaunch · unlock · message-sent · message-received · delete · camera-shutter · achievement · typing
game-arcadecoin · jump · power-up · level-up · hit · explosion · game-over · menu-select
notificationsubtle-tick · gentle-chime · message · reminder · urgent-alert · celebrate
checkoutadd-to-cart · scan · payment-success · payment-error · receipt · cash
ambient-loopsrain · cafe · forest · ocean · fireplace
a full UI sound pack
curl -X POST $MEDIA_API_URL/v1/generate \
  -H "authorization: Bearer $MEDIA_API_KEY" \
  -H "content-type: application/json" \
  -d '{
    "type": "soundpack",
    "brief": "soft glassy minimal, premium feel",
    "pack": "ui-essentials",
    "audioFormat": "wav"
  }'

# → 8 clips + manifest.json, every clip peak-normalized to -1 dBFS

Choosing a voice

voice accepts a built-in alias, a catalog name, or a raw voice id. Aliases include narrator, assistant, guide, calm, friendly, announcer, hero and villain. Browse everything with GET /v1/voices. To give your app its own voice, design one and reuse the id it returns:

design a brand voice, then use it
# 1 — design (returns 3 candidate previews, saves the first)
{"type":"voice",
 "brief":"warm, upbeat female product guide, late twenties, neutral American accent",
 "saveVoiceAs":"Acme Guide"}
# → result.meta.voiceId

# 2 — every line from then on
{"type":"speech","brief":"Welcome back!","voice":"<that voiceId>"}

Formats

mp3 (default, 44.1 kHz), wav (24 kHz PCM, peak-normalized — best for game engines and Web Audio), pcm, opus, ulaw. Level consistency across a pack requires a linear format, so reach for wav when clips must sit together.

Reference

Visual media types

typeWhat you getNotes
imageA raster imageAuto-optimized to WebP. `variants` + pick-best.
iconFull app-icon bundleiOS AppIcon set, Android mipmaps, web icons, favicon.ico, PWA manifest.
faviconFavicon bundle16–512px + Apple touch + manifest. Superseded by `icon`, which now includes everything this does.
socialSocial card packOG, Twitter, LinkedIn, Instagram square.
splashApp splash screensiOS, Android, web PWA sizes.
screenshotApp store screenshotsiPhone, iPad, Android, feature graphic.
videoA short video clipText-to-video. Poll `get_job`.
animationAnimated mascot / logoImage-to-video, transparent WebM.
svgA vector graphicScales to any size.
lottieLottie JSON animationlottie-web, dotLottie, RN Lottie.

Reference

HTTP API

All /v1 routes take authorization: Bearer <api key>. Jobs run asynchronously; a completed job carries result.assets[] (durable URLs) and result.meta (voice used, pack name, manifest URL).

MethodPathWhat it does
POST
/v1/generateCreate a generation job
GET
/v1/jobs/:idJob status and result
GET
/v1/modelsThe model registry
GET
/v1/voicesVoice catalog + aliases (filter with ?q= &gender= &accent=)
GET
/v1/sound-packsBuilt-in sound packs + audio intents
POST
/v1/brandsDeclare a brand and resolve its style anchor
GET
/v1/brandsYour brands and their anchors
GET
/v1/brands/:slugOne brand's full identity
PATCH
/v1/brands/:slugEdit a brand and re-derive its anchor
DELETE
/v1/brands/:slugDelete a brand and its stored assets

Reference

MCP tools

ToolWhat it does
generate_imageRaster image → durable URL
generate_iconiOS/Android/web icon bundle + favicon.ico + PWA manifest
generate_social_cardsOG / Twitter / LinkedIn / IG pack
generate_splash_screensiOS / Android / web splash bundle
generate_app_screenshotsStore screenshots
generate_videoShort video clip
generate_animationTransparent-background mascot animation
generate_svgVector graphic
generate_lottieLottie JSON animation
generate_speechText to speech in a chosen voice
generate_dialogueMulti-speaker dialogue in one take
generate_sound_effectOne sound effect or ambience loop
generate_sound_packA whole interaction sound pack + manifest
generate_musicMusic track or loop
design_voiceDesign and save a custom voice
list_voicesBrowse voices and aliases
list_sound_packsBrowse packs and audio intents
create_brandDeclare a product's visual identity once
list_brandsBrowse your brands and their style anchors
get_brandOne brand's full identity
update_brandEdit a brand and re-derive its anchor
delete_brandDelete a brand and its stored assets
list_modelsBrowse the model registry
get_jobPoll a job for its result