In short
Roblox could not load the audio with that ID in this experience. Usually the ID is wrong (it belongs to a decal, a model or a web page, not an audio asset), or the audio is private: uploaded by another account that never gave your experience permission to use it. Use audio from the Creator Store tab of the Toolbox (right-click, Copy Asset ID), upload your own, or have the owner grant your experience access on the asset's Permissions page. If every sound fails at once, check the Roblox status page before you change anything.
What the message means
Failed to load sound rbxassetid://1234567890: Unable to download sound data
The message comes from the Sound object, not from a script line, so there is no line number. The ID in it tells you which sound failed: search your place for that number to find the Sound.
Audio you upload is private to you at first. Roblox's asset privacy system lets the owner grant other creators and experiences permission to use it. An experience without that permission cannot load the audio, so the same ID can play in its owner's game and fail in yours.
Audio also goes through moderation after upload. Audio that is still in review, or that moderation removed, will not load anywhere.
Causes and fixes
Three things cause this error in practice. Each one below has the smallest code that triggers it, then the fix.
- The ID is not an audio asset
- The experience has no permission to use the audio
- Many new Sound objects load at the same moment
The ID is not an audio asset
The number from a web address, a decal, a model in the Toolbox or a game page looks like any other asset ID. Put into SoundId, it points at something that is not audio.
local SoundService = game:GetService("SoundService")
local music = Instance.new("Sound")
-- a model's ID copied from the Toolbox, not the audio inside it:
-- Failed to load sound rbxassetid://1234567890: Unable to download sound data
music.SoundId = "rbxassetid://1234567890"
music.Looped = true
music.Parent = SoundService
music:Play()
Find the audio in the Toolbox's Creator Store tab with the category set to Audio, right-click it and choose Copy Asset ID. Then wait for the sound to load before you rely on it, and warn with the ID if it never does, so a bad ID is easy to spot.
local SoundService = game:GetService("SoundService")
local music = Instance.new("Sound")
music.SoundId = "rbxassetid://9876543210" -- the audio asset's own ID
music.Looped = true
music.Parent = SoundService
task.delay(10, function()
if not music.IsLoaded then
warn("[Music] still not loaded:", music.SoundId)
end
end)
if not music.IsLoaded then
music.Loaded:Wait()
end
music:Play()
The experience has no permission to use the audio
Audio IDs from tutorials, free models or other games usually belong to accounts that never shared them with your experience. They play in their owner's games and fail in yours. A group game using audio uploaded to a personal account can fail the same way.
local Players = game:GetService("Players")
local DOOR_CREAK = "rbxassetid://1234567890" -- from a free model; someone else's private audio
Players.PlayerAdded:Connect(function(player)
local sound = Instance.new("Sound")
sound.SoundId = DOOR_CREAK
sound.Parent = workspace
sound:Play() -- Failed to load sound ...: Unable to download sound data
end)
Use audio this experience is allowed to load: Creator Store audio, audio uploaded by the account or group that owns the experience, or audio whose owner granted access. To grant access to your own audio, open the Creator Dashboard, Development Items, Audio, select the asset, open Permissions, then Add experiences on the Experiences tab and enter the universe ID. A game grant cannot be taken back later. Keep every ID in one table so a swap is a one-line change.
local Players = game:GetService("Players")
-- one table for every sound ID in the game, all from the Creator Store or our own uploads
local SOUNDS = table.freeze({
DoorCreak = "rbxassetid://9876543210",
})
Players.PlayerAdded:Connect(function(_player: Player)
local sound = Instance.new("Sound")
sound.SoundId = SOUNDS.DoorCreak
sound.Parent = workspace
sound:Play()
end)
Studio helps here: when a creator has access to an asset but the game does not, clicking the error in Output can open a window to grant the game permission.
Many new Sound objects load at the same moment
Creating a fresh Sound for every footstep, hit or coin starts a new load each time. Many loads at once, on a slow connection, can fail or arrive late, so the message can appear for audio that is otherwise fine.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local coinPickedUp = ReplicatedStorage:WaitForChild("CoinPickedUp") :: RemoteEvent
coinPickedUp.OnClientEvent:Connect(function()
-- a brand new Sound, and a new load, for every coin
local ding = Instance.new("Sound")
ding.SoundId = "rbxassetid://9876543210"
ding.Parent = workspace
ding:Play()
end)
Create each sound once, preload it with ContentProvider:PreloadAsync when the game starts, and play the same object again every time.
local ContentProvider = game:GetService("ContentProvider")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local SoundService = game:GetService("SoundService")
local coinPickedUp = ReplicatedStorage:WaitForChild("CoinPickedUp") :: RemoteEvent
local ding = Instance.new("Sound")
ding.SoundId = "rbxassetid://9876543210"
ding.Parent = SoundService
ContentProvider:PreloadAsync({ ding }, function(contentId: string, status: Enum.AssetFetchStatus)
if status ~= Enum.AssetFetchStatus.Success then
warn("[CoinSound] could not load", contentId, status)
end
end)
coinPickedUp.OnClientEvent:Connect(function()
ding:Play()
end)
Fix it in your place
Paste the error, RoCode fixes it in your place
Copy the line from Output and paste it here. RoCode opens the script it names in the place you have open in Studio, works out which of the causes above it is, and edits the code there instead of handing you a snippet to paste.
RoCode is an AI agent for Roblox Studio: it reads the scripts in the place you have open, finds the line and edits it there, and every change is an undo point. It runs on Windows or macOS with a desktop browser. Free to start, with free credits every day.
How to find the line that causes it
- This message comes from a
Sound, so Output does not link to a script. Copy the number afterrbxassetid://. - Use Ctrl+Shift+F (Find All) to search every script for that number, and also for
SoundId, which catches scripts that build the ID from parts. For Sound objects placed by hand, select each one in the Explorer and read itsSoundIdin the Properties window. - Paste the number into the Creator Store search or open its Creator Dashboard page to see what kind of asset it is and who owns it.
Questions
Why does a sound work in another game but not mine?
Because that game's owner has permission to use the audio and your experience does not. Use audio from the Creator Store, upload your own, or ask the owner to grant your experience access on the asset's Permissions page.
Where can I find audio I am allowed to use?
In the Toolbox, open the Creator Store tab and set the category to Audio. Roblox lists free sound effects and music there, including licensed tracks from its audio partners.
Can I upload my own sounds?
Yes, through the Asset Manager or the Creator Dashboard, if you have the rights to them. Files must be under 20 MB and 7 minutes. Uploads go through moderation before they can be used.
Every sound in my game failed at once. What now?
If audio that worked yesterday fails everywhere today, the cause is often on Roblox's side. Check the Roblox status page and try again later before changing your IDs.
Can RoCode fix it?
Yes, for the script side. Paste the Output line into RoCode. It finds every place that sound ID is used in the place you have open, and can move the IDs into one table and preload them. You still pick audio your experience is allowed to use.
Sources and further reading
- Roblox Creator Docs: audio assets. finding audio in the Creator Store, import limits and moderation
- Roblox Creator Docs: asset privacy. granting an experience permission to use an asset
- Roblox Creator Docs: ContentProvider:PreloadAsync
- Roblox Creator Docs: Sound. IsLoaded and Loaded
How the code was checked: every block marked Fixed passes Luau's strict type checker against Roblox's API definitions (luau-lsp, 4 November 2026), and every block marked Breaks compiles and fails only when it runs. The message wording was checked against the message format strings in Roblox Studio itself (macOS build installed on 24 October 2026) on 4 November 2026. How audio permissions work is from the audio assets and asset privacy pages in the Roblox creator docs. A type check catches misspelt APIs and wrong types, not game logic, so playtest in Studio before you publish.