Guide
Connect a CSV to your agent
Connect a spreadsheet into the core — generate a pre-signed link, drop your file in a browser, and your agent reads it via `sh`.
5/18/2026 · connect0 · 4 min
The simplest way to connect data into the core: a CSV your agent can load, slice, and summarise.
You have a 12 MB CSV. You want the agent to load it into pandas, slice it, summarise it. Pasting it into chat would be slow, expensive, and a lossy form of "sharing." Use upload.create_link.
1. Ask the agent to make a link
"I want to share
sales-2026-q1.csvwith you. Make me an upload link — it's about 12 MB."
The agent calls:
upload.create_link {
"account_slug": "acme",
"project_slug": "demo",
"target_path": "data/sales-2026-q1.csv",
"content_type": "text/csv",
"content_length": 12582912
}
You get back something like:
{
"upload_url": "https://<account>.r2.cloudflarestorage.com/.../...?X-Amz-Algorithm=...",
"browser_url": "https://connect0.ai/u/8a4f...",
"method": "PUT",
"expires_at": "2026-05-18T17:30:00Z",
"target_path": "data/sales-2026-q1.csv",
"workspace_path": "/workspace/data/sales-2026-q1.csv",
"headers": { "content-type": "text/csv", "content-length": "12582912" },
"max_bytes": 12582912
}
2. Upload from your browser (easiest)
Open browser_url in any logged-in tab. You'll see a drop zone. Drag the file in — it PUTs directly to R2, never through connect0's servers.
2 (alternate). Upload from the terminal
curl --upload-file ./sales-2026-q1.csv \
-H 'content-type: text/csv' \
'<upload_url>'
upload_url is one-shot — you can't reuse it for another file.
3. Verify
"Did the upload land?"
The agent calls info and checks current_project.recent_uploads[0].status. Within a few seconds of the PUT, the status flips from pending to claimed. Then:
sh "head -5 /workspace/data/sales-2026-q1.csv"
If you see your column headers, you're done.
What can go wrong
- Size mismatch. When you pass
content_length, the link is bound to exactly that byte count. Drop a file with even one extra byte and R2 returns 403. Either trim/pad, or ask the agent for a fresh link without a declared size. - Wrong
content_type. Same — signed into the URL, mismatch returns 403. statusstayspending. The R2 → queue → claim path takes a few seconds; if it's still pending after a minute, something is broken on our side (see debugging silent uploads).
Next steps
- Tiny configs, no curl:
upload.write— for content the agent already has in hand. - Drop-zone on the dashboard — for non-CLI users.
Where this fits
This is the Connect everything pillar of connect0 — the core that connects everything your company runs on. A pre-signed link drops your spreadsheet straight into the core, where the agent can read and analyze it without ever pasting bytes into chat. Start building → · All guides →