run402-com · Schema

DeployPlanResponse

Agent-deploy-observability v2 plan response. In legacy dry-run mode (`POST /apply/v1/plans?dry_run=true`), `plan_id` and `operation_id` are null and no plan/operation rows are created. In reviewed-plan mode, `plan_id` is non-null, `operation_id` is null, and `plan_fingerprint`/`plan_expires_at` make the plan require-able.

AIInfrastructureBackendOpen-sourceAgents

Properties

Name Type Description
static_continuity object
kind string
schema_version string
actor object Immutable plan-creation actor. Null for dry-run/legacy records; never live-enriched.
plan_id stringnull Null only for legacy ?dry_run=true. Reviewed-plan mode returns a non-null require-able plan id.
operation_id stringnull Null for legacy ?dry_run=true and reviewed-plan mode. Ordinary apply plans create an operation id.
base_release_id stringnull
manifest_digest object
is_noop boolean
summary string Pre-rendered counts in prose. User identifiers live in warnings[].affected.
warnings array Plan-time non-blocking warnings. Always present; includes MISSING_REQUIRED_SECRET, deploy-observability warnings such as destructive removals and migration heuristics, Web Route warnings, and exact st
expected_events array Operation event types expected during commit, in execution order.
missing_content array
payment_required object
rehearsal object
migrations object
site object
site_settings object
public_paths object
functions object
secrets object NO changed slot; secrets diff exposes keys only.
subdomains object
routes object
static_assets object
plan_fingerprint stringnull Versioned fingerprint binding reviewed intent: normalized spec digest, manifest digest, concrete base identity, planner semantics, confirmation-required warnings, destructive sets, and diff identity.
plan_expires_at stringnull Reviewed plan expiration timestamp. Present for reviewed-plan mode; current TTL is one hour.
planner_semantics_version stringnull Planner semantics version bound into plan_fingerprint.
base_identity stringnull Concrete base identity bound into plan_fingerprint, e.g. empty or release:.
next_actions array Structured recovery/apply actions. CLI actions include command and argv; direct HTTP callers can branch on type/path/method fields when present.
vault object
effective_access array Declared access preview; pending until PostgreSQL rehearsal/apply. Custom operations may be null. Row checks remain runtime checks.
View JSON Schema on GitHub

JSON Schema

