> ## Documentation Index
> Fetch the complete documentation index at: https://docs.blobrouter.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect Cloudflare R2

> Add R2 as a routing target for hot files with zero egress fees.

<Info>
  **BlobRouter v0.1** · Last updated: August 2026 · Architecture version: **2.0**
</Info>

Cloudflare R2 is the preferred destination for `priority: "hot"` uploads — storage without egress fees.

## Prerequisites

* A Cloudflare account with R2 enabled
* An R2 bucket
* R2 API token with **Object Read & Write** on that bucket

## 1. Create an R2 bucket

1. Cloudflare dashboard → **R2 Object Storage**
2. **Create bucket**
3. Note the bucket name

## 2. Create an API token

1. R2 → **Manage R2 API Tokens**
2. Create a token with permission to read/write your bucket
3. Copy **Access Key ID** and **Secret Access Key** (secret is shown once)
4. Copy your Cloudflare **Account ID** (overview page)

Endpoint format:

```text theme={null}
https://<ACCOUNT_ID>.r2.cloudflarestorage.com
```

## 3. Add credentials in BlobRouter

1. Open [Dashboard → Providers](https://app.blobrouter.com)
2. Choose **Cloudflare R2**
3. Enter:
   * Account ID
   * Access Key ID
   * Secret Access Key
   * Bucket name
   * Region (use `auto` if your token uses the default R2 S3 API)
4. Save, then **Test connection**

Credentials are encrypted with AES-256-GCM before storage.

## 4. Upload with hot priority

```javascript theme={null}
import { BlobRouter } from "@blobrouter/sdk";
import { readFileSync } from "fs";

const storage = new BlobRouter({
  apiKey: process.env.BLOBROUTER_API_KEY,
});

const file = readFileSync("./asset.png");

const result = await storage.upload(file, {
  fileName: "asset.png",
  contentType: "image/png",
  fileSizeBytes: file.length,
  priority: "hot",
});

console.log(result.provider); // "cloudflare-r2" when R2 is configured
```

If R2 is not connected, BlobRouter falls back to the cheapest configured provider and sets `routingWarning`.

## Troubleshooting

| Symptom                              | Fix                                                            |
| ------------------------------------ | -------------------------------------------------------------- |
| Test connection fails                | Confirm account ID, keys, and bucket name                      |
| Upload routes elsewhere with warning | Ensure R2 credentials saved under Providers                    |
| Signature errors                     | Regenerate R2 API token; confirm endpoint uses your account ID |
