Programmatic access

OpenAPI Schema

The Web API has an auto-generated OpenAPI schema available at assets/schemas/openapi.json.

gRPC, gRPC-Web

See obelisk.proto schema for details.

Deprecated: gRPC and gRPC-web are deprecated in 0.42. The web API below covers the same feature set; new clients should use /v1.

WebAPI

This document describes the REST-like API for managing components, deployments, and executions.

General Information

Base URL

All endpoints are prefixed with /v1.

Authentication

The API port denies any request without a valid Authorization: Bearer <token> header, returning HTTP 401 (gRPC UNAUTHENTICATED). The same requirement applies to the web API, gRPC, and gRPC-web.

Present an accepted token on every request:

export OBELISK_API_TOKEN=<accepted-token>
export OBELISK_API_AUTH="Authorization: Bearer $OBELISK_API_TOKEN"
curl -H "$OBELISK_API_AUTH" http://127.0.0.1:5005/v1/components

An ephemeral startup token is printed to the console on every server start; persistent tokens are configured as SHA-256 hashes. See Authentication for how to generate and configure tokens. The --no-auth server flag accepts unauthenticated requests on the API port, for development or recovery.

All curl examples below use $OBELISK_API_AUTH defined above.

Content Negotiation

The API supports content negotiation via the Accept header.

Structured endpoints default to application/json. Endpoints that return raw identifiers or file-like content default to text/plain: /v1/execution-id, /v1/deployment-id, WIT endpoints, and /v1/executions/{execution-id}/backtrace/source.

Send an explicit Accept header to override an endpoint's default where both representations are supported.

Deprecated: text/plain representations of structured resources and actions are deprecated and will be removed after 0.43; use application/json. Plaintext remains supported (not deprecated) for WIT documents, backtrace source files, and the execution and deployment ID endpoints.


Components

GET /v1/components

Lists all registered components in the system.

Query Parameters:

ParameterTypeDescriptionDefault
typeStringFilter by Component Type.None
nameStringFilter by component name.None
ffqnStringFilter by function FFQN or its prefix (any prefix of ns:pkg/ifc.fn).None
digestStringFilter by component digest (sha256 of the WASM file for WASM components; hash of JS source + configuration for JS components).None
deployment_idStringFilter by deployment ID.None
exportsBooleanInclude exported functions in the response.false
importsBooleanInclude imported functions in the response.false
submittableBooleanIf set, filters the exports list to only include functions that can be submitted.None (Shows all)
extensionsBooleanInclude Extension Functions exports (e.g. -schedule variant).false

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/components?exports=true&imports=false" -H accept:application/json
[
  {
    "component_id": {
      "component_type": "activity",
      "name": "test_programs_fibo_activity",
      "component_digest": "sha256:6a4566fb2de6564b4cbdaa6572983612d10cfe5558cb48b631e303e1d6a9e2d0"
    },
    "files": [
      {
        "file": {
          "path": "target/wasm-cache/test_programs_fibo_activity.wasm",
          "digest": "sha256:6a4566fb2de6564b4cbdaa6572983612d10cfe5558cb48b631e303e1d6a9e2d0",
          "size": 331911
        },
        "role": "wasm_component"
      }
    ],
    "exports": [
      {
        "ffqn": "testing:fibo/fibo.fibo",
        "parameter_types": [
          {
            "name": "n",
            "wit_type": "u8"
          }
        ],
        "return_type": "result<u64>",
        "submittable": true
      }
    ]
  },
  ...
]

Filtering by FFQN prefix with text/plain output:

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/components?exports=true&ffqn=testing:fibo/fibo.fibo" -H accept:text/plain
activity:test_programs_fibo_activity:sha256:6a4566fb2de6564b4cbdaa6572983612d10cfe5558cb48b631e303e1d6a9e2d0 sha256:6a4566fb2de6564b4cbdaa6572983612d10cfe5558cb48b631e303e1d6a9e2d0
 exports:
  testing:fibo/fibo.fibo: func(n: u8) -> result<u64>

