> ## Documentation Index
> Fetch the complete documentation index at: https://docs.beta.b3os.org/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a pack manifest

Returns the exact `b3pack.json` of one pack version, as published and signed.

` GET /v1/actions/packs/{namespace}/{name}/versions/{version}/manifest `

Get a pack manifest

Returns the exact `b3pack.json` of one pack version, as published and signed.

## Servers

- ` https://beta-api.b3os.org ` — API (API keys and CLI tokens)

- ` https://beta.b3os.org ` — Dashboard (session cookie and CSRF header; same paths)

## Authentication

The operation accepts these alternatives. Schemes within one alternative are required together.

### Alternative 1

- ` apiKey `: ` http `

  - HTTP scheme: ` bearer ` (b3os_sk_ API key or b3os_pat_ token)

  - `Authorization: Bearer <credential>`. Two credential kinds are accepted:

- **API keys** `b3os_sk_<32 base32>_<crc32>`, created in the dashboard or with `POST /v1/keys`. A key belongs to
  one project, has scopes, an optional spend cap and expiry, and is shown only once.
- **CLI tokens** `b3os_pat_<32 base32>_<crc32>`, issued by the device login (`b3os login`). They act for one
  user in the organization and project chosen at approval.

Keys are stored as SHA-256 hashes. The edge exchanges them for a 60-second node token before forwarding
a request to a node, so nodes never see your key.


### Alternative 2

- ` session `: ` apiKey `

  - Credential: ` __Host-b3os_session ` in ` cookie `

  - The dashboard session cookie on `beta.b3os.org` (host-only, `Secure`, `HttpOnly`). Requests other than
`GET`/`HEAD` must also send `x-b3os-csrf: <csrf_token>` from `GET /v1/auth/session`; SameSite is not relied
on. The cookie is never sent to `beta-api.b3os.org` or `usercontent.b3os.org`.


## Parameters

### ` namespace ` (path, required)

Reverse-DNS publisher namespace, such as `io.b3os`.

- ` value `: type ` string `

  - maxLength: ` 100 `

  - pattern: ` "^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+$" `

Example:

```json
"io.b3os"
```

### ` name ` (path, required)

Pack name within the namespace, such as `github`.

- ` value `: type ` string `

  - pattern: ` "^[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$" `

Example:

```json
"github"
```

### ` version ` (path, required)

