Iceberg without the catalog baggage
Apache Iceberg has become the default choice for running large-scale analytics directly on object storage. Its database-like semantics—ACID transactions, schema evolution, partition pruning—solve the problems that made naive data lakes fragile. But adopting Iceberg has traditionally meant standing up and operating a separate catalog service. Cloudflare is removing that step with the R2 Data Catalog, now in open beta, which embeds a managed Iceberg catalog directly into each R2 bucket.
The catalog exposes a standard Iceberg REST interface, so existing tooling connects without modification. Supported engines include PyIceberg, Snowflake, and Spark. And because the underlying data lives in R2, egress costs remain $0 regardless of where queries run.
What Iceberg actually manages

An Iceberg table is split between data files (typically Parquet or ORC) and metadata files (JSON or Avro). The metadata layer is what makes the format useful: it records snapshots, schema versions, and partition layouts so engines don't have to guess what a table looks like.
Three components in a metadata file do most of the heavy lifting:
schemas: historical record of schema changes. Engines use this to read data written under older schemas without rewriting files.snapshots: point-in-time references to specific data file sets. This is what enables time travel.partition-specs: logical partition definitions that engines consult during query planning to skip irrelevant data.
That metadata is still only half the story. While Iceberg's data and metadata files live in object storage, something has to track which tables exist and where their current metadata lives. That is the catalog's job—a registry that gives multiple query engines a consistent, conflict-free view of the tables they share.
Standing up your first table
Getting started with R2 Data Catalog takes four steps. The full walkthrough is in the developer docs.
- Enable the data catalog on a bucket. You can do this from the dashboard under R2 Object Storage > Settings > R2 Data Catalog, or via the API:
npx wrangler r2 bucket catalog enable my-bucket
- Create a Cloudflare API token with permissions for both R2 storage and the data catalog.
- Install PyIceberg and PyArrow, then open a Python shell or notebook:
pip install pyiceberg pyarrow
- Connect to the catalog and create a table:
import pyarrow as pa
from pyiceberg.catalog.rest import RestCatalog
# Define catalog connection details (replace variables)
WAREHOUSE = "<WAREHOUSE>"
TOKEN = "<TOKEN>"
CATALOG_URI = "<CATALOG_URI>"
# Connect to R2 Data Catalog
catalog = RestCatalog(
name="my_catalog",
warehouse=WAREHOUSE,
uri=CATALOG_URI,
token=TOKEN,
)
# Create default namespace
catalog.create_namespace("default")
# Create simple PyArrow table
df = pa.table({
"id": [1, 2, 3],
"name": ["Alice", "Bob", "Charlie"],
})
# Create an Iceberg table
table = catalog.create_table(
("default", "my_table"),
schema=df.schema,
)
After that, the table behaves like any other Iceberg table—append data, run queries, evolve the schema.
Pricing and roadmap
During the open beta, R2 Data Catalog adds no charges beyond standard R2 storage and operations costs. Bucket storage pricing stays at $0.015 per GB-month, and egress remains $0. Future pricing for catalog operations (table creation, metadata retrieval) and data compaction is planned but not yet set; Cloudflare says it will announce details well before billing starts.
|
Pricing |
|
|
R2 storage For standard storage class |
$0.015 per GB-month (no change) |
|
R2 Class A operations |
$4.50 per million operations (no change) |
|
R2 Class B operations |
$0.36 per million operations (no change) |
|
Data Catalog operations e.g., create table, get table metadata, update table properties |
$9.00 per million catalog operations |
|
Data Catalog compaction data processed |
$0.05 per GB processed $4.00 per million objects processed |
|
Data egress |
$0 (no change, always free) |
Current development priorities are compaction and table optimization—rewriting many small data files into fewer larger ones for faster queries—and expanding query-engine compatibility with the Iceberg REST Catalog spec through collaboration with the Apache Iceberg community. Feedback is welcome during the beta on the Cloudflare Developer Discord.