GET /v1/components/{digest}/wit

Retrieves the WebAssembly Interface Type (WIT) definition for a specific component.

Path Parameters:

Query Parameters:

ParameterTypeDescriptionDefault
deployment_idStringFilter by deploymentNone

Returns:

Example request

curl -H "$OBELISK_API_AUTH" '127.1:5005/v1/components/sha256:6a4566fb2de6564b4cbdaa6572983612d10cfe5558cb48b631e303e1d6a9e2d0/wit'
package root:component;

world root {
  import wasi:io/error@0.2.3;
  ...
}
...

GET /v1/components/{digest}/source

Retrieves a source file of a component, such as a JavaScript module or a file referenced by backtrace source mappings.

Query Parameters:

ParameterTypeDescriptionDefault
fileStringFile path to retrieve. Suffix matching is used if not exact.Required

Executions

GET /v1/execution-id

Generates a new, globally unique execution id.

Returns:


GET /v1/executions

Lists executions with support for filtering and pagination.

Query Parameters:

ParameterTypeDescriptionDefault
ffqn_prefixStringFilter by Function Fully Qualified Name or its prefix.None
packageStringExact package scope, for example ns:pkg.None
interfaceStringExact interface scope, for example ns:pkg/ifc.None
functionStringExact Function Fully Qualified Name, for example ns:pkg/ifc.fn.None
stateStringMatch any of the given states. Repeat the parameter for several.None
show_derivedBooleanIf true, includes child executions.false
hide_finishedBooleanShow only unfinished executions.false
execution_id_prefixStringFilter by Execution ID or its prefix.None
component_digestStringFilter by component digest (see digest in GET /v1/components).None
deployment_idStringFilter by deployment ID.None
cursorStringPagination cursor. Can be an ISO 8601 Timestamp or an Execution ID.None
lengthIntegerNumber of items to return.System Default
directionStringolder or newer.older
including_cursorBooleanInclude the cursor item in the result.false

state accepts locked, pending, scheduled, blocked, paused, cancelling, finished, finished_ok, finished_error, and finished_execution_failure, e.g. ?state=pending&state=blocked.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions?length=10&direction=older" -H accept:application/json
[
  {
    "execution_id": "E_01KDJH6F811F2E0Q7AC4PDR9WE",
    "ffqn": "obelisk-flyio:workflow/workflow@1.0.0-beta.app-init",
    "pending_state": {
      "status": "finished",
      "version": 16,
      "finished_at": "2025-12-28T13:09:50.226429459Z",
      "result_kind": "ok"
    },
    "created_at": "2025-12-28T13:08:38.274234577Z",
    "first_scheduled_at": "2025-12-28T13:08:38.274234577Z",
    "component_digest": "sha256:b2ee4bdf32367e5d4eaf3643b95b9d7261996a5fe03582bff58cc59a884dc29b",
    "component_type": "workflow",
    "deployment_id": "Dep_01KN1NK9A6NMHP31TVJ875X599"
  },
  ...
]

POST /v1/executions

Submits a new execution. The system will automatically generate an Execution ID.

Query Parameters:

Request Body:

Example request

curl -H "$OBELISK_API_AUTH" '127.1:5005/v1/executions' -H content-type:application/json -H accept:application/json -X POST -d \
'{ "ffqn":"testing:fibo/fibo.fibo", "params": [5] }'
{ "ok": "E_01KDN8Y8ZZ4XYG2J0XJW5A8WE5" }

Getting the result with follow set to true:

curl -H "$OBELISK_API_AUTH" '127.1:5005/v1/executions?follow=true' -H content-type:application/json -X POST -d \
'{ "ffqn":"testing:fibo/fibo.fibo", "params": [5] }'
event: result
id: 1
data: {"ok":5}

PUT /v1/executions/{execution-id}

