# 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.

- Question: How does DiceyTable download a web file for my agent?
- Source: https://diceytable.com/docs/ai-agents/concepts/url-imports
- Last verified: 2026-10-09

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`](https://diceytable.com/docs/ai-agents/reference/tools/assets-and-credits#assetimport). The import itself is covered in
[Import models, images and sounds with an agent](https://diceytable.com/docs/ai-agents/workflows/importing-assets).

![A web file goes from the website to DiceyTable's proxy, then through the bridge to your tab](https://diceytable.com/assets/build/url-imports--proxy-path-DhepZDQi.svg "**The only road in.** The server fetches and checks the file; your tab imports it.")

## 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](https://diceytable.com/docs/ai-agents/setup/api-keys).

## 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.arpa`
  and 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 `https` to `http`.
- **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`, `.svg` and `.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](https://diceytable.com/docs/ai-agents/concepts/local-file-access) 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 **Settings ▸ AI agents ▸ URL imports** at
[/play/settings](https://diceytable.com/play/settings#ai-agents). Records are deleted after 90 days.
[What leaves your computer](https://diceytable.com/docs/ai-agents/concepts/privacy) covers the rest of what the agent's work leaves behind.

## Limits

Every other agent limit is in [AI agent limits and quotas](https://diceytable.com/docs/ai-agents/reference/limits).

| 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](https://diceytable.com/docs/ai-agents/reference/errors).

| 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](https://diceytable.com/docs/ai-agents/concepts/prompt-injection) 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](https://diceytable.com/docs/ai-agents/concepts/ai-attested-credits).

## Related

- [AI agent safety in DiceyTable](https://diceytable.com/docs/ai-agents/concepts/security-model): the rule every safeguard follows from.
- [Which local files an agent can read](https://diceytable.com/docs/ai-agents/concepts/local-file-access): the other way files come in.
- [AI agent error codes](https://diceytable.com/docs/ai-agents/reference/errors): every code in one table.