Exact semantic version, without build metadata (b3pack's `semver`).

- ` value `: type ` string ` — Semantic version 2.0.0 without build metadata (two versions that differ only in build metadata would be the same release).

  - maxLength: ` 64 `

  - pattern: ` "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(-(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*)?$" `

Example:

```json
"1.0.0"
```

## Responses

### ` 200 ` — The manifest.

Content type: ` application/json `

- ` value `: type ` object ` — One manifest per pack: connections, egress, actions (T0 declarative HTTP or T1 first-party JS), triggers (webhook, poll, schedule), fixtures, pricing and the publisher signature. Field names follow research/b3os-actions.md section 12.3 (camelCase, like MCP). Every string that contains ${{ }} is a CEL template; the template rules and CEL contexts are in packages/spec/schemas/README.md. Rules JSON Schema cannot express (unique action keys, egress subset, connection references, effect consistency) are listed in the README under 'b3pack publish checks' and are enforced by the actions registry and by examples/validate.mjs. Owner after freeze: actions.

  - Title: B3OS pack manifest (b3pack.json), format v1

  - Required fields: ` pack `, ` version `, ` title `, ` description `, ` publisher `, ` license `, ` engine `, ` actions `

  - ` $schema `: type ` string `; format ` uri ` — Optional pointer to this schema for editors. Ignored by the runtime.

  - ` pack `: type ` string ` — Pack id <namespace>/<name>, e.g. io.b3os/github. Action refs are <namespace>/<name>/<action>@<semver>.

    - maxLength: ` 165 `

    - pattern: ` "^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+/[a-z0-9]([a-z0-9-]{0,62}[a-z0-9])?$" `

  - ` version `: type ` string ` — Semantic version 2.0.0 without build metadata (two versions that differ only in build metadata would be the same release).

    - maxLength: ` 64 `

    - pattern: ` "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(-(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*)?$" `

  - ` title `: type ` string `

    - minLength: ` 1 `

    - maxLength: ` 80 `

  - ` description `: type ` string `

    - minLength: ` 1 `

    - maxLength: ` 2000 `

  - ` publisher `: type ` object ` — Who publishes the pack. id must equal the namespace part of pack (registry check). Verification status lives in the registry record, never in the manifest, so a manifest cannot claim to be verified.

    - Required fields: ` id `, ` name `

    - ` id `: type ` string ` — Reverse-DNS publisher namespace with at least one dot, lowercase: io.b3os, com.example, io.github.acme.

      - minLength: ` 3 `

      - maxLength: ` 100 `

      - pattern: ` "^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+$" `

    - ` name `: type ` string `

      - minLength: ` 1 `

      - maxLength: ` 100 `

    - ` url `: type ` string `; format ` uri `

      - pattern: ` "^https://" `

    - ` email `: type ` string `; format ` email `

      - maxLength: ` 254 `

  - ` license `: type ` string ` — SPDX license expression, e.g. MIT, Apache-2.0, or LicenseRef-<name>.

    - minLength: ` 1 `

    - maxLength: ` 100 `

    - pattern: ` "^[A-Za-z0-9][A-Za-z0-9.+() -]*$" `

  - ` facets `: type ` object ` — Discovery facets (research 12.12). Free kebab-case values; the registry curates the displayed set.

    - ` domain `: type ` array `

      - ` array item `: type ` string `

        - maxLength: ` 40 `

        - pattern: ` "^[a-z0-9]+(-[a-z0-9]+)*$" `

    - ` assetClass `: type ` array `

      - ` array item `: type ` string `

        - maxLength: ` 40 `

        - pattern: ` "^[a-z0-9]+(-[a-z0-9]+)*$" `

    - ` chains `: type ` array `

      - ` array item `: type ` string `

        - maxLength: ` 40 `

        - pattern: ` "^[a-z0-9]+(-[a-z0-9]+)*$" `

  - ` icons `: type ` array ` — MCP-style icons. src is a bundle-relative path under assets/ or an https URL.

    - ` array item `: type ` object `

      - Required fields: ` src `

      - ` src `: type ` string `

        - maxLength: ` 512 `

        - pattern: ` "^(assets/[A-Za-z0-9._/-]+|https://.+)$" `

      - ` mimeType `: type ` unknown `

        - enum: ` ["image/svg+xml","image/png","image/webp"] `

      - ` sizes `: type ` array `

        - ` array item `: type ` string `

          - pattern: ` "^([1-9][0-9]{0,3}x[1-9][0-9]{0,3}|any)$" `

  - ` engine `: type ` string ` — Pack runtime API the pack needs, as a caret range (npm and Cargo read it the same way). The v1 runtime is 1.0.0, so packs declare ^1 or ^1.0.

    - pattern: ` "^\\^(0|[1-9][0-9]*)(\\.(0|[1-9][0-9]*)){0,2}$" `

  - ` connections `: type ` object ` — Credentials and configuration the pack's actions and triggers can use, keyed by a connection key that templates reference as connections.<key>. A customer binds each key to a vault connection (conn_). Secrets are injected at the egress layer and never reach templates, fixtures or T1 code.

  - ` egress `: type ` array ` — Pack-wide egress ceiling: every outbound request from any action or trigger must match one entry. Actions may narrow it with their own egress list. Enforced by the b3os-core egress guard (ARCHITECTURE 4.4); a host diff between versions counts as a major change.

    - ` array item `: type ` object `

      - Required fields: ` host `

      - ` host `: type ` string ` — Lowercase host. Exact (api.github.com), wildcard (*.slack.com matches any name below slack.com but not slack.com itself), or * for any public host. * is first-party only and never receives injected credentials. IP literals are not allowed; the egress guard resolves names and denies private ranges either way.

        - maxLength: ` 253 `

        - pattern: ` "^(\\*|(\\*\\.)?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+)$" `

      - ` ports `: type ` array ` — Allowed destination ports. Default [443].

        - default: ` [443] `

        - ` array item `: type ` integer `

          - minimum: ` 1 `

          - maximum: ` 65535 `

      - ` schemes `: type ` array ` — Allowed URL schemes. Default ["https"]; plain http must be listed explicitly.

        - default: ` ["https"] `

        - ` array item `: type ` unknown `

          - enum: ` ["https","http"] `

  - ` actions `: type ` array `

    - ` array item `: type ` object ` — One action; every action is an MCP tool. The MCP tool name defaults to <pack name>__<action key> (for example github__create-issue), mapped into [A-Za-z0-9_-]{1,64}; the registry adds a hash suffix on collision and stores the result in the index.

      - Required fields: ` key `, ` title `, ` description `, ` inputSchema `, ` outputSchema `, ` effects `, ` impl `

      - ` key `: type ` string ` — Action or trigger key, kebab-case, unique within the pack.

        - minLength: ` 1 `

        - maxLength: ` 64 `

        - pattern: ` "^[a-z][a-z0-9]*(-[a-z0-9]+)*$" `

      - ` title `: type ` string `

        - minLength: ` 1 `

        - maxLength: ` 80 `

      - ` description `: type ` string `

        - minLength: ` 1 `

        - maxLength: ` 4000 `

      - ` inputSchema `: type ` unknown ` — A JSON Schema 2020-12 document whose top level describes an object (MCP requires object-typed inputSchema and outputSchema). Objects should be closed (additionalProperties false) unless declared open (research 12.4). x-b3-* keywords (x-b3-widget, x-b3-semantic, x-b3-options, ...) are allowed as annotations and ignored by validation.

        - ` allOf constraint 1 `: type ` unknown ` — A JSON Schema (draft 2020-12) document, such as a routine's `inputs` or an action's `inputSchema`. B3OS checks it against the meta-schema when it is published. References to the meta-schema in `schemas/*.json` resolve here. 

          - ` anyOf alternative 1 `: type ` object `

          - ` anyOf alternative 2 `: type ` boolean `

        - ` allOf constraint 2 `: type ` object `

          - Required fields: ` type `

          - ` type `: type ` unknown `

            - enum: ` ["object"] `

      - ` outputSchema `: type ` unknown ` — A JSON Schema 2020-12 document whose top level describes an object (MCP requires object-typed inputSchema and outputSchema). Objects should be closed (additionalProperties false) unless declared open (research 12.4). x-b3-* keywords (x-b3-widget, x-b3-semantic, x-b3-options, ...) are allowed as annotations and ignored by validation.

        - ` allOf constraint 1 `: type ` unknown ` — A JSON Schema (draft 2020-12) document, such as a routine's `inputs` or an action's `inputSchema`. B3OS checks it against the meta-schema when it is published. References to the meta-schema in `schemas/*.json` resolve here. 

          - ` anyOf alternative 1 `: type ` object `

          - ` anyOf alternative 2 `: type ` boolean `

        - ` allOf constraint 2 `: type ` object `

          - Required fields: ` type `

          - ` type `: type ` unknown `

            - enum: ` ["object"] `

      - ` effects `: type ` object ` — The single source for MCP annotations, approval UI, retries and routine durability (research 12.3). readOnlyHint = class in {pure, read}; destructiveHint = class == irreversible; openWorldHint = effective egress is non-empty. The runtime retries only pure and read calls and never auto-retries irreversible ones.

        - Required fields: ` class `

        - ` class `: type ` unknown `

          - enum: ` ["pure","read","write","irreversible"] `

      - ` impl `: type ` unknown ` — How the action runs. http = T0, declarative HTTP inside b3osd. js = T1, a first-party ES module run by the actions-js sidecar (packages/spec/sidecars/actions-js.md).

        - ` oneOf alternative 1 `: type ` object `

          - Title: T0 http

          - Required fields: ` kind `, ` request `

          - ` kind `: type ` unknown `

            - enum: ` ["http"] `

          - ` request `: type ` object ` — T0 request template. CEL context: input (validated input with schema defaults applied) and connections.<key>.params. In url, every expression that is not the whole string is percent-encoded with the RFC 3986 unreserved set (like encodeURIComponent); a whole-string url expression must yield an absolute URL and is used as is. The final URL must match the effective egress list; a templated host label may only produce [a-z0-9-] and must match a wildcard egress entry.

            - Required fields: ` method `, ` url `

            - ` method `: type ` unknown `

              - enum: ` ["GET","HEAD","POST","PUT","PATCH","DELETE"] `

            - ` url `: type ` unknown `

              - minLength: ` 9 `

              - maxLength: ` 2048 `

              - ` allOf constraint 1 `: type ` string ` — A string that may contain ${{ <cel> }} expressions. A string that is exactly one expression keeps the expression's type; otherwise each expression is converted to text and spliced in (README, 'Templates').

                - maxLength: ` 8192 `

            - ` query `: type ` object ` — Query parameters appended to url, form-encoded. Value results: string, int, double and bool are stringified; null omits the parameter; a list repeats the parameter once per element; a map is an error.

            - ` headers `: type ` object ` — Request headers. A null result omits the header; a value containing CR or LF fails the call. Not allowed: Host, Content-Length, Transfer-Encoding, Connection, Upgrade, TE, Trailer, Proxy-*, and any header a required connection injects.

            - ` body `: type ` unknown ` — Request body template. Not allowed with GET or HEAD.

              - ` allOf constraint 1 `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

            - ` bodyEncoding `: type ` unknown ` — json (default): the evaluated body is serialized as JSON with Content-Type application/json. form: the body must evaluate to a flat map; it is sent as application/x-www-form-urlencoded with the query rules above. text: the body must evaluate to a string; Content-Type defaults to text/plain;charset=utf-8.

              - enum: ` ["json","form","text"] `

              - default: ` "json" `

          - ` response `: type ` object ` — Response handling. CEL context: input, connections, response {status: int, headers: map of lowercase name to string (repeated headers joined with ', '), body: parsed JSON or string}.

            - ` body `: type ` unknown ` — How to read the body. auto (default): JSON when Content-Type is application/json or ends in +json, otherwise text. json fails the call if the body is not JSON. text keeps a string.

              - enum: ` ["auto","json","text"] `

              - default: ` "auto" `

            - ` success `: type ` unknown ` — Whether the call succeeded. Default ${{ response.status >= 200 && response.status < 300 }}.

              - ` allOf constraint 1 `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

                - minLength: ` 6 `

                - maxLength: ` 4096 `

                - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

            - ` map `: type ` unknown ` — Output template, evaluated on success. The result must validate against outputSchema. Default ${{ response.body }}.

              - ` allOf constraint 1 `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

            - ` errors `: type ` array ` — Evaluated in order when success is false; the first match decides the error. No match: code upstream_error, retryable when status is 429 or 5xx.

              - ` array item `: type ` object `

                - Required fields: ` if `, ` code `

                - ` if `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

                  - minLength: ` 6 `

                  - maxLength: ` 4096 `

                  - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

                - ` code `: type ` string `

                  - pattern: ` "^[a-z][a-z0-9_]{0,63}$" `

                - ` message `: type ` unknown `

                  - maxLength: ` 1024 `

                  - ` allOf constraint 1 `: type ` string ` — A string that may contain ${{ <cel> }} expressions. A string that is exactly one expression keeps the expression's type; otherwise each expression is converted to text and spliced in (README, 'Templates').

                    - maxLength: ` 8192 `

                - ` retryable `: type ` boolean `

                  - default: ` false `

        - ` oneOf alternative 2 `: type ` object `

          - Title: T1 js

          - Required fields: ` kind `, ` entry `

          - ` kind `: type ` unknown `

            - enum: ` ["js"] `

          - ` entry `: type ` string ` — Bundle-relative path of a self-contained ES module (bundled; no bare imports except node: built-ins the sidecar allows).

            - maxLength: ` 256 `

            - pattern: ` "^dist/[A-Za-z0-9._-]+(/[A-Za-z0-9._-]+)*\\.m?js$" `

          - ` export `: type ` string ` — Exported async function to call. Default run.

            - default: ` "run" `

            - pattern: ` "^[A-Za-z_$][A-Za-z0-9_$]{0,63}$" `

      - ` requires `: type ` object `

        - ` connections `: type ` array ` — Connection keys this action uses. Each must be declared in connections. For T0, every listed connection injects its credential into requests whose host matches its hosts.

          - ` array item `: type ` string ` — Connection key, a CEL identifier so templates can write connections.<key>.

            - minLength: ` 1 `

            - maxLength: ` 32 `

            - pattern: ` "^[a-z][a-z0-9_]{0,31}$" `

      - ` egress `: type ` array ` — Narrows the pack egress list for this action; each entry must be covered by a pack entry. Default: the pack list. An action with an empty effective list may not make network calls (only pure T1 transforms).

        - ` array item `: type ` object `

          - Required fields: ` host `

          - ` host `: type ` string ` — Lowercase host. Exact (api.github.com), wildcard (*.slack.com matches any name below slack.com but not slack.com itself), or * for any public host. * is first-party only and never receives injected credentials. IP literals are not allowed; the egress guard resolves names and denies private ranges either way.

            - maxLength: ` 253 `

            - pattern: ` "^(\\*|(\\*\\.)?[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+)$" `

          - ` ports `: type ` array ` — Allowed destination ports. Default [443].

            - default: ` [443] `

            - ` array item `: type ` integer `

              - minimum: ` 1 `

              - maximum: ` 65535 `

          - ` schemes `: type ` array ` — Allowed URL schemes. Default ["https"]; plain http must be listed explicitly.

            - default: ` ["https"] `

            - ` array item `: type ` unknown `

              - enum: ` ["https","http"] `

      - ` execution `: type ` object `

        - ` timeoutMs `: type ` integer ` — Wall-clock budget per call, including upstream time. Default 10000 for http, 30000 for js. A caller's shorter deadline wins.

          - minimum: ` 100 `

          - maximum: ` 300000 `

        - ` memoryMb `: type ` integer ` — T1 only: V8 old-generation limit of the worker running the call. Default 128.

          - minimum: ` 16 `

          - maximum: ` 1024 `

        - ` idempotencyHeader `: type ` unknown ` — T0 write or irreversible only: header that carries the caller's idempotency key upstream (for example Idempotency-Key for Stripe). Absent means the upstream has no idempotency support.

          - ` allOf constraint 1 `: type ` string `

            - minLength: ` 1 `

            - maxLength: ` 64 `

            - pattern: `` "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$" ``

      - ` annotations `: type ` object ` — MCP hints that effects cannot derive. readOnlyHint, destructiveHint and openWorldHint are always derived and may not be set here.

        - ` idempotentHint `: type ` boolean `

      - ` examples `: type ` array `

        - ` array item `: type ` unknown `

          - ` oneOf alternative 1 `: type ` object `

            - Title: fixture reference

            - Required fields: ` fixture `

            - ` fixture `: type ` string ` — Bundle-relative path of a fixture file (see $defs/fixture).

              - maxLength: ` 200 `

              - pattern: ` "^fixtures/[a-z0-9][a-z0-9._-]*\\.json$" `

          - ` oneOf alternative 2 `: type ` object `

            - Title: inline example

            - Required fields: ` input `

            - ` title `: type ` string `

              - maxLength: ` 120 `

            - ` input `: type ` object `

            - ` output `: type ` unknown `

      - ` pricing `: type ` object ` — Publisher price on top of the platform's actions.call meter. v0.1 first-party packs are free. Amounts are decimal strings in USD to avoid float rounding.

        - Required fields: ` model `

        - ` model `: type ` unknown `

          - enum: ` ["free","per_call"] `

        - ` usd `: type ` string `

          - pattern: ` "^(0|[1-9][0-9]{0,5})(\\.[0-9]{1,8})?$" `

      - ` mcp `: type ` object `

        - ` name `: type ` string ` — MCP tool name override; must be unique in the pack.

          - pattern: ` "^[A-Za-z0-9_-]{1,64}$" `

        - ` expose `: type ` boolean ` — false keeps the action out of tools/list (still callable through actions_call). Default true.

          - default: ` true `

  - ` triggers `: type ` array `

    - ` array item `: type ` object ` — A trigger turns provider events into B3OS events: CloudEvents-shaped {id, source, type, time, data, dedupeKey, subscription} with data validated against eventSchema. Delivery is at least once; consumers dedupe on (subscription, dedupeKey).

      - Required fields: ` key `, ` title `, ` description `, ` kind `, ` eventSchema `

      - ` key `: type ` string ` — Action or trigger key, kebab-case, unique within the pack.

        - minLength: ` 1 `

        - maxLength: ` 64 `

        - pattern: ` "^[a-z][a-z0-9]*(-[a-z0-9]+)*$" `

      - ` title `: type ` string `

        - minLength: ` 1 `

        - maxLength: ` 80 `

      - ` description `: type ` string `

        - minLength: ` 1 `

        - maxLength: ` 4000 `

      - ` kind `: type ` unknown `

        - enum: ` ["webhook","poll","schedule"] `

      - ` configSchema `: type ` unknown ` — Per-subscription configuration, available to CEL as config. Default: an empty closed object.

        - ` allOf constraint 1 `: type ` unknown ` — A JSON Schema 2020-12 document whose top level describes an object (MCP requires object-typed inputSchema and outputSchema). Objects should be closed (additionalProperties false) unless declared open (research 12.4). x-b3-* keywords (x-b3-widget, x-b3-semantic, x-b3-options, ...) are allowed as annotations and ignored by validation.

          - ` allOf constraint 1 `: type ` unknown ` — A JSON Schema (draft 2020-12) document, such as a routine's `inputs` or an action's `inputSchema`. B3OS checks it against the meta-schema when it is published. References to the meta-schema in `schemas/*.json` resolve here. 

            - ` anyOf alternative 1 `: type ` object `

            - ` anyOf alternative 2 `: type ` boolean `

          - ` allOf constraint 2 `: type ` object `

            - Required fields: ` type `

            - ` type `: type ` unknown `

              - enum: ` ["object"] `

      - ` eventSchema `: type ` unknown ` — A JSON Schema 2020-12 document whose top level describes an object (MCP requires object-typed inputSchema and outputSchema). Objects should be closed (additionalProperties false) unless declared open (research 12.4). x-b3-* keywords (x-b3-widget, x-b3-semantic, x-b3-options, ...) are allowed as annotations and ignored by validation.

        - ` allOf constraint 1 `: type ` unknown ` — A JSON Schema (draft 2020-12) document, such as a routine's `inputs` or an action's `inputSchema`. B3OS checks it against the meta-schema when it is published. References to the meta-schema in `schemas/*.json` resolve here. 

          - ` anyOf alternative 1 `: type ` object `

          - ` anyOf alternative 2 `: type ` boolean `

        - ` allOf constraint 2 `: type ` object `

          - Required fields: ` type `

          - ` type `: type ` unknown `

            - enum: ` ["object"] `

      - ` requires `: type ` object `

        - ` connections `: type ` array `

          - ` array item `: type ` string ` — Connection key, a CEL identifier so templates can write connections.<key>.

            - minLength: ` 1 `

            - maxLength: ` 32 `

            - pattern: ` "^[a-z][a-z0-9_]{0,31}$" `

      - ` examples `: type ` array `

        - ` array item `: type ` object `

          - Required fields: ` fixture `

          - ` fixture `: type ` string ` — Bundle-relative path of a fixture file (see $defs/fixture).

            - maxLength: ` 200 `

            - pattern: ` "^fixtures/[a-z0-9][a-z0-9._-]*\\.json$" `

      - ` verify `: type ` object ` — Mandatory delivery verification (ARCHITECTURE 4.3). Signatures are compared in constant time over the raw request body bytes. Schemes: github: X-Hub-Signature-256 'sha256=<hex HMAC-SHA256(secret, body)>'. stripe: Stripe-Signature 't=<unix>,v1=<hex>' over '<t>.<body>' (any v1 may match). slack: X-Slack-Signature 'v0=<hex>' over 'v0:<X-Slack-Request-Timestamp>:<body>'. standard_webhooks: webhook-signature 'v1,<base64>' entries over '<webhook-id>.<webhook-timestamp>.<body>', secret is base64 after the whsec_ prefix. hmac_sha256: generic, and always timestamped: the header value is prefix plus the HMAC-SHA256 (hex or base64, per encoding) of '<value of timestampHeader>.<body>', and a delivery whose timestamp header is missing or not a Unix time is refused. Timestamped schemes (stripe, slack, standard_webhooks, hmac_sha256) reject deliveries more than toleranceS (at most 300 s, the same rule as routine webhooks) from the node clock. The node also remembers the verified signature of each accepted delivery with its dedupe key (73 h, up to 10,000 per subscription), so a delivery replayed with a different unsigned header (for example X-GitHub-Delivery, which github's dedupe key reads) is still a duplicate; github signs no timestamp, so outside that window such a replay is not refused.

        - Required fields: ` scheme `, ` secret `

        - ` scheme `: type ` unknown `

          - enum: ` ["github","stripe","slack","standard_webhooks","hmac_sha256"] `

        - ` secret `: type ` object `

          - Required fields: ` from `

          - ` from `: type ` unknown ` — generated: B3OS creates a random 32-byte secret per subscription and exposes it once to the subscribe call as subscription.secret. subscribe_result: the provider returns the secret; subscribe.secret extracts it. user: the customer supplies it when creating the subscription, as an api_key vault connection (verification-only: no pack, no hosts) bound under the routine trigger's connections.webhook_secret. The secret is stored in the vault, never in subscription state.

            - enum: ` ["generated","subscribe_result","user"] `

        - ` header `: type ` unknown ` — hmac_sha256 only: signature header.

          - ` allOf constraint 1 `: type ` string `

            - minLength: ` 1 `

            - maxLength: ` 64 `

            - pattern: `` "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$" ``

        - ` encoding `: type ` unknown ` — hmac_sha256 only. Default hex.

          - enum: ` ["hex","base64"] `

        - ` prefix `: type ` string ` — hmac_sha256 only: literal prefix before the signature, e.g. sha256=.

          - maxLength: ` 32 `

          - pattern: ` "^[ -~]*$" `

        - ` timestampHeader `: type ` unknown ` — hmac_sha256 only, and required there: header carrying the delivery's Unix timestamp; the signed payload is '<timestamp>.<body>'.

          - ` allOf constraint 1 `: type ` string `

            - minLength: ` 1 `

            - maxLength: ` 64 `

            - pattern: `` "^[A-Za-z0-9!#$%&'*+.^_`|~-]+$" ``

        - ` toleranceS `: type ` integer ` — Timestamped schemes: the largest allowed distance in seconds between the delivery's timestamp and the node clock.

          - default: ` 300 `

          - minimum: ` 30 `

          - maximum: ` 300 `

      - ` subscribe `: type ` object ` — webhook: action called when a subscription is created (REST hooks). CEL context for with: config, subscription {id, url, secret (only when verify.secret.from is generated)}. state and secret are evaluated with result (the action output), config and subscription.

        - Required fields: ` action `, ` with `

        - ` action `: type ` string ` — Action or trigger key, kebab-case, unique within the pack.

          - minLength: ` 1 `

          - maxLength: ` 64 `

          - pattern: ` "^[a-z][a-z0-9]*(-[a-z0-9]+)*$" `

        - ` with `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

        - ` state `: type ` unknown ` — Non-secret state kept with the subscription (for example the provider's hook id), later available as subscription.state.

          - ` allOf constraint 1 `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

        - ` secret `: type ` unknown ` — Required when verify.secret.from is subscribe_result: extracts the signing secret from result. Stored in the vault.

          - ` allOf constraint 1 `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

            - minLength: ` 6 `

            - maxLength: ` 4096 `

            - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

      - ` unsubscribe `: type ` object ` — webhook: action called when the subscription is deleted. CEL context for with: config, subscription {id, url, state}.

        - Required fields: ` action `, ` with `

        - ` action `: type ` string ` — Action or trigger key, kebab-case, unique within the pack.

          - minLength: ` 1 `

          - maxLength: ` 64 `

          - pattern: ` "^[a-z][a-z0-9]*(-[a-z0-9]+)*$" `

        - ` with `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

      - ` handshake `: type ` object ` — webhook: answers a provider verification request (for example Slack url_verification) without emitting an event. Evaluated after signature verification. CEL context: request, config.

        - Required fields: ` if `, ` response `

        - ` if `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

          - minLength: ` 6 `

          - maxLength: ` 4096 `

          - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

        - ` response `: type ` object `

          - Required fields: ` status `

          - ` status `: type ` integer `

            - minimum: ` 200 `

            - maximum: ` 299 `

          - ` contentType `: type ` unknown `

            - enum: ` ["application/json","text/plain"] `

          - ` body `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

      - ` dedupeKey `: type ` unknown ` — webhook: string that identifies the provider event (provider event id or delivery id). CEL context: request {method, headers (lowercase map), query, body (parsed JSON or string), received_at}, config, subscription.

        - ` allOf constraint 1 `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

          - minLength: ` 6 `

          - maxLength: ` 4096 `

          - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

      - ` filter `: type ` unknown ` — webhook: bool; false acknowledges the delivery with 2xx and emits nothing. Same context as dedupeKey.

        - ` allOf constraint 1 `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

          - minLength: ` 6 `

          - maxLength: ` 4096 `

          - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

      - ` event `: type ` unknown ` — Event data template. webhook default ${{ request.body }} (context as dedupeKey); poll default ${{ item }} (context: item, config); schedule default ${{ result }} when action is set, else ${{ {'scheduled_at': scheduled_at} }} (context: result, config, scheduled_at).

        - ` allOf constraint 1 `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

      - ` poll `: type ` object ` — poll: runs a read action of this pack on an interval and emits new items. CEL context for with: config, cursor (null on the first poll), subscription. items and cursor see result, cursor, config. The first poll records a baseline and emits nothing unless initial is emit.

        - Required fields: ` action `, ` items `, ` intervalMs `

        - ` action `: type ` string ` — Action or trigger key, kebab-case, unique within the pack.

          - minLength: ` 1 `

          - maxLength: ` 64 `

          - pattern: ` "^[a-z][a-z0-9]*(-[a-z0-9]+)*$" `

        - ` with `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

        - ` items `: type ` unknown ` — List of raw items in result.

          - ` allOf constraint 1 `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

            - minLength: ` 6 `

            - maxLength: ` 4096 `

            - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

        - ` cursor `: type ` unknown ` — Next cursor; null keeps the previous one.

          - ` allOf constraint 1 `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

            - minLength: ` 6 `

            - maxLength: ` 4096 `

            - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

        - ` intervalMs `: type ` object ` — Poll interval. default applies when the subscription does not choose; min is the floor a subscription may request. Plans may raise the floor (GET /v1/limits).

          - Required fields: ` default `, ` min `

          - ` default `: type ` integer `

            - minimum: ` 1000 `

            - maximum: ` 86400000 `

          - ` min `: type ` integer `

            - minimum: ` 1000 `

            - maximum: ` 86400000 `

        - ` initial `: type ` unknown `

          - enum: ` ["baseline","emit"] `

          - default: ` "baseline" `

      - ` dedupe `: type ` object ` — poll: which items are new. unique: emit items whose key was not among the last window keys seen. greatest: emit items whose key is greater than the largest key seen (keys are ints or RFC 3339 strings).

        - Required fields: ` strategy `, ` key `

        - ` strategy `: type ` unknown `

          - enum: ` ["unique","greatest"] `

        - ` key `: type ` unknown ` — Per-item key. CEL context: item, config.

          - ` allOf constraint 1 `: type ` string ` — Exactly one CEL expression wrapped as the whole string: ${{ <cel> }}. The result keeps its CEL type (bool, int, double, string, list, map, null).

            - minLength: ` 6 `

            - maxLength: ` 4096 `

            - pattern: ` "^\\$\\{\\{[\\s\\S]*\\}\\}$" `

        - ` window `: type ` integer `

          - default: ` 1000 `

          - minimum: ` 1 `

          - maximum: ` 10000 `

      - ` schedule `: type ` object ` — schedule: emits one event per occurrence, optionally carrying the result of a read action. Occurrences missed while the node was down follow catchUp (skip: none, latest: the newest one, all: every one within 24 h).

        - Required fields: ` catchUp `

        - ` cron `: type ` string ` — Six-field cron with seconds: second minute hour day-of-month month day-of-week, single spaces. Fields accept numbers, names (JAN, MON), *, ranges a-b, lists a,b, steps */n and ?; L, W and # are accepted in the day fields.

          - maxLength: ` 128 `

          - pattern: ` "^[0-9A-Za-z*/,?#-]+( [0-9A-Za-z*/,?#-]+){5}$" `

        - ` tz `: type ` string ` — IANA time zone name, e.g. America/Los_Angeles. Default UTC.

          - maxLength: ` 64 `

          - pattern: ` "^(UTC|[A-Za-z]+(/[A-Za-z0-9_+-]+){1,2})$" `

        - ` everyMs `: type ` integer `

          - minimum: ` 1000 `

          - maximum: ` 2592000000 `

        - ` catchUp `: type ` unknown `

          - enum: ` ["skip","latest","all"] `

        - ` action `: type ` string ` — Action or trigger key, kebab-case, unique within the pack.

          - minLength: ` 1 `

          - maxLength: ` 64 `

          - pattern: ` "^[a-z][a-z0-9]*(-[a-z0-9]+)*$" `

        - ` with `: type ` unknown ` — Any JSON value. Strings inside it (at any depth) are template strings; object keys are literal.

        - ` oneOf alternative 1 `: type ` unknown `

          - Required fields: ` cron `

        - ` oneOf alternative 2 `: type ` unknown `

          - Required fields: ` everyMs `

  - ` pricing `: type ` unknown ` — Default price for every action that does not set its own. v0.1 packs are free; the node still meters actions.call (ARCHITECTURE 4.5).

    - ` allOf constraint 1 `: type ` object ` — Publisher price on top of the platform's actions.call meter. v0.1 first-party packs are free. Amounts are decimal strings in USD to avoid float rounding.

      - Required fields: ` model `

      - ` model `: type ` unknown `

        - enum: ` ["free","per_call"] `

      - ` usd `: type ` string `

        - pattern: ` "^(0|[1-9][0-9]{0,5})(\\.[0-9]{1,8})?$" `

  - ` compat `: type ` object `

    - ` legacyIds `: type ` object ` — Maps an action key in this pack to the flat action id it replaces in the old B3OS catalog (research 12.3, 13). Used by the importer so old workflows resolve.

  - ` signature `: type ` object ` — Publisher signature written by the publish tool and repeated in the registry record. contentHash covers the whole bundle with this member removed (README, 'Pack content hash and signature'). sig is Ed25519 over the UTF-8 bytes of 'b3pack-sig-v1\n<pack>\n<version>\n<contentHash>'. Nodes verify contentHash and sig against the registry record and the publisher's registered key before loading (ARCHITECTURE 5.5).

    - Required fields: ` alg `, ` kid `, ` contentHash `, ` sig `

    - ` alg `: type ` unknown `

      - enum: ` ["ed25519"] `

    - ` kid `: type ` string ` — Publisher key id as registered: <namespace>#<label>.

      - maxLength: ` 140 `

      - pattern: ` "^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)+#[A-Za-z0-9._-]{1,32}$" `

    - ` contentHash `: type ` string `

      - pattern: ` "^sha256:[0-9a-f]{64}$" `

    - ` sig `: type ` string ` — base64url without padding of the 64-byte signature.

      - pattern: ` "^[A-Za-z0-9_-]{86}$" `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Example:

```json
{
  "pack": "io.b3os/open-meteo",
  "version": "1.0.0",
  "title": "Open-Meteo",
  "description": "Place search and current weather from the Open-Meteo API.",
  "publisher": {
    "id": "io.b3os",
    "name": "B3OS"
  },
  "license": "MIT",
  "engine": "^1.0",
  "egress": [
    {
      "host": "geocoding-api.open-meteo.com"
    }
  ],
  "actions": [
    {
      "key": "search-places",
      "title": "Search places",
      "description": "Find places by name. Returns coordinates and time zone for each match, best match first.",
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "minLength": 2,
            "maxLength": 100
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "places"
        ],
        "properties": {
          "places": {
            "type": "array"
          }
        }
      },
      "effects": {
        "class": "read"
      },
      "impl": {
        "kind": "http",
        "request": {
          "method": "GET",
          "url": "https://geocoding-api.open-meteo.com/v1/search",
          "query": {
            "name": "${{ input.name }}",
            "format": "json"
          }
        },
        "response": {
          "map": {
            "places": "${{ has(response.body.results) ? response.body.results : [] }}"
          }
        }
      }
    }
  ]
}
```

### ` 400 ` — The request failed validation (`invalid_request`, `invalid_url`).

Content type: ` application/problem+json `

- ` value `: type ` object ` — An RFC 9457 problem. `code` is stable and listed in the errors catalog; `type` links to its entry. `detail` is human-readable and may change. Extension members appear only for the codes that document them; ignore members you do not recognize. 

  - Required fields: ` type `, ` title `, ` status `, ` code `, ` detail `

  - ` type `: type ` string `; format ` uri ` — `https://docs.beta.b3os.org/errors#<code>`.

    - example: ` "https://docs.beta.b3os.org/errors#invalid_request" `

  - ` title `: type ` string ` — Short summary of the problem type.

  - ` status `: type ` integer ` — The HTTP status code, repeated for convenience.

    - minimum: ` 400 `

    - maximum: ` 599 `

  - ` code `: type ` string ` — Stable machine-readable error code from the errors catalog.

    - pattern: ` "^[a-z][a-z0-9_]*$" `

  - ` detail `: type ` string ` — Explanation of this occurrence. Never contains secrets.

  - ` instance `: type ` string ` — The request ID (`req_…`) of the request that failed. Include it when you contact support.

    - example: ` "req_01m5t4yg394wegr3j4y01qb363" `

  - ` errors `: type ` array ` — Validation problems, one per field (`invalid_request` and the other codes that list `errors`).

    - ` array item `: type ` object ` — One validation problem.

      - Required fields: ` pointer `, ` detail `

      - ` pointer `: type ` string ` — Where the problem is: a JSON pointer into the request body (`/url`, `/steps/0/uses`), or `#query/<name>`, `#path/<name>` or `#header/<name>` for parameters. 

        - example: ` "/url" `

      - ` detail `: type ` string ` — What is wrong there.

        - example: ` "must be an absolute http or https URL" `

  - ` reason `: type ` string ` — Finer-grained cause for codes that document one (`unauthorized`, `forbidden`, `egress_denied`, `upstream_unreachable`, …).

  - ` required_scope `: type ` string ` — The scope that was missing (`forbidden` with `reason: scope`).

  - ` retry_after_s `: type ` integer ` — Same value as the `Retry-After` header, for clients that only read the body.

    - minimum: ` 0 `

  - ` limit `: type ` object ` — The limit an error refers to. IDs and current values are listed by `GET /v1/limits`.

    - Required fields: ` id `, ` limit `, ` unit `

    - ` id `: type ` string ` — Limit ID, such as `vision.scrape.rpm` or `sandboxes.concurrent`.

      - example: ` "vision.scrape.rpm" `

    - ` limit `: type ` number ` — The limit's value.

    - ` unit `: type ` string ` — What the limit counts, such as `requests`, `sandboxes`, `vcpu` or `MiB`.

    - ` window_s `: type ` integer ` — Window length in seconds for rate limits and quotas.

    - ` current `: type ` number ` — Current usage against the limit, when known.

  - ` current_status `: type ` string ` — The object's current status, for state conflicts such as `sandbox_not_running`.

  - ` upstream_status `: type ` integer ` — The HTTP status the upstream returned (`upstream_error`, `action_output_invalid`).

  - ` step `: type ` string ` — The failed step, as a step ID (routines), an index (`act`) or a path such as `beats/2/do/0` (render).

  - ` pack_error `: type ` object ` — The error a pack's error mapping chose (`upstream_error` from pack actions).

    - Required fields: ` code `, ` message `, ` retryable `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` retryable `: type ` boolean `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Example:

```json
{
  "type": "https://docs.beta.b3os.org/errors#invalid_request",
  "title": "Invalid request",
  "status": 400,
  "code": "invalid_request",
  "detail": "1 field failed validation",
  "instance": "req_01m5t4yg394wegr3j4y01qb363",
  "errors": [
    {
      "pointer": "/url",
      "detail": "must be an absolute http or https URL"
    }
  ]
}
```

### ` 401 ` — Missing, malformed, expired or revoked credentials (`unauthorized`).

Content type: ` application/problem+json `

- ` value `: type ` object ` — An RFC 9457 problem. `code` is stable and listed in the errors catalog; `type` links to its entry. `detail` is human-readable and may change. Extension members appear only for the codes that document them; ignore members you do not recognize. 

  - Required fields: ` type `, ` title `, ` status `, ` code `, ` detail `

  - ` type `: type ` string `; format ` uri ` — `https://docs.beta.b3os.org/errors#<code>`.

    - example: ` "https://docs.beta.b3os.org/errors#invalid_request" `

  - ` title `: type ` string ` — Short summary of the problem type.

  - ` status `: type ` integer ` — The HTTP status code, repeated for convenience.

    - minimum: ` 400 `

    - maximum: ` 599 `

  - ` code `: type ` string ` — Stable machine-readable error code from the errors catalog.

    - pattern: ` "^[a-z][a-z0-9_]*$" `

  - ` detail `: type ` string ` — Explanation of this occurrence. Never contains secrets.

  - ` instance `: type ` string ` — The request ID (`req_…`) of the request that failed. Include it when you contact support.

    - example: ` "req_01m5t4yg394wegr3j4y01qb363" `

  - ` errors `: type ` array ` — Validation problems, one per field (`invalid_request` and the other codes that list `errors`).

    - ` array item `: type ` object ` — One validation problem.

      - Required fields: ` pointer `, ` detail `

      - ` pointer `: type ` string ` — Where the problem is: a JSON pointer into the request body (`/url`, `/steps/0/uses`), or `#query/<name>`, `#path/<name>` or `#header/<name>` for parameters. 

        - example: ` "/url" `

      - ` detail `: type ` string ` — What is wrong there.

        - example: ` "must be an absolute http or https URL" `

  - ` reason `: type ` string ` — Finer-grained cause for codes that document one (`unauthorized`, `forbidden`, `egress_denied`, `upstream_unreachable`, …).

  - ` required_scope `: type ` string ` — The scope that was missing (`forbidden` with `reason: scope`).

  - ` retry_after_s `: type ` integer ` — Same value as the `Retry-After` header, for clients that only read the body.

    - minimum: ` 0 `

  - ` limit `: type ` object ` — The limit an error refers to. IDs and current values are listed by `GET /v1/limits`.

    - Required fields: ` id `, ` limit `, ` unit `

    - ` id `: type ` string ` — Limit ID, such as `vision.scrape.rpm` or `sandboxes.concurrent`.

      - example: ` "vision.scrape.rpm" `

    - ` limit `: type ` number ` — The limit's value.

    - ` unit `: type ` string ` — What the limit counts, such as `requests`, `sandboxes`, `vcpu` or `MiB`.

    - ` window_s `: type ` integer ` — Window length in seconds for rate limits and quotas.

    - ` current `: type ` number ` — Current usage against the limit, when known.

  - ` current_status `: type ` string ` — The object's current status, for state conflicts such as `sandbox_not_running`.

  - ` upstream_status `: type ` integer ` — The HTTP status the upstream returned (`upstream_error`, `action_output_invalid`).

  - ` step `: type ` string ` — The failed step, as a step ID (routines), an index (`act`) or a path such as `beats/2/do/0` (render).

  - ` pack_error `: type ` object ` — The error a pack's error mapping chose (`upstream_error` from pack actions).

    - Required fields: ` code `, ` message `, ` retryable `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` retryable `: type ` boolean `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Example:

```json
{
  "type": "https://docs.beta.b3os.org/errors#unauthorized",
  "title": "Unauthorized",
  "status": 401,
  "code": "unauthorized",
  "detail": "API key checksum does not match; check that the whole key was copied",
  "instance": "req_01m5t4yg394wegr3j4y01qb363",
  "reason": "malformed"
}
```

### ` 403 ` — Authenticated but not allowed (`forbidden`, `egress_denied`).

Content type: ` application/problem+json `

- ` value `: type ` object ` — An RFC 9457 problem. `code` is stable and listed in the errors catalog; `type` links to its entry. `detail` is human-readable and may change. Extension members appear only for the codes that document them; ignore members you do not recognize. 

  - Required fields: ` type `, ` title `, ` status `, ` code `, ` detail `

  - ` type `: type ` string `; format ` uri ` — `https://docs.beta.b3os.org/errors#<code>`.

    - example: ` "https://docs.beta.b3os.org/errors#invalid_request" `

  - ` title `: type ` string ` — Short summary of the problem type.

  - ` status `: type ` integer ` — The HTTP status code, repeated for convenience.

    - minimum: ` 400 `

    - maximum: ` 599 `

  - ` code `: type ` string ` — Stable machine-readable error code from the errors catalog.

    - pattern: ` "^[a-z][a-z0-9_]*$" `

  - ` detail `: type ` string ` — Explanation of this occurrence. Never contains secrets.

  - ` instance `: type ` string ` — The request ID (`req_…`) of the request that failed. Include it when you contact support.

    - example: ` "req_01m5t4yg394wegr3j4y01qb363" `

  - ` errors `: type ` array ` — Validation problems, one per field (`invalid_request` and the other codes that list `errors`).

    - ` array item `: type ` object ` — One validation problem.

      - Required fields: ` pointer `, ` detail `

      - ` pointer `: type ` string ` — Where the problem is: a JSON pointer into the request body (`/url`, `/steps/0/uses`), or `#query/<name>`, `#path/<name>` or `#header/<name>` for parameters. 

        - example: ` "/url" `

      - ` detail `: type ` string ` — What is wrong there.

        - example: ` "must be an absolute http or https URL" `

  - ` reason `: type ` string ` — Finer-grained cause for codes that document one (`unauthorized`, `forbidden`, `egress_denied`, `upstream_unreachable`, …).

  - ` required_scope `: type ` string ` — The scope that was missing (`forbidden` with `reason: scope`).

  - ` retry_after_s `: type ` integer ` — Same value as the `Retry-After` header, for clients that only read the body.

    - minimum: ` 0 `

  - ` limit `: type ` object ` — The limit an error refers to. IDs and current values are listed by `GET /v1/limits`.

    - Required fields: ` id `, ` limit `, ` unit `

    - ` id `: type ` string ` — Limit ID, such as `vision.scrape.rpm` or `sandboxes.concurrent`.

      - example: ` "vision.scrape.rpm" `

    - ` limit `: type ` number ` — The limit's value.

    - ` unit `: type ` string ` — What the limit counts, such as `requests`, `sandboxes`, `vcpu` or `MiB`.

    - ` window_s `: type ` integer ` — Window length in seconds for rate limits and quotas.

    - ` current `: type ` number ` — Current usage against the limit, when known.

  - ` current_status `: type ` string ` — The object's current status, for state conflicts such as `sandbox_not_running`.

  - ` upstream_status `: type ` integer ` — The HTTP status the upstream returned (`upstream_error`, `action_output_invalid`).

  - ` step `: type ` string ` — The failed step, as a step ID (routines), an index (`act`) or a path such as `beats/2/do/0` (render).

  - ` pack_error `: type ` object ` — The error a pack's error mapping chose (`upstream_error` from pack actions).

    - Required fields: ` code `, ` message `, ` retryable `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` retryable `: type ` boolean `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Example:

```json
{
  "type": "https://docs.beta.b3os.org/errors#forbidden",
  "title": "Forbidden",
  "status": 403,
  "code": "forbidden",
  "detail": "This key lacks the scope sandboxes:write",
  "instance": "req_01m5t4yg394wegr3j4y01qb363",
  "reason": "scope",
  "required_scope": "sandboxes:write"
}
```

### ` 404 ` — No such pack or version (`pack_not_found`, `pack_version_not_found`).

Content type: ` application/problem+json `

- ` value `: type ` object ` — An RFC 9457 problem. `code` is stable and listed in the errors catalog; `type` links to its entry. `detail` is human-readable and may change. Extension members appear only for the codes that document them; ignore members you do not recognize. 

  - Required fields: ` type `, ` title `, ` status `, ` code `, ` detail `

  - ` type `: type ` string `; format ` uri ` — `https://docs.beta.b3os.org/errors#<code>`.

    - example: ` "https://docs.beta.b3os.org/errors#invalid_request" `

  - ` title `: type ` string ` — Short summary of the problem type.

  - ` status `: type ` integer ` — The HTTP status code, repeated for convenience.

    - minimum: ` 400 `

    - maximum: ` 599 `

  - ` code `: type ` string ` — Stable machine-readable error code from the errors catalog.

    - pattern: ` "^[a-z][a-z0-9_]*$" `

  - ` detail `: type ` string ` — Explanation of this occurrence. Never contains secrets.

  - ` instance `: type ` string ` — The request ID (`req_…`) of the request that failed. Include it when you contact support.

    - example: ` "req_01m5t4yg394wegr3j4y01qb363" `

  - ` errors `: type ` array ` — Validation problems, one per field (`invalid_request` and the other codes that list `errors`).

    - ` array item `: type ` object ` — One validation problem.

      - Required fields: ` pointer `, ` detail `

      - ` pointer `: type ` string ` — Where the problem is: a JSON pointer into the request body (`/url`, `/steps/0/uses`), or `#query/<name>`, `#path/<name>` or `#header/<name>` for parameters. 

        - example: ` "/url" `

      - ` detail `: type ` string ` — What is wrong there.

        - example: ` "must be an absolute http or https URL" `

  - ` reason `: type ` string ` — Finer-grained cause for codes that document one (`unauthorized`, `forbidden`, `egress_denied`, `upstream_unreachable`, …).

  - ` required_scope `: type ` string ` — The scope that was missing (`forbidden` with `reason: scope`).

  - ` retry_after_s `: type ` integer ` — Same value as the `Retry-After` header, for clients that only read the body.

    - minimum: ` 0 `

  - ` limit `: type ` object ` — The limit an error refers to. IDs and current values are listed by `GET /v1/limits`.

    - Required fields: ` id `, ` limit `, ` unit `

    - ` id `: type ` string ` — Limit ID, such as `vision.scrape.rpm` or `sandboxes.concurrent`.

      - example: ` "vision.scrape.rpm" `

    - ` limit `: type ` number ` — The limit's value.

    - ` unit `: type ` string ` — What the limit counts, such as `requests`, `sandboxes`, `vcpu` or `MiB`.

    - ` window_s `: type ` integer ` — Window length in seconds for rate limits and quotas.

    - ` current `: type ` number ` — Current usage against the limit, when known.

  - ` current_status `: type ` string ` — The object's current status, for state conflicts such as `sandbox_not_running`.

  - ` upstream_status `: type ` integer ` — The HTTP status the upstream returned (`upstream_error`, `action_output_invalid`).

  - ` step `: type ` string ` — The failed step, as a step ID (routines), an index (`act`) or a path such as `beats/2/do/0` (render).

  - ` pack_error `: type ` object ` — The error a pack's error mapping chose (`upstream_error` from pack actions).

    - Required fields: ` code `, ` message `, ` retryable `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` retryable `: type ` boolean `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Example:

```json
{
  "type": "https://docs.beta.b3os.org/errors#pack_not_found",
  "title": "Pack not found",
  "status": 404,
  "code": "pack_not_found",
  "detail": "No pack io.b3os/gitlab is available",
  "instance": "req_01m5t4yg394wegr3j4y01qb363"
}
```

### ` 429 ` — A rate, concurrency or quota limit applies (`rate_limited`, `concurrency_limited`, `quota_exceeded`).

Content type: ` application/problem+json `

- ` value `: type ` object ` — An RFC 9457 problem. `code` is stable and listed in the errors catalog; `type` links to its entry. `detail` is human-readable and may change. Extension members appear only for the codes that document them; ignore members you do not recognize. 

  - Required fields: ` type `, ` title `, ` status `, ` code `, ` detail `

  - ` type `: type ` string `; format ` uri ` — `https://docs.beta.b3os.org/errors#<code>`.

    - example: ` "https://docs.beta.b3os.org/errors#invalid_request" `

  - ` title `: type ` string ` — Short summary of the problem type.

  - ` status `: type ` integer ` — The HTTP status code, repeated for convenience.

    - minimum: ` 400 `

    - maximum: ` 599 `

  - ` code `: type ` string ` — Stable machine-readable error code from the errors catalog.

    - pattern: ` "^[a-z][a-z0-9_]*$" `

  - ` detail `: type ` string ` — Explanation of this occurrence. Never contains secrets.

  - ` instance `: type ` string ` — The request ID (`req_…`) of the request that failed. Include it when you contact support.

    - example: ` "req_01m5t4yg394wegr3j4y01qb363" `

  - ` errors `: type ` array ` — Validation problems, one per field (`invalid_request` and the other codes that list `errors`).

    - ` array item `: type ` object ` — One validation problem.

      - Required fields: ` pointer `, ` detail `

      - ` pointer `: type ` string ` — Where the problem is: a JSON pointer into the request body (`/url`, `/steps/0/uses`), or `#query/<name>`, `#path/<name>` or `#header/<name>` for parameters. 

        - example: ` "/url" `

      - ` detail `: type ` string ` — What is wrong there.

        - example: ` "must be an absolute http or https URL" `

  - ` reason `: type ` string ` — Finer-grained cause for codes that document one (`unauthorized`, `forbidden`, `egress_denied`, `upstream_unreachable`, …).

  - ` required_scope `: type ` string ` — The scope that was missing (`forbidden` with `reason: scope`).

  - ` retry_after_s `: type ` integer ` — Same value as the `Retry-After` header, for clients that only read the body.

    - minimum: ` 0 `

  - ` limit `: type ` object ` — The limit an error refers to. IDs and current values are listed by `GET /v1/limits`.

    - Required fields: ` id `, ` limit `, ` unit `

    - ` id `: type ` string ` — Limit ID, such as `vision.scrape.rpm` or `sandboxes.concurrent`.

      - example: ` "vision.scrape.rpm" `

    - ` limit `: type ` number ` — The limit's value.

    - ` unit `: type ` string ` — What the limit counts, such as `requests`, `sandboxes`, `vcpu` or `MiB`.

    - ` window_s `: type ` integer ` — Window length in seconds for rate limits and quotas.

    - ` current `: type ` number ` — Current usage against the limit, when known.

  - ` current_status `: type ` string ` — The object's current status, for state conflicts such as `sandbox_not_running`.

  - ` upstream_status `: type ` integer ` — The HTTP status the upstream returned (`upstream_error`, `action_output_invalid`).

  - ` step `: type ` string ` — The failed step, as a step ID (routines), an index (`act`) or a path such as `beats/2/do/0` (render).

  - ` pack_error `: type ` object ` — The error a pack's error mapping chose (`upstream_error` from pack actions).

    - Required fields: ` code `, ` message `, ` retryable `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` retryable `: type ` boolean `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Response header ` Retry-After ` — Seconds to wait before retrying or polling again.

- ` value `: type ` integer `

  - minimum: ` 0 `

Response header ` RateLimit-Limit ` — Requests allowed in the current window for the limit that applies to this operation.

- ` value `: type ` integer `

Response header ` RateLimit-Remaining ` — Requests left in the current window.

- ` value `: type ` integer `

Response header ` RateLimit-Reset ` — Seconds until the current window resets.

- ` value `: type ` integer `

Response header ` RateLimit-Policy ` — The applied policy as `<limit>;w=<window seconds>;name="<limit id>"` (limit IDs are listed by `GET /v1/limits`).

- ` value `: type ` string `

Example:

```json
{
  "type": "https://docs.beta.b3os.org/errors#rate_limited",
  "title": "Rate limited",
  "status": 429,
  "code": "rate_limited",
  "detail": "60 scrapes per minute allowed; retry in 12 seconds",
  "instance": "req_01m5t4yg394wegr3j4y01qb363",
  "retry_after_s": 12,
  "limit": {
    "id": "vision.scrape.rpm",
    "limit": 60,
    "unit": "requests",
    "window_s": 60,
    "current": 60
  }
}
```

### ` 500 ` — Something failed inside B3OS (`internal`). Retry with backoff.

Content type: ` application/problem+json `

- ` value `: type ` object ` — An RFC 9457 problem. `code` is stable and listed in the errors catalog; `type` links to its entry. `detail` is human-readable and may change. Extension members appear only for the codes that document them; ignore members you do not recognize. 

  - Required fields: ` type `, ` title `, ` status `, ` code `, ` detail `

  - ` type `: type ` string `; format ` uri ` — `https://docs.beta.b3os.org/errors#<code>`.

    - example: ` "https://docs.beta.b3os.org/errors#invalid_request" `

  - ` title `: type ` string ` — Short summary of the problem type.

  - ` status `: type ` integer ` — The HTTP status code, repeated for convenience.

    - minimum: ` 400 `

    - maximum: ` 599 `

  - ` code `: type ` string ` — Stable machine-readable error code from the errors catalog.

    - pattern: ` "^[a-z][a-z0-9_]*$" `

  - ` detail `: type ` string ` — Explanation of this occurrence. Never contains secrets.

  - ` instance `: type ` string ` — The request ID (`req_…`) of the request that failed. Include it when you contact support.

    - example: ` "req_01m5t4yg394wegr3j4y01qb363" `

  - ` errors `: type ` array ` — Validation problems, one per field (`invalid_request` and the other codes that list `errors`).

    - ` array item `: type ` object ` — One validation problem.

      - Required fields: ` pointer `, ` detail `

      - ` pointer `: type ` string ` — Where the problem is: a JSON pointer into the request body (`/url`, `/steps/0/uses`), or `#query/<name>`, `#path/<name>` or `#header/<name>` for parameters. 

        - example: ` "/url" `

      - ` detail `: type ` string ` — What is wrong there.

        - example: ` "must be an absolute http or https URL" `

  - ` reason `: type ` string ` — Finer-grained cause for codes that document one (`unauthorized`, `forbidden`, `egress_denied`, `upstream_unreachable`, …).

  - ` required_scope `: type ` string ` — The scope that was missing (`forbidden` with `reason: scope`).

  - ` retry_after_s `: type ` integer ` — Same value as the `Retry-After` header, for clients that only read the body.

    - minimum: ` 0 `

  - ` limit `: type ` object ` — The limit an error refers to. IDs and current values are listed by `GET /v1/limits`.

    - Required fields: ` id `, ` limit `, ` unit `

    - ` id `: type ` string ` — Limit ID, such as `vision.scrape.rpm` or `sandboxes.concurrent`.

      - example: ` "vision.scrape.rpm" `

    - ` limit `: type ` number ` — The limit's value.

    - ` unit `: type ` string ` — What the limit counts, such as `requests`, `sandboxes`, `vcpu` or `MiB`.

    - ` window_s `: type ` integer ` — Window length in seconds for rate limits and quotas.

    - ` current `: type ` number ` — Current usage against the limit, when known.

  - ` current_status `: type ` string ` — The object's current status, for state conflicts such as `sandbox_not_running`.

  - ` upstream_status `: type ` integer ` — The HTTP status the upstream returned (`upstream_error`, `action_output_invalid`).

  - ` step `: type ` string ` — The failed step, as a step ID (routines), an index (`act`) or a path such as `beats/2/do/0` (render).

  - ` pack_error `: type ` object ` — The error a pack's error mapping chose (`upstream_error` from pack actions).

    - Required fields: ` code `, ` message `, ` retryable `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` retryable `: type ` boolean `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Example:

```json
{
  "type": "https://docs.beta.b3os.org/errors#internal",
  "title": "Internal error",
  "status": 500,
  "code": "internal",
  "detail": "internal error",
  "instance": "req_01m5t4yg394wegr3j4y01qb363"
}
```

### ` 503 ` — The node or the product is not available right now (`node_unavailable`, `product_unavailable`, `capacity_unavailable`).

Content type: ` application/problem+json `

- ` value `: type ` object ` — An RFC 9457 problem. `code` is stable and listed in the errors catalog; `type` links to its entry. `detail` is human-readable and may change. Extension members appear only for the codes that document them; ignore members you do not recognize. 

  - Required fields: ` type `, ` title `, ` status `, ` code `, ` detail `

  - ` type `: type ` string `; format ` uri ` — `https://docs.beta.b3os.org/errors#<code>`.

    - example: ` "https://docs.beta.b3os.org/errors#invalid_request" `

  - ` title `: type ` string ` — Short summary of the problem type.

  - ` status `: type ` integer ` — The HTTP status code, repeated for convenience.

    - minimum: ` 400 `

    - maximum: ` 599 `

  - ` code `: type ` string ` — Stable machine-readable error code from the errors catalog.

    - pattern: ` "^[a-z][a-z0-9_]*$" `

  - ` detail `: type ` string ` — Explanation of this occurrence. Never contains secrets.

  - ` instance `: type ` string ` — The request ID (`req_…`) of the request that failed. Include it when you contact support.

    - example: ` "req_01m5t4yg394wegr3j4y01qb363" `

  - ` errors `: type ` array ` — Validation problems, one per field (`invalid_request` and the other codes that list `errors`).

    - ` array item `: type ` object ` — One validation problem.

      - Required fields: ` pointer `, ` detail `

      - ` pointer `: type ` string ` — Where the problem is: a JSON pointer into the request body (`/url`, `/steps/0/uses`), or `#query/<name>`, `#path/<name>` or `#header/<name>` for parameters. 

        - example: ` "/url" `

      - ` detail `: type ` string ` — What is wrong there.

        - example: ` "must be an absolute http or https URL" `

  - ` reason `: type ` string ` — Finer-grained cause for codes that document one (`unauthorized`, `forbidden`, `egress_denied`, `upstream_unreachable`, …).

  - ` required_scope `: type ` string ` — The scope that was missing (`forbidden` with `reason: scope`).

  - ` retry_after_s `: type ` integer ` — Same value as the `Retry-After` header, for clients that only read the body.

    - minimum: ` 0 `

  - ` limit `: type ` object ` — The limit an error refers to. IDs and current values are listed by `GET /v1/limits`.

    - Required fields: ` id `, ` limit `, ` unit `

    - ` id `: type ` string ` — Limit ID, such as `vision.scrape.rpm` or `sandboxes.concurrent`.

      - example: ` "vision.scrape.rpm" `

    - ` limit `: type ` number ` — The limit's value.

    - ` unit `: type ` string ` — What the limit counts, such as `requests`, `sandboxes`, `vcpu` or `MiB`.

    - ` window_s `: type ` integer ` — Window length in seconds for rate limits and quotas.

    - ` current `: type ` number ` — Current usage against the limit, when known.

  - ` current_status `: type ` string ` — The object's current status, for state conflicts such as `sandbox_not_running`.

  - ` upstream_status `: type ` integer ` — The HTTP status the upstream returned (`upstream_error`, `action_output_invalid`).

  - ` step `: type ` string ` — The failed step, as a step ID (routines), an index (`act`) or a path such as `beats/2/do/0` (render).

  - ` pack_error `: type ` object ` — The error a pack's error mapping chose (`upstream_error` from pack actions).

    - Required fields: ` code `, ` message `, ` retryable `

    - ` code `: type ` string `

    - ` message `: type ` string `

    - ` retryable `: type ` boolean `

Response header ` x-request-id ` — The request ID (`req_…`). It is the `instance` of any problem and the key for `GET /v1/requests/{request_id}`.

- ` value `: type ` string `

  - pattern: ` "^req_[0-9a-hjkmnp-tv-z]{26}$" `

Response header ` Server-Timing ` — Phase durations in milliseconds (W3C Server Timing); the handler's phases break the request down. For a
response whose body size is known, `total` runs from reading the request head to writing the response head.
Streaming responses (event streams, WebSockets, chunked bodies) carry no `total` here: they report their
final phases in the terminal event (`job.succeeded`, `job.failed`, `job.canceled`) or the final job. The
time from the first request byte to the last response byte is recorded in the node's metrics and request
log (`GET /v1/requests/{request_id}`). The edge prepends `edge_auth` and `edge_upstream`.


- ` value `: type ` string `

Response header ` Retry-After ` — Seconds to wait before retrying or polling again.

- ` value `: type ` integer `

  - minimum: ` 0 `

Example:

```json
{
  "type": "https://docs.beta.b3os.org/errors#node_unavailable",
  "title": "Node unavailable",
  "status": 503,
  "code": "node_unavailable",
  "detail": "Node n1 is not reachable; retry in 5 seconds",
  "instance": "req_01m5t4yg394wegr3j4y01qb363",
  "retry_after_s": 5
}
```

## Request examples

### cURL

```curl
curl -X GET 'https://beta-api.b3os.org/v1/actions/packs/io.b3os/github/versions/1.0.0/manifest' \
  -H 'Authorization: Bearer YOUR_API_TOKEN'
```

### JavaScript

```javascript
const response = await fetch('https://beta-api.b3os.org/v1/actions/packs/io.b3os/github/versions/1.0.0/manifest', {
  method: 'GET',
  headers: {
      "Authorization": "Bearer YOUR_API_TOKEN"
  }
});

const data = await response.json();
console.log(data);
```

### Python

```python
import requests

headers = {
    'Authorization': 'Bearer YOUR_API_TOKEN'
}

response = requests.get('https://beta-api.b3os.org/v1/actions/packs/io.b3os/github/versions/1.0.0/manifest', headers=headers)
print(response.json())
```