Submits an execution with a client-provided ID. This is idempotent; if the execution already exists with the same parameters, it returns 200 OK.

Path Parameters:

Query Parameters:

Example request

EXECUTION_ID=$(curl -H "$OBELISK_API_AUTH" 127.1:5005/v1/execution-id)
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}" -H content-type:application/json -H accept:application/json -X PUT -d \
'{ "ffqn":"testing:fibo/fibo.fibo", "params": [5] }'
{ "ok": "E_01KDN9422HAK2AHY9EXZA201TD" }

Getting the result with follow set to true:

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}?follow=true" -H content-type:application/json -X PUT -d \
'{ "ffqn":"testing:fibo/fibo.fibo", "params": [5] }'
event: result
id: 1
data: {"ok":5}

GET /v1/executions/{execution-id}

Retrieves the result of an execution.

Query Parameters:

Responses:

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}"
{ "ok": 5 }

Following results

With follow=true, the submit and result endpoints respond with Content-Type: text/event-stream. The stream carries a single result event with ID 1 whose data is the Execution Result JSON, then closes. While waiting, the server sends periodic comment lines as heartbeats. A client that reconnects with Last-Event-ID: 1 receives an empty stream, because the result was already delivered.


GET /v1/executions/{execution-id}/status

Returns the current lifecycle status (e.g., pending, finished). Unlike the root GET endpoint, this returns the internal state rather than the function return value.

Query Parameters:

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/status" -H accept:application/json
{
  "execution_id": "E_01KDQR2TGJR2XWEDM4CS6E4TF1",
  "ffqn": "testing:fibo/fibo.fibo",
  "pending_state": {
    "status": "finished",
    "version": 2,
    "finished_at": "2025-12-30T13:45:14.993810795Z",
    "result_kind": "ok"
  },
  "created_at": "2025-12-30T13:45:14.968745786Z",
  "first_scheduled_at": "2025-12-30T13:45:14.968745786Z",
  "component_digest": "sha256:6a4566fb2de6564b4cbdaa6572983612d10cfe5558cb48b631e303e1d6a9e2d0",
  "component_type": "activity",
  "deployment_id": "Dep_01KN1NK9A6NMHP31TVJ875X599"
}

GET /v1/executions/{execution-id}/events-and-responses

Returns a consistent snapshot of an execution's events and join-set responses in one request. It accepts the query parameters of the events endpoint (version_from, events_length, include_backtrace_id) and of the responses endpoint (responses_cursor_from, responses_length, responses_including_cursor).


GET /v1/executions/{execution-id}/events

Retrieves the history of events for an execution.

Query Parameters:

ParameterTypeDescriptionDefault
version_fromIntegerStart from this event version.0
lengthIntegerMax number of events.20
include_backtrace_idBooleanInclude debugging backtrace IDs.false

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/events" -H accept:application/json
{
  "events": [
    {
      "created_at": "2025-12-29T14:46:33.030449088Z",
      "event": {
        "locked": {
          "component_id": {
            "component_type": "activity",
            "name": "test_programs_fibo_activity",
            "component_digest": "sha256:6a4566fb2de6564b4cbdaa6572983612d10cfe5558cb48b631e303e1d6a9e2d0"
          },
          "executor_id": "Exr_01KDN7RB038RJHVZ5QS6MMWWZ4",
          "deployment_id": "Dep_01KN1NK9A6NMHP31TVJ875X599",
          "run_id": "Run_01KDN7RB038RJHVZ5QS6MMWWZ5",
          "lock_expires_at": "2025-12-29T14:46:34.030449088Z",
          "retry_config": {
            "max_retries": 5,
            "retry_exp_backoff": { "secs": 0, "nanos": 100000000 }
          }
        }
      },
      "version": 1
    },
    {
      "created_at": "2025-12-29T14:46:33.082449088Z",
      "event": {
        "finished": {
          "retval": { "ok": 5 },
          "http_client_traces": []
        }
      },
      "version": 2
    }
  ],
  "max_version": 2
}

