{"openapi":"3.1.0","info":{"title":"rayfin.dev control plane","version":"1.0.0","description":"Temporary claimable apps. App tokens are returned once. Claims deploy schema and assets, not app data or password users. Browser mutations require a matching Origin header."},"servers":[{"url":"https://rayfin.dev"}],"paths":{"/api/internal/functions/nodes/{node}/register":{"post":{"operationId":"post__api_internal_functions_nodes_node_register","summary":"Enroll a dedicated function node with FN_NODE_TOKEN, never a cell credential","security":[{"functionNodeToken":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}},{"name":"X-Rfd-Node","in":"header","required":true,"schema":{"type":"string"},"description":"Registered function supervisor identity. Never accepted from a sandbox worker."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/internal/functions/heartbeat":{"post":{"operationId":"post__api_internal_functions_heartbeat","summary":"Refresh function node health and authoritative assignments","security":[{"functionNodeToken":[]}],"parameters":[{"name":"X-Rfd-Node","in":"header","required":true,"schema":{"type":"string"},"description":"Registered function supervisor identity. Never accepted from a sandbox worker."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/internal/functions/artifact-grant":{"post":{"operationId":"post__api_internal_functions_artifact_grant","summary":"Issue an assigned generation's read-only artifact grant","security":[{"functionNodeToken":[]}],"parameters":[{"name":"X-Rfd-Node","in":"header","required":true,"schema":{"type":"string"},"description":"Registered function supervisor identity. Never accepted from a sandbox worker."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/internal/functions/ack":{"post":{"operationId":"post__api_internal_functions_ack","summary":"Acknowledge an applied function and secret generation","security":[{"functionNodeToken":[]}],"parameters":[{"name":"X-Rfd-Node","in":"header","required":true,"schema":{"type":"string"},"description":"Registered function supervisor identity. Never accepted from a sandbox worker."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/internal/functions/quota-lease":{"post":{"operationId":"post__api_internal_functions_quota_lease","summary":"Reserve bounded app-wide invocation, CPU and egress budgets","security":[{"functionNodeToken":[]}],"parameters":[{"name":"X-Rfd-Node","in":"header","required":true,"schema":{"type":"string"},"description":"Registered function supervisor identity. Never accepted from a sandbox worker."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/internal/functions/quota-settle":{"post":{"operationId":"post__api_internal_functions_quota_settle","summary":"Settle an issuing node's retired quota reservation to actual consumption, once","security":[{"functionNodeToken":[]}],"parameters":[{"name":"X-Rfd-Node","in":"header","required":true,"schema":{"type":"string"},"description":"Registered function supervisor identity. Never accepted from a sandbox worker."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/challenge":{"get":{"operationId":"get__api_v1_challenge","summary":"Issue a single-use five-minute hashcash challenge","security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"nonce":{"type":"string"},"difficultyBits":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"algorithm":{"type":"string","const":"sha256"},"input":{"type":"string"}},"required":["nonce","difficultyBits","expiresAt","algorithm","input"],"additionalProperties":false}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps":{"post":{"operationId":"post__api_v1_apps","summary":"Create a sandbox with signed agent identity and PoW; issue its app token and claim capability once","security":[{"agentSignature":[]}],"parameters":[{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"appToken":{"type":"string"},"url":{"type":"string","format":"uri"},"claimUrl":{"type":"string","format":"uri"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"templateUrl":{"type":"string","format":"uri"}},"required":["appId","appToken","url","claimUrl","expiresAt","templateUrl"],"additionalProperties":false}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"429":{"description":"rate_limited, fleet_at_capacity","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["rate_limited","fleet_at_capacity"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}},"headers":{"Retry-After":{"schema":{"type":"integer","minimum":1}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[^\\u0000-\\u001f/\\\\]+$"},"agent":{"type":"string","maxLength":200},"publicKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"pow":{"type":"object","properties":{"nonce":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"solution":{"type":"string","pattern":"^[A-Za-z0-9_-]{1,128}$"}},"required":["nonce","solution"],"additionalProperties":false}},"required":["name","publicKey","pow"],"additionalProperties":false}}}}}},"/api/v1/agents/me/apps":{"get":{"operationId":"get__api_v1_agents_me_apps","summary":"List all apps created by this signing key, without app or claim capabilities","security":[{"agentSignature":[]}],"parameters":[{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/agents/me/dashboard-key":{"post":{"operationId":"post__api_v1_agents_me_dashboard_key","summary":"Mint or explicitly rotate a hash-only dashboard capability; supply the cached key to reuse it","security":[{"agentSignature":[]}],"parameters":[{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"rotate":{"default":false,"type":"boolean"},"viewKey":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"}},"additionalProperties":false}}}}}},"/api/v1/apps/{id}":{"get":{"operationId":"get__api_v1_apps_id","summary":"Read app state, last deployment, warnings and claim result","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}},"delete":{"operationId":"delete__api_v1_apps_id","summary":"Delete a sandbox and its snapshots","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"204":{"description":"No content"},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/serving":{"get":{"operationId":"get__api_v1_apps_id_serving","summary":"Read the owning cell's materialized and desired generations without waking it; a two-second cell read, never a deployment","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appId":{"type":"string"},"state":{"type":"string"},"generation":{"anyOf":[{"type":"string","pattern":"^[1-9]\\d*:[a-f0-9]{64}$"},{"type":"null"}],"description":"Materialized cell generation, deploymentId:bundleSha256; null before materialization or when not serving."},"desiredGeneration":{"anyOf":[{"type":"string","pattern":"^[1-9]\\d*:[a-f0-9]{64}$"},{"type":"null"}],"description":"Generation the owning cell is reconciling. A served assertion requires both generations to match the uploaded generation."},"warm":{"description":"Engine observed running without waking it; null while reconciliation holds the runtime lock. Absent on older cells.","type":["boolean","null"]},"warming":{"description":"Admission prewarming is in progress; serving publication waits for this attempt.","type":"boolean"},"functions":{"anyOf":[{"type":"object","properties":{"mode":{"type":"string","enum":["disabled","unsupported","browser-preview","hosted"]},"ready":{"type":"boolean"},"generation":{"type":["string","null"]},"diagnostics":{"maxItems":16,"type":"array","items":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":false}}},"required":["mode","ready","generation","diagnostics"],"additionalProperties":false},{"type":"null"}]},"served":{"type":"boolean"}},"required":["appId","state","generation","desiredGeneration"],"additionalProperties":false}}}},"401":{"description":"unauthorized, invalid_agent_signature","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized","invalid_agent_signature"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"404":{"description":"cell_operation_failed","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["cell_operation_failed"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"502":{"description":"invalid_cell_response, cell_operation_failed","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_cell_response","cell_operation_failed"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"503":{"description":"cell_unavailable, serving_changed","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["cell_unavailable","serving_changed"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/bundle":{"put":{"operationId":"put__api_v1_apps_id_bundle","summary":"Stream and validate a version 1 bundle zip","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}}},"get":{"operationId":"get__api_v1_apps_id_bundle","summary":"Download the latest validated bundle for local claim conversion","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"302":{"description":"Short-lived signed artifact URL","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/logs":{"get":{"operationId":"get__api_v1_apps_id_logs","summary":"Read logs from the owning cell","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Cell log cursor or timestamp","schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"text/plain":{"schema":{"type":"string"}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/users":{"post":{"operationId":"post__api_v1_apps_id_users","summary":"Create a password test user on the cell; retain metadata only","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"username":{"type":"string","minLength":1,"maxLength":254},"password":{"type":"string","minLength":12,"maxLength":256},"roles":{"default":[],"maxItems":20,"type":"array","items":{"type":"string","pattern":"^[a-zA-Z0-9_-]{1,64}$"}}},"required":["username","password"],"additionalProperties":false}}}}},"get":{"operationId":"get__api_v1_apps_id_users","summary":"List cell test-user metadata","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/users/{username}":{"delete":{"operationId":"delete__api_v1_apps_id_users_username","summary":"Remove a cell test user","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"username","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"204":{"description":"No content"},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/auth-settings":{"put":{"operationId":"put__api_v1_apps_id_auth_settings","summary":"Set sandbox signup policy and reconcile its monotonic auth revision","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"allowSignUp":{"type":"boolean"},"revision":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["allowSignUp","revision"],"additionalProperties":false}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"allowSignUp":{"type":"boolean"}},"required":["allowSignUp"],"additionalProperties":false}}}}}},"/api/v1/apps/{id}/shares":{"post":{"operationId":"post__api_v1_apps_id_shares","summary":"Issue a bounded bearer link for an existing test user; return its secret once","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"201":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"grantId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"url":{"type":"string","format":"uri"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"uses":{"type":"integer","minimum":1,"maximum":100}},"required":["grantId","url","expiresAt","uses"],"additionalProperties":false}}}},"404":{"description":"user_unknown","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["user_unknown"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"409":{"description":"app_unavailable","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["app_unavailable"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["rate_limited"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}},"headers":{"Retry-After":{"schema":{"type":"integer","minimum":1}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"username":{"type":"string"},"uses":{"default":1,"type":"integer","minimum":1,"maximum":100},"expiresInSeconds":{"type":"number","exclusiveMinimum":0}},"required":["username"],"additionalProperties":false}}}}},"get":{"operationId":"get__api_v1_apps_id_shares","summary":"List share metadata without secrets","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"shares":{"type":"array","items":{"type":"object","properties":{"grantId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"username":{"type":"string"},"uses":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"usesRemaining":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"revokedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["grantId","username","uses","usesRemaining","expiresAt","revokedAt","lastUsedAt"],"additionalProperties":false}}},"required":["shares"],"additionalProperties":false}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/shares/{grantId}":{"delete":{"operationId":"delete__api_v1_apps_id_shares_grantId","summary":"Revoke future redemptions; already-issued v1 sessions may last until app expiry","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"grantId","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"204":{"description":"No content"},"404":{"description":"share_unknown","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["share_unknown"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/claim-token/rotate":{"post":{"operationId":"post__api_v1_apps_id_claim_token_rotate","summary":"Invalidate the prior claim link and issue a new one once","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/claim-session":{"get":{"operationId":"get__api_v1_claim_session","summary":"Read the app card using the short-lived claim capability cookie, without changing lifetime","security":[{"claimCapability":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/claim-session/device":{"post":{"operationId":"post__api_v1_claim_session_device","summary":"Start organizational device authorization, bound to the claim capability cookie","security":[{"claimCapability":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}},"get":{"operationId":"get__api_v1_claim_session_device","summary":"Poll the device grant server-side; respects interval and slow_down","security":[{"humanSession":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/claim-sessions/sign-in":{"post":{"operationId":"post__api_v1_claim_sessions_sign_in","summary":"Hand off loopback sign-in tokens using the required claim capability in the body (no browser cookie)","security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"continueUrl":{"type":"string","format":"uri"},"expiresIn":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["continueUrl","expiresIn"],"additionalProperties":false}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"claimToken":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"access_token":{"type":"string","minLength":1,"maxLength":24576},"refresh_token":{"type":"string","minLength":1,"maxLength":24576},"expires_in":{"type":"integer","exclusiveMinimum":0,"maximum":86400},"id_token":{"type":"string","minLength":1,"maxLength":24576},"displayName":{"type":"string","maxLength":256},"tenantId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["claimToken","access_token","expires_in","id_token"],"additionalProperties":false}}}}}},"/api/v1/claim-session/events":{"post":{"operationId":"post__api_v1_claim_session_events","summary":"Record an allowed claim funnel event without extending lifetime","security":[{"claimCapability":[]}],"parameters":[],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"type":"string","enum":["claim.page_viewed","claim.trial_link_clicked","claim.handoff_copied","claim.protocol_attempted","claim.protocol_succeeded","claim.command_copied"]}},"required":["kind"],"additionalProperties":false}}}}}},"/api/v1/fabric/workspaces":{"get":{"operationId":"get__api_v1_fabric_workspaces","summary":"Reach destination selection, extend a live app once, and list capacity-backed Fabric workspaces","security":[{"humanSession":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/claims":{"post":{"operationId":"post__api_v1_claims","summary":"Atomically reserve the app and start its conversion job","security":[{"humanSession":[]}],"parameters":[],"responses":{"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"claimToken":{"type":"string","pattern":"^[A-Za-z0-9_-]{43}$"},"workspaceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1,"maxLength":80,"pattern":"^[^\\u0000-\\u001f/\\\\]+$"},"options":{"default":{"rewriteAnonymousGrants":false},"type":"object","properties":{"rewriteAnonymousGrants":{"default":false,"type":"boolean"},"functions":{"type":"object","properties":{"mode":{"type":"string","const":"prebuilt"},"functionBundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"acknowledgeSecretReentry":{"type":"boolean"},"acknowledgeEgressPolicyChange":{"type":"boolean"},"dependsOnSandboxEgress":{"type":"boolean"}},"required":["mode","functionBundleSha256","acknowledgeSecretReentry","acknowledgeEgressPolicyChange","dependsOnSandboxEgress"],"additionalProperties":false}},"additionalProperties":false}},"required":["appId","workspaceId","name"],"additionalProperties":false}}}}}},"/api/v1/claims/local":{"post":{"operationId":"post__api_v1_claims_local","summary":"Record a locally completed deployment without a server-side delegated token","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspaceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"hostingUrl":{"type":"string","maxLength":2048,"format":"uri"},"bundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["appId","itemId","workspaceId","hostingUrl"],"additionalProperties":false}}}}}},"/api/v1/claims/{id}":{"get":{"operationId":"get__api_v1_claims_id","summary":"Read the signed-in claimer's conversion progress","security":[{"humanSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/claims/{id}/resume":{"post":{"operationId":"post__api_v1_claims_id_resume","summary":"Use a fresh sign-in to resume the same frozen artifact and recorded destination","security":[{"humanSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"functions":{"type":"object","properties":{"mode":{"type":"string","const":"prebuilt"},"functionBundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"acknowledgeSecretReentry":{"type":"boolean"},"acknowledgeEgressPolicyChange":{"type":"boolean"},"dependsOnSandboxEgress":{"type":"boolean"}},"required":["mode","functionBundleSha256","acknowledgeSecretReentry","acknowledgeEgressPolicyChange","dependsOnSandboxEgress"],"additionalProperties":false},"verification":{"type":"object","properties":{"deploymentGeneration":{"type":"string","pattern":"^[1-9]\\d*:[a-f0-9]{64}$"},"functionBundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"udfArtifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"verifiedSecretNames":{"maxItems":32,"type":"array","items":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,255}$"}},"applicationVerified":{"type":"boolean","const":true}},"required":["deploymentGeneration","functionBundleSha256","itemId","udfArtifactId","verifiedSecretNames","applicationVerified"],"additionalProperties":false}},"additionalProperties":false}}}}}},"/api/v1/claims/{id}/reconcile":{"post":{"operationId":"post__api_v1_claims_id_reconcile","summary":"Operator and original human attest an inspected, exact remote checkpoint before resuming an uncertain outcome","security":[{"humanSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"checkpoint":{"type":"object","properties":{"deploymentGeneration":{"type":"string","pattern":"^[1-9]\\d*:[a-f0-9]{64}$"},"bundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"functionBundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"schemaSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"workspaceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"udfArtifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"hostingUrl":{"type":"string","maxLength":2048,"format":"uri"},"portalUrl":{"type":"string","maxLength":2048,"format":"uri"},"completedPhases":{"maxItems":5,"type":"array","items":{"type":"string","enum":["item","settings","schema","site","functions"]}},"itemState":{"type":"string","enum":["not_started","started","resolved","unknown"]},"uploadState":{"type":"string","enum":["not_started","started","accepted","complete","failed","unknown"]}},"required":["deploymentGeneration","bundleSha256","workspaceId","completedPhases","itemState","uploadState"],"additionalProperties":false},"inspected":{"type":"boolean","const":true}},"required":["checkpoint","inspected"],"additionalProperties":false}}}}}},"/api/v1/claims/{id}/export":{"get":{"operationId":"get__api_v1_claims_id_export","summary":"Download the original schema and static bundle; v1.0 exports no app data or users","security":[{"humanSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Short-lived signed artifact URL","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/internal/v1/cells/{node}/register":{"post":{"operationId":"post__internal_v1_cells_node_register","summary":"Register a cell address and admission capacity","security":[{"cellToken":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"addr":{"type":"string","format":"uri"},"capacity":{"type":"object","properties":{"memBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"diskBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"maxLiveProcesses":{"type":"integer","exclusiveMinimum":0,"maximum":1000000}},"required":["memBytes","diskBytes","maxLiveProcesses"],"additionalProperties":false},"capabilities":{"type":"object","properties":{"authProtocolVersion":{"type":"integer","minimum":1,"maximum":100},"protectedHosting":{"type":"boolean"},"pkceHandoff":{"type":"boolean"}},"additionalProperties":false}},"required":["addr","capacity"],"additionalProperties":false}}}}}},"/internal/v1/cells/{node}/desired":{"get":{"operationId":"get__internal_v1_cells_node_desired","summary":"Long-poll desired state for up to 30 seconds","security":[{"cellToken":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","required":false,"description":"Last observed desired-state integer version, default -1","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/internal/v1/cells/{node}/heartbeat":{"post":{"operationId":"post__internal_v1_cells_node_heartbeat","summary":"Update cell health and owned app runtime states","security":[{"cellToken":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"usage":{"type":"object","properties":{"memBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"diskBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"liveProcesses":{"type":"integer","minimum":0,"maximum":1000000}},"required":["memBytes","diskBytes","liveProcesses"],"additionalProperties":false},"apps":{"maxItems":100000,"type":"array","items":{"type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"state":{"type":"string","enum":["running","asleep","materialized","evicted"]},"lastRequestAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"dbBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"requests1h":{"type":"integer","minimum":0,"maximum":2147483647}},"required":["appId","state","dbBytes","requests1h"],"additionalProperties":false}}},"required":["usage","apps"],"additionalProperties":false}}}}}},"/internal/v1/cells/{node}/events":{"post":{"operationId":"post__internal_v1_cells_node_events","summary":"Record cell events; human view marks viewed but does not extend TTL","security":[{"cellToken":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","maxItems":1000,"type":"array","items":{"type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"kind":{"type":"string","enum":["app.viewed_by_human","app.request_limit","app.db_limit"]},"at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["appId","kind","at"],"additionalProperties":false}}}}}}},"/internal/v1/bundles/{sha256}":{"get":{"operationId":"get__internal_v1_bundles_sha256","summary":"Redirect to a five-minute read SAS for a validated bundle","security":[{"cellToken":[]}],"parameters":[{"name":"sha256","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Short-lived signed artifact URL","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/internal/v1/apps/{appId}/snapshot":{"put":{"operationId":"put__internal_v1_apps_appId_snapshot","summary":"Obtain a five-minute create/write SAS; explicitly PUT the snapshot to Location","security":[{"cellToken":[]}],"parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"302":{"description":"Short-lived signed artifact URL","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/internal/v1/apps/{appId}/shares/redeem":{"post":{"operationId":"post__internal_v1_apps_appId_shares_redeem","summary":"Atomically consume one share use after checking app and test-user availability","security":[{"cellToken":[]}],"parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"grantId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"username":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"remainingUses":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["grantId","username","expiresAt","remainingUses"],"additionalProperties":false}}}},"404":{"description":"share_unknown","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["share_unknown"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"409":{"description":"app_unavailable","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["app_unavailable"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"410":{"description":"share_expired, share_exhausted, share_revoked","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["share_expired","share_exhausted","share_revoked"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["rate_limited"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}},"headers":{"Retry-After":{"schema":{"type":"integer","minimum":1}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string","minLength":1,"maxLength":256}},"required":["token"],"additionalProperties":false}}}}}},"/internal/v1/apps/{appId}/shares/inspect":{"post":{"operationId":"post__internal_v1_apps_appId_shares_inspect","summary":"Inspect share identity and use limit without consuming the grant","security":[{"cellToken":[]}],"parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"username":{"type":"string"},"expiresAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"useLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"remainingUses":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["username","expiresAt","useLimit","remainingUses"],"additionalProperties":false}}}},"404":{"description":"share_unknown","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["share_unknown"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"409":{"description":"app_unavailable","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["app_unavailable"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"410":{"description":"share_expired, share_exhausted, share_revoked","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["share_expired","share_exhausted","share_revoked"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"429":{"description":"rate_limited","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["rate_limited"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}},"headers":{"Retry-After":{"schema":{"type":"integer","minimum":1}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string","minLength":1,"maxLength":256}},"required":["token"],"additionalProperties":false}}}}}},"/internal/v1/apps/{appId}/route":{"get":{"operationId":"get__internal_v1_apps_appId_route","summary":"Resolve the healthy owning node and interstitial state","security":[{"cellToken":[]}],"parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/internal/v1/apps/{appId}/interstitial":{"get":{"operationId":"get__internal_v1_apps_appId_interstitial","summary":"Read cell-renderable expired, claimed, frozen or unknown app messaging","security":[{"cellToken":[]}],"parameters":[{"name":"appId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/internal/v1/reap":{"post":{"operationId":"post__internal_v1_reap","summary":"Reap app lifetimes, conversion leases and expired secrets, and reconcile placement","security":[{"cellToken":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/internal/v1/claims/{id}/progress":{"post":{"operationId":"post__internal_v1_claims_id_progress","summary":"Publish monotonic conversion progress; finalize or release the reservation","security":[{"callbackToken":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","anyOf":[{"type":"object","properties":{"step":{"type":"string","enum":["prepare","create_item","apply_settings","apply_schema","deploy_static","functions_upload","functions_ready","secrets_pending","verify","verification_pending","done","failed"]},"message":{"type":"string","maxLength":2000,"pattern":"^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$"},"code":{"type":"string","pattern":"^[a-z_]{1,64}$"},"protocolVersion":{"type":"number","const":1},"data":{"type":"object","properties":{"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspaceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"hostingUrl":{"type":"string","maxLength":2048,"format":"uri"},"portalUrl":{"type":"string","maxLength":2048,"format":"uri"}},"additionalProperties":false}},"required":["step","message"],"additionalProperties":false},{"type":"object","properties":{"step":{"type":"string","enum":["prepare","create_item","apply_settings","apply_schema","deploy_static","functions_upload","functions_ready","secrets_pending","verify","verification_pending","done","failed"]},"message":{"type":"string","maxLength":2000,"pattern":"^[^\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f]*$"},"code":{"type":"string","pattern":"^[a-z_]{1,64}$"},"protocolVersion":{"type":"number","const":2},"data":{"type":"object","properties":{"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"workspaceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"hostingUrl":{"type":"string","maxLength":2048,"format":"uri"},"portalUrl":{"type":"string","maxLength":2048,"format":"uri"},"checkpoint":{"type":"object","properties":{"deploymentGeneration":{"type":"string","pattern":"^[1-9]\\d*:[a-f0-9]{64}$"},"bundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"functionBundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"schemaSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"workspaceId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"itemId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"udfArtifactId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"hostingUrl":{"type":"string","maxLength":2048,"format":"uri"},"portalUrl":{"type":"string","maxLength":2048,"format":"uri"},"completedPhases":{"maxItems":5,"type":"array","items":{"type":"string","enum":["item","settings","schema","site","functions"]}},"itemState":{"type":"string","enum":["not_started","started","resolved","unknown"]},"uploadState":{"type":"string","enum":["not_started","started","accepted","complete","failed","unknown"]}},"required":["deploymentGeneration","bundleSha256","workspaceId","completedPhases","itemState","uploadState"],"additionalProperties":false},"outcome":{"type":"string","enum":["partial","unknown"]},"requiredSecretNames":{"maxItems":32,"type":"array","items":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,255}$"}},"verification":{"type":"object","properties":{"site":{"type":"boolean"},"settings":{"type":"boolean"},"functions":{"type":"boolean"},"secrets":{"type":"boolean"},"human":{"type":"boolean"}},"required":["site","settings","functions","secrets","human"],"additionalProperties":false}},"required":["checkpoint"],"additionalProperties":false}},"required":["step","message","protocolVersion","data"],"additionalProperties":false}]}}}}}},"/api/admin/login":{"post":{"operationId":"post__api_admin_login","summary":"Set a short-lived httpOnly admin cookie","security":[],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"string","minLength":1,"maxLength":256}},"required":["token"],"additionalProperties":false}}}}}},"/api/admin/logout":{"post":{"operationId":"post__api_admin_logout","summary":"Clear the admin cookie","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/overview":{"get":{"operationId":"get__api_admin_overview","summary":"Read apps, nodes, claims, daily funnel counts, settings and estimated node spend","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"search","in":"query","required":false,"description":"App ID or name substring","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"App state filter","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/agents":{"get":{"operationId":"get__api_admin_agents","summary":"Read the latest 200 agents and their block state","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/agents/{agentId}/block":{"post":{"operationId":"post__api_admin_agents_agentId_block","summary":"Block or unblock an agent; blocking also revokes its dashboard key","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"agentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"blocked":{"type":"boolean"}},"required":["blocked"],"additionalProperties":false}}}}}},"/api/admin/apps/{id}":{"post":{"operationId":"post__api_admin_apps_id","summary":"Freeze, unfreeze, delete or extend an app","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"action":{"type":"string","enum":["freeze","unfreeze","delete","extend"]},"hours":{"type":"integer","minimum":1,"maximum":168}},"required":["action"],"additionalProperties":false}}}}}},"/api/admin/nodes/{node}":{"post":{"operationId":"post__api_admin_nodes_node","summary":"Drain, re-enable or forget a cell","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"action":{"type":"string","enum":["drain","ready","forget"]}},"required":["action"],"additionalProperties":false}}}}}},"/api/admin/settings":{"put":{"operationId":"put__api_admin_settings","summary":"Set minimum CLI version, admission switches, quotas and estimated hourly node rate","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"minimumCliVersion":{"type":"string","maxLength":200,"description":"Minimum rfd version on agent and app API routes. Omitted values are preserved."},"pauseCreates":{"type":"boolean"},"pauseClaims":{"type":"boolean"},"rateMultiplier":{"type":"number","minimum":0.1,"maximum":10},"nodeHourlyRate":{"type":"number","minimum":0,"maximum":1000},"secretsEnabled":{"type":"boolean","description":"Allow app-secret writes and private function bootstrap. Metadata reads remain available."},"createLimitPerHour":{"type":"integer","minimum":1,"maximum":1000,"description":"Base creates per shared network address per sliding hour, scaled by rateMultiplier. Omitted values are preserved."},"createLimitPerDay":{"type":"integer","minimum":1,"maximum":10000,"description":"Base creates per shared network address per sliding day, scaled by rateMultiplier. Omitted values are preserved."},"deviceCreateLimitPerDay":{"type":"integer","minimum":1,"maximum":1000,"description":"Base creates per device per sliding day, or per signing key for legacy clients without X-Rfd-Device, scaled by rateMultiplier. Omitted values are preserved. Takes precedence over agentCreateLimitPerDay."},"agentCreateLimitPerDay":{"type":"integer","minimum":1,"maximum":1000,"deprecated":true,"description":"Deprecated alias for deviceCreateLimitPerDay."},"storageBytes":{"type":"integer","exclusiveMinimum":0,"maximum":209715200},"storageObjects":{"type":"integer","exclusiveMinimum":0,"maximum":1000},"storageFileBytes":{"type":"integer","exclusiveMinimum":0,"maximum":26214400},"functionsEnabled":{"type":"boolean"},"functionsKillSwitch":{"type":"boolean"},"functionsPrivatePreview":{"maxItems":256,"type":"array","items":{"type":"string","pattern":"^(?:[a-z2-7]{10}|[a-z2-7]{16})$"}},"functionsCallsPerHour":{"type":"integer","minimum":1,"maximum":1000},"functionsCpuSecondsPerDay":{"type":"integer","minimum":1,"maximum":1800},"functionsEgressBytesPerDay":{"type":"integer","minimum":1,"maximum":20971520},"functionsWallSeconds":{"type":"integer","minimum":1,"maximum":60},"functionsClaimMode":{"type":"string","enum":["refuse","gate","public"]},"functionsClaimGateAppIds":{"maxItems":1,"type":"array","items":{"type":"string","pattern":"^[a-z2-7]{10}$"}},"functionsClaimLiveGatePassed":{"type":"boolean"},"graceDaysDefault":{"type":"integer","minimum":0,"maximum":30},"graceDaysWithClaimIntent":{"type":"integer","minimum":0,"maximum":30},"egressBytesPerAppPerDay":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["pauseCreates","pauseClaims","rateMultiplier","nodeHourlyRate"],"additionalProperties":false}}}}}},"/internal/v1/cells/{node}/samples":{"post":{"operationId":"post__internal_v1_cells_node_samples","summary":"Ingest cumulative cell/app telemetry with browser health and reset-aware differencing","security":[{"cellToken":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"intervalSeconds":{"type":"number","exclusiveMinimum":0,"maximum":3600},"counterEpoch":{"type":"string","minLength":1,"maxLength":128},"node":{"type":"object","properties":{"bootId":{"anyOf":[{"type":"string","minLength":1,"maxLength":128},{"type":"null"}]},"cpuCores":{"type":"integer","minimum":1,"maximum":4096},"cpuBusyMillis":{"type":"integer","minimum":0,"maximum":9007199254740991},"cpuCellMillis":{"type":"integer","minimum":0,"maximum":9007199254740991},"memTotalBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"memAvailableBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"diskTotalBytes":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"diskUsedBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"dataUsedBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"appDirBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"platformUsedBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"dataOnOsDisk":{"type":["boolean","null"]},"netRxBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"netTxBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"liveProcesses":{"type":"integer","minimum":0,"maximum":9007199254740991},"materializedApps":{"type":"integer","minimum":0,"maximum":9007199254740991},"casBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"casReclaimedBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"wakeClassification":{"type":"string","const":"idle-cold-v1"},"wakeMillisP50":{"type":"number","minimum":0,"maximum":86400000},"wakeMillisP95":{"type":"number","minimum":0,"maximum":86400000},"wakeObservations":{"type":"integer","minimum":0,"maximum":9007199254740991},"coldWakeMillisP50":{"type":"number","minimum":0,"maximum":86400000},"coldWakeMillisP95":{"type":"number","minimum":0,"maximum":86400000},"coldWakeObservations":{"type":"integer","minimum":0,"maximum":9007199254740991},"wakes":{"type":"integer","minimum":0,"maximum":9007199254740991},"wakePhases":{"type":"object","properties":{"spawn":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"readiness":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"auth":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"schema":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"meta":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"finalize":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"materialize":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"inflate":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"total":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false}},"required":["spawn","readiness","auth","schema","meta","finalize","materialize","inflate","total"],"additionalProperties":false},"coldWakePhases":{"type":"object","properties":{"spawn":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"readiness":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"auth":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"schema":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"meta":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"finalize":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"materialize":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"inflate":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false},"total":{"type":"object","properties":{"p50Ms":{"type":"number","minimum":0,"maximum":86400000},"p95Ms":{"type":"number","minimum":0,"maximum":86400000}},"required":["p50Ms","p95Ms"],"additionalProperties":false}},"required":["spawn","readiness","auth","schema","meta","finalize","materialize","inflate","total"],"additionalProperties":false},"logins":{"type":"integer","minimum":0,"maximum":9007199254740991},"loginQueueMax":{"type":"integer","minimum":0,"maximum":9007199254740991},"loginSaturated":{"type":"integer","minimum":0,"maximum":9007199254740991},"rejected429":{"type":"integer","minimum":0,"maximum":9007199254740991},"rejected413":{"type":"integer","minimum":0,"maximum":9007199254740991},"snapshots":{"type":"integer","minimum":0,"maximum":9007199254740991},"snapshotBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"snapshotWritesAvoided":{"type":"integer","minimum":0,"maximum":9007199254740991}},"required":["cpuCores","cpuBusyMillis","cpuCellMillis","memTotalBytes","memAvailableBytes","diskTotalBytes","diskUsedBytes","netRxBytes","netTxBytes","liveProcesses","materializedApps","casBytes","wakeMillisP50","wakeMillisP95","wakes","logins","loginQueueMax","rejected429","rejected413"],"additionalProperties":false},"apps":{"maxItems":100000,"type":"array","items":{"type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"state":{"type":"string","enum":["running","asleep","materialized","evicted"]},"cpuMillis":{"type":"integer","minimum":0,"maximum":9007199254740991},"rssBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"pssBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"processEpoch":{"type":"string","minLength":1,"maxLength":128},"dbBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"distBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"storageBytes":{"type":"integer","minimum":0,"maximum":9007199254740991},"egressDay":{"type":"integer","minimum":0,"maximum":9007199254740991},"egressBytesToday":{"type":"integer","minimum":0,"maximum":9007199254740991},"dirtyGeneration":{"type":"integer","minimum":0,"maximum":9007199254740991},"snapshotGeneration":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"generation":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}]},"browserErrors1h":{"type":"integer","minimum":0,"maximum":9007199254740991},"snapshotWritesAvoided":{"type":"integer","minimum":0,"maximum":9007199254740991},"wakeClassification":{"type":"string","const":"idle-cold-v1"},"wakeMillisP50":{"type":"number","minimum":0,"maximum":86400000},"wakeMillisP95":{"type":"number","minimum":0,"maximum":86400000},"wakeObservations":{"type":"integer","minimum":0,"maximum":9007199254740991},"coldWakeMillisP50":{"type":"number","minimum":0,"maximum":86400000},"coldWakeMillisP95":{"type":"number","minimum":0,"maximum":86400000},"coldWakeObservations":{"type":"integer","minimum":0,"maximum":9007199254740991},"requests":{"type":"integer","minimum":0,"maximum":9007199254740991},"requestMillisP50":{"type":"number","minimum":0,"maximum":86400000},"requestMillisP95":{"type":"number","minimum":0,"maximum":86400000},"requestObservations":{"type":"integer","minimum":0,"maximum":9007199254740991},"errors5xx":{"type":"integer","minimum":0,"maximum":9007199254740991},"errors4xx":{"type":"integer","minimum":0,"maximum":9007199254740991},"bytesOut":{"type":"integer","minimum":0,"maximum":9007199254740991},"staticBytesOut":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastRequestAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]}},"required":["appId","state","dbBytes","distBytes","lastRequestAt"],"additionalProperties":false}}},"required":["at","intervalSeconds","node","apps"],"additionalProperties":false}}}}}},"/internal/v1/rollup":{"post":{"operationId":"post__internal_v1_rollup","summary":"Roll pending node samples into five-minute buckets and apply telemetry retention","security":[{"cellToken":[]}],"parameters":[],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/metrics/fleet/summary":{"get":{"operationId":"get__api_admin_metrics_fleet_summary","summary":"Read current fleet utilization, capacity headroom, admission pressure and funnel KPIs","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"range","in":"query","required":false,"description":"1h, 24h, 7d or 30d; defaults to 24h","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/metrics/fleet/series":{"get":{"operationId":"get__api_admin_metrics_fleet_series","summary":"Read gap-aware fleet or per-node time series","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"range","in":"query","required":false,"description":"1h, 24h, 7d or 30d; defaults to 24h","schema":{"type":"string"}},{"name":"metric","in":"query","required":false,"description":"cpu, memory, disk, running, asleep, materialized, live_apps, wake_p50, wake_p95, cold_wake_p50, cold_wake_p95, wakes, logins, login_queue, rejected_429, rejected_413, requests, errors_5xx, egress, bytesOut, created, expired, claims, run_rate","schema":{"type":"string"}},{"name":"step","in":"query","required":false,"description":"auto or seconds, at most 2000 points","schema":{"type":"string"}},{"name":"node","in":"query","required":false,"description":"Optional node ID","schema":{"type":"string"}},{"name":"groupBy","in":"query","required":false,"description":"cluster or node","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/metrics/apps/top":{"get":{"operationId":"get__api_admin_metrics_apps_top","summary":"Rank and filter apps by measured resource consumption","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"range","in":"query","required":false,"description":"1h (minute samples), 24h, 7d or 30d (five-minute rollups); defaults to 24h (apps/top: 1h)","schema":{"type":"string"}},{"name":"by","in":"query","required":false,"description":"cpu, memory/rss, requests, bytesOut/egress, dbBytes/db, errors, latency or created","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"1 through 1000, default 50","schema":{"type":"string"}},{"name":"node","in":"query","required":false,"description":"Optional node ID","schema":{"type":"string"}},{"name":"state","in":"query","required":false,"description":"Optional catalog or runtime state","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Literal ID/name substring","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/metrics/apps/{id}/series":{"get":{"operationId":"get__api_admin_metrics_apps_id_series","summary":"Read per-app CPU, memory, requests, latency, egress and database history","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"1h (minute samples), 24h, 7d or 30d (five-minute rollups); defaults to 24h (apps/top: 1h)","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/metrics/functions/nodes/{node}/series":{"get":{"operationId":"get__api_admin_metrics_functions_nodes_node_series","summary":"Read function-node sandboxes, memory budget and reset-aware invocation/rejection rates","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"node","in":"path","required":true,"schema":{"type":"string"}},{"name":"range","in":"query","required":false,"description":"1h, 24h, 7d or 30d; defaults to 24h","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/metrics/cost/estimate":{"get":{"operationId":"get__api_admin_metrics_cost_estimate","summary":"Estimate node-hour, egress and snapshot cost against the configured monthly cap","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"range","in":"query","required":false,"description":"1h, 24h, 7d or 30d; defaults to 24h","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/metrics/insights":{"get":{"operationId":"get__api_admin_metrics_insights","summary":"Evaluate evidence-backed capacity, latency, egress and cost rules","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"range","in":"query","required":false,"description":"1h, 24h, 7d or 30d; defaults to 24h","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/cockpit/apps/{id}":{"get":{"operationId":"get__api_admin_cockpit_apps_id","summary":"Read one app's catalog detail: deployments, recent events, claims with progress, snapshots and test-user count","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/cockpit/claims":{"get":{"operationId":"get__api_admin_cockpit_claims","summary":"Read recent claims with step progress and app names","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"limit","in":"query","required":false,"description":"Maximum rows, default 200, at most 500","schema":{"type":"string"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/cockpit/apps/{id}/wake":{"post":{"operationId":"post__api_admin_cockpit_apps_id_wake","summary":"Ask the owning cell to start a live app's process","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/admin/cockpit/apps/{id}/snapshot":{"post":{"operationId":"post__api_admin_cockpit_apps_id_snapshot","summary":"Ask the owning cell to snapshot the app's data to Blob now","security":[{"adminToken":[]},{"adminSession":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"No content"},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/secrets":{"get":{"operationId":"get__api_v1_apps_id_secrets","summary":"List declared and stored secret metadata; requires the exact owning signer, never returns values","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"secretsGeneration":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"secrets":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,255}$"},"set":{"type":"boolean"},"declared":{"type":"boolean"},"secretVersion":{"anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"updatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"},{"type":"null"}]}},"required":["name","set","declared","secretVersion","updatedAt"],"additionalProperties":false}}},"required":["appId","secretsGeneration","secrets"],"additionalProperties":false}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/v1/apps/{id}/secrets/{name}":{"put":{"operationId":"put__api_v1_apps_id_secrets_name","summary":"Set an envelope-encrypted app secret with the exact owning signer","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"value":{"type":"string"}},"required":["value"],"additionalProperties":false}}}}},"delete":{"operationId":"delete__api_v1_apps_id_secrets_name","summary":"Remove a stored value and advance the app secret generation with the exact owning signer","security":[{"appToken":[],"agentSignature":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}},{"name":"User-Agent","in":"header","required":true,"description":"Exactly rfd/<semver>, at or above the operator's minimumCliVersion. An older or unidentified client receives 426 cli_outdated.","schema":{"type":"string"}},{"name":"X-Rfd-Agent-Key","in":"header","required":false,"description":"Unpadded base64url Ed25519 public key. Required before enrollment unless POST /apps includes publicKey.","schema":{"type":"string"}},{"name":"X-Rfd-Content-SHA256","in":"header","required":true,"description":"Lowercase hex SHA-256 of the exact request body, including the empty body. Compared against streamed bytes before mutation.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}},{"name":"X-Rfd-Device","in":"header","required":false,"description":"Lowercase hex SHA-256 of rfd-device-v1: followed by the OS machine identifier (or persisted fallback UUID). Send only the hash. When present, append LF and this hash to the signed message; new keys on the same device share the daily create allowance.","schema":{"type":"string","pattern":"^[a-f0-9]{64}$"}}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"426":{"description":"cli_outdated: update with rfd update or reinstall from rayfin.dev.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}}}},"/api/internal/functions/secrets-bootstrap":{"post":{"operationId":"post__api_internal_functions_secrets_bootstrap","summary":"Obtain a no-store, app/deployment/placement-bound secret snapshot for one registered function sandbox lease","security":[{"functionNodeToken":[]}],"parameters":[{"name":"X-Rfd-Node","in":"header","required":true,"schema":{"type":"string"},"description":"Registered function supervisor identity. Never accepted from a sandbox worker."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"unauthorized","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["unauthorized"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"404":{"description":"app_unknown","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["app_unknown"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"409":{"description":"secrets_missing, secrets_binding_mismatch, functions_stale","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["secrets_missing","secrets_binding_mismatch","functions_stale"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"503":{"description":"secrets_disabled, secrets_unavailable","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["secrets_disabled","secrets_unavailable"]},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}},"default":{"description":"Structured error. A 429 includes Retry-After.","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"appId":{"type":"string","pattern":"^[a-z2-7]{10}$"},"deploymentGeneration":{"type":"string","pattern":"^[1-9]\\d*:[a-f0-9]{64}$"},"functionBundleSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"placementEpoch":{"type":"string","pattern":"^[1-9]\\d{0,19}$"},"requiredNames":{"maxItems":32,"type":"array","items":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]{0,255}$"}},"leaseSeconds":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["appId","deploymentGeneration","functionBundleSha256","placementEpoch","requiredNames","leaseSeconds"],"additionalProperties":false}}}}}},"/":{"get":{"summary":"Landing page; clients that do not ask for HTML get the complete Markdown agent guide instead, the same text as /skill.md","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/index.md":{"get":{"summary":"The complete Markdown agent guide that / returns to clients that do not ask for HTML","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/claim":{"get":{"summary":"Private claim device sign-in, destination, confirmation and progress UI","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/admin":{"get":{"summary":"Prototype administrator sign-in and operations UI","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/apps/{id}":{"get":{"summary":"Public app interstitial HTML without private Fabric coordinates","security":[],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/agents/{agentId}":{"get":{"summary":"Read-only agent dashboard; a valid key query capability is required, otherwise a generic invalid-link page","security":[{"agentDashboard":[]}],"parameters":[{"name":"agentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/limits":{"get":{"summary":"Current effective limits and sandbox capabilities; agent clients receive Markdown instead of HTML","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/limits.md":{"get":{"summary":"Markdown limits, lifetime policy and preview-versus-live capability boundaries","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/terms":{"get":{"summary":"Plain-language prototype terms and content policy","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/skill.md":{"get":{"summary":"The agent guide as an installable skill, from the version-matched repository","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/llms.txt":{"get":{"summary":"Agent discovery index","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/openapi.json":{"get":{"summary":"This OpenAPI 3.1 document","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/install.sh":{"get":{"summary":"POSIX installer with SHA-256 verification","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/install.ps1":{"get":{"summary":"PowerShell installer with SHA-256 verification","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/downloads/{file}":{"get":{"summary":"Stream released binaries, tool and runtime store archives, release manifests or SHA256SUMS from private Blob storage","security":[],"parameters":[{"name":"file","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/templates/{file}":{"get":{"summary":"Stream a versioned claimable template tarball from private Blob storage","security":[],"parameters":[{"name":"file","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/claim/{token}":{"get":{"summary":"Move the capability into an httpOnly cookie and redirect without consuming it or changing app lifetime","security":[],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}},"head":{"summary":"Check a claim link route without consuming it or changing app lifetime","security":[],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/claim/continue/{code}":{"get":{"summary":"Consume a five-minute loopback continuation once, bind the human session cookie and redirect to the workspace step","security":[],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}},"head":{"summary":"Check the continuation route without consuming the code or setting cookies","security":[],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}},"/healthz":{"get":{"summary":"Control-plane process liveness","security":[],"parameters":[],"responses":{"200":{"description":"Site resource"},"303":{"description":"Clean claim URL"},"default":{"description":"Resource unavailable"}}}}},"components":{"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"retryAfter":{"type":"integer","minimum":1},"scope":{"type":"string","enum":["address","device","agent","app"],"description":"Device is the identity quota; legacy clients without X-Rfd-Device use agent (signing key). Offices and VPN egress share the separate address quota; app scopes per-app writes."},"window":{"type":"string","enum":["minute","hour","day"],"description":"The tripped sliding window for an address, device or legacy signing-key rate limit."},"details":{"type":"object","additionalProperties":true,"description":"Value-free structured diagnostics, including missingNames for secrets_missing."}}}}}},"securitySchemes":{"agentSignature":{"type":"apiKey","in":"header","name":"X-Rfd-Agent","description":"v1;<agentId>;<Unix-seconds>;<base64url-16-byte-nonce>;<base64url-Ed25519-signature>. Sign UTF-8 METHOD + LF + pathname-and-query + LF + lowercase SHA256(body) + LF + timestamp + LF + nonce. If X-Rfd-Device is present, append LF + its lowercase device hash. No final newline. Without X-Rfd-Device the legacy signed message is unchanged. Five-minute clock window, single-use nonce. App-token-only access remains valid for legacy apps without agent_id."},"agentDashboard":{"type":"apiKey","in":"query","name":"key","description":"Read-only capability returned once by the signed dashboard-key endpoint."},"appToken":{"type":"http","scheme":"bearer"},"cellToken":{"type":"http","scheme":"bearer"},"callbackToken":{"type":"http","scheme":"bearer"},"functionNodeToken":{"type":"http","scheme":"bearer","description":"Dedicated enrollment token only for registration; subsequent calls require the returned node credential plus X-Rfd-Node. A cell token is not accepted."},"adminToken":{"type":"http","scheme":"bearer"},"claimCapability":{"type":"apiKey","in":"cookie","name":"claim_capability"},"humanSession":{"type":"apiKey","in":"cookie","name":"human_session"},"adminSession":{"type":"apiKey","in":"cookie","name":"admin_session"}}}}