run402-com-deploy-plan-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/run402-com/json-schema/run402-com-deploy-plan-response-schema.json",
  "title": "DeployPlanResponse",
  "description": "Agent-deploy-observability v2 plan response. In legacy dry-run mode (`POST /apply/v1/plans?dry_run=true`), `plan_id` and `operation_id` are null and no plan/operation rows are created. In reviewed-plan mode, `plan_id` is non-null, `operation_id` is null, and `plan_fingerprint`/`plan_expires_at` make the plan require-able.",
  "x-generated": "2026-10-29",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/run402-com-openapi.json#/components/schemas/DeployPlanResponse",
  "type": "object",
  "required": [
    "kind",
    "schema_version",
    "plan_id",
    "operation_id",
    "base_release_id",
    "manifest_digest",
    "is_noop",
    "summary",
    "warnings",
    "expected_events",
    "missing_content",
    "migrations",
    "site",
    "site_settings",
    "functions",
    "secrets",
    "subdomains",
    "routes",
    "static_assets"
  ],
  "properties": {
    "static_continuity": {
      "$ref": "#/$defs/StaticContinuity"
    },
    "kind": {
      "type": "string",
      "enum": [
        "plan_response"
      ]
    },
    "schema_version": {
      "type": "string",
      "enum": [
        "agent-deploy-observability.v1"
      ]
    },
    "actor": {
      "allOf": [
        {
          "$ref": "#/$defs/OperationActorSnapshot"
        }
      ],
      "nullable": true,
      "description": "Immutable plan-creation actor. Null for dry-run/legacy records; never live-enriched."
    },
    "plan_id": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^plan_[A-Za-z0-9_-]+$",
      "description": "Null only for legacy ?dry_run=true. Reviewed-plan mode returns a non-null require-able plan id."
    },
    "operation_id": {
      "type": [
        "string",
        "null"
      ],
      "pattern": "^op_[A-Za-z0-9_-]+$",
      "description": "Null for legacy ?dry_run=true and reviewed-plan mode. Ordinary apply plans create an operation id."
    },
    "base_release_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "manifest_digest": {
      "$ref": "#/$defs/HexSha256"
    },
    "is_noop": {
      "type": "boolean"
    },
    "summary": {
      "type": "string",
      "description": "Pre-rendered counts in prose. User identifiers live in warnings[].affected."
    },
    "warnings": {
      "type": "array",
      "description": "Plan-time non-blocking warnings. Always present; includes MISSING_REQUIRED_SECRET, deploy-observability warnings such as destructive removals and migration heuristics, Web Route warnings, and exact static URL alias warnings.",
      "items": {
        "$ref": "#/$defs/WarningEntry"
      }
    },
    "expected_events": {
      "type": "array",
      "description": "Operation event types expected during commit, in execution order.",
      "items": {
        "type": "string"
      }
    },
    "missing_content": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "sha256",
          "size",
          "present"
        ],
        "properties": {
          "sha256": {
            "$ref": "#/$defs/HexSha256"
          },
          "size": {
            "type": "integer",
            "minimum": 1
          },
          "present": {
            "type": "boolean"
          }
        }
      }
    },
    "payment_required": {
      "allOf": [
        {
          "$ref": "#/$defs/DeployPaymentRequired"
        }
      ],
      "nullable": true
    },
    "rehearsal": {
      "$ref": "#/$defs/PlanRehearsalEnvelope"
    },
    "migrations": {
      "type": "object",
      "required": [
        "new",
        "noop"
      ],
      "properties": {
        "new": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "checksum_hex",
              "transaction"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "checksum_hex": {
                "$ref": "#/$defs/HexSha256"
              },
              "transaction": {
                "type": "string",
                "enum": [
                  "default",
                  "none"
                ]
              }
            }
          }
        },
        "noop": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "checksum_hex"
            ],
            "properties": {
              "id": {
                "type": "string"
              },
              "checksum_hex": {
                "$ref": "#/$defs/HexSha256"
              }
            }
          }
        }
      }
    },
    "site": {
      "type": "object",
      "required": [
        "added",
        "removed",
        "changed"
      ],
      "properties": {
        "added": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "path",
              "sha256",
              "content_type"
            ],
            "properties": {
              "path": {
                "type": "string"
              },
              "sha256": {
                "$ref": "#/$defs/HexSha256"
              },
              "content_type": {
                "type": "string"
              }
            }
          }
        },
        "removed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "changed": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "path",
              "sha256_old",
              "sha256_new",
              "content_type_old",
              "content_type_new"
            ],
            "properties": {
              "path": {
                "type": "string"
              },
              "sha256_old": {
                "$ref": "#/$defs/HexSha256"
              },
              "sha256_new": {
                "$ref": "#/$defs/HexSha256"
              },
              "content_type_old": {
                "type": "string"
              },
              "content_type_new": {
                "type": "string"
              },
              "content_type_inferred": {
                "type": [
                  "boolean",
                  "null"
                ]
              }
            }
          }
        },
        "totals": {
          "type": "object",
          "properties": {
            "added": {
              "type": "integer"
            },
            "removed": {
              "type": "integer"
            },
            "changed": {
              "type": "integer"
            }
          },
          "description": "Present only when any site diff bucket was truncated."
        }
      }
    },
    "site_settings": {
      "$ref": "#/$defs/SiteSettingsDiff"
    },
    "public_paths": {
      "$ref": "#/$defs/PublicPathsDiff"
    },
    "functions": {
      "type": "object",
      "required": [
        "added",
        "removed",
        "changed"
      ],
      "properties": {
        "added": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "removed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "changed": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "name",
              "fields_changed"
            ],
            "properties": {
              "name": {
                "type": "string"
              },
              "fields_changed": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "code_hash",
                    "runtime",
                    "timeout_seconds",
                    "memory_mb",
                    "schedule"
                  ]
                }
              }
            }
          }
        }
      }
    },
    "secrets": {
      "type": "object",
      "description": "NO changed slot; secrets diff exposes keys only.",
      "required": [
        "added",
        "removed"
      ],
      "properties": {
        "added": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "removed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "subdomains": {
      "type": "object",
      "required": [
        "added",
        "removed"
      ],
      "properties": {
        "added": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "removed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "routes": {
      "$ref": "#/$defs/RoutesDiff"
    },
    "static_assets": {
      "$ref": "#/$defs/StaticAssetsDiff"
    },
    "plan_fingerprint": {
      "type": [
        "string",
        "null"
      ],
      "description": "Versioned fingerprint binding reviewed intent: normalized spec digest, manifest digest, concrete base identity, planner semantics, confirmation-required warnings, destructive sets, and diff identity. Present for reviewed-plan mode."
    },
    "plan_expires_at": {
      "type": [
        "string",
        "null"
      ],
      "format": "date-time",
      "description": "Reviewed plan expiration timestamp. Present for reviewed-plan mode; current TTL is one hour."
    },
    "planner_semantics_version": {
      "type": [
        "string",
        "null"
      ],
      "description": "Planner semantics version bound into plan_fingerprint."
    },
    "base_identity": {
      "type": [
        "string",
        "null"
      ],
      "description": "Concrete base identity bound into plan_fingerprint, e.g. empty or release:<release_id>."
    },
    "next_actions": {
      "type": "array",
      "description": "Structured recovery/apply actions. CLI actions include command and argv; direct HTTP callers can branch on type/path/method fields when present.",
      "items": {
        "type": "object",
        "additionalProperties": true
      }
    },
    "vault": {
      "$ref": "#/$defs/VaultPlanRider"
    },
    "effective_access": {
      "description": "Declared access preview; pending until PostgreSQL rehearsal/apply. Custom operations may be null. Row checks remain runtime checks.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "table": {
            "type": "string"
          },
          "role": {
            "type": "string",
            "enum": [
              "anon",
              "authenticated"
            ]
          },
          "declared_operations": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "required_privileges": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "validation": {
            "type": "string",
            "enum": [
              "pending",
              "structural"
            ]
          },
          "row_checks": {
            "type": "string",
            "enum": [
              "runtime"
            ]
          },
          "findings": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  },
  "$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
    },
    "DeployPaymentRequired": {
      "type": "object",
      "required": [
        "amount",
        "asset",
        "payTo",
        "reason"
      ],
      "properties": {
        "amount": {
          "type": "string"
        },
        "asset": {
          "type": "string"
        },
        "payTo": {
          "type": "string"
        },
        "reason": {
          "type": "string"
        }
      }
    },
    "HexSha256": {
      "type": "string",
      "pattern": "^[0-9a-f]{64}$"
    },
    "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"
          ]
        }
      }
    },
    "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"
        }
      }
    },
    "PlanRehearsalEnvelope": {
      "type": "object",
      "required": [
        "available",
        "rehearse_url",
        "reason"
      ],
      "properties": {
        "available": {
          "type": "boolean",
          "description": "True for a persisted plan that carries at least one migration the commit would actually run, on a project that has a live release to protect. `run402 up` rehearses automatically when this is true and commits directly otherwise; clients never re-derive the decision."
        },
        "rehearse_url": {
          "type": [
            "string",
            "null"
          ]
        },
        "reason": {
          "type": [
            "string",
            "null"
          ],
          "enum": [
            "no_migrations",
            "no_live_release",
            "migrations_unchanged",
            "ci_session_unsupported",
            null
          ],
          "description": "Why rehearsal is not offered, evaluated in this order: `no_migrations` (the spec declares none), `no_live_release` (a first deploy has nothing to branch from — commit directly), `migrations_unchanged` (the spec declares migrations but every one is already applied with an identical checksum — `migrations.new` is empty — so the commit runs no SQL and there is nothing to rehearse; commit directly), or `ci_session_unsupported` (the plan was made by a CI session, and the rehearse route refuses CI sessions with `403 REHEARSAL_CI_UNSUPPORTED` — commit directly, or rehearse with a wallet, sign-in session, or scoped agent grant key). `null` when `available` is true, or when only a persisted plan id is missing."
        },
        "next_actions": {
          "type": "array",
          "description": "Present with `reason: \"no_live_release\"`, `reason: \"migrations_unchanged\"`, or `reason: \"ci_session_unsupported\"`: one `commit_plan` entry pointing at the plan's commit call and saying why the plan is not rehearsed.",
          "items": {
            "type": "object",
            "required": [
              "type",
              "why"
            ],
            "properties": {
              "type": {
                "type": "string"
              },
              "command": {
                "type": "string"
              },
              "why": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "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"
          }
        }
      }
    },
    "PublicPathsDiff": {
      "type": "object",
      "description": "Which browser URLs serve which release asset (`site.public_paths`), from the base to the target. `mode_old`/`mode_new` are the public path modes; `added`, `removed` and `changed` list direct public paths. A file reachable by its own name in implicit mode is stated by `site` only. A mode switch or any entry makes `is_noop` false and adds a clause to `summary`. `totals` is present only when a bucket was truncated.",
      "required": [
        "mode_old",
        "mode_new",
        "added",
        "removed",
        "changed"
      ],
      "properties": {
        "mode_old": {
          "type": "string",
          "enum": [
            "implicit",
            "explicit"
          ]
        },
        "mode_new": {
          "type": "string",
          "enum": [
            "implicit",
            "explicit"
          ]
        },
        "added": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "public_path",
              "asset_path"
            ],
            "properties": {
              "public_path": {
                "type": "string"
              },
              "asset_path": {
                "type": "string"
              }
            }
          }
        },
        "removed": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "changed": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "public_path",
              "asset_path_old",
              "asset_path_new"
            ],
            "properties": {
              "public_path": {
                "type": "string"
              },
              "asset_path_old": {
                "type": "string"
              },
              "asset_path_new": {
                "type": "string"
              }
            }
          }
        },
        "totals": {
          "type": "object",
          "properties": {
            "added": {
              "type": "integer"
            },
            "removed": {
              "type": "integer"
            },
            "changed": {
              "type": "integer"
            }
          }
        }
      }
    },
    "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": 

# --- truncated at 32 KB (43 KB total) ---
# Full source: https://artifacts.apis.io/run402-com/json-schema/run402-com-deploy-plan-response-schema.json

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-deploy-plan-response"
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.