GET /v1/executions/{execution-id}/responses

Retrieves responses associated with an execution (used for long-running interactions).

Query Parameters:

ParameterTypeDescriptionDefault
cursor_fromIntegerStart from this cursor index.0
lengthIntegerMax number of responses.20
including_cursorBooleanInclude the event at cursor_from.false
join_setStringFilter to responses of this join-set ID.all

join_set takes a canonical join-set ID as shown in join_set_id, for example o:1-fibo or n:session-events (URL-encode the colon as %3A if needed). A bare join-set name is rejected with 400 Bad Request.

Example request

EXECUTION_ID=$(curl -H "$OBELISK_API_AUTH" 127.1:5005/v1/execution-id)
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}"?follow=true -H content-type:application/json -X PUT -d \
'{ "ffqn":"testing:fibo-workflow/workflow.fiboa", "params": [5,5] }'

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/responses" -H accept:application/json
{
  "responses": [
    {
      "event": {
        "created_at": "2025-12-29T14:58:17.290976499Z",
        "event": {
          "join_set_id": "o:1-fibo",
          "event": {
            "type": "child_execution_finished",
            "child_execution_id": "E_01KDN9VJ2TJ396ZARNEMRBNBHP.o:1-fibo_1",
            "finished_version": 2,
            "result": {
              "ok": {
                "type": "u64",
                "value": 5
              }
            }
          }
        }
      },
      "cursor": 1
    }
  ],
  "max_cursor": 5,
  "scan_cursor": 1
}

PUT /v1/executions/{execution-id}/stub

Manually provides a return value for a stubbed execution. The execution-id here is a derived ID (child execution).

Request Body (JSON): The body must match the return type of the stubbed function.

{
  "ok": "your-return-value"
}

or

{
  "err": "your-error-value"
}

Example request

EXECUTION_ID=$(curl -H "$OBELISK_API_AUTH" 127.1:5005/v1/execution-id)
# Submit a workflow that submits a stub activity
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}" -H content-type:application/json -H accept:application/json -X PUT -d \
'{ "ffqn":"testing:stub-workflow/workflow.submit-await", "params": ["test"] }'
# Create the expected child execution id based on code or execution log
CHILD_EXECUTION_ID="${EXECUTION_ID}.o:1-foo_1"
# Optionally verify the id:
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/events" -H accept:text/plain | grep $CHILD_EXECUTION_ID
# returns a row containing: HistoryEvent(JoinSetRequest(ChildExecutionRequest(E_01KDNB650P06H69YR1FD973MA0.o:1-foo_1, testing:stub-activity/activity.foo, params: ["test"])))

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${CHILD_EXECUTION_ID}/stub" -H content-type:application/json -X PUT -d \
'{"ok": "some return value"}'
{ "ok": "stubbed" }

PUT /v1/executions/{execution-id}/upgrade

Upgrade an execution to run with a different WASM component. Upgrading only makes sense when the executor is configured to lock executions by its WASM's sha256 digest:

exec.locking_strategy = "by_component_digest"

Request Body (JSON):

{
  "old": "sha256:old-sha",
  "new": "sha256:new-sha"
}

Example request

obelisk server run -a app-testing-wasm.toml --deployment deployment-testing-wasm-oci.toml # components from Docker Hub
EXECUTION_ID=$(curl -H "$OBELISK_API_AUTH" 127.1:5005/v1/execution-id)
# Submit a workflow
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}" -H content-type:application/json -X PUT -d \
'{ "ffqn":"testing:sleep-workflow/workflow.sleep-host-activity", "params": [{"seconds":10}] }'

