REST API surface and operation inventory
On this page
Relay implements the DBOS Conductor v2 HTTP REST contract to provide drop-in compatibility for unmodified DBOS Transact applications and client tooling. This document inventories every operation defined by the vendored OpenAPI contract, records where the backing data lives (Relay Postgres store versus live dispatch to an executor over WebSockets), identifies OIDC-gated endpoints, documents naming and error constraints, and catalogues schema fields that Relay does not populate.
Specification provenance
The REST surface is defined by two OpenAPI documents vendored under api/spec/:
openapi.json(OpenAPI 3.1.0, SHA256:b5dc31eb29686a84fe0390a7446b5acdbc0dd05846cc94a746de649b92880722)openapi-3.0.json(OpenAPI 3.0.3, SHA256:aed633d5b923e24b1c27e0860ca38af00c0941747fbc7bfed1d9fb4de3fdfd4a)
Both documents were fetched on 2026-09-08 from https://cloud.dbos.dev/conductor/v2/.
Both were served publicly over HTTPS with HTTP 200 OK without requiring authentication
or click-through licensing. Detailed provenance
and checksums are tracked in api/spec/PROVENANCE.md and the
provenance ledger.
Operation inventory
The OpenAPI specification defines 64 operations across applications, workflows, steps, queues, schedules, executors, alerting rules, metrics, organizations, members, roles, and tokens.
Per Relay architectural invariants and ADR 0004, Relay never executes direct raw SQL against an application's system database. Workflow, step, queue, and schedule data are fetched on demand from executors over the WebSocket connection hub, or via the official SDK client when an application has an explicitly configured data-plane connection (with live executors taking precedence). System metadata (applications, versions, API keys, alert rules, and executor registrations) is stored in Relay's own Postgres database.
| Method | Path | Operation ID | Storage Location | OIDC Required | Wire Message |
|---|---|---|---|---|---|
GET |
/v2/orgs/{orgName} |
getOrg |
Relay store | Yes | N/A |
PATCH |
/v2/orgs/{orgName} |
updateOrg |
Relay store | Yes | N/A |
GET |
/v2/orgs/{orgName}/apps |
listApps |
Relay store | No | N/A |
DELETE |
/v2/orgs/{orgName}/apps/{appName} |
deleteApp |
Relay store | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName} |
getApp |
Relay store | No | N/A |
PATCH |
/v2/orgs/{orgName}/apps/{appName} |
updateApp |
Relay store | No | N/A |
PUT |
/v2/orgs/{orgName}/apps/{appName} |
registerApp |
Relay store | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/alerting-rules |
listAlertingRules |
Relay store | No | N/A |
POST |
/v2/orgs/{orgName}/apps/{appName}/alerting-rules |
createAlertingRule |
Relay store | No | N/A |
DELETE |
/v2/orgs/{orgName}/apps/{appName}/alerting-rules/{ruleId} |
deleteAlertingRule |
Relay store | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/autoscale |
getAutoscale |
Not implemented (Tier 5) | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/autoscale/versions/{version} |
getAutoscaleVersion |
Not implemented (Tier 5) | No | N/A |
DELETE |
/v2/orgs/{orgName}/apps/{appName}/autoscaling-policy |
deleteAutoscalingPolicy |
Not implemented (Tier 5) | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/autoscaling-policy |
getAutoscalingPolicy |
Not implemented (Tier 5) | No | N/A |
PUT |
/v2/orgs/{orgName}/apps/{appName}/autoscaling-policy |
setAutoscalingPolicy |
Not implemented (Tier 5) | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/executors |
listExecutors |
Relay store | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/metrics |
listMetrics |
Relay store | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/queues |
listQueues |
Executor dispatch | No | ListQueuesRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/queues/{queueName} |
getQueue |
Executor dispatch | No | GetQueueRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/schedules |
listSchedules |
Executor dispatch | No | ListSchedulesRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/schedules/{scheduleName} |
getSchedule |
Executor dispatch | No | GetScheduleRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/schedules/{scheduleName}/backfill |
backfillSchedule |
Executor dispatch | No | BackfillScheduleRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/schedules/{scheduleName}/pause |
pauseSchedule |
Executor dispatch | No | PauseScheduleRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/schedules/{scheduleName}/resume |
resumeSchedule |
Executor dispatch | No | ResumeScheduleRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/schedules/{scheduleName}/trigger |
triggerSchedule |
Executor dispatch | No | TriggerScheduleRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/steps/aggregates |
getStepAggregates |
Executor dispatch | No | GetStepAggregatesRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/versions |
listAppVersions |
Relay store | No | N/A |
PATCH |
/v2/orgs/{orgName}/apps/{appName}/versions/latest |
setLatestAppVersion |
Relay store | No | N/A |
GET |
/v2/orgs/{orgName}/apps/{appName}/workflows |
listWorkflows |
Executor dispatch | No | ListWorkflowsRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/aggregates |
getWorkflowAggregates |
Executor dispatch | No | GetWorkflowAggregatesRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/bulk-cancel |
bulkCancelWorkflows |
Executor dispatch | No | CancelWorkflowRequest (bulk) |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/bulk-delete |
bulkDeleteWorkflows |
Executor dispatch | No | DeleteWorkflowRequest (bulk) |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/bulk-fork-from-failure |
bulkForkWorkflowsFromFailure |
Executor dispatch | No | ForkFromFailureRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/bulk-resume |
bulkResumeWorkflows |
Executor dispatch | No | ResumeWorkflowRequest (bulk) |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/import |
importWorkflow |
Executor dispatch | No | ImportWorkflowRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/search |
searchWorkflows |
Executor dispatch | No | ListWorkflowsRequest |
DELETE |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId} |
deleteWorkflow |
Executor dispatch | No | DeleteWorkflowRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId} |
getWorkflow |
Executor dispatch | No | GetWorkflowRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/cancel |
cancelWorkflow |
Executor dispatch | No | CancelWorkflowRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/events |
listWorkflowEvents |
Executor dispatch | No | GetWorkflowEventsRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/export |
exportWorkflow |
Executor dispatch | No | ExportWorkflowRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/fork |
forkWorkflow |
Executor dispatch | No | ForkWorkflowRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/notifications |
listWorkflowNotifications |
Executor dispatch | No | GetWorkflowNotificationsRequest |
POST |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/resume |
resumeWorkflow |
Executor dispatch | No | ResumeWorkflowRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/steps |
listWorkflowSteps |
Executor dispatch | No | ListStepsRequest |
GET |
/v2/orgs/{orgName}/apps/{appName}/workflows/{workflowId}/streams |
listWorkflowStreams |
Executor dispatch | No | GetWorkflowStreamsRequest |
GET |
/v2/orgs/{orgName}/audit-logs |
listAuditLogs |
Relay store | Yes | N/A |
GET |
/v2/orgs/{orgName}/domain-claims |
listDomainClaims |
Relay store | Yes | N/A |
POST |
/v2/orgs/{orgName}/domain-claims |
requestDomainClaim |
Relay store | Yes | N/A |
DELETE |
/v2/orgs/{orgName}/domain-claims/{domain} |
releaseDomainClaim |
Relay store | Yes | N/A |
POST |
/v2/orgs/{orgName}/join |
joinOrg |
Relay store | Yes | N/A |
GET |
/v2/orgs/{orgName}/members |
listMembers |
Relay store | Yes | N/A |
DELETE |
/v2/orgs/{orgName}/members/{username} |
removeMember |
Relay store | Yes | N/A |
PUT |
/v2/orgs/{orgName}/members/{username}/roles/{roleName} |
grantRole |
Relay store | Yes | N/A |
GET |
/v2/orgs/{orgName}/permissions |
listPermissions |
Relay store | No | N/A |
GET |
/v2/orgs/{orgName}/roles |
listRoles |
Relay store | Yes | N/A |
POST |
/v2/orgs/{orgName}/roles |
createRole |
Relay store | Yes | N/A |
DELETE |
/v2/orgs/{orgName}/roles/{roleName} |
deleteRole |
Relay store | Yes | N/A |
POST |
/v2/orgs/{orgName}/secrets |
generateSecret |
Relay store | Yes | N/A |
GET |
/v2/orgs/{orgName}/tokens |
listTokens |
Relay store | No | N/A |
DELETE |
/v2/orgs/{orgName}/tokens/{tokenName} |
deleteToken |
Relay store | No | N/A |
POST |
/v2/orgs/{orgName}/tokens/{tokenName} |
createToken |
Relay store | No | N/A |
POST |
/v2/users |
registerUser |
Relay store | Yes | N/A |
GET |
/v2/users/me |
getCurrentUser |
Relay store | Yes | N/A |
Schema and parameter constraints
The OpenAPI document defines strict validation patterns and formats across common identifiers and error models.
Identifier constraints
-
Organization name (
orgName):- Minimum length: 3
- Maximum length: 30
- Character pattern:
^[a-z0-9_]+$ - Combined regular expression:
^[a-z0-9_]{3,30}$ - Applies to all
/v2/orgs/{orgName}/...path segments.
-
Application name (
appName):- Minimum length: 3
- Maximum length: 30 in the REST path parameter schema (extending up to 256 characters in backend workflow contexts and version identifiers).
- Character pattern:
^[a-z0-9-_]+$ - Combined regular expression:
^[a-z0-9-_]{3,30}$(path parameter) and^[a-z0-9-_]{3,256}$(general storage validation). - Allows lowercase alphanumeric characters, hyphens, and underscores.
Error response format
Every non-success response across the entire OpenAPI specification is typed as
application/problem+json referencing the ErrorModel schema, complying with
RFC 9457 (Problem Details for HTTP APIs):
{
"$schema": "//schemas/ErrorModel.json",
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "Human-readable explanation of the specific error.",
"instance": "https://example.com/error-log/abc123",
"errors": [
{
"location": "body.appName",
"message": "appName does not match pattern",
"value": "INVALID NAME"
}
]
}
Key fields in ErrorModel:
type: URI reference to error documentation (default:about:blank).title: Short summary of the problem type (does not change across instances).status: HTTP status code integer.detail: Explanation specific to this occurrence.instance: URI reference identifying this occurrence.errors: Optional array ofErrorDetailobjects containinglocation(path or body selector),message(error explanation), andvalue(offending input).
OIDC and authentication segmentation
The specification includes 16 operations tagged with x-dbos-requires-oauth: true:
- User registration and current profile:
POST /v2/users,GET /v2/users/me - Organization management:
GET /v2/orgs/{orgName},PATCH /v2/orgs/{orgName},POST /v2/orgs/{orgName}/join,POST /v2/orgs/{orgName}/secrets - Member management:
GET /v2/orgs/{orgName}/members,DELETE /v2/orgs/{orgName}/members/{username},PUT /v2/orgs/{orgName}/members/{username}/roles/{roleName} - Role management:
GET /v2/orgs/{orgName}/roles,POST /v2/orgs/{orgName}/roles,DELETE /v2/orgs/{orgName}/roles/{roleName} - Domain claims:
GET /v2/orgs/{orgName}/domain-claims,POST /v2/orgs/{orgName}/domain-claims,DELETE /v2/orgs/{orgName}/domain-claims/{domain} - Audit logging:
GET /v2/orgs/{orgName}/audit-logs
In self-hosted no-auth mode (Tier 1 through Tier 6), these routes respond with HTTP 404 Problem Details rather than 403 Forbidden, conforming to upstream client expectations when running without an identity provider.
Schemas Relay does not populate
Several schemas in the vendored specification represent DBOS Cloud proprietary managed infrastructure (such as managed RDS, managed VMs, and cloud domain routing) or are deferred to later compatibility tiers:
-
Cloud infrastructure fields in
Organization:defaultRdsInstanceClassType: Proprietary RDS instance sizing.maxApps,maxConductorApps,maxDatabaseInstances,maxVms,maxTeamMembers: Cloud tenant quota limits.subscriptionPlan: DBOS Cloud billing tier (e.g. "free", "pro", "teams").- Relay returns sensible defaults (or null) for self-hosted instances rather than emulating proprietary billing entities.
-
Autoscaling policies and recommendations (
AutoscalePolicy,QueueAutoscale,RolloutPolicy):QueueAutoscalecomputes recommended replica counts for external scalers (KEDA).- Deferred to Tier 5 (Scale), as standalone self-hosted deployments rely on external container orchestrators or fixed executor processes.
- Relay returns 404 Problem Details when reading autoscale recommendations or policies for an application (and 400 on attempts to write an autoscaling policy), matching upstream behaviour when no policy is configured.
-
Domain claims (
DomainClaim):requestDomainClaim,listDomainClaims,releaseDomainClaim.- These manage DNS and TLS termination on cloud infrastructure; not applicable to self-hosted on-premises Relay deployments.
-
Cloud-specific fields in
UserProfile:isDbosAdmin,subscriptionPlan.
-
Cloud host identifier in
Executor:hostIdrepresents cloud VM instance identifiers; Relay populatesexecutorId,hostname,appVersion,language, andexecutorMetadatafrom executor registrations.