This article provides a step by step comparison of seven Apache Iceberg REST catalog implementations, measuring what each one actually serves against the published specification.
A Python probe harness is built to issue one identical request suite to every catalog and store the raw response as evidence. https://github.com/xbill9/lakehouse-iceberg-2026 Every vendor with a lakehouse now ships an Iceberg REST catalog, and every one of them says it implements the same specification.
That claim is checkable.
The specification also asks a server to publish a machine-readable list of the endpoints it supports, which makes a second claim checkable: does a catalog agree with itself?
All results below were measured on 2026-09-03.
Nothing here is about the REST catalog being broken.
It works — every catalog served the core read path.
What Do You Need to Reproduce This?
Seven catalogs means seven accounts, and three of mine were trials that will have expired by the time most people read this.
Read this section before investing an afternoon.
Catalog What you need What I used Apache Polaris Docker local container, free Google BigLake GCP project, Lakehouse API enabled owned project AWS Glue AWS account owned account AWS S3 Tables AWS account owned account Databricks Unity Premium workspace 14-day trial Snowflake Horizon any Snowflake account 30-day Enterprise trial Microsoft OneLake Fabric licence on a work account 60-day Fabric trial capacity Three of those need saying plainly.
Databricks Free Edition will not work.
Enabling external data access is an account-level action, and Free Edition documents no access to the account console.
A personal Microsoft account cannot hold a Fabric licence.
The Fabric API returns and no configuration changes it.
A work or school account in an Entra tenant can, and the free 60-day trial capacity is enough — the paid F-SKU the Azure portal steers you toward is not needed.
Snowflake Open Catalog is closed to new signups.
Snowflake's documentation directs new customers to Horizon, which is what this measures.
Being on a trial tier is also a genuine confound in the results, not only an inconvenience.
The limitations section returns to it.
What Is Apache Iceberg?
Iceberg is a table format.
A table is a directory of Parquet files plus a chain of JSON metadata files recording which of those files belong to the table right now, what the schema is, how it is partitioned, and what it looked like at every previous commit.
That history is why engines can time-travel and why two writers can commit without corrupting each other.
Something has to hold the pointer to the current metadata file.
That something is the catalog.
It answers one question — for table , where is the metadata right now — and it makes commits atomic by swapping that pointer.
What Is the REST Catalog?
For years each engine brought its own catalog: Hive Metastore, a Glue client, a JDBC catalog, a filesystem convention.
Every engine needed a driver for every catalog.
The Iceberg REST catalog replaces that with one HTTP API.
A client speaks HTTP to a URL and the vendor implements the endpoints behind it.
The specification lives in the Iceberg repository as .
Thirty-five operations: listing namespaces, loading a table, committing an update, creating a view, planning a scan.
What Does a Catalog Say About Itself?
The endpoint every client calls first is .
It returns the routing prefix for every later request, and it may return one more thing: endpoints: A list of endpoints that the server supports.
The format of each endpoint must be . — , That field is the reason this article exists.
A catalog publishes a machine-readable list of what it supports, and nothing stops a client from trusting it.
Throughout, declared means named in that array and served means returned a 2xx to the probe.
Where a catalog declares an endpoint and does not serve it, I call that an overclaim, on the strength of the spec's own word supports.
What This Suite Does Not Do Apache ships