How data is stored
Every push writes an immutable JSONL blob to Cloudflare R2. Nothing is overwritten — each version lives at its own key forever, until it falls outside your retention window.
grids/<handle>/<slug>/v1.jsonl ← never mutated
grids/<handle>/<slug>/v2.jsonl
grids/<handle>/<slug>/v3.jsonl ← "current" pointer
$0 egress
Cloudflare R2 has no egress fees. Reading a grid — whether it's your agent pulling 5 million rows or the embed rendering a table — costs the same in egress as doing nothing. You only pay for storage and ingest operations.
Retention and storage by plan
| Plan | Retention | Storage limit |
|---|---|---|
| Free | 7 days | 100 MB |
| Builder | 30 days | 100 GB |
| Agent | 365 days | 1 TB |
Note: Retention applies to the JSONL blob in R2. The grid metadata (title, schema, version list) persists in D1 after a blob expires — you can see the version history even if the raw file is gone.
Verifying storage via the API
# Check your current workspace usage
curl https://instadash.io/api/workspace \
-H "Authorization: Bearer sk_live_…"
# → { "storage_used_bytes": 1234567, "storage_limit_bytes": 107374182400, … }