# How to Send Files to X02 From an AI Chat

> Four ways a file gets from your machine into X02 through an assistant — inline upload, rehosting from a URL, drop links and the standing tray — with the size ceilings and expiry times for each.

Source: https://x02.me/blog/how-to-send-files-to-x02-from-an-ai-chat · 2026-09-22 · X02 Team

"Upload this screenshot" is the single most common thing anyone asks an assistant to do with X02, and it is the one place where the protocol gets in the way. An AI client can *show* the model your attachment, but it has no mechanism for handing the bytes to a remote server — and no client exposes your attachments as public URLs, which is just as well.

So X02 has four routes instead. This page is which one applies when, and what each costs you.

> [!TIP]
> **Quick Navigation:**
> * [The four routes at a glance](#the-four-routes-at-a-glance)
> * [The tray: drop first, ask later](#the-tray-drop-first-ask-later)
> * [Drop links: ask first, drop after](#drop-links-ask-first-drop-after)
> * [Rehosting from a URL](#rehosting-from-a-url)
> * [Inline upload, and why it is so small](#inline-upload-and-why-it-is-so-small)
> * [What happens after the upload](#what-happens-after-the-upload)
> * [Next Steps & Related Tutorials](#next-steps--related-tutorials)

---

## The four routes at a glance

| Route | Use it for | Ceiling | Expires |
|---|---|---|---|
| **The tray** (`x02.me/drop`) | Anything, when you know in advance you will want it | Your plan's file size limit | Drop waits 24 hours |
| **Drop link** (`request_file_from_user`) | Anything, when the assistant asks mid-conversation | Your plan's file size limit | Link open 15 minutes |
| **From a URL** (`upload_from_url`) | Images already online | Your plan's file size limit | — |
| **Inline** (`upload_file`) | Icons, SVGs, short text files | 1 MB hard, ~128 KB comfortable | — |

The pattern: **the two routes that go through the chat are the limited ones.** Anything that travels as text in a conversation is expensive and capped. The two that route around the conversation carry whatever your plan allows.

![Architecture Diagram](/blog-diagrams/how-to-send-files-to-x02-from-an-ai-chat-1.svg)

---

## The tray: drop first, ask later

The best route, and the one nobody discovers on their own.

Open **[x02.me/drop](https://x02.me/drop)** and pin it as a tab. Paste anything into it — Ctrl+V works anywhere on the page, which is the entire interaction for a screenshot already on your clipboard. Dragging files in works too.

Whatever is sitting there gets picked up by the next assistant that asks. You never see a link, never wait, never go back and confirm. Ask "upload the screenshot I just dropped and give me the link" and it is already done by the time it answers.

> [!NOTE]
> A tray drop waits **24 hours** for someone to collect it. Unlike a drop link, it is not tied to one assistant — whichever one asks next gets it. That is the point: the tray is shared across your clients, a drop link is not.

Each drop is handed over once. Collecting it marks it claimed, so asking a second assistant the same question does not re-deliver the same pile of files.

---

## Drop links: ask first, drop after

When you ask for an upload and there is nothing in your tray, the assistant gives you a link:

```
https://x02.me/drop/K7M2QXR4
```

Open it, paste or drag the file, and the assistant collects it without you saying anything. It polls in roughly ten-second stretches, so a "not yet" in the middle of the conversation is normal rather than a failure — it means the link is still open and it is still watching.

Three things worth knowing:

**The link lasts fifteen minutes.** Wander off and come back to an expired one and the assistant simply issues another. Nothing is lost.

**The code is eight characters** from an alphabet with no O/0 or I/1, so reading one aloud or retyping it is survivable.

**It is delivered to one assistant only.** A file handed to Claude through a drop link does not appear in Cursor. If you want something available to whichever assistant asks next, use the tray instead.

---

## Rehosting from a URL

If the file is already online, this is the fastest route by a distance: give the assistant the URL and the bytes go straight from the source to X02 without passing through the conversation at all.

> "Rehost https://example.com/diagram.png on my account and give me the link."

Two constraints:

- **Images only.** The URL has to answer with an `image/*` content type. A PDF, a video or an HTML page is refused with *"Only image URLs are supported"*.
- **Private and internal hostnames are refused.** Localhost, the private IPv4 ranges, and `.local` and `.internal` hostnames are all blocked, so an assistant cannot be talked into fetching something off your network.

Size follows your plan: 80 MB anonymous, 200 MB on a registered account, 512 MB on Pro. The remote file's `Content-Length` is checked before the download starts, and the real size again afterwards, so an oversized file fails fast rather than halfway.

---

## Inline upload, and why it is so small

`upload_file` carries the file base64-encoded inside the tool call itself. That works, and for small things it is the most direct route there is — an SVG, a favicon, a config snippet the assistant just generated.

For anything photographic it is hopeless, and the arithmetic is worth seeing. Base64 inflates bytes by about a third. A modest 150 KB screenshot becomes roughly 200,000 characters of text that has to pass through the model's context on the way. Most clients will not emit that much, and the ones that do make you pay for it twice.

So: comfortable under **128 KB**, refused outright above **1 MB**. When it refuses, it says so in terms you can act on — upload it yourself on x02.me and tell the assistant what it was called, or hand over a URL instead.

That first suggestion works better than it sounds, because of how search behaves. X02 renames files on upload, but it keeps your original name alongside the generated one, and `list_files` searches both. Upload `quarterly-report-final.png` through the website and then say "find the quarterly report I just uploaded" — the assistant finds it by the name it had on your machine, without you ever touching the generated one.

---

## What happens after the upload

**The stored name is not your name.** X02 assigns a short generated filename, and that is what every other tool expects — `rename_files`, `move_files`, `delete_files`, `share_folder`. Assistants are told to use the name returned by the upload. If you are cross-referencing by hand, check `list_files` rather than assuming.

**It lands in your default upload folder.** If you have set one, assistant uploads go there too, by every route. See [setting a default upload folder](/blog/how-to-set-a-default-upload-folder).

**It counts against your normal quota.** MCP is not a separate allowance — same daily limit (250 uploads on a registered account, 1,500 on Pro), same per-plan file size ceiling. Before a big batch, ask:

> "How many uploads do I have left today?"

**You can set an expiry at upload time.** Both upload tools accept `1h`, `6h`, `1d`, `7d` or `30d`, after which the file deletes itself. Say "upload this but have it expire in a day" and the assistant passes it through. Omit it and the file is permanent.

---

## Next Steps & Related Tutorials

| What to learn next | Guide Link |
| :--- | :--- |
| **What MCP is and what it can do** | [Connect AI Assistants to X02 with MCP](/blog/connect-ai-assistants-to-x02-with-mcp) |
| **Step-by-step setup for your client** | [Set Up X02 in Claude, ChatGPT, Cursor and More](/blog/set-up-x02-mcp-in-your-ai-client) |
| **What each permission grants** | [X02 MCP Permissions: What You Are Actually Approving](/blog/x02-mcp-permissions-and-scopes-explained) |
| **Things to ask your assistant** | [Ten Things to Ask an Assistant Connected to X02](/blog/x02-mcp-workflows-and-recipes) |
| **Upload files by every other method** | [How to Upload Files to X02](/blog/how-to-upload-files-to-x02) |
| **Set a default upload folder** | [How to Set a Default Upload Folder](/blog/how-to-set-a-default-upload-folder) |
