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.csv with 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.
  • status stays pending. 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

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 →