run402-com · Schema

ReleaseInventory

Materialized release inventory (capability agent-deploy-observability). Used by `GET /apply/v1/releases/{release_id}` (activation-time snapshot) and `GET /apply/v1/releases/active` (current-live state). The `state_kind` field discriminates: `"current_live"` for /releases/active; `"effective"` for active/superseded /releases/{release_id}; `"desired_manifest"` for failed/staged /releases/{release_id} (manifest replay, not snapshot).

AIInfrastructureBackendOpen-sourceAgents

Properties

Name Type Description
static_continuity object
kind string
schema_version string
release_id stringnull
project_id string
parent_id stringnull
status string
manifest_digest string Hex-encoded SHA-256 of the canonical manifest.
created_at string
created_by stringnull
actor object Immutable release action actor; null for legacy releases.
activated_at stringnull
superseded_at stringnull
operation_id stringnull
plan_id stringnull
events_url stringnull Full path to the deploy operation's event stream, if known.
effective boolean True for active/superseded releases (state was actually realized); false for failed/staged (desired-manifest only).
state_kind string
release_generation integernull Monotonic active-host generation used for cache keys and diagnostics.
deployment_id stringnull The dpl_ site deployment this release serves — what managed subdomain bindings point at and what POST /subdomains/v1 resolves a release_id to. Null for a release that never carried site files.
static_manifest_sha256 stringnull SHA-256 of the canonical run402.static_manifest.v1 object for this materialized release.
static_manifest_metadata object
embedding object The release's framing opt-in as catalog keys (tenant-site-embedding), or null when the release denies framing.
sign_in_path stringnull The app's own sign-in page for MCP authorization (`site.sign_in_path`), or null for the hosted page.
noindex boolean Whether the release declared `site.noindex`: every response of the host carries `X-Robots-Tag: noindex, nofollow, nosnippet`.
static_public_paths array Materialized static public-path entries, including explicit direct paths and route-only static aliases. Empty when there is no static manifest.
site object
functions array
secrets object
subdomains object
routes object
migrations_applied array
View JSON Schema on GitHub

JSON Schema

run402-com-release-inventory-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/run402-com/json-schema/run402-com-release-inventory-schema.json",
  "title": "ReleaseInventory",
  "description": "Materialized release inventory (capability agent-deploy-observability). Used by `GET /apply/v1/releases/{release_id}` (activation-time snapshot) and `GET /apply/v1/releases/active` (current-live state). The `state_kind` field discriminates: `\"current_live\"` for /releases/active; `\"effective\"` for active/superseded /releases/{release_id}; `\"desired_manifest\"` for failed/staged /releases/{release_id} (manifest replay, not snapshot).",
  "x-generated": "2026-10-29",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/run402-com-openapi.json#/components/schemas/ReleaseInventory",
  "type": "object",
  "required": [
    "kind",
    "schema_version",
    "release_id",
    "project_id",
    "status",
    "manifest_digest",
    "created_at",
    "effective",
    "state_kind",
    "release_generation",
    "static_manifest_sha256",
    "static_manifest_metadata",
    "static_public_paths",
    "site",
    "functions",
    "secrets",
    "subdomains",
    "routes",
    "migrations_applied"
  ],
  "properties": {
    "static_continuity": {
      "$ref": "#/$defs/StaticContinuity"
    },
    "kind": {
      "type": "string",
      "enum": [
        "release_inventory"
      ]
    },
    "schema_version": {
      "type": "string",
      "enum": [
        "agent-deploy-observability.v1"
      ]
    },
    "release_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "project_id": {
      "type": "string"
    },
    "parent_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "superseded",
        "failed",
        "staged"
      ]
    },
    "manifest_digest": {
      "type": "string",
      "description": "Hex-encoded SHA-256 of the canonical manifest."
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "created_by": {
      "type": [
        "string",
        "null"
      ]
    },
    "actor": {
      "allOf": [
        {
          "$ref": "#/$defs/OperationActorSnapshot"
        }
      ],
      "nullable": true,
      "description": "Immutable release action actor; null for legacy releases."
    },
    "activated_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "superseded_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time"
    },
    "operation_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "plan_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "events_url": {
      "type": [
        "string",
        "null"
      ],
      "description": "Full path to the deploy operation's event stream, if known."
    },
    "effective": {
      "type": "boolean",
      "description": "True for active/superseded releases (state was actually realized); false for failed/staged (desired-manifest only)."
    },
    "state_kind": {
      "type": "string",
      "enum": [
        "current_live",
        "effective",
        "desired_manifest"
      ]
    },
    "release_generation": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Monotonic active-host generation used for cache keys and diagnostics."
    },
    "deployment_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "The dpl_ site deployment this release serves — what managed subdomain bindings point at and what POST /subdomains/v1 resolves a release_id to. Null for a release that never carried site files."
    },
    "static_manifest_sha256": {
      "type": [
        "string",
        "null"
      ],
      "description": "SHA-256 of the canonical run402.static_manifest.v1 object for this materialized release."
    },
    "static_manifest_metadata": {
      "$ref": "#/$defs/StaticManifestMetadata"
    },
    "embedding": {
      "description": "The release's framing opt-in as catalog keys (tenant-site-embedding), or null when the release denies framing.",
      "nullable": true,
      "allOf": [
        {
          "$ref": "#/$defs/SiteEmbeddingSpec"
        }
      ]
    },
    "sign_in_path": {
      "type": [
        "string",
        "null"
      ],
      "description": "The app's own sign-in page for MCP authorization (`site.sign_in_path`), or null for the hosted page."
    },
    "noindex": {
      "type": "boolean",
      "description": "Whether the release declared `site.noindex`: every response of the host carries `X-Robots-Tag: noindex, nofollow, nosnippet`."
    },
    "static_public_paths": {
      "type": "array",
      "description": "Materialized static public-path entries, including explicit direct paths and route-only static aliases. Empty when there is no static manifest.",
      "items": {
        "$ref": "#/$defs/StaticPublicPathInventoryEntry"
      }
    },
    "site": {
      "type": "object",
      "required": [
        "paths"
      ],
      "properties": {
        "paths": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/SitePathEntry"
          }
        },
        "totals": {
          "type": "object",
          "properties": {
            "paths": {
              "type": "integer"
            }
          },
          "description": "Present ONLY when paths array was truncated by site_limit."
        }
      }
    },
    "functions": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/FunctionEntry"
      }
    },
    "secrets": {
      "type": "object",
      "required": [
        "keys"
      ],
      "properties": {
        "keys": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "subdomains": {
      "type": "object",
      "required": [
        "names"
      ],
      "properties": {
        "names": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "routes": {
      "$ref": "#/$defs/MaterializedRoutes"
    },
    "migrations_applied": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/MigrationAppliedEntry"
      }
    }
  },
  "$defs": {
    "AppRepoName": {
      "type": "string",
      "pattern": "^[a-z0-9][a-z0-9._-]{0,63}$",
      "description": "App repo name; must not end in `.git`. `default` always exists."
    },
    "AuthenticatorSnapshot": {
      "type": "object",
      "required": [
        "authenticator_id",
        "kind",
        "public_subject"
      ],
      "properties": {
        "authenticator_id": {
          "type": "string"
        },
        "kind": {
          "type": "string"
        },
        "public_subject": {
          "type": "string"
        }
      }
    },
    "AuthoritySnapshot": {
      "type": "object",
      "required": [
        "kind"
      ],
      "description": "Discriminated immutable action-time authority: organization_membership, project_grant, grant_key, ci, system, legacy, or a preserved future kind. A link is never an authority kind.",
      "properties": {
        "kind": {
          "type": "string"
        },
        "org_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "project_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "membership_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "grant_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "grant_key_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "credential_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "role": {
          "type": [
            "string",
            "null"
          ]
        },
        "scope": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "reason_code": {
          "type": [
            "string",
            "null"
          ]
        }
      },
      "additionalProperties": true
    },
    "FunctionEntry": {
      "type": "object",
      "description": "Function row materialized from `internal.functions`. NO `env_keys` (would leak secret-key information) and NO `source_sha` (use `code_hash` for content identity).",
      "required": [
        "name",
        "code_hash",
        "runtime",
        "timeout_seconds",
        "memory_mb"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "code_hash": {
          "type": "string"
        },
        "runtime": {
          "type": "string"
        },
        "timeout_seconds": {
          "type": "integer"
        },
        "memory_mb": {
          "type": "integer"
        },
        "schedule": {
          "type": [
            "string",
            "null"
          ]
        },
        "tool": {
          "$ref": "#/$defs/FunctionToolEntry"
        }
      }
    },
    "FunctionToolEntry": {
      "type": "object",
      "description": "add-app-mcp-endpoint: the function's MCP tool, read at commit from a static `export const tool = { description, input, title?, annotations? }` in its source (parsed, never executed). Served on every host of the project at `/_run402/mcp`; a tool call is a POST to `route`.",
      "required": [
        "name",
        "description",
        "input",
        "route"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "The function name, which is the tool name."
        },
        "description": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "input": {
          "type": "object",
          "description": "JSON Schema for the tool's arguments; root `type` is `object`."
        },
        "annotations": {
          "type": "object",
          "additionalProperties": {
            "type": "boolean"
          },
          "description": "MCP tool hints: readOnlyHint, destructiveHint, idempotentHint, openWorldHint."
        },
        "route": {
          "type": [
            "string",
            "null"
          ],
          "description": "The one exact POST route the tool binds to."
        }
      }
    },
    "LinkedIdentitySnapshot": {
      "type": "object",
      "required": [
        "identity_link_id",
        "kind",
        "public_subject",
        "display_subject",
        "verified_at",
        "status_at_capture"
      ],
      "properties": {
        "identity_link_id": {
          "type": "string"
        },
        "kind": {
          "type": "string"
        },
        "public_subject": {
          "type": "string"
        },
        "display_subject": {
          "type": "string"
        },
        "verified_at": {
          "type": "string",
          "format": "date-time"
        },
        "status_at_capture": {
          "type": "string",
          "enum": [
            "active"
          ]
        }
      }
    },
    "MaterializedRoutes": {
      "type": "object",
      "description": "Canonical route manifest for a materialized release, including function routes and exact static URL aliases. A non-null manifest_sha256 indicates the route table is ready for managed-domain and custom-domain lookup.",
      "required": [
        "manifest_sha256",
        "entries"
      ],
      "properties": {
        "manifest_sha256": {
          "type": [
            "string",
            "null"
          ],
          "description": "SHA-256 of the canonical route table, or null when entries is empty."
        },
        "entries": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/RouteEntry"
          }
        }
      }
    },
    "MigrationAppliedEntry": {
      "type": "object",
      "required": [
        "migration_id",
        "checksum_hex",
        "applied_at"
      ],
      "properties": {
        "migration_id": {
          "type": "string"
        },
        "checksum_hex": {
          "type": "string"
        },
        "applied_at": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "OperationActorSnapshot": {
      "type": "object",
      "required": [
        "schema_version",
        "principal",
        "authenticator",
        "authority",
        "captured_at"
      ],
      "properties": {
        "schema_version": {
          "type": "integer",
          "enum": [
            1
          ]
        },
        "principal": {
          "allOf": [
            {
              "$ref": "#/$defs/PrincipalSnapshot"
            }
          ],
          "nullable": true
        },
        "authenticator": {
          "allOf": [
            {
              "$ref": "#/$defs/AuthenticatorSnapshot"
            }
          ],
          "nullable": true
        },
        "authority": {
          "$ref": "#/$defs/AuthoritySnapshot"
        },
        "captured_at": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "PrincipalSnapshot": {
      "type": "object",
      "required": [
        "principal_id",
        "principal_type",
        "display_name_at_capture",
        "linked_identities_at_capture"
      ],
      "properties": {
        "principal_id": {
          "type": "string"
        },
        "principal_type": {
          "type": "string"
        },
        "display_name_at_capture": {
          "type": [
            "string",
            "null"
          ]
        },
        "linked_identities_at_capture": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/LinkedIdentitySnapshot"
          }
        }
      }
    },
    "RouteEntry": {
      "type": "object",
      "description": "Materialized route entry exposed in release/deployment inventory and route diffs. This is the canonicalized form used by managed domains and custom-domain Worker manifests. Static alias entries carry target { type: \"static\", file } and exact GET+HEAD effective methods. Function entries may carry canonical pricing. Repo entries carry target { type: \"repo\", repo, path, requireAuth?, requireRole? } and effective GET+HEAD methods.",
      "required": [
        "pattern",
        "kind",
        "prefix",
        "methods",
        "target"
      ],
      "properties": {
        "pattern": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "enum": [
            "exact",
            "prefix"
          ]
        },
        "prefix": {
          "type": [
            "string",
            "null"
          ]
        },
        "methods": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "type": "string",
            "enum": [
              "GET",
              "HEAD",
              "POST",
              "PUT",
              "PATCH",
              "DELETE",
              "OPTIONS"
            ]
          },
          "description": "Null means all supported methods."
        },
        "target": {
          "$ref": "#/$defs/RouteTarget"
        },
        "pricing": {
          "$ref": "#/$defs/RoutePricingSpec"
        }
      }
    },
    "RoutePricingDiscovery": {
      "type": "object",
      "description": "Opt-in x402 Bazaar discovery metadata. When present, the route's 402 challenge carries it (resource description, mimeType, serviceName, tags, iconUrl, extensions.bazaar) plus platform attribution (the tag run402 and accepts[].extra.hosted_by), and the first paid call through the CDP facilitator lists the route in the Bazaar. Allowed only on an exact route with exactly one HTTP method (GET may include HEAD). Canonical JSON of this object is at most 4096 bytes.",
      "required": [
        "description"
      ],
      "properties": {
        "description": {
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "description": "What the endpoint does and when to call it. Used verbatim."
        },
        "mime_type": {
          "type": "string",
          "description": "Response media type. Default application/json."
        },
        "service_name": {
          "type": "string",
          "minLength": 1,
          "maxLength": 32,
          "description": "Printable ASCII."
        },
        "tags": {
          "type": "array",
          "maxItems": 4,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32
          },
          "description": "Printable ASCII. The Bazaar keeps five tags; the platform appends run402 as the fifth."
        },
        "icon_url": {
          "type": "string",
          "format": "uri",
          "description": "Absolute https URL on a public host name, without credentials."
        },
        "input": {
          "type": "object",
          "description": "A GET, HEAD, or DELETE route describes query parameters (query_params_schema, object example); a POST, PUT, or PATCH route describes its body (body_type required). Schemas may reference only local # fragments.",
          "properties": {
            "query_params_schema": {
              "type": "object",
              "additionalProperties": true
            },
            "body_type": {
              "type": "string",
              "enum": [
                "json",
                "form-data",
                "text"
              ]
            },
            "body_schema": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "additionalProperties": false
        },
        "output": {
          "type": "object",
          "properties": {
            "schema": {
              "type": "object",
              "additionalProperties": true
            }
          },
          "additionalProperties": false
        }
      },
      "additionalProperties": false
    },
    "RoutePricingNetwork": {
      "type": "string",
      "enum": [
        "mainnet",
        "testnet",
        "lightning",
        "lightning-testnet",
        "tempo",
        "tempo-testnet"
      ],
      "description": "Tenant payment rail set for priced function routes. mainnet and testnet are USDC on Base over x402, settled to the organization payout wallet; lightning and lightning-testnet are the x402 exact scheme on Bitcoin Lightning (lnbtc), settled to the organization's own Lightning receiver; tempo (chain 4217) and tempo-testnet (Moderato, chain 42431) are an MPP Tempo charge in pathUSD, offered as a WWW-Authenticate: Payment challenge beside the x402 entries and settled to the organization payout address. Omitted networks default to production mainnet; testnet values must be opted in explicitly."
    },
    "RoutePricingSpec": {
      "type": "object",
      "description": "Fixed-price tenant x402 policy for a public function web route. Supported only when target.type is function; static aliases cannot be priced. A challenge advertises maxTimeoutSeconds=300. After proof verification, Idempotency-Key (1-255 visible ASCII bytes) is scoped by verified payer, project, route pattern, and method, then bound to the normalized request contract. Same-payer/same-request/same-key retry is the only status/recovery operation. Successful routed responses expose platform-owned X-Run402-Payment-* headers and the x402 v2 PAYMENT-RESPONSE settlement header (base64 JSON SettleResponse: success, transaction, network, payer), on a first delivery and on a deduplicated replay alike; pending and conflict responses use a canonical error envelope. Tenant execution is at-least-once, so handlers should deduplicate durable effects by paymentId.",
      "required": [
        "mode",
        "amount_usd_micros",
        "pay_to"
      ],
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "always"
          ],
          "description": "Every matching request must settle x402 before the handler runs."
        },
        "amount_usd_micros": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991,
          "description": "USD micro-units charged per matching request. 250000 means $0.25."
        },
        "amount_msat": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991,
          "description": "Pins the Lightning price in millisatoshis for the route's lightning / lightning-testnet entries. Valid only when networks names a Lightning value. Absent, each challenge quotes amount_usd_micros into whole satoshis through the platform Lightning quote; amount_usd_micros stays the ledger amount either way."
        },
        "pay_to": {
          "type": "string",
          "enum": [
            "org_default_payout"
          ],
          "description": "Resolve the owning organization default payout wallet at activation and serve time."
        },
        "networks": {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/$defs/RoutePricingNetwork"
          },
          "description": "Optional supported network set. Omitted means mainnet only. A Lightning value requires the organization's Lightning receiver on that network (LIGHTNING_RECEIVER_REQUIRED at activation); a Lightning-only route needs no EVM payout wallet. receipt cannot be combined with a Lightning value."
        },
        "receipt": {
          "type": "string",
          "enum": [
            "on_fulfillment"
          ],
          "description": "Receipt authoring intent from the public ReleaseSpec contract. Run402 Cloud currently rejects this field at routes.replace.<index>.pricing.receipt before mutation until an interoperable delegated-signer authorization carrier is published; ordinary priced routes remain supported."
        },
        "discovery": {
          "$ref": "#/$defs/RoutePricingDiscovery"
        }
      },
      "additionalProperties": false
    },
    "RouteTarget": {
      "description": "Web Route target. Function targets invoke a same-release Node 22 function. Static targets are exact static URL aliases that serve a materialized same-release static site file without redirecting or rewriting the browser URL. Repo targets serve a file from an app repo's latest `main` commit, resolved on every request, so a commit is live with no deploy (app-repos).",
      "oneOf": [
        {
          "type": "object",
          "required": [
            "type",
            "name"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "function"
              ]
            },
            "name": {
              "type": "string",
              "description": "Name of a materialized function in the same release."
            }
          },
          "additionalProperties": false
        },
        {
          "type": "object",
          "required": [
            "type",
            "file"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "static"
              ]
            },
            "file": {
              "type": "string",
              "description": "Relative materialized static-site file path in the same release. No leading slash, query, fragment, backslash, empty segment, . segment, .. segment, or directory shorthand."
            }
          },
          "additionalProperties": false
        },
        {
          "type": "object",
          "description": "Serve a file from an app repo. Prefix pattern (`/data/*`): `path` is an optional directory (the root when omitted, normalized to end in `/`) and the part matched by `*` is joined to it. Exact pattern: `path` is required and names the file. GET/HEAD only, never priced, counts toward the 100-entry route limit. Responses carry `Content-Type` from the extension, `ETag` the blob id (If-None-Match answers 304), `X-Run402-Commit`, and `Cache-Control: public, max-age=0, must-revalidate` (`private` when gated). A missing file, directory, repo or empty repo is 404 (`APP_REPO_PATH_NOT_FOUND` to an API caller). The repo need not exist at deploy time. The custom-domain Worker always proxies it to the gateway. Also takes the camelCase gate keys a function route takes, `requireAuth` (boolean) and `requireRole` (table, idColumn, roleColumn, allowed, cacheTtl?, onDeny?, signInPath?), validated and enforced exactly as on a function (function-role-gates), including the 303-to-sign-in deny mode, and counting toward the one-triple-per-release rule.",
          "required": [
            "type",
            "repo"
          ],
          "properties": {
            "type": {
              "type": "string",
              "enum": [
                "repo"
              ]
            },
            "repo": {
              "$ref": "#/$defs/AppRepoName"
            },
            "path": {
              "type": "string",
              "description": "No leading /, no empty, ., .. or .git segment."
            }
          },
          "additionalProperties": true
        }
      ]
    },
    "SiteEmbeddingSpec": {
      "type": "object",
      "description": "Framing opt-in for the site (tenant-site-embedding). `frame_ancestors` lists platform embedding catalog KEYS, never raw origins; the gateway expands them into the `Content-Security-Policy: frame-ancestors` the host sends and drops `X-Frame-Options`. Catalog: `localhost` (http://localhost:* and http://127.0.0.1:*). Omitted on a later apply = carry the base release's declaration forward; `null` = clear back to the default deny. Unknown keys, duplicates, an empty array, or any other member fail with INVALID_SPEC naming the valid keys.",
      "required": [
        "frame_ancestors"
      ],
      "properties": {
        "frame_ancestors": {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "enum": [
              "localhost"
            ]
          }
        }
      },
      "additionalProperties": false
    },
    "SitePathEntry": {
      "type": "object",
      "required": [
        "path",
        "content_sha256",
        "content_type"
      ],
      "properties": {
        "path": {
          "type": "string"
        },
        "content_sha256": {
          "type": "string",
          "description": "Lowercase hex SHA-256."
        },
        "content_type": {
          "type": "string"
        },
        "size_bytes": {
          "type": [
            "integer",
            "null"
          ],
          "minimum": 0,
          "description": "Static file byte size when available from CAS metadata."
        }
      }
    },
    "StaticContinuity": {
      "type": "object",
      "description": "Automatic one-hour origin availability for previously direct-public non-HTML paths absent from the active release. Cached copies may outlive the deadline. Plans omit the deadline until supersession.",
      "required": [
        "mode",
        "origin_retention_seconds",
        "scope",
        "source_release_id",
        "source_release_generation",
        "retained_path_count"
      ],
      "properties": {
        "mode": {
          "type": "string",
          "enum": [
            "absent_public_paths"
          ]
        },
        "origin_retention_seconds": {
          "type": "integer",
          "enum": [
            3600
          ]
        },
        "scope": {
          "type": "string",
          "enum": [
            "previously_public_non_html"
          ]
        },
        "source_release_id": {
          "type": [
            "string",
            "null"
          ]
        },
        "source_release_generation": {
          "type": [
            "integer",
            "null"
          ]
        },
        "retained_path_count": {
          "type": "integer",
          "minimum": 0
        },
        "origin_available_until": {
          "type": [
            "string",
            "null"
          ],
          "format": "date-time",
          "description": "Omitted for candidate supersessions; null for an active release."
        }
      }
    },
    "StaticManifestMetadata": {
      "type": "object",
      "required": [
        "file_count",
        "total_bytes",
        "cache_classes",
        "cache_class_sources",
        "spa_fallback"
      ],
      "properties": {
        "file_count": {
          "type": "integer",
          "minimum": 0
        },
        "total_bytes": {
          "type": "integer",
          "minimum": 0
        },
        "cache_classes": {
          "type": "object",
          "additionalProperties": {
            "type": "integer",
            "minimum": 0
          }
        },
        "cache_class_sources": {
          "type": "object",
          "additionalProperties": {
            "type": "integer",
            "minimum": 0
          }
        },
        "spa_fallback": {
          "type": [
            "string",
            "null"
          ]
        }
      }
    },
    "StaticPublicPathInventoryEntry": {
      "type": "object",
      "description": "One materialized public static path in a release inventory. This authenticated read surface explains whether the URL is direct or route-only and which release static asset backs it.",
      "required": [
        "public_path",
        "asset_path",
        "reachability_authority",
        "direct",
        "cache_class",
        "content_type"
      ],
      "properties": {
        "public_path": {
          "type": "string",
          "description": "Canonical browser path, such as /events."
        },
        "asset_path": {
          "type": "string",
          "description": "Private release static asset path backing the public path."
        },
        "reachability_authority": {
          "type": "string",
          "enum": [
            "implicit_file_path",
            "explicit_public_path",
            "route_static_alias"
          ]
        },
        "direct": {
          "type": "boolean",
          "description": "True for ordinary direct static lookup; false for route-only static aliases."
        },
        "cache_class": {
          "type": "string",
          "enum": [
            "html",
            "immutable_versioned",
            "revalidating_asset"
          ]
        },
        "content_type": {
          "type": "string"
        },
        "route_id": {
          "type": "string",
          "description": "Present for route-only static alias entries."
        },
        "methods": {
          "type": "array",
          "description": "Effective static methods for route-only entries.",
          "items": {
            "type": "string",
            "enum": [
              "GET",
              "HEAD"
            ]
          }
        }
      },
      "additionalProperties": false
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/run402-com-release-inventory"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.