Clone
2
Iceberg REST Catalog API
Chris Lu edited this page 2026-08-16 13:00:07 -07:00

SeaweedFS implements the Iceberg REST Catalog API, so any Iceberg REST client (Spark, Trino, PyIceberg, iceberg-go, DuckDB, Dremio, RisingWave, Doris) can manage namespaces, tables, and views directly against SeaweedFS while data and metadata files live in SeaweedFS S3 buckets.

For setup, authentication, and client integrations, see SeaweedFS Iceberg Catalog.

Endpoint

The catalog listens on its own port (default 8181, set with -s3.port.iceberg). A catalog is a table bucket; address it either by URL prefix (/v1/{bucket}/...) or with ?warehouse=s3://{bucket}/. With neither, requests default to the bucket named warehouse. See SeaweedFS Iceberg Catalog for the bucket relationship.

Supported APIs

The tables below list the Iceberg REST Catalog operations and their support status, using the operation names from the REST catalog OpenAPI spec.

Configuration and OAuth

API Operation Method & Path Supported Notes
GetConfig GET /v1/config Yes Echoes overrides.prefix for a ?warehouse= query
GetToken POST /v1/oauth/tokens Yes client_credentials grant; S3 access/secret key as client id/secret

Namespace

API Operation Method & Path Supported Notes
ListNamespaces GET /v1/{prefix}/namespaces Yes parent and pagination supported
CreateNamespace POST /v1/{prefix}/namespaces Yes
LoadNamespaceMetadata GET /v1/{prefix}/namespaces/{ns} Yes
NamespaceExists HEAD /v1/{prefix}/namespaces/{ns} Yes
DropNamespace DELETE /v1/{prefix}/namespaces/{ns} Yes Rejects a non-empty namespace
UpdateNamespaceProperties POST /v1/{prefix}/namespaces/{ns}/properties Yes Returns the removed/updated/missing summary

Table

API Operation Method & Path Supported Notes
ListTables GET /v1/{prefix}/namespaces/{ns}/tables Yes
CreateTable POST /v1/{prefix}/namespaces/{ns}/tables Yes Includes stage-create
LoadTable GET /v1/{prefix}/namespaces/{ns}/tables/{table} Yes Vends S3 FileIO config so clients read data files directly; ?snapshots=refs returns only the snapshots refs point at
TableExists HEAD /v1/{prefix}/namespaces/{ns}/tables/{table} Yes
UpdateTable POST /v1/{prefix}/namespaces/{ns}/tables/{table} Yes Commit with assert-* requirements
DropTable DELETE /v1/{prefix}/namespaces/{ns}/tables/{table} Yes
RegisterTable POST /v1/{prefix}/namespaces/{ns}/register Yes Registers an existing metadata.json location
RenameTable POST /v1/{prefix}/tables/rename Yes Catalog-only; data and metadata files do not move
ReportMetrics POST /v1/{prefix}/namespaces/{ns}/tables/{table}/metrics Yes Accepted and discarded; the catalog keeps no metrics store
LoadCredentials GET /v1/{prefix}/namespaces/{ns}/tables/{table}/credentials No Credentials come back on LoadTable instead, see S3 Tables Security
PlanTableScan / FetchScanTasks .../tables/{table}/plan No Server-side scan planning

View

API Operation Method & Path Supported Notes
ListViews GET /v1/{prefix}/namespaces/{ns}/views Yes
CreateView POST /v1/{prefix}/namespaces/{ns}/views Yes
LoadView GET /v1/{prefix}/namespaces/{ns}/views/{view} Yes
ViewExists HEAD /v1/{prefix}/namespaces/{ns}/views/{view} Yes
ReplaceView POST /v1/{prefix}/namespaces/{ns}/views/{view} Yes Commit with assert-view-uuid requirements
DropView DELETE /v1/{prefix}/namespaces/{ns}/views/{view} Yes
RenameView POST /v1/{prefix}/views/rename Yes Catalog-only, like RenameTable

Transaction

API Operation Method & Path Supported Notes
CommitTransaction POST /v1/{prefix}/transactions/commit Yes Multi-table commit; requirements validated together, applied best-effort (not crash-atomic)

Notes

  • Naming: namespace and table/view names use the S3 Tables charset — lowercase a-z, 0-9, _ and -, starting and ending alphanumeric. Names with other characters (uppercase, dots) are rejected with 400 BadRequestException.
  • Table and view names share a namespace: a name is unique across both within a namespace.
  • Metadata storage: the catalog entry is a pointer; the Iceberg metadata.json is an object at s3://{bucket}/{ns}/{table}/metadata/vN.metadata.json. A commit writes a new metadata file and flips the pointer.
  • Concurrent commits: the metadata file is written exclusively and the pointer is flipped conditionally, so two engines committing from the same base cannot lose each other's snapshot. The loser retries against the winner's metadata and, out of attempts, gets 409 CommitFailedException — which Iceberg clients handle by re-reading and retrying. A commit that finds its vN.metadata.json name taken stages under vN-{uuid}.metadata.json.

See Also