Stay in control
How URL imports are fetched safely
DiceyTable's server fetches a web file for your agent through a guarded proxy. It checks the address and file type, streams the file and keeps no copy.
On this page7 sections
Your agent never downloads a web file by itself. When it asks for one, DiceyTable's server fetches it through a guarded proxy, checks it, and streams it to your tab without keeping a copy.
This page is for anyone who lets an agent import files with the url argument of
asset_import. The import itself is covered in
Import models, images and sounds with an agent.
Who fetches the file?#
Only DiceyTable's server does. Your tab can't fetch random websites, because its security rules forbid it. The bridge doesn't fetch them either. So the agent asks the server, using your key. The server downloads the file and streams it back through the bridge to your tab.
There is no general "fetch a web page" tool, for agents or for mods. A URL import is the only thing that fetches, and it only brings in game assets.
What you'll need. The key needs the Import from URLs permission, as well as Edit projects. You pick them when you create an API key.
What the proxy checks#
Before the proxy lets a file in, it checks all of this:
- The address. It must start with
https://. It can't hold a user name or a password, and it can't be longer than 2,048 characters. - The host name. Local and special names are refused, such as
localhost,*.local,*.internal,*.home.arpaand one-word names. So are DiceyTable's own hosts. - Where the name points. The proxy looks the name up first. If any address it gets back is private, local or not on the public internet, the fetch stops. Then it connects to the exact address it checked. That way, nobody can swap in a private address between the check and the download. (This trick is called DNS rebinding.)
- Redirects. It follows at most 5. It checks each one from scratch, and it never drops from
httpstohttp. - The file type. It reads the first 4 KB of the file and decides the type from the bytes. What the website claims
doesn't count. Models, images, HDR environments, KTX2 textures, sounds and data files are allowed. Scripts, code and
markup are always refused, such as
.js,.ts,.lua,.wasm,.html,.svgand.xml. So is anything that looks like a web page.
The proxy names itself DiceyTableAssetFetch/1 when it asks for a file. Some sites put a bot check in front of their
files and turn it away. When that happens, download the file yourself and let the agent import it from your computer.
Which local files an agent can read explains the folders it can use.
Does DiceyTable keep the file?#
No. The file streams straight through. The proxy holds only the first 4 KB in memory, to check the type. Nothing is written to disk, a database, a cache or a log.
What is kept is a short record of each try, refused ones included. It holds the address, where the file ended up after redirects, the HTTP status, the size, the type, the outcome and how long it took. It never holds the file or the request headers. You can read the list under ▸ ▸ at /play/settings. Records are deleted after 90 days. What leaves your computer covers the rest of what the agent's work leaves behind.
Limits#
Every other agent limit is in AI agent limits and quotas.
| Limit | Value |
|---|---|
| One file | 128 MB, counted on the bytes actually sent |
| Fetches per key | 60 a minute |
| Bytes per key | 5 GB in any 24 hours. A download that crosses it stops part-way. |
| At the same time | 2 per user, 4 on the server. A request waits up to 10 seconds for a free slot. |
| Time | 10 seconds to connect, 30 to the first byte, 120 in total |
The file that gets stored has tighter limits of its own, because conversion shrinks it.
Outcomes#
Every try ends with one of these outcomes, and the URL imports list shows it too. All the other codes are in AI agent error codes.
| Outcome | What happened | What to do |
|---|---|---|
ok |
Fetched and handed to the import | Nothing |
blocked-url |
Not an https:// address, has a name or password in it, is too long, or names a local or DiceyTable host |
Use the file's public https:// address. |
blocked-address |
The name points at a private or non-public address, even in part | Download the file and import it from your computer. |
blocked-type |
Not an asset type, a script or markup file, empty, or the bytes don't match the name | Import models, images, sounds and data files only. |
too-large |
Over 128 MB, as declared or as sent | Shrink or convert the file first. |
timeout |
Too slow to connect, to start or to finish | Try again, or download it yourself. |
upstream-error |
The site sent an error (404, 500 and so on) or broke off | Check the address in your browser. |
upstream-blocked |
The site refused us (401, 403, 429 and so on), often a bot check | Download it yourself and import it from your computer. |
rate-limited |
More than 60 fetches in a minute | Wait. The error says how long. |
quota-exceeded |
5 GB used in the last 24 hours | Wait, or import files from your computer. |
busy |
Too many fetches at once, or the server's daily total is used up | Try again shortly. |
Fetched files are data#
A fetched file can't give your agent orders. That goes for its bytes, its name and its final address. It matters most
for text files like .json, .txt and .csv, because the agent may read them. A downloaded README that says "ignore
your instructions" is only text. Prompt injection protection explains how
DiceyTable marks this kind of text for your agent.
Every file the agent imports also needs a credit. For a URL import, the credit records where the file came from and a SHA-256 hash, which is a fingerprint of the exact bytes. You check that record before you publish. See Review credits an AI agent added.
Related#
- AI agent safety in DiceyTable: the rule every safeguard follows from.
- Which local files an agent can read: the other way files come in.
- AI agent error codes: every code in one table.