# Shutdown the server before the execution finishes.
obelisk server run -a app-testing-wasm.toml --deployment deployment-testing-wasm-local.toml # components built locally
# Find the old and new sha256 digest
OLD=$(curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/status"  -H accept:application/json | jq .component_digest)
NEW=$(curl -H "$OBELISK_API_AUTH" '127.1:5005/v1/components?name=test_programs_sleep_workflow' -H 'accept:application/json' | jq .[0].component_id.input_digest)

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/upgrade" -H content-type:application/json -X PUT -d \
'{"old":'$OLD', "new": '$NEW' }'
{ "ok": "upgraded" }

GET /v1/executions/{execution-id}/logs

Retrieves stored logs and output streams for an execution. Logs are stored in the database when forward_stdout/forward_stderr is set to "db" (the default) or when using the obelisk:log API.

Query Parameters:

ParameterTypeDescriptionDefault
show_logsBooleanInclude structured log entriestrue
show_streamsBooleanInclude stdout/stderr stream entriestrue
show_derivedBooleanInclude logs from all derived (child) executionsfalse
cursorDateTime (ISO 8601)Pagination cursorstart of time
lengthIntegerMax entries to returnsystem default
including_cursorBooleanInclude the entry at cursorfalse
directionStringolder or newerolder

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/logs" -H accept:application/json
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/logs?show_derived=true" -H accept:application/json

GET /v1/executions/{execution-id}/backtrace

Returns a persisted call-site backtrace of a workflow execution, including WASM call frames and source symbol information. Backtraces are stored when a webhook or workflow is configured with backtrace_persist, when advance is called with persist_backtrace, or on demand with PUT /v1/executions/{execution-id}/backtrace/persist. Otherwise the endpoint returns 404 Not Found.

Query Parameters:

ParameterTypeDescriptionDefault
versionStringWhich backtrace to retrieve: "first", "last", or a version number"last"

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/backtrace" -H accept:application/json
{
  "execution_id": "E_01KDQR2TGJR2XWEDM4CS6E4TF1",
  "component_id": {
    "component_type": "workflow",
    "name": "my_workflow",
    "component_digest": "sha256:abc123..."
  },
  "version_min_including": 1,
  "version_max_excluding": 3,
  "wasm_backtrace": {
    "frames": [
      {
        "module": "my_workflow",
        "func_name": "panic_handler",
        "symbols": [{ "func_name": "my_fn", "file": "src/lib.rs", "line": 42, "col": 5 }]
      }
    ]
  }
}

GET /v1/executions/{execution-id}/backtrace/source

Retrieves the source file content referenced by a backtrace frame. The component must be compiled with debug info so frames carry file symbols, and the deployment must map those files to local sources with backtrace.sources.

Query Parameters:

ParameterTypeDescriptionDefault
fileStringFrame file path; a unique trailing path suffix is also acceptedrequired
versionStringBacktrace version for component lookup: "first", "last", or a number"last"

Responses:

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/backtrace/source?file=workflow/src/lib.rs"

PUT /v1/executions/{execution-id}/pause

Pauses an active execution. The execution will not be scheduled for further processing until it is unpaused. Running activities cannot be paused while locked; activity pausing applies between runs. Cancel a running activity if it must be interrupted immediately.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/pause" -X PUT -H accept:application/json
{ "ok": "paused" }

PUT /v1/executions/{execution-id}/unpause

Resumes a previously paused execution.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/unpause" -X PUT -H accept:application/json
{ "ok": "unpaused" }

PUT /v1/executions/{execution-id}/replay

Replay a workflow execution from its execution log. The response indicates what would happen next without actually applying any writes:

Every JSON outcome also includes:

A replay_failed outcome can include a structured, sanitized failure object in addition to its human-readable error and captured writes.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/replay" -X PUT -H accept:application/json
{ "type": "finished", "retval": { "ok": 5 } }

PUT /v1/executions/{execution-id}/advance

Advance a paused execution by applying captured writes from a previous replay. The typical workflow is: create a paused execution, call replay to preview what would happen, then advance to apply those writes. This enables step-through debugging — you can inspect each step, trim events, or mark child executions as paused before they execute.

Request Body (JSON):

{
  "captured_writes": [...],
  "persist_backtrace": false
}

The captured_writes array should contain the writes returned by a previous replay call. Set persist_backtrace to true to persist fresh call-site backtraces while applying the writes.

Responses:

Example request

# 1. Create a paused execution
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions" -H content-type:application/json -X POST -d \
'{ "ffqn":"my:app/workflow.run", "params": [], "paused": true }'

# 2. Replay to preview the next step
REPLAY=$(curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/replay" -X PUT -H accept:application/json)

# 3. Advance to apply the captured writes
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/advance" -X PUT \
  -H content-type:application/json -H accept:application/json \
  -d "{\"captured_writes\": $(echo $REPLAY | jq .captured_writes)}"

PUT /v1/executions/{execution-id}/backtrace/persist

Replay a workflow and persist its call-site backtraces. The operation is idempotent and skips backtraces that are already stored.

Example request

curl -H "$OBELISK_API_AUTH" \
  "127.1:5005/v1/executions/${EXECUTION_ID}/backtrace/persist" \
  -X PUT -H accept:application/json
{ "persisted_backtrace_count": 12 }

Returns 404 when the execution does not exist and 422 when replay fails.


Delays

PUT /v1/delays/{delay-id}/pause

Pauses a pending delay request, preventing it from firing until unpaused.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/delays/${DELAY_ID}/pause" -X PUT -H accept:application/json

PUT /v1/delays/{delay-id}/unpause

Resumes a previously paused delay request.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/delays/${DELAY_ID}/unpause" -X PUT -H accept:application/json

Functions

GET /v1/functions

Lists all available functions across all components.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/functions" -H accept:application/json

GET /v1/functions/wit

Retrieves the WIT definition for a specific function.

Query Parameters:

ParameterTypeDescription
ffqnStringFunction Fully Qualified Name

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/functions/wit?ffqn=testing:fibo/fibo.fibo"

Deployments

GET /v1/deployment-id

Retrieves the current deployment ID.

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/deployment-id" -H accept:application/json

GET /v1/deployments

Lists deployment states.

Query Parameters:

ParameterTypeDescriptionDefault
cursor_fromStringDeployment ID cursor for paginationNone
lengthIntegerNumber of items to returnSystem Default
including_cursorBooleanInclude the cursor item in the resultfalse
include_derivedBooleanInclude child executions in execution summariesfalse
include_component_summaryBooleanInclude component counts by manifest sectionfalse
directionStringolder or newerolder
include_deployment_tomlBooleanInclude each deployment's TOMLfalse
include_execution_countsBooleanInclude execution state countstrue

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/deployments" -H accept:application/json
[
  {
    "deployment_id": "Dep_01KN1NK9A6NMHP31TVJ875X599",
    "description": "production",
    "digest": "sha256:...",
    "status": "active",
    "created_at": "2026-03-31T10:04:01.736281506Z",
    "last_active_at": "2026-03-31T10:04:01.736491095Z",
    "last_active_app_config_digest": "app-config:v1:sha256:...",
    "locked": 0,
    "pending": 0,
    "scheduled": 0,
    "blocked": 0,
    "paused": 0,
    "cancelling": 0,
    "finished_ok": 6,
    "finished_error": 0,
    "finished_execution_failure": 0,
    "component_summary": null
  }
]

GET /v1/deployments/{deployment-id}

Returns the full details of a specific deployment, including its stored deployment.toml.

Path Parameters:

Responses:

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/deployments/Dep_01KN1NK9A6NMHP31TVJ875X599" -H accept:application/json
{
  "deployment_id": "Dep_01KN1NK9A6NMHP31TVJ875X599",
  "description": "production",
  "digest": "sha256:...",
  "status": "active",
  "created_at": "2026-03-31T10:04:01.736281506Z",
  "last_active_at": "2026-03-31T10:04:01.736491095Z",
  "last_active_app_config_digest": "app-config:v1:sha256:...",
  "deployment_toml": "...",
  "files": [...]
}

PUT /v1/deployments/{deployment-id}

Submits a deployment package under a caller-generated deployment ID and stores it in the database. Retrying the same ID and content is idempotent; reusing an ID for different content returns a conflict. The deployment is not yet activated; use PUT /v1/deployments/{id}/switch to activate it.

Path Parameters:

Request Body (JSON):

FieldTypeDescription
deployment_tomlStringVerbatim deployment manifest
descriptionStringOptional human-readable description
allow_unavailable_runtime_configBooleanStore before runtime values or app and platform approvals are available (false)

Set allow_unavailable_runtime_config to true when a developer submits a deployment for later admin approval. Missing values, public environment declarations, secret registrations, outbound HTTP allowances, and exec approvals are tolerated during submission. Invalid manifests, missing files, compile errors, and link errors still fail. Submission alone does not activate the deployment; activation requires strict verification.

The endpoint also accepts multipart/form-data. Use text fields for deployment_toml, description, and allow_unavailable_runtime_config. Every other part is treated as a deployment-owned file blob; its filename is the deployment-relative path and the form-field name is either the claimed sha256:... digest or file.

Every deployment-owned file referenced by location must carry its content_digest in the submitted manifest, for example content_digest = "sha256:..." next to location. The Obelisk CLI adds these digests automatically; raw REST clients compute the SHA-256 of each file. Files already present in the server's content store need not be attached again.

Responses:

Example request

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/deployments/Dep_01KN1NK9A6NMHP31TVJ875X599" \
  -H content-type:application/json -X PUT -d \
  "$(jq -Rs '{deployment_toml: ., description: "production"}' deployment.toml)"

Multipart package with a deployment-owned script:

curl -H "$OBELISK_API_AUTH" \
  "127.1:5005/v1/deployments/Dep_01KN1NK9A6NMHP31TVJ875X599" -X PUT \
  -F deployment_toml=@deployment.toml \
  -F 'file=@scripts/run.sh;filename=scripts/run.sh'

where deployment.toml declares the script with its digest:

[[activity_exec]]
ffqn = "example:scripts/run.run"
location = "scripts/run.sh"
content_digest = "sha256:..." # sha256sum scripts/run.sh
return_type = "result"

PUT /v1/deployments/{deployment-id}/switch

Activates a previously submitted deployment. Supports hot-redeploy (apply without a server restart) or enqueue (activate on next restart).

Path Parameters:

Request Body (JSON):

FieldTypeDescription
applyBooleanIf true, apply immediately without restarting (default: false).
allow_unavailable_runtime_configBooleanEnqueue before runtime values or app and platform approvals are available (false). Applying without restart rejects true.

An enqueue request with this field set to true can queue a deployment that does not yet fit the app or platform policy. Startup checks the configuration strictly before activation, so supply the values and approvals before restarting. Hot apply always requires strict verification.

Responses:

Example request

# Enqueue a deployment (activates on next restart)
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/deployments/Dep_01KN1NK9A6NMHP31TVJ875X599/switch" \
  -H content-type:application/json -X PUT -d '{"apply": false}'

# Apply immediately without restart
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/deployments/Dep_01KN1NK9A6NMHP31TVJ875X599/switch" \
  -H content-type:application/json -X PUT -d '{"apply": true}'
{ "ok": "switched" }

App Configuration

GET /v1/app-config

Returns the running app policy (secrets without values, public environment names, exec approvals, and outbound HTTP rules) together with its canonical app_config_digest. Deployments record the digest that was in effect when they were activated, and system events carry the current digest.

{
  "app_config_digest": "app-config:v1:sha256:03f0...",
  "policy": {
    "format": "obelisk-app-config-v1",
    "secrets": {},
    "public_env": [],
    "allowed_exec_activities": {},
    "outbound_http": [{ "pattern": "https://example.com", "methods": ["GET"], "...": "..." }]
  }
}

GET /v1/app-config-digest

Returns only the current app_config_digest, as plain text by default.


Operator Administration

The authenticated /v1/admin API exposes operator-only maintenance and diagnostics. Prefer the obelisk admin CLI for interactive use; use the OpenAPI schema for complete request and response types.

EndpointPurpose
GET /v1/admin/node-run-idIdentify the current server process run
GET /v1/admin/system-eventsList persisted events, filtered by run, level, code, or creation time
GET /v1/admin/system-events/{event-id}Retrieve one system event
POST /v1/admin/system-events/retainRemove system events older than the requested age
GET /v1/admin/storageShow persistent storage usage and record counts
DELETE /v1/admin/executions/{execution-id}Delete a top-level execution tree
POST /v1/admin/executions/retainRetain execution trees by count or age in bounded batches
DELETE /v1/admin/deployments/{deployment-id}Delete an inactive deployment
POST /v1/admin/deployments/retainRetain inactive deployments by count or age

Deletion tombstones execution roots synchronously; automatic maintenance removes their trees and unreferenced shared metadata and CAS blobs in bounded batches. Forced deletion can remove a non-terminal tree unless its root belongs to the active deployment. Active and enqueued deployments are always retained.

Cancellation requests

PUT /v1/executions/{execution-id}/cancel

Cancels an active activity or cancellable workflow execution. Workflow cancellation is accepted only when the workflow's exported function name ends in -cancellable.

Cancelling a workflow requests structured-concurrency teardown: Obelisk stops advancing that workflow, closes its join sets from the persisted execution log, cancels activities, delays, and cancellable workflow children, and waits for any non-cancellable workflow children. This is useful for operator cleanup of workflows stuck on long-lived stubs or stranded by a failed upgrade. See Cancellation.

Example request

EXECUTION_ID=$(curl -H "$OBELISK_API_AUTH" 127.1:5005/v1/execution-id)
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}" -H content-type:application/json -X PUT -d \
'{ "ffqn":"testing:sleep/sleep.sleep", "params": [{"seconds":100}] }'

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/cancel" -X PUT -H accept:application/json
{ "ok": "cancellation requested" }

Cancellation is asynchronous; poll the status or result endpoint to observe the cancelled outcome. 409 Conflict is returned with already finished or already cancelling.


PUT /v1/delays/{delay-id}/cancel

Cancels a request for persistent sleep.

Path Parameters:

Example request

EXECUTION_ID=$(curl -H "$OBELISK_API_AUTH" 127.1:5005/v1/execution-id)
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}" -H content-type:application/json -X PUT -d \
'{ "ffqn":"testing:sleep-workflow/workflow.sleep-host-activity", "params": [{"seconds":100}] }'
# Create the expected delay id based on code or execution log
DELAY_ID="Delay_${EXECUTION_ID#E_}.o:1-sleep_1"
# Optionally verify the id:
curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/executions/${EXECUTION_ID}/events" -H accept:text/plain | grep $DELAY_ID
# returns a row containing: HistoryEvent(JoinSetRequest(DelayRequest(Delay_01KDNCA38TYGKHF7GKH3XQJH02.o:1-sleep_1, expires_at: `2025-12-29 15:43:39.751469133 UTC`, schedule_at: `In(150s)`)))

curl -H "$OBELISK_API_AUTH" "127.1:5005/v1/delays/${DELAY_ID}/cancel" -X PUT -H accept:application/json
{ "ok": "cancelled" }

Data Reference

Component Type

When filtering components or reading the component_type field in responses, use these values:

Execution Result

The result object returned when an execution finishes (from GET /v1/executions/{id}):

The result_kind field in status/list responses summarises the outcome:

Execution Failure Kind

One of:

Errors

Errors are returned with appropriate HTTP status codes:

Response Format: