Free sounds via MCP & API for your video game
Thousands of free sound effects, music and ambience, or generate any sound you can describe. Free for commercial use, from Claude, ChatGPT, your coding agent or your own code.
q: "chiptune boss fight"type: musicform: loop
- Chiptune Adventures: Boss Fightloop · non-AI · 87 bpm+33 fields1:12
- Boss Battle 3 V3loop · non-AI · E minor+33 fields0:41
- 8-Bit Danger Strong Bossloop · non-AI · wav 44.1k/24+33 fields2:14
100k+ sounds downloaded·16K+ non-AI sounds·Generate what you can't find
Get started#
Everything is free. Pick where you'll use soundza:
- Click Add to Claude. Claude opens with the name and URL filled in. Click Add.
- Sign in to soundza and approve. A free account is all you need.
- In a chat, click +, open Connectors and turn on Soundza.
https://mcp.soundza.com/mcp/oauth- Open ChatGPT plugins and add a custom MCP server. Name it Soundza and keep OAuth.
- Paste the URL below, then sign in to soundza.
- In a new chat, pick Soundza from the tools menu.
https://mcp.soundza.com/mcp/oauthCustom servers depend on your ChatGPT plan; some need Developer mode turned on in settings.
Add it, then run /mcp, choose soundza, and sign in when your browser opens.
claude mcp add --transport http soundza https://mcp.soundza.com/mcp/oauth›Rather use a key?
Set SOUNDZA_API_KEY and add https://mcp.soundza.com/mcp with an Authorization header. The keys page shows this command with your key filled in:
claude mcp add --transport http soundza https://mcp.soundza.com/mcp --header "Authorization: Bearer $SOUNDZA_API_KEY"soundza works with any MCP client that supports streamable HTTP. If it can sign you in, use https://mcp.soundza.com/mcp/oauth. If not, use https://mcp.soundza.com/mcp with your key in an Authorization header. For Cursor, add this to ~/.cursor/mcp.json; it reads the key from your environment, so it stays out of files you might commit.
{
"mcpServers": {
"soundza": {
"url": "https://mcp.soundza.com/mcp",
"headers": { "Authorization": "Bearer ${env:SOUNDZA_API_KEY}" }
}
}
}Get a free key
Make one on the keys page and keep it on your server or in a gitignored .env as SOUNDZA_API_KEY, never in client code. Or just ask your coding agent to find sounds on soundza.com: it signs you in and saves the key itself.
›The sign-in steps an agent follows
Soundza is free. Searching works without a key, but downloading needs an API key tied to a person's account (it also gives every page of results and the full metadata). Get one with a one-click sign-in:
1. Start the sign-in. Include what the person is building, if you know it from the project: project_kind (one of game, video_tool, own_content, app, agent, music, trying, other) and project, one plain line about it. After approving, the person sees both and can change them; leave out anything you'd have to guess.
curl -s -X POST https://api.soundza.com/v1/auth/device -H "content-type: application/json" -d '{"client_name":"<your tool> on <this machine>","project_kind":"game","project":"<one line, e.g. A retro sci-fi shooter in Godot>"}'
It returns device_code, user_code, verification_uri_complete, expires_in (600 seconds) and interval (5 seconds).
2. Tell the human: "Open <verification_uri_complete> and approve code <user_code> (sign in with Google if it asks)." Nothing else is needed from them.
3. Right after telling them, poll every <interval> seconds until they approve. Run the polling loop in the foreground and wait for it; don't end your turn while the sign-in is pending (the code lasts 10 minutes).
curl -s -X POST https://api.soundza.com/v1/auth/token -H "content-type: application/json" -d '{"device_code":"<device_code>"}'
While it returns {"error":"authorization_pending"} keep polling; on "slow_down" wait the "interval" it returns. On approval it returns {"access_token":"sz_live_...","token_type":"Bearer",...} once: access_token is the API key. "expired_token" or "access_denied" means stop (start again only if the human asks).
4. Save the key as SOUNDZA_API_KEY in the project's .env and make sure .env is in .gitignore. Never commit the key or put it in a project-scope .mcp.json.
5. Optional: connect this MCP server with the key. The command reads $SOUNDZA_API_KEY from the shell, so load .env first (set -a; . ./.env; set +a). It stores the key in Claude Code's own settings (local scope), not in the project. If soundza is already added without a key, run "claude mcp remove soundza" first.
claude mcp add --transport http soundza https://mcp.soundza.com/mcp --header "Authorization: Bearer $SOUNDZA_API_KEY"
The tools load in the next session (or after /mcp). Until then, and in any tool that can't add MCP servers, use the REST API at https://api.soundza.com/v1 with the header "Authorization: Bearer $SOUNDZA_API_KEY". It does everything the MCP tools do.
A person can also create a key at https://soundza.com/developers/keys and set it the same way.Search, then download what you use
curl -s "https://api.soundza.com/v1/sounds/search?type=sound_effect&q=whoosh&per_page=5" \
-H "Authorization: Bearer $SOUNDZA_API_KEY"
# download_url redirects to the file: -L follows it, -OJ saves it under its own name
curl -LOJ "https://api.soundza.com/v1/sounds/SOUND_ID/file" \
-H "Authorization: Bearer $SOUNDZA_API_KEY"Each result has preview_files, MP3s to listen to that don't count toward your limits, and a download_url for the full-quality file.
Just having a look? Try a search without a key. It's meant for a first look, with fewer details and lower limits; keys are free, so we'd suggest one.
curl "https://api.soundza.com/v1/sounds/search?q=coin+pickup"- REST API
- https://api.soundza.com/v1
- MCP, sign-in
- https://mcp.soundza.com/mcp/oauth
- MCP, API key
- https://mcp.soundza.com/mcp
- For agents
- soundza.com/llms.txt · step-by-step instructions
Searching#
Every endpoint is under https://api.soundza.com/v1. The full spec is at /openapi.json.
| Endpoint | What it does |
|---|---|
GET/sounds/search | Search by words and filters. Returns a page of sounds and a search_id. |
GET/sounds/{id} | One sound, by id. |
GET/packs | Public packs, best first. Optional q, page and per_page. |
GET/packs/{id} | One pack, then a page of its sounds. Every sound names its pack. |
Set type first (sound_effect, music or ambience), add any filters you know, and describe the rest in q. “Corporate background music, no vocals” is type=music&vocals=none&q=corporate.
All search parametersFilters, ranking and paging
Give a q, at least one filter, or both. Durations are in seconds.
| Parameter | Type | Description |
|---|---|---|
q | string | Words to match, e.g. "door slam" or "lofi drum loop". Typos are forgiven. |
type | string | What the sound is: music, sound_effect or ambience (see Types and their filters). Case-insensitive. A search with q that finds nothing within its type searches every type, and says so in relaxed_filters. |
form | string | Music only: track, excerpt, loop, one_shot or stem. |
parts | string | Music only: full_mix or single_part. Without it, type=music ranks full mixes first, then loops, then single parts. |
vocals | string | Music only: none, backing or lead. |
style | string | Sound effects only: retro or cartoon. Set per pack, so most sounds have none; with a q that finds nothing with it, it is dropped and listed in relaxed_filters. |
min_duration | number | Shortest length, in seconds. |
max_duration | number | Longest length, in seconds. |
min_bpm | number | Slowest tempo. Only music has a tempo. |
max_bpm | number | Fastest tempo. |
key | string | Musical key, e.g. "C", "F# minor" or "Bbm". Matches only the keys sounds show: stated by the source or a person, or detected with high confidence. |
chord | string | Chord a chord one-shot plays, e.g. "Am", "C#m7" or "Fmaj7". |
note | string | Note a pitched one-shot plays: "D3" for that octave (C3 is middle C), or "D" for any octave. |
mood | list | Comma-separated mood words; sounds matching any of them come back, and more matches rank higher. One of: airy, heavy, metallic, bright, dark, punchy, soft, warm, glitchy, organic, cinematic, cartoony, retro. |
good_for | list | Comma-separated jobs the sound should suit. Ranking only: matching sounds rank higher, and nothing is filtered out. One of: transition, reveal, build_up, impact_on_beat, title_or_logo, notification, ui_click, menu, game_pickup, game_hit, game_power_up, footsteps, background_bed, intro, outro. |
fit_seconds | number | The length the sound has to fill, e.g. 20 for a 20-second ad. Ranks sounds that can fill it (a track at least that long, or a seamless loop) and adds a fit hint to each result. It doesn't filter anything out. |
pack | string | A pack's id or slug: only that pack's sounds. |
loop_seamless | boolean | true: only sounds that loop seamlessly, as measured from the audio (the end runs back into the start without a click or jump). For game music and ambience beds that repeat under a scene. |
category | string | A Universal Category System top-level category ("CROWDS") or CatID ("CRWDCheer"). Sound effects and ambience. |
page | integer | Page number, from 1. |
per_page | integer | Results per page: default 15, at most 50. Results stop at 500 per query. |
Types and their filtersWhat sound_effect, music and ambience cover
| type | What belongs | Filters |
|---|---|---|
music | Tracks, excerpts, loops, one-shots, stems, stingers, jingles and vocal chops, game music included. | form (track, excerpt, loop, one_shot, stem), parts (full_mix, single_part), vocals (none, backing, lead), bpm, key, note, chord |
sound_effect | Whooshes, impacts, foley, UI and game sounds, voices as effects. | category (UCS), style (retro, cartoon; set per pack) |
ambience | Places, room tone and noise beds. | category (UCS) |
With type=music, full mixes come first, then loops, then single parts, unless you set parts. good_for moves sounds suited to a job (transition, ui_click, background_bed…) up the results without filtering any out. A search with q that finds nothing within its type searches every type and lists type in relaxed_filters.
What a result looks likeFields and an example
A page of results, with a link to the next page. bpm and key describe music; creator is null when a sound has no public creator.
{
"page": 1,
"per_page": 5,
"total_results": 38,
"next_page": "https://api.soundza.com/v1/sounds/search?q=whoosh&type=SOUND_EFFECT&per_page=5&page=2",
"search_id": "x7k2m9q4r1t8v3w6y0z5a2b4",
"sounds": [
{
"id": "cm9w2k4e30001",
"url": "https://soundza.com/sound/fast-air-whoosh",
"title": "Fast Air Whoosh",
"description": "A quick, bright air whoosh that sweeps left to right.",
"creator_description": null,
"type": "sound_effect",
"form": null,
"parts": null,
"vocals": null,
"style": null,
"good_for": ["transition"],
"duration": 0.84,
"bpm": null,
"key": null,
"chord": null,
"note": null,
"mood": ["airy", "bright"],
"tags": ["whoosh", "swipe", "air", "airy", "bright"],
"sync_ms": 310,
"lufs": -19.4,
"true_peak_db": -6.1,
"loudness": { "value": -18.2, "basis": "momentary_max" },
"gain_db": 5.1,
"loop_seamless": null,
"file_type": "audio/wav",
"file_extension": "wav",
"sample_rate": 48000,
"bit_depth": 24,
"channels": 2,
"size_bytes": 322604,
"category": { "id": "WHSH", "label": "Swooshes › Whoosh" },
"pack": {
"id": "cm8p1x7a20004",
"name": "Air and Motion",
"slug": "air-and-motion",
"sound_count": 42,
"url": "https://soundza.com/packs/air-and-motion"
},
"creator": null,
"preview_files": [
{ "type": "audio/mpeg", "bitrate": 128, "link": "https://media.soundza.com/l/fast-air-whoosh/4fJ9aQx2LmP0sT7vKc1Rb8Ze.mp3" }
],
"download_url": "https://api.soundza.com/v1/sounds/cm9w2k4e30001/file",
"license": { "name": "Soundza Standard License", "url": "https://soundza.com/license" },
"attribution": "\"Fast Air Whoosh\" on Soundza (https://soundza.com/sound/fast-air-whoosh)"
}
]
}Downloading#
Fetch a result's download_url with your key. It redirects to the file, usually a WAV. With curl, add -L; fetch and requests follow redirects on their own. Save each sound once and reuse it by its id, since its file never changes. In an AI app, download_sound returns a link and a ready curl command.
| Endpoint | What it does |
|---|---|
GET/sounds/{id}/file | The full-quality file. Redirects to a link that works for 5 minutes. |
GET/removals?since= | Sounds removed since a date, for anyone who stores files. |
What you getLevel-matched WAVs, or the original
Files are level-matched, so sounds sit together without adjusting each one: one gain per sound, no compression, peaks at or under −1 dBTP. Ambience aims for −20 LUFS, music, pads and long loops for −16, everything else for −13 on its loudest 400 ms. lufs, true_peak_db and loudness describe the original; gain_db is what the default file adds to it.
Add ?variant=original for the original as uploaded. The redirect is a signed link that lasts 5 minutes, so keep the file, not the link. download_url already carries the search it came from; if you serve many users, add user with your own id for each.
Storing filesUp to 500 per free key, and removals
A free key may keep up to 500 downloaded sounds. Now and then a sound is taken down; check GET /v1/removals at least monthly and delete any it lists.
Generating sounds#
Can't find a sound you want? Generate it. It's completely free for sounds under 10 seconds, up to 250 per week. Need background music instead? Generate music. Every generated sound is eligible to be added back to the soundza library to share with others.
Ask your agent
Add soundza to Claude Code, Cursor or any MCP app (see Get started), then ask for the sound you need. It makes the sound, picks the best take and saves the file.
claude mcp add --transport http soundza https://mcp.soundza.com/mcp/oauth> make a laser blast for my space shooter and save it to assets/sfx
Or one request
With a free API key, one call makes the sound and answers with its link. No polling.
curl -s -X POST "https://api.soundza.com/v1/generations" \
-H "Authorization: Bearer $SOUNDZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "magic sparkle chime"}' \
| jq -r '.takes[0].url' | xargs curl -sL -o sparkle.wavOptions, limits and errorsLength, takes, seeds, and busy moments
prompt up to 200 characters. duration_seconds0.5 to 10, default 3: it's for sound effects, so for music use generate_music below. takes 1 to 3, best first, default 1. seed to repeat a result. Each take has a WAV url and an MP3 preview_url; neither needs a key, and both work for 120 days, so save what you keep.
250 a week per account (at most 120 an hour), one at a time. A busy moment answers 503 or 429 with Retry-After: wait and send it again. A sound that takes longer than about 50 seconds answers 202 with a poll_url; send "wait": false to always get that.
| Endpoint | What it does |
|---|---|
POST/generations | Make a sound from a prompt. Answers with the takes. |
GET/generations/{id} | A generation, for one that answered 202 before it finished. |
Takes are made with AI and say so in ai_content. Use them like any soundza sound. They aren't exclusive to you, and we may add good ones to the soundza library for everyone (see AI features in the Terms).
Generating sound variations#
Need a full set of sounds that are similar? Call vary_sound to generate variations of a base sound. Give it the ID of any soundza sound, including a sound you generated, and get back a set of variations: the same sound, played differently each time. All variations are free and yours to use commercially.
Great for:
- Footsteps that don't repeat, for a game character or a cartoon
- Sword swings, punches and impacts for a fight, in a game or a video
- A different grunt or shout for each character
- Gunshots and UI clicks that stay consistent without sounding copy-pasted
- Footsteps on woodSpread 5 · 0.50s each
- Sword slashSpread 5 · 1.2s each
- Punch impactSpread 5 · 0.24s each
- Sci-fi laser shotSpread 5 · 0.58s each
Ask your agent
Add soundza to Claude Code, Cursor or any MCP app (see Get started), then ask for the sound and how many variations you need. It finds or makes the sound, varies it and saves the set.
> add footsteps for the character crossing the room, with variations so no two steps sound the same
Tips on getting great variationsHow spread and takes shape the result
A sound_id is all it needs, but spread, how different the variations are, is what makes the set fit how the sound is used. Use subtle for sounds that must stay consistent, like UI clicks, coins and gunshots; natural for footsteps, impacts and swings; and bold when each take should be a different performance, like grunts from different characters. All variation parameters lists every field and its type; here's a full example:
# Short sounds come back in 5-10 seconds, in this one call.
curl -s -X POST "https://api.soundza.com/v1/variations" \
-H "Authorization: Bearer $SOUNDZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"sound_id": "footstep-on-wood",
"spread": "natural",
"takes": 6
}'
# then save each take under its own name:
# curl -sL -o footstep-on-wood-var-01.wav "<takes[0].url>"Working through an agent? Tell it what the sound is for, and it picks the level and the number of takes for you.
All variation parametersTypes, defaults and what each does
| Parameter | Type | Required | Description |
|---|---|---|---|
sound_id | string | One of these | The sound to vary: a soundza sound's id or slug, e.g. "footstep-on-wood". A one-shot up to 10 seconds, not an ambience. Send this or take_id. |
take_id | string | One of these | A take you made with generate_sound (or an earlier variation), to vary instead of a soundza sound. Send this or sound_id. |
spread | integer | "subtle" | "natural" | "bold" | Optional | How different the takes are, 1 to 10, or "subtle" (2), "natural" (5), "bold" (8). Defaults to 5. Measured on each sound, so a spread means the same on a punch as on a footstep. |
takes | integer | Optional | How many variations to make, 1 to 8, best first. Defaults to 6. Each one counts as a generation. |
prompt | string | Optional | What the sound is, e.g. "boot on gravel", when its title doesn't say. Defaults to the sound's title and tags. |
seed | integer | Optional | Any whole number. Send the same seed with the same sound and settings to get the same variations back; leave it out to get new ones each time. |
wait | boolean | Optional | Whether the call waits for the variations. By default it waits and answers with them. If you send false, it answers right away with a 202 and a job ID, and you check on the job at GET /generations/{id} until it's done. |
Spread, takes and limitsWhat to ask for, and what comes back
spread goes from 1, about as different as a pitch randomizer, to 10, the same idea played by someone else. It's measured on each sound, so a spread of 5 sounds about as different on a punch as on a footstep. The presets are "subtle" (2), "natural" (5), "bold" (8).
Every variation comes back as a WAV (url) and an MP3 preview (preview_url), named after the sound: footstep-on-wood-var-01.wavand on. Each one is lined up with the original's attack and matched to its length, tone and loudness, so you can lay them along a video timeline, or drop the set into Godot's AudioStreamRandomizer, an FMOD or Wwise random container, or Unity next to the original. Links work for 120 days, so save what you keep.
It works on one-shots up to 10 seconds: sound effects, instrument hits and stingers. Each variation counts as one of your 250 generations a week, free, so 6 takes use 6. Short sounds come back in 5 to 10 seconds; a 10-second sound can take up to about 30.
If the service is busy, you'll get a 429 or 503 response telling you how long to wait before trying again.
Generating music#
Can't find the right music? Call generate_music to make it. You can generate a full-length track, or a seamless music loop to play under a game or video. All music is free, instrumental, and yours to use commercially.
Full-length tracks
Made with Lyria · 8 a week, free- Sweeping orchestral adventure themeFull track3:00
- Ambient bed for a sci-fi videoFull track2:56
- Charming cozy town themeFull track2:37
- Energetic electronic backgroundFull track2:34
Seamless loops
Made with Stable Audio 3 · 15 a week, free- Fantasy tavern themeSeamless loop120 BPM · 12 bars · 24s
- Upbeat background for an explainer videoSeamless loop120 BPM · 12 bars · 24s
- Retro synthwave driveSeamless loop120 BPM · 20 bars · 40s
- Chill lofi study beatSeamless loop120 BPM · 12 bars · 24s
Ask your agent
Add soundza to Claude Code, Cursor or any MCP app (see Get started), then describe the music you want. It writes the loop or track and saves the file.
> write a calm looping theme for my village scene
Tips on getting great music for your gameHow game, scene and mood shape the result
A plain description works, but game, scene and moodare what make the music feel like it belongs in your game — the more you give, the better the fit. All music generation parameters lists every field and its type; here's a full example:
# Music takes a minute or two, so this answers 202 with a poll_url.
curl -s -X POST "https://api.soundza.com/v1/music" \
-H "Authorization: Bearer $SOUNDZA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "a slow, warm orchestral piece: solo harp, soft strings, no drums",
"looping": true,
"game": "a cozy fantasy RPG about running a village inn",
"scene": "the player wanders the village at dawn",
"mood": "peaceful and welcoming"
}'
# then poll until it is ready:
curl -s "https://api.soundza.com/v1/music/JOB_ID" -H "Authorization: Bearer $SOUNDZA_API_KEY"Working through an agent? Tell it about your game and the scene, and it fills the fields in for you.
All music generation parametersTypes, defaults and what each does
| Parameter | Type | Required | Description |
|---|---|---|---|
description | string | Required | The music, in plain words, e.g. "warm orchestral theme, strings and harp". Up to 200 characters. |
model | "stable" | "lyria" | Optional | "stable" (default): Stable Audio 3, for seamless loops and short tracks. "lyria": Lyria, for long full-length tracks (no looping). |
looping | boolean | Optional | Return a seamless loop. Stable only — a loop with model lyria is an error. Defaults to false. |
duration_seconds | number | Optional | Full-length tracks only (not loops): length in seconds, 10 to 180. A loop's length is set by the loop finder. |
bpm | integer | Optional | Tempo to aim for, in beats per minute. |
game | string | Optional | What game this is for, e.g. "a cozy farming sim" — improves the fit, and tells us what games people want music for. |
scene | string | Optional | The moment or scene the music plays under, e.g. "a tense boss fight". |
mood | string | Optional | How it should feel, e.g. "calm and hopeful". |
Loops, tracks and limitsWhat to ask for, and what comes back
The endpoint supports two models: stable (Stable Audio 3) and lyria (Lyria). We recommend using stable for loops and short tracks, or lyria for long, full-length tracks. Only stable supports looping.
If you need a seamless loop, use stable with looping: true. We do some extra audio work on the back end to make that possible, so you get a clean loop that plays back to back with no gap. You can run 15 stable and 8 lyria generations a week, free, one at a time.
Every generation comes back as a WAV (url) and an MP3 preview (preview_url). Use the WAV in your game: it loops with no gap and includes loop points for Unity and Godot. The MP3 is there for a quick listen and has a short gap if you loop it. Loops also report their tempo and bar count.
If the service is busy, you'll get a 429 or 503 response telling you how long to wait before trying again.
Limits#
| What | Free |
|---|---|
| Searches | 60 a minute |
| Downloads | 250 an hour, 500 a week |
| Sound effect generation (under 10s; each variation counts as one)Stable Audio 3 | 250 a week |
| Music loop generationStable Audio 3 | 15 a week |
| Full-length music generationsLyria | 8 a week |
That's for a free key, shared across your account, and it covers building a game or a small app. Putting a sound picker in an app with real traffic? Request higher limits or email admin@soundza.com.
How limits are countedHeaders, re-fetches, lookups, and trying it without a key
Every response has X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and X-RateLimit-Policy. A 429 also has Retry-After, in seconds.
Only different sounds count as downloads. Total file fetches are capped at twice the download limits, so save each file once and reuse it by the sound's id. Generations are at most 120 an hour, one at a time, each up to 10 seconds. Looking up a single sound or pack has its own limit, five times the search limit.
Trying it without a key: 20 searches a minute and 300 a day per connection, 3 pages of 20, and no downloads.
Giving credit#
Everything is completely free. The only thing we ask is for you to credit soundza.com (and/or an original sound creator if applicable) somewhere it makes sense for your project. Ideally please include a link to soundza.com somewhere on your website/blog/itch page (e.g. 'Thanks to soundza.com for the free sounds'). If you don't have a site we'd still love a shoutout on social media or in a Youtube video description, etc. Help spread the word!
Examples by kind of projectApps, games, videos, bots, and our logo
We are flexible on how you credit us, but we ask that you please do so somehow that works naturally for your project.
| You're making | How to credit |
|---|---|
| An app or tool with a sound picker | Powered by soundza in the picker, plus a link to soundza.com in your site's footer, About page, blog, or somewhere else that makes sense. |
| A game, even a small one | Wherever you share it (a Reddit or Discord post, X, your devlog or site, itch.io or Steam), a quick thank-you to soundza.com, with a link where you can. |
| Videos | Sound effects: soundza.com in the YouTube description. On TikTok or Instagram, tag @soundza_audio if you can. |
| A bot, agent or open-source tool | A line in your README, help text or listing page. |
| Something just for you | Nothing needed. |
Want to use our logo? You're welcome to show it with your link: the full logo (PNG) or the mark on its own (SVG). Just don't use it as your app's icon.
Made something with soundza? We'd love to see it. Email admin@soundza.com or tag @soundza_audio. We reshare cool projects.
Reference#
Every sound comes under the Soundza Standard License, linked from its license field: royalty-free for personal and commercial work, with no attribution required for the sounds themselves (the credit above is what we ask in return for the API). We review sounds carefully but provide them as is, with no guarantee that a sound is free of third-party claims. Use of the API is governed by the Terms of Service and the license.
GuidelinesWhat to do and not do with the API
- Once people outside your team see what you make, link back to soundza.com in the way that fits it: "Powered by soundza" by your sound picker plus a link on your site, a thank-you wherever you share your game, or a line in your video description. See soundza.com/developers#credit.
- Request a sound's
download_urlwhen it is added to a project, save the file once, and reuse it by the sound'sid. - Previews are for listening. Use downloaded files in finished work.
- Don't copy Soundza's core functionality or build a competing sound library or API.
- A free key may store up to 500 downloaded sounds. Remove any sound listed in
GET /v1/removals, and check it at least monthly. - Respect the rate limits, and ask when you need more. We may suspend or end API access for anyone, at any time, for any reason.
ErrorsStatus codes and what they mean
Errors are JSON: {"error": {"code", "message", "details"?}}.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A parameter is wrong. details lists each one. |
| 401 | missing_key | No Authorization: Bearer header. |
| 401 | invalid_key | The key doesn't exist. |
| 401 | revoked_key | The key was revoked. |
| 401 | key_required | Past the last page you can get without a key. Use a key for the rest. |
| 404 | not_found | No public sound, pack or generation on this account has that id. |
| 410 | take_expired | That take's link has expired, so it can't be varied. Generate a new one. |
| 422 | unsupported_source | That sound can't be varied (an ambience, or longer than 10 seconds, for example). Try another. |
| 429 | rate_limited | A limit was hit. Wait Retry-After seconds. |
| 429 | generation_in_progress | This account already has a generation running. details has its poll_url. |
| 503 | generation_unavailable | Generation is switched off for now. Search and downloads still work. |
| 503 | generator_busy | The generator is busy. Wait Retry-After seconds. |
| 500 | server_error | Something went wrong on our end. Try again shortly. |
Soundza pickerA drop-in sound picker for your app, in three files
Two server routes that keep your key private, and a component with chips, previews and the credit link. Style it to match your app.
// app/api/sounds/route.ts: search, with your key kept on the server
export async function GET(req: Request) {
const params = new URL(req.url).searchParams;
const res = await fetch(`https://api.soundza.com/v1/sounds/search?${params}`, {
headers: { Authorization: `Bearer ${process.env.SOUNDZA_API_KEY}` },
});
return new Response(res.body, { status: res.status, headers: { "Content-Type": "application/json" } });
}
// app/api/sounds/[id]/file/route.ts: call it from your server when a user adds a sound
export async function GET(req: Request, { params }: { params: Promise<{ id: string }> }) {
const { id } = await params;
const query = new URL(req.url).searchParams; // search_id, and your own user id as user
const res = await fetch(`https://api.soundza.com/v1/sounds/${encodeURIComponent(id)}/file?${query}`, {
headers: { Authorization: `Bearer ${process.env.SOUNDZA_API_KEY}` },
redirect: "manual",
});
const location = res.headers.get("location");
return location ? Response.redirect(location, 302) : new Response(res.body, { status: res.status });
}When a user adds a sound, fetch the file route from your server and save the file to your own storage. That counts the download. The route redirects to a signed link that lasts 5 minutes and can't be read from a browser on another site, so don't fetch it client-side or keep the link. Pass your own user id as user if you want per-user reports.
URLs and MCP toolsREST, MCP, OpenAPI, llms.txt
The MCP server has these tools: search_sounds, get_sound, search_packs, get_pack, download_sound, generate_sound, vary_sound, get_generation, generate_music and get_music.
- REST
- https://api.soundza.com/v1
- MCP, sign-in
- https://mcp.soundza.com/mcp/oauth
- MCP, API key
- https://mcp.soundza.com/mcp
- OpenAPI
- soundza.com/openapi.json
- For agents
- soundza.com/llms.txt
FAQ#
Is the API free?
Yes. The API and the keys are free. In return, we'd love a link back to soundza wherever it fits what you make.
Do I need to credit soundza?
We ask for it once people outside your team see what you make, in whatever form fits: a link on your site, your store page or your video description. Nothing is needed while you build or test, or for things that are just for you.
What counts as credit?
A link to soundza.com where people can see it. For an app, Powered by soundza by your sound picker plus a link in your site's footer, About page, blog, or somewhere else that makes sense. For a game, a thank-you wherever you share it: a Reddit or Discord post, your devlog or site, or its itch.io or Steam page. For a video, Sound effects: soundza.com in the description. A shout-out on X, Discord or YouTube is lovely too.
Will you share what I make?
We'd love to hear about what you build. Email admin@soundza.com or tag @soundza_audio and tell us what you made. We reshare cool projects made with soundza.
Can I use the soundza logo?
Yes, we'd love you to show it with your "Powered by soundza" link, though it's optional. Please don't use it as your app's icon. Download the full logo (soundza.com/logo-wordmark.png) or the mark on its own (soundza.com/logo.svg).
Do I need a key?
To try it, no: you can search without one for a first look, with fewer details and lower limits (3 pages per search, 20 a minute). To download sounds or build anything, get a key. They're free.
What are the limits?
Free keys get 60 searches a minute, 250 downloads an hour and 500 a week, and 250 generated sounds a week, shared by all keys on your account. Previews don't count. Every response has X-RateLimit-* headers.
How do I get higher limits?
The free limits cover building a game, editing videos, or a small app with a sound picker. If you're putting a sound picker in an app with real traffic, use "Request higher limits" on the keys page and tell us a little about it, or email admin@soundza.com with your key prefix and what you're building. We'll reply by email.
Can I use the sounds in commercial projects?
Yes. Every sound is royalty-free for personal and commercial work under the Soundza Standard License, and shipping a sound inside a game or app you make is fine.
Can I store the files?
Yes. Save each file once and reuse it by the sound's id. A free key may store up to 500 downloaded sounds. Don't keep the signed link download_url redirects to; it lasts 5 minutes.
What if a sound is removed?
Call GET /v1/removals?since=<date> now and then (at least monthly) and delete any sound it lists.
Who owns the sounds I generate?
You can use them like any soundza sound, under the Soundza Standard License. They aren't exclusive to you: the same prompt can give someone else a similar sound, and soundza may add good takes to its library for everyone. See AI features in the Terms: soundza.com/terms#sfx-generator.
What makes the generated sounds?
They're made with Stable Audio 3 Medium, running on our own GPUs. Powered by Stability AI. Sounds in the library are different: they aren't AI-made unless their ai_content says so.
Can I use the sounds to train AI?
No. The sounds can't be used to train, fine-tune or build an AI or machine-learning model.
Can I build a sound library on the API?
No. Please don't redistribute sounds as standalone files or sample packs, or build a competing sound library or API.
REST or MCP?
Both use the same key, limits and catalog. Use REST from your code, and MCP (mcp.soundza.com/mcp) so an agent like Claude Code or Cursor can search and download for you.
Can the API make new sounds?
Yes. Describe a sound and get a WAV back in about five seconds, free up to 250 a week: POST /v1/generations over REST, or the generate_sound tool over MCP. Take links work for 120 days.
Can it make variations of a sound?
Yes. Give it one sound, like a footstep or a sword swing, and it makes up to 8 variations for a game or a video, lined up and level-matched with the original: POST /v1/variations over REST, or the vary_sound tool over MCP. Each take counts as one generation, and a short sound takes about 5 to 10 seconds.
Can it make music?
Yes. generate_music makes original music: a seamless loop to play under a scene or video, or a full-length track. Free, 15 loops on Stable Audio and 8 full tracks on Lyria a week.
Can my coding agent get a key itself?
Yes. Ask it to find sounds on soundza.com. It reads llms.txt, sends you one link to approve, and saves the key.