---
id: platform/api-reference
title: API reference
description: Graded Bex platform REST API reference from the pinned OpenAPI contract, with an interactive Scalar explorer.
keywords: [bex, api reference, openapi, rest, scalar, platform api]
sidebar_position: 4
last_updated: 2026-09-23
---

{/* Generated by yarn build:api-reference from the pinned platform OpenAPI fixture. Do not edit by hand. After regenerating English, run: yarn translate-docs --force docs/platform/api-reference.md */}

This page indexes every operation in Bex's pinned Render-compatible OpenAPI contract (SHA-256 `c6851bc830fa…`), graded against the backend's registered REST routes. bex.co serves the graded document at [`/content/platform-openapi.json`](https://bex.co/content/platform-openapi.json) for agents and the interactive explorer below; it does **not** execute these operations — live calls go to `https://api.bex.co/v1`.

Generated from Bex backend revision `33fb49def890` (committed 2026-09-14). That revision is the source this reference describes; it is not a statement about which build is currently deployed at `api.bex.co`.

## Grade legend

| Grade | Meaning |
| --- | --- |
| `implemented` | Registered REST handler; not on the conformance allowlist or retired-alias list |
| `partial` | Handler exists but response shape or behaviour diverges (ADR018) or the route is a documented stub |
| `not-implemented` | No matching handler, or a retired public alias that 404s by design |

For authentication and GraphQL, see the [REST & GraphQL API](./api.md) guide. For CLI grades, see the [CLI reference](./cli-reference.md).

## Bex query extensions {#bex-query-extensions}

Bex accepts these query parameters on otherwise Render-shaped operations. They are part of the served document and the explorer below, so a Render-shaped client that never sends them behaves unchanged. Request schemas carry Bex additions too — managed Postgres `plan` also accepts Bex's own instance-type ids, for example.

| Parameter | Accepts | Behaviour | Operations |
| --- | --- | --- | --- |
| `aggregateAllMethod` | `MIN` \| `MAX` \| `AVG` | How to combine a multi-replica series into one at each timestamp. Omitted, per-replica series are returned unaggregated. | [`get-bandwidth`](#op-get-bandwidth), [`get-cpu`](#op-get-cpu), [`get-cpu-target`](#op-get-cpu-target), [`get-http-latency`](#op-get-http-latency), [`get-http-requests`](#op-get-http-requests), [`get-instance-count`](#op-get-instance-count), [`get-memory`](#op-get-memory), [`get-memory-target`](#op-get-memory-target) |
| `confirm` | string | The exact server-issued confirmation phrase required to act on a resource in a protected environment. A free-form string, not a boolean. | [`delete-key-value`](#op-delete-key-value), [`delete-postgres`](#op-delete-postgres), [`delete-service`](#op-delete-service), [`restart-postgres`](#op-restart-postgres), [`restart-service`](#op-restart-service), [`resume-key-value`](#op-resume-key-value), [`resume-postgres`](#op-resume-postgres), [`resume-service`](#op-resume-service), [`suspend-key-value`](#op-suspend-key-value), [`suspend-postgres`](#op-suspend-postgres), [`suspend-service`](#op-suspend-service) |
| `dryRun` | boolean | Resolve and validate the change, then return the preview without writing it. Only the literal `true` enables the preview; it may also be sent as a request-body field. | [`create-key-value`](#op-create-key-value), [`create-postgres`](#op-create-postgres), [`create-service`](#op-create-service), [`update-key-value`](#op-update-key-value), [`update-postgres`](#op-update-postgres), [`update-service`](#op-update-service) |
| `kind` | `database` \| `keyvalue` \| `service` | Which resource's disk to read: a managed Postgres, a managed Key Value, or a service's attached persistent disk. Omitted, the read targets a managed Postgres. | [`get-disk-capacity`](#op-get-disk-capacity) |
| `ownerId` | string | Workspace to address. Omitted, the request resolves to the caller's selected or default workspace; authorization still checks membership. | [`delete-webhook`](#op-delete-webhook), [`disconnect-blueprint`](#op-disconnect-blueprint), [`list-blueprint-syncs`](#op-list-blueprint-syncs), [`list-webhook-events`](#op-list-webhook-events), [`retrieve-blueprint`](#op-retrieve-blueprint), [`retrieve-event`](#op-retrieve-event), [`retrieve-webhook`](#op-retrieve-webhook), [`update-blueprint`](#op-update-blueprint), [`update-webhook`](#op-update-webhook) |
| `percentage` | boolean | Report the series as a percentage of the resource's limit rather than an absolute value. Only the literal `true` enables it. | [`get-bandwidth`](#op-get-bandwidth), [`get-cpu`](#op-get-cpu), [`get-cpu-target`](#op-get-cpu-target), [`get-http-latency`](#op-get-http-latency), [`get-http-requests`](#op-get-http-requests), [`get-instance-count`](#op-get-instance-count), [`get-memory`](#op-get-memory), [`get-memory-target`](#op-get-memory-target) |
| `status` | `delivered` \| `failed` | Restrict the attempt history to one immutable outcome. Omitted, the endpoint's attempts are returned unfiltered; any other value is rejected. | [`list-webhook-events`](#op-list-webhook-events) |

## Audit Logs {#tag-audit-logs}

#### `GET /organizations/{orgId}/audit-logs` {#op-list-organization-audit-logs}
#### `GET /owners/{ownerId}/audit-logs` {#op-list-owner-audit-logs}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /organizations/{orgId}/audit-logs` | List organization audit logs | not-implemented |
| `GET /owners/{ownerId}/audit-logs` | List workspace audit logs | implemented |

## Blueprints {#tag-blueprints}

#### `GET /blueprints` {#op-list-blueprints}
#### `DELETE /blueprints/{blueprintId}` {#op-disconnect-blueprint}
#### `GET /blueprints/{blueprintId}` {#op-retrieve-blueprint}
#### `PATCH /blueprints/{blueprintId}` {#op-update-blueprint}
#### `GET /blueprints/{blueprintId}/syncs` {#op-list-blueprint-syncs}
#### `POST /blueprints/validate` {#op-validate-blueprint}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /blueprints` | List Blueprints | implemented |
| `DELETE /blueprints/{blueprintId}` | Disconnect Blueprint | implemented |
| `GET /blueprints/{blueprintId}` | Retrieve Blueprint | implemented |
| `PATCH /blueprints/{blueprintId}` | Update Blueprint | implemented |
| `GET /blueprints/{blueprintId}/syncs` | List Blueprint syncs | implemented |
| `POST /blueprints/validate` | Validate Blueprint | implemented |

## Custom Domains {#tag-custom-domains}

#### `GET /services/{serviceId}/custom-domains` {#op-list-custom-domains}
#### `POST /services/{serviceId}/custom-domains` {#op-create-custom-domain}
#### `DELETE /services/{serviceId}/custom-domains/{customDomainNameOrID}` {#op-delete-custom-domain}
#### `GET /services/{serviceId}/custom-domains/{customDomainNameOrID}` {#op-retrieve-custom-domain}
#### `POST /services/{serviceId}/custom-domains/{customDomainNameOrID}/verify` {#op-refresh-custom-domain}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /services/{serviceId}/custom-domains` | List custom domains | partial — ADR018 §Custom domains: bex exposes pending DNS-instruction state and omits unavailable provider metadata |
| `POST /services/{serviceId}/custom-domains` | Add custom domain | implemented |
| `DELETE /services/{serviceId}/custom-domains/{customDomainNameOrID}` | Delete custom domain | implemented |
| `GET /services/{serviceId}/custom-domains/{customDomainNameOrID}` | Retrieve custom domain | implemented |
| `POST /services/{serviceId}/custom-domains/{customDomainNameOrID}/verify` | Verify DNS configuration | implemented |

## Dedicated IPs {#tag-dedicated-ips}

#### `GET /dedicated-ips` {#op-list-dedicated-ips}
#### `POST /dedicated-ips` {#op-create-dedicated-ip}
#### `DELETE /dedicated-ips/{dedicatedIpId}` {#op-delete-dedicated-ip}
#### `GET /dedicated-ips/{dedicatedIpId}` {#op-retrieve-dedicated-ip}
#### `PATCH /dedicated-ips/{dedicatedIpId}` {#op-update-dedicated-ip}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /dedicated-ips` | List dedicated IPs | not-implemented |
| `POST /dedicated-ips` | Create dedicated IP set | not-implemented |
| `DELETE /dedicated-ips/{dedicatedIpId}` | Delete dedicated IP set | not-implemented |
| `GET /dedicated-ips/{dedicatedIpId}` | Retrieve dedicated IP set | not-implemented |
| `PATCH /dedicated-ips/{dedicatedIpId}` | Update dedicated IP set | not-implemented |

## Deploys {#tag-deploys}

#### `GET /services/{serviceId}/deploys` {#op-list-deploys}
#### `POST /services/{serviceId}/deploys` {#op-create-deploy}
#### `GET /services/{serviceId}/deploys/{deployId}` {#op-retrieve-deploy}
#### `POST /services/{serviceId}/deploys/{deployId}/cancel` {#op-cancel-deploy}
#### `POST /services/{serviceId}/rollback` {#op-rollback-deploy}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /services/{serviceId}/deploys` | List deploys | implemented |
| `POST /services/{serviceId}/deploys` | Trigger deploy | implemented |
| `GET /services/{serviceId}/deploys/{deployId}` | Retrieve deploy | implemented |
| `POST /services/{serviceId}/deploys/{deployId}/cancel` | Cancel deploy | implemented |
| `POST /services/{serviceId}/rollback` | Roll back deploy | implemented |

## Disks {#tag-disks}

#### `GET /disks` {#op-list-disks}
#### `POST /disks` {#op-add-disk}
#### `DELETE /disks/{diskId}` {#op-delete-disk}
#### `GET /disks/{diskId}` {#op-retrieve-disk}
#### `PATCH /disks/{diskId}` {#op-update-disk}
#### `GET /disks/{diskId}/snapshots` {#op-list-snapshots}
#### `POST /disks/{diskId}/snapshots/restore` {#op-restore-snapshot}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /disks` | List disks | implemented |
| `POST /disks` | Add disk | implemented |
| `DELETE /disks/{diskId}` | Delete disk | implemented |
| `GET /disks/{diskId}` | Retrieve disk | implemented |
| `PATCH /disks/{diskId}` | Update disk | implemented |
| `GET /disks/{diskId}/snapshots` | List snapshots | implemented |
| `POST /disks/{diskId}/snapshots/restore` | Restore snapshot | implemented |

## Environment Groups {#tag-environment-groups}

#### `GET /env-groups` {#op-list-env-groups}
#### `POST /env-groups` {#op-create-env-group}
#### `DELETE /env-groups/{envGroupId}` {#op-delete-env-group}
#### `GET /env-groups/{envGroupId}` {#op-retrieve-env-group}
#### `PATCH /env-groups/{envGroupId}` {#op-update-env-group}
#### `DELETE /env-groups/{envGroupId}/env-vars/{envVarKey}` {#op-delete-env-group-env-var}
#### `GET /env-groups/{envGroupId}/env-vars/{envVarKey}` {#op-retrieve-env-group-env-var}
#### `PUT /env-groups/{envGroupId}/env-vars/{envVarKey}` {#op-update-env-group-env-var}
#### `DELETE /env-groups/{envGroupId}/secret-files/{envVarKey}` {#op-delete-env-group-secret-file}
#### `GET /env-groups/{envGroupId}/secret-files/{envVarKey}` {#op-retrieve-env-group-secret-file}
#### `PUT /env-groups/{envGroupId}/secret-files/{envVarKey}` {#op-update-env-group-secret-file}
#### `DELETE /env-groups/{envGroupId}/services/{serviceId}` {#op-unlink-service-from-env-group}
#### `POST /env-groups/{envGroupId}/services/{serviceId}` {#op-link-service-to-env-group}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /env-groups` | List environment groups | implemented |
| `POST /env-groups` | Create environment group | implemented |
| `DELETE /env-groups/{envGroupId}` | Delete environment group | implemented |
| `GET /env-groups/{envGroupId}` | Retrieve environment group | implemented |
| `PATCH /env-groups/{envGroupId}` | Update environment group | implemented |
| `DELETE /env-groups/{envGroupId}/env-vars/{envVarKey}` | Remove environment variable | implemented |
| `GET /env-groups/{envGroupId}/env-vars/{envVarKey}` | Retrieve environment variable | implemented |
| `PUT /env-groups/{envGroupId}/env-vars/{envVarKey}` | Add or update environment variable | implemented |
| `DELETE /env-groups/{envGroupId}/secret-files/{envVarKey}` | Remove secret file | implemented |
| `GET /env-groups/{envGroupId}/secret-files/{envVarKey}` | Retrieve secret file | implemented |
| `PUT /env-groups/{envGroupId}/secret-files/{envVarKey}` | Add or update secret file | implemented |
| `DELETE /env-groups/{envGroupId}/services/{serviceId}` | Unlink service | implemented |
| `POST /env-groups/{envGroupId}/services/{serviceId}` | Link service | implemented |

## Events {#tag-events}

#### `GET /events/{eventId}` {#op-retrieve-event}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /events/{eventId}` | Retrieve event | partial — ADR018 §Services & lifecycle — Service events / activity feed: deliberate partial event-detail dialect |

## Key Value {#tag-key-value}

#### `GET /key-value` {#op-list-key-value}
#### `POST /key-value` {#op-create-key-value}
#### `DELETE /key-value/{redisId}` {#op-delete-key-value}
#### `GET /key-value/{redisId}` {#op-retrieve-key-value}
#### `PATCH /key-value/{redisId}` {#op-update-key-value}
#### `GET /key-value/{redisId}/connection-info` {#op-retrieve-key-value-connection-info}
#### `POST /key-value/{redisId}/resume` {#op-resume-key-value}
#### `POST /key-value/{redisId}/suspend` {#op-suspend-key-value}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /key-value` | List Key Value instances | implemented |
| `POST /key-value` | Create Key Value instance | implemented |
| `DELETE /key-value/{redisId}` | Delete Key Value instance | implemented |
| `GET /key-value/{redisId}` | Retrieve Key Value instance | implemented |
| `PATCH /key-value/{redisId}` | Update Key Value instance | implemented |
| `GET /key-value/{redisId}/connection-info` | Retrieve Key Value connection info | implemented |
| `POST /key-value/{redisId}/resume` | Resume Key Value instance | implemented |
| `POST /key-value/{redisId}/suspend` | Suspend Key Value instance | implemented |

## Logs {#tag-logs}

#### `GET /logs` {#op-list-logs}
#### `DELETE /logs/streams/owner/{ownerId}` {#op-delete-owner-log-stream}
#### `GET /logs/streams/owner/{ownerId}` {#op-get-owner-log-stream}
#### `PUT /logs/streams/owner/{ownerId}` {#op-update-owner-log-stream}
#### `GET /logs/streams/resource` {#op-list-resource-log-streams}
#### `DELETE /logs/streams/resource/{resourceId}` {#op-delete-resource-log-stream}
#### `GET /logs/streams/resource/{resourceId}` {#op-get-resource-log-stream}
#### `PUT /logs/streams/resource/{resourceId}` {#op-update-resource-log-stream}
#### `GET /logs/subscribe` {#op-subscribe-logs}
#### `GET /logs/values` {#op-list-logs-values}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /logs` | List logs | implemented |
| `DELETE /logs/streams/owner/{ownerId}` | Delete log stream | not-implemented |
| `GET /logs/streams/owner/{ownerId}` | Retrieve log stream | not-implemented |
| `PUT /logs/streams/owner/{ownerId}` | Update log stream | not-implemented |
| `GET /logs/streams/resource` | List log stream overrides | not-implemented |
| `DELETE /logs/streams/resource/{resourceId}` | Delete log stream override | not-implemented |
| `GET /logs/streams/resource/{resourceId}` | Retrieve log stream override | not-implemented |
| `PUT /logs/streams/resource/{resourceId}` | Update log stream override | not-implemented |
| `GET /logs/subscribe` | Subscribe to new logs | implemented |
| `GET /logs/values` | List log label values | implemented |

## Maintenance {#tag-maintenance}

#### `GET /maintenance` {#op-list-maintenance}
#### `GET /maintenance/{maintenanceRunID}` {#op-retrieve-maintenance}
#### `PATCH /maintenance/{maintenanceRunID}` {#op-update-maintenance}
#### `POST /maintenance/{maintenanceRunID}/trigger` {#op-trigger-maintenance}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /maintenance` | List maintenance runs | not-implemented |
| `GET /maintenance/{maintenanceRunID}` | Retrieve maintenance run | not-implemented |
| `PATCH /maintenance/{maintenanceRunID}` | Update maintenance run | not-implemented |
| `POST /maintenance/{maintenanceRunID}/trigger` | Trigger maintenance run | not-implemented |

## Metrics {#tag-metrics}

#### `DELETE /metrics-stream/{ownerId}` {#op-deleteOwnerMetricsStream}
#### `GET /metrics-stream/{ownerId}` {#op-getOwnerMetricsStream}
#### `PUT /metrics-stream/{ownerId}` {#op-upsertOwnerMetricsStream}
#### `GET /metrics/active-connections` {#op-get-active-connections}
#### `GET /metrics/bandwidth` {#op-get-bandwidth}
#### `GET /metrics/bandwidth-sources` {#op-get-bandwidth-sources}
#### `GET /metrics/cpu` {#op-get-cpu}
#### `GET /metrics/cpu-limit` {#op-get-cpu-limit}
#### `GET /metrics/cpu-target` {#op-get-cpu-target}
#### `GET /metrics/disk-capacity` {#op-get-disk-capacity}
#### `GET /metrics/disk-usage` {#op-get-disk-usage}
#### `GET /metrics/filters/application` {#op-list-application-filter-values}
#### `GET /metrics/filters/http` {#op-list-http-filter-values}
#### `GET /metrics/filters/path` {#op-list-path-filter-values}
#### `GET /metrics/http-latency` {#op-get-http-latency}
#### `GET /metrics/http-requests` {#op-get-http-requests}
#### `GET /metrics/instance-count` {#op-get-instance-count}
#### `GET /metrics/memory` {#op-get-memory}
#### `GET /metrics/memory-limit` {#op-get-memory-limit}
#### `GET /metrics/memory-target` {#op-get-memory-target}
#### `GET /metrics/replication-lag` {#op-get-replication-lag}
#### `GET /metrics/task-runs-completed` {#op-get-task-runs-completed}
#### `GET /metrics/task-runs-queued` {#op-get-task-runs-queued}

| Operation | Summary | Grade |
| --- | --- | --- |
| `DELETE /metrics-stream/{ownerId}` | Delete metrics stream | not-implemented |
| `GET /metrics-stream/{ownerId}` | Retrieve metrics stream | not-implemented |
| `PUT /metrics-stream/{ownerId}` | Create or update metrics stream | not-implemented |
| `GET /metrics/active-connections` | Get active connection count | not-implemented |
| `GET /metrics/bandwidth` | Get bandwidth usage | implemented |
| `GET /metrics/bandwidth-sources` | Get bandwidth usage breakdown by traffic source | not-implemented |
| `GET /metrics/cpu` | Get CPU usage | implemented |
| `GET /metrics/cpu-limit` | Get CPU limit | not-implemented |
| `GET /metrics/cpu-target` | Get CPU target | implemented |
| `GET /metrics/disk-capacity` | Get disk capacity | implemented |
| `GET /metrics/disk-usage` | Get disk usage | not-implemented |
| `GET /metrics/filters/application` | List queryable instance values | not-implemented |
| `GET /metrics/filters/http` | List queryable status codes and host values | not-implemented |
| `GET /metrics/filters/path` | List queryable paths | not-implemented |
| `GET /metrics/http-latency` | Get HTTP latency | implemented |
| `GET /metrics/http-requests` | Get HTTP request count | implemented |
| `GET /metrics/instance-count` | Get instance count | implemented |
| `GET /metrics/memory` | Get memory usage | implemented |
| `GET /metrics/memory-limit` | Get memory limit | not-implemented |
| `GET /metrics/memory-target` | Get memory target | implemented |
| `GET /metrics/replication-lag` | Get replica lag | implemented |
| `GET /metrics/task-runs-completed` | Get task runs completed count | not-implemented |
| `GET /metrics/task-runs-queued` | Get task runs queued count | not-implemented |

## Notification Settings {#tag-notification-settings}

#### `GET /notification-settings/overrides` {#op-list-notification-overrides}
#### `GET /notification-settings/overrides/services/{serviceId}` {#op-retrieve-service-notification-overrides}
#### `PATCH /notification-settings/overrides/services/{serviceId}` {#op-patch-service-notification-overrides}
#### `GET /notification-settings/owners/{ownerId}` {#op-retrieve-owner-notification-settings}
#### `PATCH /notification-settings/owners/{ownerId}` {#op-patch-owner-notification-settings}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /notification-settings/overrides` | List notification overrides | not-implemented |
| `GET /notification-settings/overrides/services/{serviceId}` | Retrieve notification override | implemented |
| `PATCH /notification-settings/overrides/services/{serviceId}` | Update notification override | implemented |
| `GET /notification-settings/owners/{ownerId}` | Retrieve notification settings | not-implemented |
| `PATCH /notification-settings/owners/{ownerId}` | Update notification settings | not-implemented |

## One-Off Jobs {#tag-one-off-jobs}

#### `GET /services/{serviceId}/jobs` {#op-list-job}
#### `POST /services/{serviceId}/jobs` {#op-post-job}
#### `GET /services/{serviceId}/jobs/{jobId}` {#op-retrieve-job}
#### `POST /services/{serviceId}/jobs/{jobId}/cancel` {#op-cancel-job}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /services/{serviceId}/jobs` | List jobs | implemented |
| `POST /services/{serviceId}/jobs` | Create job | implemented |
| `GET /services/{serviceId}/jobs/{jobId}` | Retrieve job | implemented |
| `POST /services/{serviceId}/jobs/{jobId}/cancel` | Cancel running job | implemented |

## Postgres {#tag-postgres}

#### `GET /postgres` {#op-list-postgres}
#### `POST /postgres` {#op-create-postgres}
#### `DELETE /postgres/{postgresId}` {#op-delete-postgres}
#### `GET /postgres/{postgresId}` {#op-retrieve-postgres}
#### `PATCH /postgres/{postgresId}` {#op-update-postgres}
#### `GET /postgres/{postgresId}/connection-info` {#op-retrieve-postgres-connection-info}
#### `GET /postgres/{postgresId}/credentials` {#op-list-postgres-users}
#### `POST /postgres/{postgresId}/credentials` {#op-create-postgres-user}
#### `DELETE /postgres/{postgresId}/credentials/{username}` {#op-delete-postgres-user}
#### `GET /postgres/{postgresId}/export` {#op-list-postgres-export}
#### `POST /postgres/{postgresId}/export` {#op-create-postgres-export}
#### `POST /postgres/{postgresId}/failover` {#op-failover-postgres}
#### `GET /postgres/{postgresId}/query/processes` {#op-list-postgres-processes}
#### `GET /postgres/{postgresId}/query/sizes` {#op-list-postgres-sizes}
#### `GET /postgres/{postgresId}/query/table-scans` {#op-list-postgres-table-scans}
#### `GET /postgres/{postgresId}/query/top-queries` {#op-list-postgres-top-queries}
#### `GET /postgres/{postgresId}/recovery` {#op-retrieve-postgres-recovery-info}
#### `POST /postgres/{postgresId}/recovery` {#op-recover-postgres}
#### `POST /postgres/{postgresId}/restart` {#op-restart-postgres}
#### `POST /postgres/{postgresId}/resume` {#op-resume-postgres}
#### `POST /postgres/{postgresId}/suspend` {#op-suspend-postgres}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /postgres` | List Postgres instances | partial — ADR018 §Managed Postgres / §Resource metadata contract: omitted unknown metadata and unsupported advanced provider fields |
| `POST /postgres` | Create Postgres instance | implemented |
| `DELETE /postgres/{postgresId}` | Delete Postgres instance | implemented |
| `GET /postgres/{postgresId}` | Retrieve Postgres instance | partial — ADR018 §Managed Postgres / §Resource metadata contract: omitted unknown metadata and unsupported advanced provider fields |
| `PATCH /postgres/{postgresId}` | Update Postgres instance | implemented |
| `GET /postgres/{postgresId}/connection-info` | Retrieve Postgres connection info | implemented |
| `GET /postgres/{postgresId}/credentials` | List PostgreSQL Users | not-implemented |
| `POST /postgres/{postgresId}/credentials` | Create PostgreSQL User | not-implemented |
| `DELETE /postgres/{postgresId}/credentials/{username}` | Delete PostgreSQL User | not-implemented |
| `GET /postgres/{postgresId}/export` | List Postgres exports | implemented |
| `POST /postgres/{postgresId}/export` | Create Postgres export | implemented |
| `POST /postgres/{postgresId}/failover` | Failover Postgres instance | implemented |
| `GET /postgres/{postgresId}/query/processes` | List live queries | not-implemented |
| `GET /postgres/{postgresId}/query/sizes` | List database, table, and index sizes | not-implemented |
| `GET /postgres/{postgresId}/query/table-scans` | List table scans | not-implemented |
| `GET /postgres/{postgresId}/query/top-queries` | List top queries | not-implemented |
| `GET /postgres/{postgresId}/recovery` | Retrieve point-in-time recovery status | not-implemented |
| `POST /postgres/{postgresId}/recovery` | Trigger point-in-time recovery | not-implemented |
| `POST /postgres/{postgresId}/restart` | Restart Postgres instance | implemented |
| `POST /postgres/{postgresId}/resume` | Resume Postgres instance | implemented |
| `POST /postgres/{postgresId}/suspend` | Suspend Postgres instance | implemented |

## Projects & Environments {#tag-projects--environments}

#### `GET /environments` {#op-list-environments}
#### `POST /environments` {#op-create-environment}
#### `DELETE /environments/{environmentId}` {#op-delete-environment}
#### `GET /environments/{environmentId}` {#op-retrieve-environment}
#### `PATCH /environments/{environmentId}` {#op-update-environment}
#### `DELETE /environments/{environmentId}/resources` {#op-remove-resources-from-environment}
#### `POST /environments/{environmentId}/resources` {#op-add-resources-to-environment}
#### `GET /projects` {#op-list-projects}
#### `POST /projects` {#op-create-project}
#### `DELETE /projects/{projectId}` {#op-delete-project}
#### `GET /projects/{projectId}` {#op-retrieve-project}
#### `PATCH /projects/{projectId}` {#op-update-project}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /environments` | List environments | implemented |
| `POST /environments` | Create environment | implemented |
| `DELETE /environments/{environmentId}` | Delete environment | implemented |
| `GET /environments/{environmentId}` | Retrieve environment | implemented |
| `PATCH /environments/{environmentId}` | Update environment | implemented |
| `DELETE /environments/{environmentId}/resources` | Remove resources from environment | not-implemented |
| `POST /environments/{environmentId}/resources` | Add resources to environment | not-implemented |
| `GET /projects` | List projects | implemented |
| `POST /projects` | Create project | implemented |
| `DELETE /projects/{projectId}` | Delete project | implemented |
| `GET /projects/{projectId}` | Retrieve Project | implemented |
| `PATCH /projects/{projectId}` | Update project | implemented |

## Redis (Deprecated) {#tag-redis-deprecated}

#### `GET /redis` {#op-list-redis}
#### `POST /redis` {#op-create-redis}
#### `DELETE /redis/{redisId}` {#op-delete-redis}
#### `GET /redis/{redisId}` {#op-retrieve-redis}
#### `PATCH /redis/{redisId}` {#op-update-redis}
#### `GET /redis/{redisId}/connection-info` {#op-retrieve-redis-connection-info}
#### `POST /redis/{redisId}/resume` {#op-resume-redis}
#### `POST /redis/{redisId}/suspend` {#op-suspend-redis}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /redis` | List Redis instances | not-implemented |
| `POST /redis` | Create Redis instance | not-implemented |
| `DELETE /redis/{redisId}` | Delete Redis instance | not-implemented |
| `GET /redis/{redisId}` | Retrieve Redis instance | not-implemented |
| `PATCH /redis/{redisId}` | Update Redis instance | not-implemented |
| `GET /redis/{redisId}/connection-info` | Retrieve Redis connection info | not-implemented |
| `POST /redis/{redisId}/resume` | Resume Redis instance | not-implemented |
| `POST /redis/{redisId}/suspend` | Suspend Redis instance | not-implemented |

## Registry Credentials {#tag-registry-credentials}

#### `GET /registrycredentials` {#op-list-registry-credentials}
#### `POST /registrycredentials` {#op-create-registry-credential}
#### `DELETE /registrycredentials/{registryCredentialId}` {#op-delete-registry-credential}
#### `GET /registrycredentials/{registryCredentialId}` {#op-retrieve-registry-credential}
#### `PATCH /registrycredentials/{registryCredentialId}` {#op-update-registry-credential}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /registrycredentials` | List registry credentials | implemented |
| `POST /registrycredentials` | Create registry credential | implemented |
| `DELETE /registrycredentials/{registryCredentialId}` | Delete registry credential | implemented |
| `GET /registrycredentials/{registryCredentialId}` | Retrieve registry credential | implemented |
| `PATCH /registrycredentials/{registryCredentialId}` | Update registry credential | implemented |

## Services {#tag-services}

#### `GET /services` {#op-list-services}
#### `POST /services` {#op-create-service}
#### `DELETE /services/{serviceId}` {#op-delete-service}
#### `GET /services/{serviceId}` {#op-retrieve-service}
#### `PATCH /services/{serviceId}` {#op-update-service}
#### `DELETE /services/{serviceId}/autoscaling` {#op-delete-autoscaling-config}
#### `PUT /services/{serviceId}/autoscaling` {#op-autoscale-service}
#### `POST /services/{serviceId}/cache/purge` {#op-purge-cache}
#### `GET /services/{serviceId}/env-vars` {#op-get-env-vars-for-service}
#### `PUT /services/{serviceId}/env-vars` {#op-update-env-vars-for-service}
#### `DELETE /services/{serviceId}/env-vars/{envVarKey}` {#op-delete-env-var}
#### `GET /services/{serviceId}/env-vars/{envVarKey}` {#op-retrieve-env-var}
#### `PUT /services/{serviceId}/env-vars/{envVarKey}` {#op-update-env-var}
#### `GET /services/{serviceId}/events` {#op-list-events}
#### `GET /services/{serviceId}/instances` {#op-list-instances}
#### `GET /services/{serviceId}/outbound-ips` {#op-retrieve-service-outbound-ips}
#### `POST /services/{serviceId}/preview` {#op-preview-service}
#### `POST /services/{serviceId}/restart` {#op-restart-service}
#### `POST /services/{serviceId}/resume` {#op-resume-service}
#### `POST /services/{serviceId}/scale` {#op-scale-service}
#### `GET /services/{serviceId}/secret-files` {#op-list-secret-files-for-service}
#### `PUT /services/{serviceId}/secret-files` {#op-update-secret-files-for-service}
#### `DELETE /services/{serviceId}/secret-files/{envVarKey}` {#op-delete-secret-file}
#### `GET /services/{serviceId}/secret-files/{envVarKey}` {#op-retrieve-secret-file}
#### `PUT /services/{serviceId}/secret-files/{envVarKey}` {#op-add-or-update-secret-file}
#### `POST /services/{serviceId}/suspend` {#op-suspend-service}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /services` | List services | partial — ADR018 §Services & lifecycle / §Resource metadata contract: optional truthful metadata and partial serviceDetails projection |
| `POST /services` | Create service | implemented |
| `DELETE /services/{serviceId}` | Delete service | implemented |
| `GET /services/{serviceId}` | Retrieve service | partial — ADR018 §Services & lifecycle / §Resource metadata contract: optional truthful metadata and partial serviceDetails projection |
| `PATCH /services/{serviceId}` | Update service | implemented |
| `DELETE /services/{serviceId}/autoscaling` | Delete autoscaling config | implemented |
| `PUT /services/{serviceId}/autoscaling` | Update autoscaling config | implemented |
| `POST /services/{serviceId}/cache/purge` | Purge Web Service Cache | not-implemented |
| `GET /services/{serviceId}/env-vars` | List environment variables | implemented |
| `PUT /services/{serviceId}/env-vars` | Update environment variables | implemented |
| `DELETE /services/{serviceId}/env-vars/{envVarKey}` | Delete environment variable | implemented |
| `GET /services/{serviceId}/env-vars/{envVarKey}` | Retrieve environment variable | implemented |
| `PUT /services/{serviceId}/env-vars/{envVarKey}` | Add or update environment variable | implemented |
| `GET /services/{serviceId}/events` | List events | partial — ADR018 §Services & lifecycle — Service events / activity feed: deliberate partial event-detail dialect |
| `GET /services/{serviceId}/instances` | List instances | implemented |
| `GET /services/{serviceId}/outbound-ips` | Retrieve service outbound IPs | implemented |
| `POST /services/{serviceId}/preview` | Create service preview (image-backed) | not-implemented |
| `POST /services/{serviceId}/restart` | Restart service | implemented |
| `POST /services/{serviceId}/resume` | Resume service | implemented |
| `POST /services/{serviceId}/scale` | Scale instance count | implemented |
| `GET /services/{serviceId}/secret-files` | List secret files | partial — ADR018 §Environment variables & secret files: list returns names without secret contents |
| `PUT /services/{serviceId}/secret-files` | Update secret files | not-implemented |
| `DELETE /services/{serviceId}/secret-files/{envVarKey}` | Delete secret file | implemented |
| `GET /services/{serviceId}/secret-files/{envVarKey}` | Retrieve secret file | implemented |
| `PUT /services/{serviceId}/secret-files/{envVarKey}` | Add or update secret file | implemented |
| `POST /services/{serviceId}/suspend` | Suspend service | implemented |

## Services - Cron Jobs {#tag-services---cron-jobs}

#### `DELETE /cron-jobs/{cronJobId}/runs` {#op-cancel-cron-job-run}
#### `POST /cron-jobs/{cronJobId}/runs` {#op-run-cron-job}

| Operation | Summary | Grade |
| --- | --- | --- |
| `DELETE /cron-jobs/{cronJobId}/runs` | Cancel running cron job | implemented |
| `POST /cron-jobs/{cronJobId}/runs` | Trigger cron job run | implemented |

## Services - Headers {#tag-services---headers}

#### `GET /services/{serviceId}/headers` {#op-list-headers}
#### `POST /services/{serviceId}/headers` {#op-add-headers}
#### `PUT /services/{serviceId}/headers` {#op-update-headers}
#### `DELETE /services/{serviceId}/headers/{headerId}` {#op-delete-header}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /services/{serviceId}/headers` | List header rules | implemented |
| `POST /services/{serviceId}/headers` | Add header rule | not-implemented |
| `PUT /services/{serviceId}/headers` | Replace header rules | implemented |
| `DELETE /services/{serviceId}/headers/{headerId}` | Delete header rule | not-implemented |

## Services - Routes {#tag-services---routes}

#### `GET /services/{serviceId}/routes` {#op-list-routes}
#### `POST /services/{serviceId}/routes` {#op-add-route}
#### `PUT /services/{serviceId}/routes` {#op-put-routes}
#### `DELETE /services/{serviceId}/routes/{routeId}` {#op-delete-route}
#### `PATCH /services/{serviceId}/routes/{routeId}` {#op-patch-route}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /services/{serviceId}/routes` | List redirect/rewrite rules | implemented |
| `POST /services/{serviceId}/routes` | Add redirect/rewrite rules | not-implemented |
| `PUT /services/{serviceId}/routes` | Update redirect/rewrite rules | implemented |
| `DELETE /services/{serviceId}/routes/{routeId}` | Delete redirect/rewrite rule | not-implemented |
| `PATCH /services/{serviceId}/routes/{routeId}` | Update redirect/rewrite rule priority | not-implemented |

## Users {#tag-users}

#### `GET /users` {#op-get-user}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /users` | Get the authenticated user | implemented |

## Webhooks {#tag-webhooks}

#### `GET /webhooks` {#op-list-webhooks}
#### `POST /webhooks` {#op-create-webhook}
#### `DELETE /webhooks/{webhookId}` {#op-delete-webhook}
#### `GET /webhooks/{webhookId}` {#op-retrieve-webhook}
#### `PATCH /webhooks/{webhookId}` {#op-update-webhook}
#### `GET /webhooks/{webhookId}/events` {#op-list-webhook-events}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /webhooks` | List webhooks | implemented |
| `POST /webhooks` | Create a webhook | implemented |
| `DELETE /webhooks/{webhookId}` | Delete a webhook | implemented |
| `GET /webhooks/{webhookId}` | Retrieve a webhook | implemented |
| `PATCH /webhooks/{webhookId}` | Update a webhook | implemented |
| `GET /webhooks/{webhookId}/events` | List webhook events | implemented |

## Workflow Tasks {#tag-workflow-tasks}

#### `GET /task-runs` {#op-listTaskRuns}
#### `POST /task-runs` {#op-createTask}
#### `DELETE /task-runs/{taskRunId}` {#op-cancelTaskRun}
#### `GET /task-runs/{taskRunId}` {#op-getTaskRun}
#### `GET /task-runs/events` {#op-streamTaskRunsEvents}
#### `GET /tasks` {#op-listTasks}
#### `GET /tasks/{taskId}` {#op-getTask}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /task-runs` | List task runs | not-implemented |
| `POST /task-runs` | Run task | not-implemented |
| `DELETE /task-runs/{taskRunId}` | Cancel task run | not-implemented |
| `GET /task-runs/{taskRunId}` | Retrieve task run | not-implemented |
| `GET /task-runs/events` | Stream realtime events (SSE) | not-implemented |
| `GET /tasks` | List tasks | not-implemented |
| `GET /tasks/{taskId}` | Retrieve task | not-implemented |

## Workflows {#tag-workflows}

#### `GET /workflows` {#op-listWorkflows}
#### `POST /workflows` {#op-createWorkflow}
#### `DELETE /workflows/{workflowId}` {#op-deleteWorkflow}
#### `GET /workflows/{workflowId}` {#op-getWorkflow}
#### `PATCH /workflows/{workflowId}` {#op-updateWorkflow}
#### `GET /workflowversions` {#op-listWorkflowVersions}
#### `POST /workflowversions` {#op-createWorkflowVersion}
#### `GET /workflowversions/{workflowVersionId}` {#op-getWorkflowVersion}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /workflows` | List workflows | partial — GET /v1/workflows stub returns []; not a real implementation |
| `POST /workflows` | Create a workflow | not-implemented |
| `DELETE /workflows/{workflowId}` | Delete workflow | not-implemented |
| `GET /workflows/{workflowId}` | Retrieve workflow | not-implemented |
| `PATCH /workflows/{workflowId}` | Update workflow | not-implemented |
| `GET /workflowversions` | List workflow versions | not-implemented |
| `POST /workflowversions` | Deploy a workflow version | not-implemented |
| `GET /workflowversions/{workflowVersionId}` | Retrieve workflow version | not-implemented |

## Workspaces {#tag-workspaces}

#### `GET /owners` {#op-list-owners}
#### `GET /owners/{ownerId}` {#op-retrieve-owner}
#### `GET /owners/{ownerId}/members` {#op-retrieve-owner-members}
#### `DELETE /owners/{ownerId}/members/{userId}` {#op-remove-workspace-member}
#### `PATCH /owners/{ownerId}/members/{userId}` {#op-update-workspace-member}

| Operation | Summary | Grade |
| --- | --- | --- |
| `GET /owners` | List workspaces | implemented |
| `GET /owners/{ownerId}` | Retrieve workspace | implemented |
| `GET /owners/{ownerId}/members` | List workspace members | implemented |
| `DELETE /owners/{ownerId}/members/{userId}` | Remove workspace member | not-implemented |
| `PATCH /owners/{ownerId}/members/{userId}` | Update workspace member role | not-implemented |

## Interactive reference

The explorer below loads the same graded OpenAPI document. Test-request and client buttons are disabled on this site so the browser never calls `api.bex.co` from `bex.co`.

<ApiReference />
