Every surface the Meridian server mounts, extracted from the router itself, with per-endpoint status from the repo's honest docs.
One server, port 8181 by default. Six mounts:
| base | what it serves |
|---|---|
/iceberg/v1 | Iceberg REST catalog, spec-style mount. Clients configured with uri http://localhost:8181/iceberg (as in the quickstart) append /v1/... and hit this nest. Identical router to /v1. |
/v1 | Bare alias nest of the exact same Iceberg REST catalog router, for clients whose uri is the server root. |
/api/v2 | Management API: warehouses, RBAC, governance, quality, lineage, semantics, agents, branching, federation, sharing, events, audit, workbench, AI assets. |
/share/{token} | Recipient-facing read-only Iceberg REST catalog per share, authenticated by the opaque token in the path, exempt from OIDC middleware. |
/mcp | MCP agent gateway, single Streamable-HTTP endpoint. POST carries JSON-RPC; GET and DELETE answer 405 (stateless sessions, no server stream). |
/ | Root mount for health probes only: /healthz and /readyz. |
The full IRC surface, served identically at /v1 and /iceberg/v1.
{prefix} is a warehouse name; warehouse@branch mounts a catalog branch. Per-endpoint status, straight from
api-status.md:
All paths in the Iceberg REST groups are served at both /v1 and /iceberg/v1. {prefix} is a warehouse name; a warehouse@branch prefix addresses a branch. Static /v1/config wins over the {prefix} capture.
Signing follows ADR 005; planning follows docs/design/scan-planning.md. Governance enforcement applies on the scan-plan path.
| endpoint | method and path | status | notes |
|---|---|---|---|
| getConfig | GET /v1/config | implemented | warehouse param resolves registered warehouse into prefix override (unknown 404); returns implemented endpoints list and idempotency-key-lifetime PT24H. |
| getToken | POST /v1/oauth/tokens | not yet | Not planned: spec deprecates it; Meridian validates external OIDC tokens and never issues its own. |
| listNamespaces | GET /v1/{prefix}/namespaces | implemented | parent supported, missing parent 404; pageSize alone engages pagination (divergence a). |
| createNamespace | POST /v1/{prefix}/namespaces | implemented | Multi-level namespaces and initial properties. |
| loadNamespaceMetadata | GET /v1/{prefix}/namespaces/{ns} | implemented | No caveats recorded. |
| namespaceExists | HEAD /v1/{prefix}/namespaces/{ns} | implemented | 204 / 404. |
| dropNamespace | DELETE /v1/{prefix}/namespaces/{ns} | implemented | Only empty namespaces (no child namespaces, tables, or views); otherwise 409 NamespaceNotEmptyError. |
| updateProperties | POST /v1/{prefix}/namespaces/{ns}/properties | implemented | Atomic set plus remove; a key in both updates and removals returns 422. |
| listTables | GET .../namespaces/{ns}/tables | implemented | pageSize alone engages pagination (divergence a). |
| createTable | POST .../namespaces/{ns}/tables | implemented | stage-create supported; server assigns fresh field ids; delegation vends credentials or signing on opted-in warehouses; table/view collisions 409. |
| loadTable | GET .../tables/{table} | implemented | snapshots=all or refs; strong ETag, If-None-Match 304; delegation vends RBAC-scoped credentials or advertises signing on opted-in warehouses. |
| updateTable (commit) | POST .../tables/{table} | implemented | Requirements checked; unknown update/requirement types 400; CAS retry, 409 CommitFailedException after 3 lost races; Idempotency-Key honored. |
| dropTable | DELETE .../tables/{table} | implemented | purgeRequested=true deletes catalog entry and metadata now; data files await the unbuilt maintenance worker (divergence e). |
| tableExists | HEAD .../tables/{table} | implemented | 204 / 404. |
| registerTable | POST .../namespaces/{ns}/register | partial | Adopts existing metadata file. Missing: overwrite true rejected 400; adopting a live table's UUID rejected 409 (divergence c). |
| renameTable | POST /v1/{prefix}/tables/rename | implemented | Rename or move across namespaces within one warehouse; 204. |
| reportMetrics | POST .../tables/{table}/metrics | implemented | Validated as a JSON object, stored verbatim for the planned observability layer; 204. |
| commitTransaction | POST /v1/{prefix}/transactions/commit | partial | Atomic multi-table commit, every violation reported; Idempotency-Key honored. Missing: assert-create inside a transaction rejected with 400. |
| unregisterTable | POST .../tables/{table}/unregister | not yet | Returns 404/405. |
| loadCredentials | GET .../tables/{table}/credentials | implemented | Requires warehouse vending opt-in (sts or static), otherwise 400; RBAC decides read versus read-write; every vend audited. |
| signRequest | POST .../tables/{table}/sign | implemented | S3 only, others 400; requires vending opt-in plus static keys; enforces table prefix and RBAC; denies audited too. |
| planTableScan | POST .../tables/{table}/plan | partial | ABAC governance enforced. Missing: incremental scans 406; min-rows-requested ignored; no storage-credentials; Idempotency-Key accepted but not deduplicated. |
| fetchPlanningResult | GET .../tables/{table}/plan/{plan-id} | implemented | Spec's discriminated result; completed sync plans re-plan pinned to snapshot; async plans return plan-tasks page tokens. |
| cancelPlanning | DELETE .../tables/{table}/plan/{plan-id} | implemented | 204; drops persisted pages, flips plans to cancelled, idempotent on terminal states. |
| fetchScanTasks | POST .../tables/{table}/tasks | implemented | One persisted page per plan-task token, repeatable; unknown or expired tokens 404 NoSuchPlanTaskException. |
| listViews | GET .../namespaces/{ns}/views | implemented | RBAC LIST_TABLES on the namespace; pagination divergence (a). |
| createView | POST .../namespaces/{ns}/views | implemented | 409 when name exists as view or table; fresh 1-based field ids assigned server-side; one representation per dialect. |
| loadView | GET .../views/{view} | implemented | No ETag (spec limits it to tables); referenced-by accepted and ignored; dialect transpilation via sidecar, outage degrades gracefully. |
| replaceView | POST .../views/{view} | implemented | Missing: Idempotency-Key not honored; dialect-drop protection (replace.drop-dialect.allowed) not enforced yet; provisional field ids like createView. |
| dropView | DELETE .../views/{view} | implemented | 204; spec defines no view purge, so metadata files always remain in object storage. |
| viewExists | HEAD .../views/{view} | implemented | RBAC READ on the view; 204 / 404. |
| renameView | POST /v1/{prefix}/views/rename | implemented | Needs WRITE on source view plus CREATE_VIEW on destination namespace; 409 if destination exists as view or table. |
| registerView | POST .../namespaces/{ns}/register-view | not yet | Returns 404/405. |
| listFunctions | GET .../namespaces/{ns}/functions | not yet | Returns 404/405. |
| loadFunction | GET .../namespaces/{ns}/functions/{function} | not yet | Returns 404/405. |
Everything around the catalog: RBAC, governance, quality, lineage, semantics, agents, branching, federation, sharing, events, audit, workbench. Requires management access in oidc mode.
| method | path | what it does |
|---|---|---|
| GET | /api/v2/warehouses | List warehouses. |
| POST | /api/v2/warehouses | Create a warehouse. |
| DELETE | /api/v2/warehouses/{name} | Delete a warehouse. |
| GET | /api/v2/principals | List principals. |
| GET | /api/v2/roles | List roles. |
| POST | /api/v2/roles | Create a role. |
| DELETE | /api/v2/roles/{name} | Delete a role. |
| POST | /api/v2/roles/{name}/bindings | Bind a principal to a role. |
| DELETE | /api/v2/roles/{name}/bindings/{principal_id} | Remove a role binding. |
| GET | /api/v2/grants | List grants. |
| POST | /api/v2/grants | Create a grant. |
| DELETE | /api/v2/grants/{id} | Delete a grant. |
| GET | /api/v2/permissions | Get the caller's effective permissions. |
| method | path | what it does |
|---|---|---|
| POST | /api/v2/sql/transpile | Transpile SQL between dialects via the sidecar. |
| GET | /api/v2/metrics | List metric definitions. |
| POST | /api/v2/metrics | Create a metric definition. |
| GET | /api/v2/metrics/{id} | Get a metric. |
| PATCH | /api/v2/metrics/{id} | Update a metric. |
| DELETE | /api/v2/metrics/{id} | Delete a metric. |
| GET | /api/v2/metrics/{id}/compile | Compile a metric to dialect SQL. |
| GET | /api/v2/glossary/terms | List glossary terms. |
| POST | /api/v2/glossary/terms | Create a glossary term. |
| GET | /api/v2/glossary/terms/{id} | Get a glossary term. |
| PATCH | /api/v2/glossary/terms/{id} | Update a glossary term. |
| DELETE | /api/v2/glossary/terms/{id} | Delete a glossary term. |
| GET | /api/v2/glossary/terms/{id}/links | List a term's asset links. |
| POST | /api/v2/glossary/terms/{id}/links | Link a term to an asset. |
| DELETE | /api/v2/glossary/links/{id} | Remove a term link. |
| GET | /api/v2/products | List data products. |
| POST | /api/v2/products | Create a data product. |
| GET | /api/v2/products/{id} | Get a data product. |
| PATCH | /api/v2/products/{id} | Update a data product. |
| DELETE | /api/v2/products/{id} | Delete a data product. |
| GET | /api/v2/products/{id}/members | List product members. |
| POST | /api/v2/products/{id}/members | Add a product member. |
| DELETE | /api/v2/products/members/{id} | Remove a product member. |
| GET | /api/v2/products/{id}/status | Get product status. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/shares | List shares. |
| POST | /api/v2/shares | Create a share. |
| GET | /api/v2/shares/{id} | Get a share. |
| DELETE | /api/v2/shares/{id} | Delete a share. |
| POST | /api/v2/shares/{id}/revoke | Revoke a share. |
| POST | /api/v2/shares/{id}/grants | Add an asset grant to a share. |
| DELETE | /api/v2/shares/grants/{grant_id} | Remove a share grant. |
| GET | /api/v2/marketplace/products | List marketplace products. |
| GET | /api/v2/marketplace/requests | List access requests. |
| POST | /api/v2/marketplace/requests | Request access to a product. |
| POST | /api/v2/marketplace/requests/{id}/decide | Approve or deny an access request. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/webhooks | List webhooks. |
| POST | /api/v2/webhooks | Create a webhook. |
| GET | /api/v2/webhooks/{id} | Get a webhook. |
| DELETE | /api/v2/webhooks/{id} | Delete a webhook. |
| GET | /api/v2/webhooks/{id}/deliveries | List webhook deliveries. |
| GET | /api/v2/events | List catalog events. |
| GET | /api/v2/events/consumers | List durable consumers. |
| POST | /api/v2/events/consumers | Create a durable consumer. |
| DELETE | /api/v2/events/consumers/{name} | Delete a consumer. |
| GET | /api/v2/events/consumers/{name}/next | Fetch the consumer's next events. |
| POST | /api/v2/events/consumers/{name}/commit | Commit the consumer's cursor. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/audit | Query the audit log. |
| GET | /api/v2/audit/verify | Verify the audit hash chain. |
| GET | /api/v2/search | Search assets, visibility-filtered per caller. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/maintenance/policies | List maintenance policies. |
| POST | /api/v2/maintenance/policies | Create a maintenance policy. |
| PUT | /api/v2/maintenance/policies | Update a maintenance policy. |
| DELETE | /api/v2/maintenance/policies | Delete a maintenance policy. |
| GET | /api/v2/maintenance/jobs | List maintenance jobs. |
| POST | /api/v2/maintenance/jobs | Trigger a maintenance job. |
| GET | /api/v2/maintenance/jobs/{id} | Get a maintenance job. |
| POST | /api/v2/maintenance/jobs/{id}/cancel | Cancel a maintenance job. |
| GET | /api/v2/maintenance/savings | List the savings ledger. |
| GET | /api/v2/maintenance/savings/rollup | Get aggregated savings. |
| GET | /api/v2/warehouses/{name}/health-summary | Fleet health summary for a warehouse. |
| GET | /api/v2/warehouses/{warehouse}/namespaces/{namespace}/tables/{table}/health | Current table health. |
| GET | /api/v2/warehouses/{warehouse}/namespaces/{namespace}/tables/{table}/health/history | Table health history. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/mirrors | List catalog mirrors. |
| POST | /api/v2/mirrors | Create a mirror. |
| GET | /api/v2/mirrors/{name} | Get a mirror. |
| PATCH | /api/v2/mirrors/{name} | Update a mirror. |
| DELETE | /api/v2/mirrors/{name} | Delete a mirror. |
| GET | /api/v2/mirrors/{name}/sync | Get mirror sync status. |
| POST | /api/v2/mirrors/{name}/sync | Trigger a mirror sync now. |
| GET | /api/v2/federation/sprawl | Cross-catalog sprawl summary. |
Branch data access needs no extra routes: a branch is read and written through ordinary IRC table endpoints via the warehouse@branch prefix.
| method | path | what it does |
|---|---|---|
| GET | /api/v2/branches | List branches. |
| POST | /api/v2/branches | Create a branch. |
| POST | /api/v2/branches/sweep | Sweep expired ephemeral branches. |
| GET | /api/v2/branches/{name} | Get a branch. |
| DELETE | /api/v2/branches/{name} | Delete a branch. |
| GET | /api/v2/branches/{name}/diff | Diff a branch against its base. |
| GET | /api/v2/branches/{name}/gate | Evaluate the branch merge gate. |
| POST | /api/v2/branches/{name}/merge | Merge a branch. |
| GET | /api/v2/tags | List catalog tags. |
| POST | /api/v2/tags | Create a catalog tag. |
| DELETE | /api/v2/tags/{name} | Delete a catalog tag. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/governance/tags | List classification tags. |
| POST | /api/v2/governance/tags | Create a classification tag. |
| DELETE | /api/v2/governance/tags/{id} | Delete a classification tag. |
| GET | /api/v2/governance/tags/coverage | Classification coverage report. |
| POST | /api/v2/governance/tags/assignments | Assign a tag to an asset. |
| DELETE | /api/v2/governance/tags/assignments/{id} | Remove a tag assignment. |
| POST | /api/v2/governance/tags/assignments/{id}/approve | Approve a tag assignment. |
| GET | /api/v2/governance/policies | List governance policies. |
| POST | /api/v2/governance/policies | Create a governance policy. |
| POST | /api/v2/governance/policies/dry-run | Dry-run a policy. |
| DELETE | /api/v2/governance/policies/bindings/{binding_id} | Unbind a policy. |
| GET | /api/v2/governance/policies/{id} | Get a policy. |
| PATCH | /api/v2/governance/policies/{id} | Update a policy. |
| DELETE | /api/v2/governance/policies/{id} | Delete a policy. |
| GET | /api/v2/governance/policies/{id}/versions | List policy versions. |
| POST | /api/v2/governance/policies/{id}/rollback | Roll a policy back to a version. |
| GET | /api/v2/governance/policies/{id}/bindings | List policy bindings. |
| POST | /api/v2/governance/policies/{id}/bindings | Bind a policy. |
| GET | /api/v2/governance/effective-policy | Effective policy for a principal and asset. |
| GET | /api/v2/governance/who-can-see | Who can see a given asset. |
| GET | /api/v2/governance/drift | Policy drift report. |
| GET | /api/v2/governance/evidence | Governance evidence export. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/lineage | Upstream and downstream lineage graph. |
| GET | /api/v2/lineage/impact | Impact and blast-radius query. |
| POST | /api/v2/lineage/openlineage | Ingest OpenLineage events. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/quality/contracts | List data contracts. |
| POST | /api/v2/quality/contracts | Create a data contract. |
| GET | /api/v2/quality/contracts/{id} | Get a contract. |
| PATCH | /api/v2/quality/contracts/{id} | Update a contract. |
| DELETE | /api/v2/quality/contracts/{id} | Delete a contract. |
| GET | /api/v2/quality/contracts/{id}/versions | List contract versions. |
| GET | /api/v2/quality/tables/{warehouse}/{namespace}/{table}/contracts | Contracts applying to a table. |
| GET | /api/v2/quality/violations | List contract violations. |
| POST | /api/v2/quality/tables/{warehouse}/{namespace}/{table}/quarantine/{snapshot}/publish | Publish a quarantined snapshot. |
| POST | /api/v2/quality/tables/{warehouse}/{namespace}/{table}/quarantine/{snapshot}/discard | Discard a quarantined snapshot. |
| GET | /api/v2/quality/monitors | List quality monitors. |
| POST | /api/v2/quality/monitors | Create a quality monitor. |
| GET | /api/v2/quality/monitors/results | List monitor results. |
| GET | /api/v2/quality/monitors/{id} | Get a monitor. |
| PATCH | /api/v2/quality/monitors/{id} | Update a monitor. |
| DELETE | /api/v2/quality/monitors/{id} | Delete a monitor. |
| GET | /api/v2/quality/incidents | List quality incidents. |
| GET | /api/v2/quality/incidents/{id} | Get an incident. |
| POST | /api/v2/quality/incidents/{id}/ack | Acknowledge an incident. |
| POST | /api/v2/quality/incidents/{id}/resolve | Resolve an incident. |
| GET | /api/v2/quality/tables/{warehouse}/{namespace}/{table}/status | Current table quality status. |
| GET | /api/v2/quality/tables/{warehouse}/{namespace}/{table}/status/history | Table quality status history. |
| GET | /api/v2/quality/tables/{warehouse}/{namespace}/{table}/score | Table quality score. |
No catalog-as-code routes exist anywhere in the router.
| method | path | what it does |
|---|---|---|
| POST | /api/v2/workbench/query | Run a governed SQL query. |
| GET | /api/v2/workbench/history | List query history. |
| GET | /api/v2/workbench/saved | List saved queries. |
| POST | /api/v2/workbench/saved | Save a query. |
| GET | /api/v2/workbench/saved/{id} | Get a saved query. |
| DELETE | /api/v2/workbench/saved/{id} | Delete a saved query. |
| POST | /api/v2/workbench/snippet | Generate a notebook-handoff snippet. |
| method | path | what it does |
|---|---|---|
| GET | /api/v2/assets | List AI assets. |
| POST | /api/v2/assets | Create an asset: fileset, model, vector dataset. |
| GET | /api/v2/assets/search | Search assets. |
| GET | /api/v2/assets/{id} | Get an asset. |
| POST | /api/v2/assets/{id}/credentials | Vend fileset credentials. |
| POST | /api/v2/training-runs | Create an immutable training run pin. |
| GET | /api/v2/training-runs/{id} | Get a training run. |
| GET | /api/v2/models/{model}/provenance | Model provenance. |
| GET | /api/v2/models/{model}/ai-act-summary | EU AI Act GPAI summary for a model. |
| GET | /api/v2/deletion-campaigns | List deletion campaigns. |
| POST | /api/v2/deletion-campaigns | Create a deletion campaign. |
| POST | /api/v2/deletion-campaigns/{id}/snapshots | Add snapshots to a campaign. |
| GET | /api/v2/deletion-campaigns/{id}/evidence | Campaign deletion evidence. |
| POST | /api/v2/deletion-campaigns/{id}/expire | Mark a campaign snapshot expired. |
POST /mcp
MCP agent gateway, single Streamable-HTTP endpoint. POST carries JSON-RPC; GET and DELETE answer 405 (stateless sessions, no server stream).
Tool-level behavior (governed context, governed SQL, budgets, kill switch, audit) is specified in docs/design/agent-gateway.md.
| method | path | what it does |
|---|---|---|
| GET | /healthz | Liveness probe. |
| GET | /readyz | Readiness probe. |