OPENAPI JSON Copy
{
"openapi": "3.1.0",
"info": {
"title": "URSY Locker API",
"version": "0.1.1",
"description": "Room management through resource-bound URSY.id permissions. The website and API are live. Check capabilities for purchasing, provider and recovery availability. Demo examples are explicitly labelled."
},
"servers": [
{
"url": "https://ursy.locker/api/v1"
}
],
"paths": {
"/catalogue": {
"get": {
"operationId": "catalogue",
"summary": "Read planned room prices and availability.",
"security": [],
"description": "Public read: no sign-in and no per-grant bucket; a site-wide limit per source address still applies. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"version": {
"type": "string"
},
"state": {
"type": "string"
},
"ordering_enabled": {
"type": "boolean"
},
"currency": {
"type": "string",
"enum": [
"GBP"
]
},
"monthly_pence": {
"type": "integer",
"minimum": 0
},
"setup_pence": {
"type": "integer",
"minimum": 0
},
"ai_usage_included": {
"const": false
},
"provider": {
"type": [
"string",
"null"
]
},
"region": {
"type": [
"string",
"null"
]
},
"capacity": {
"type": [
"integer",
"null"
]
},
"products": {
"type": "array",
"items": {
"type": "object",
"properties": {
"sku": {
"type": "string"
},
"name": {
"type": "string"
},
"amount_minor": {
"type": "integer"
},
"available": {
"type": "boolean"
},
"price_status": {
"type": "string"
}
},
"required": [
"sku",
"name",
"amount_minor",
"available"
],
"additionalProperties": true
}
}
},
"required": [
"version",
"ordering_enabled",
"currency",
"monthly_pence",
"setup_pence",
"products"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The site-wide limit for this source address is exhausted; wait Retry-After seconds",
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
}
}
},
"/capabilities": {
"get": {
"operationId": "capabilities",
"summary": "Read implemented and enabled capabilities.",
"security": [],
"description": "Public read: no sign-in and no per-grant bucket; a site-wide limit per source address still applies. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"version": {
"type": "string"
},
"identity_enabled": {
"type": "boolean"
},
"room_control": {
"type": "boolean"
},
"chat": {
"type": "boolean"
},
"files": {
"type": "boolean"
},
"backups": {
"type": "boolean"
},
"sales": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"reasons": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"enabled",
"reasons"
],
"additionalProperties": true
},
"mcp": {
"type": "object",
"properties": {
"endpoint": {
"type": "string"
},
"protocol": {
"type": "string"
},
"supported_protocols": {
"type": "array",
"items": {
"type": "string"
}
},
"enabled": {
"type": "boolean"
}
},
"required": [
"endpoint",
"protocol",
"enabled"
],
"additionalProperties": true
},
"rest_base": {
"type": "string"
},
"openapi": {
"type": "string"
},
"limits": {
"type": "object",
"properties": {
"page_default": {
"type": "integer"
},
"page_max": {
"type": "integer"
},
"body_bytes": {
"type": "integer"
}
},
"required": [],
"additionalProperties": true
},
"integrations": {
"type": "object",
"properties": {
"identity": {
"type": "string"
},
"provider": {
"type": "string"
},
"billing": {
"type": "string"
},
"storage": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"required": [
"version",
"sales",
"mcp",
"rest_base",
"integrations"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The site-wide limit for this source address is exhausted; wait Retry-After seconds",
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
}
}
},
"/identity": {
"get": {
"operationId": "identity",
"summary": "Discover hosted signup, device authorization and account management.",
"security": [],
"description": "Public read: no sign-in and no per-grant bucket; a site-wide limit per source address still applies. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"schema": {
"const": "ursy-locker-identity/1"
},
"issuer": {
"const": "https://ursy.id/oidc"
},
"resource": {
"const": "https://ursy.locker/api"
},
"product": {
"const": "ursy-locker"
},
"website": {
"type": "object"
},
"agent": {
"type": "object"
},
"workspace": {
"type": "object"
},
"account_management": {
"type": "object"
}
},
"required": [
"schema",
"issuer",
"resource",
"product",
"website",
"agent",
"workspace",
"account_management"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The site-wide limit for this source address is exhausted; wait Retry-After seconds",
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
}
}
},
"/status": {
"get": {
"operationId": "status",
"summary": "Read measured service and release status.",
"security": [],
"description": "Public read: no sign-in and no per-grant bucket; a site-wide limit per source address still applies. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"state": {
"type": "string"
},
"website_live": {
"type": "boolean"
},
"ordering_enabled": {
"type": "boolean"
},
"measured_at": {
"type": "string"
},
"services": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"state": {
"type": "string"
},
"detail": {
"type": "string"
}
},
"required": [
"name",
"state"
],
"additionalProperties": true
}
},
"incidents": {
"type": "array",
"items": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"message": {
"type": "string"
},
"created_at": {
"type": [
"string",
"null"
]
}
},
"required": [
"title",
"message"
],
"additionalProperties": true
}
}
},
"required": [
"state",
"website_live",
"ordering_enabled",
"measured_at",
"services"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The site-wide limit for this source address is exhausted; wait Retry-After seconds",
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
}
}
},
"/models": {
"get": {
"operationId": "models",
"summary": "List only model routes verified on the selected runtime image.",
"security": [],
"description": "Public read: no sign-in and no per-grant bucket; a site-wide limit per source address still applies. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"label": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"model_id": {
"type": "string"
},
"budget_url": {
"type": "string"
}
},
"required": [
"id",
"label",
"endpoint",
"model_id",
"budget_url"
],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The site-wide limit for this source address is exhausted; wait Retry-After seconds",
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
}
}
},
"/account": {
"get": {
"operationId": "account",
"summary": "Read the canonical Locker account, access and storage availability.",
"security": [
{
"lockerOAuth": [
"locker.account.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"subject": {
"type": "string"
},
"name": {
"type": "string"
},
"account_id": {
"type": "string"
},
"stage": {
"type": "string"
},
"sales": {
"type": "object"
},
"access": {
"type": "object",
"properties": {
"resource": {
"const": "https://ursy.locker/api"
},
"scopes": {
"type": "array",
"items": {
"type": "string"
}
},
"room_selection": {
"enum": [
"owned_rooms",
"restricted_owned_rooms"
]
},
"room_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"cross_account_sharing": {
"const": false
}
},
"required": [
"resource",
"scopes",
"room_selection",
"room_ids",
"cross_account_sharing"
],
"additionalProperties": true
},
"storage": {
"type": "object",
"properties": {
"allocation": {
"const": "per_room"
},
"pooled_account_storage": {
"const": false
},
"quota_bytes": {
"type": "null"
},
"used_bytes": {
"type": "null"
},
"availability": {
"enum": [
"runtime_configured",
"awaiting_server_capacity"
]
},
"reason": {
"type": "string"
}
},
"required": [
"allocation",
"pooled_account_storage",
"quota_bytes",
"used_bytes",
"availability",
"reason"
],
"additionalProperties": true
},
"links": {
"type": "object"
}
},
"required": [
"subject",
"account_id",
"stage",
"sales",
"access",
"storage",
"links"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
}
}
},
"/rooms": {
"get": {
"operationId": "rooms",
"summary": "List rooms visible to this grant.",
"security": [
{
"lockerOAuth": [
"locker.rooms.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/rooms/{room}": {
"get": {
"operationId": "room",
"summary": "Read one owned room.",
"security": [
{
"lockerOAuth": [
"locker.rooms.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
},
"delete": {
"operationId": "delete_room",
"summary": "Delete only after matching explicit intent and version.",
"security": [
{
"lockerOAuth": [
"locker.rooms.delete"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"intent_id": {
"type": "string",
"description": "Expiring destructive confirmation"
},
"challenge": {
"type": "string",
"description": "Exact challenge returned by the intent"
},
"expected_version": {
"type": "integer"
},
"backup_id": {
"type": "string",
"description": "Owned recovery point"
},
"profile_json": {
"type": "string",
"description": "Bounded portable profile JSON for import"
},
"confirmed_hash": {
"type": "string",
"description": "Verified SHA-256 of the import profile"
}
},
"required": [
"intent_id",
"expected_version",
"challenge"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/metrics": {
"get": {
"operationId": "metrics",
"summary": "Read observed room health and metrics.",
"security": [
{
"lockerOAuth": [
"locker.rooms.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"runtime_state": {
"type": "string"
},
"checked_at": {
"type": [
"string",
"null"
]
},
"metrics": {
"type": [
"object",
"null"
]
}
},
"required": [
"runtime_state",
"checked_at",
"metrics"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/rooms/{room}/activity": {
"get": {
"operationId": "activity",
"summary": "Read redacted room events.",
"security": [
{
"lockerOAuth": [
"locker.events.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/quotes": {
"post": {
"operationId": "quote",
"summary": "Create a planned price quote without a charge.",
"security": [
{
"lockerOAuth": [
"locker.rooms.create"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"planned_room_id": {
"type": "string"
},
"sku": {
"type": "string"
},
"currency": {
"type": "string",
"enum": [
"GBP"
]
},
"amount_due_now_minor": {
"type": "integer"
},
"recurring_amount_minor": {
"type": "integer"
},
"assisted_setup_selected": {
"type": "boolean"
},
"expires_at": {
"type": "string"
},
"purchasable": {
"type": "boolean"
}
},
"required": [
"id",
"planned_room_id",
"sku",
"currency",
"amount_due_now_minor",
"recurring_amount_minor",
"expires_at"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"sku": {
"type": "string",
"description": "Published room SKU"
},
"assisted_setup": {
"type": "boolean",
"default": false
},
"model_option_id": {
"type": "string",
"description": "Option from the verified model catalogue"
}
},
"required": [
"sku"
],
"additionalProperties": false
}
}
}
}
}
},
"/orders": {
"post": {
"operationId": "order",
"summary": "Request a room. Closed until release prerequisites pass.",
"security": [
{
"lockerOAuth": [
"locker.rooms.create",
"locker.purchase"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"quote_id": {
"type": "string",
"description": "Owned unexpired quote"
},
"room_name": {
"type": "string",
"description": "Name"
},
"credential_binding_ref": {
"type": "string",
"description": "Central binding reference"
},
"mandate_id": {
"type": "string",
"description": "Approved spending mandate"
}
},
"required": [
"quote_id",
"credential_binding_ref"
],
"additionalProperties": false
}
}
}
}
}
},
"/orders/{order}": {
"get": {
"operationId": "order_read",
"summary": "Read an owned order.",
"security": [
{
"lockerOAuth": [
"locker.billing.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "order",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/operations/{operation}": {
"get": {
"operationId": "operation",
"summary": "Read an operation under its original authority.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"command": {
"type": "string"
},
"version": {
"type": "integer"
},
"result": [],
"safe_error": {
"type": "string"
}
},
"required": [
"id",
"state",
"command"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "operation",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/rooms/{room}/actions/start": {
"post": {
"operationId": "start",
"summary": "Start an entitled room asynchronously.",
"security": [
{
"lockerOAuth": [
"locker.rooms.control"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/actions/stop": {
"post": {
"operationId": "stop",
"summary": "Stop an entitled room asynchronously.",
"security": [
{
"lockerOAuth": [
"locker.rooms.control"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/actions/restart": {
"post": {
"operationId": "restart",
"summary": "Restart an entitled room asynchronously.",
"security": [
{
"lockerOAuth": [
"locker.rooms.control"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/deletion-intents": {
"post": {
"operationId": "deletion_intent",
"summary": "Prepare an expiring room deletion confirmation.",
"security": [
{
"lockerOAuth": [
"locker.rooms.delete"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/sessions": {
"get": {
"operationId": "sessions",
"summary": "List room conversation metadata.",
"security": [
{
"lockerOAuth": [
"locker.chat"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/rooms/{room}/sessions/{session}": {
"get": {
"operationId": "session",
"summary": "Read a room conversation.",
"security": [
{
"lockerOAuth": [
"locker.chat"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "session",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/rooms/{room}/messages": {
"post": {
"operationId": "message",
"summary": "Execute a message; may use the owner model account and external tools.",
"security": [
{
"lockerOAuth": [
"locker.chat"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"message": {
"type": "string",
"maxLength": 16000
},
"session_id": {
"type": "string",
"description": "Existing session"
}
},
"required": [
"message"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/messages/{message}/cancellation": {
"post": {
"operationId": "cancel_message",
"summary": "Cancel an owned running message; completed external work cannot be undone.",
"security": [
{
"lockerOAuth": [
"locker.chat"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "message",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/files": {
"get": {
"operationId": "files",
"summary": "List the allowed workspace.",
"security": [
{
"lockerOAuth": [
"locker.files.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"entries": {
"type": "array",
"items": {
"type": "object",
"properties": {
"path": {
"type": "string"
},
"name": {
"type": "string"
},
"type": {
"type": "string"
},
"size_bytes": {
"type": "integer"
}
},
"required": [],
"additionalProperties": true
}
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "path",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Relative allowed workspace path"
}
}
]
}
},
"/rooms/{room}/file": {
"get": {
"operationId": "read_file",
"summary": "Access an allowed regular workspace file with revision checks.",
"security": [
{
"lockerOAuth": [
"locker.files.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"path": {
"type": "string"
},
"content_base64": {
"type": "string"
},
"size_bytes": {
"type": "integer"
},
"revision": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "path",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Relative allowed workspace path"
}
}
]
},
"put": {
"operationId": "write_file",
"summary": "Access an allowed regular workspace file with revision checks.",
"security": [
{
"lockerOAuth": [
"locker.files.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Relative workspace path"
},
"content_base64": {
"type": "string",
"description": "Bounded bytes"
},
"expected_revision": {
"type": "string",
"description": "Current SHA-256"
}
},
"required": [
"path",
"content_base64"
],
"additionalProperties": false
}
}
}
}
},
"delete": {
"operationId": "delete_file",
"summary": "Access an allowed regular workspace file with revision checks.",
"security": [
{
"lockerOAuth": [
"locker.files.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"path": {
"type": "string",
"description": "Relative path"
},
"expected_revision": {
"type": "string",
"description": "Current SHA-256"
}
},
"required": [
"path",
"expected_revision"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/connections": {
"get": {
"operationId": "room_connections",
"summary": "Read non-secret connection metadata.",
"security": [
{
"lockerOAuth": [
"locker.account.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
},
"post": {
"operationId": "connect",
"summary": "Bind an owner-approved central credential reference.",
"security": [
{
"lockerOAuth": [
"locker.connections.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"credential_binding_ref": {
"type": "string",
"description": "Owner-approved central credential reference"
}
},
"required": [
"credential_binding_ref"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/connections/{connection}": {
"delete": {
"operationId": "revoke_connection",
"summary": "Revoke a room connection and queue runtime remediation.",
"security": [
{
"lockerOAuth": [
"locker.connections.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "connection",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/backups": {
"get": {
"operationId": "backups",
"summary": "List private recovery point metadata.",
"security": [
{
"lockerOAuth": [
"locker.backups.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
},
"post": {
"operationId": "backup",
"summary": "Queue a bounded backup operation; destructive operations need confirmation.",
"security": [
{
"lockerOAuth": [
"locker.backups.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"backup_id": {
"type": "string",
"description": "Owned recovery point; omit to use latest verified profile"
}
},
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/restores": {
"post": {
"operationId": "restore",
"summary": "Queue a bounded restore operation; destructive operations need confirmation.",
"security": [
{
"lockerOAuth": [
"locker.backups.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"intent_id": {
"type": "string",
"description": "Expiring destructive confirmation"
},
"challenge": {
"type": "string",
"description": "Exact challenge returned by the intent"
},
"expected_version": {
"type": "integer"
},
"backup_id": {
"type": "string",
"description": "Owned recovery point"
},
"profile_json": {
"type": "string",
"description": "Bounded portable profile JSON for import"
},
"confirmed_hash": {
"type": "string",
"description": "Verified SHA-256 of the import profile"
}
},
"required": [
"intent_id",
"expected_version",
"challenge"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/exports": {
"post": {
"operationId": "export",
"summary": "Queue a bounded export operation; destructive operations need confirmation.",
"security": [
{
"lockerOAuth": [
"locker.exports.create"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"backup_id": {
"type": "string",
"description": "Owned recovery point; omit to use latest verified profile"
}
},
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/imports": {
"post": {
"operationId": "import",
"summary": "Queue a bounded import operation; destructive operations need confirmation.",
"security": [
{
"lockerOAuth": [
"locker.files.write",
"locker.rooms.control"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"intent_id": {
"type": "string",
"description": "Expiring destructive confirmation"
},
"challenge": {
"type": "string",
"description": "Exact challenge returned by the intent"
},
"expected_version": {
"type": "integer"
},
"backup_id": {
"type": "string",
"description": "Owned recovery point"
},
"profile_json": {
"type": "string",
"description": "Bounded portable profile JSON for import"
},
"confirmed_hash": {
"type": "string",
"description": "Verified SHA-256 of the import profile"
}
},
"required": [
"intent_id",
"expected_version",
"challenge",
"profile_json",
"confirmed_hash"
],
"additionalProperties": false
}
}
}
}
}
},
"/exports/{export}": {
"get": {
"operationId": "export_read",
"summary": "Read an owned export and its expiration.",
"security": [
{
"lockerOAuth": [
"locker.exports.create"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "export",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/billing/subscriptions": {
"get": {
"operationId": "subscriptions",
"summary": "Read subscriptions visible to this connection.",
"security": [
{
"lockerOAuth": [
"locker.billing.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/billing/invoices": {
"get": {
"operationId": "invoices",
"summary": "Read verified processor invoice records.",
"security": [
{
"lockerOAuth": [
"locker.billing.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/billing/portal-sessions": {
"post": {
"operationId": "portal",
"summary": "Open a limited owner-only billing portal.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/subscriptions/{subscription}/cancellation": {
"post": {
"operationId": "cancel_renewal",
"summary": "Cancel renewal at the paid-through date.",
"security": [
{
"lockerOAuth": [
"locker.subscriptions.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "subscription",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"expected_version": {
"type": "integer",
"minimum": 1
}
},
"required": [
"expected_version"
],
"additionalProperties": false
}
}
}
}
},
"delete": {
"operationId": "resume_renewal",
"summary": "Resume renewal only while the subscription permits it.",
"security": [
{
"lockerOAuth": [
"locker.subscriptions.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "subscription",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"expected_version": {
"type": "integer",
"minimum": 1
}
},
"required": [
"expected_version"
],
"additionalProperties": false
}
}
}
}
}
},
"/mandates": {
"get": {
"operationId": "mandates",
"summary": "Read bounded delegated spending authority.",
"security": [
{
"lockerOAuth": [
"locker.mandates.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/mandate-requests": {
"post": {
"operationId": "mandate_request",
"summary": "Request owner approval; a machine cannot self-approve.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"client_id": {
"type": "string",
"description": "Optional; must equal the authenticated client"
},
"monthly_limit_minor": {
"type": "integer",
"minimum": 0,
"maximum": 100000
},
"recurring_limit_minor": {
"type": "integer",
"minimum": 0,
"maximum": 100000
},
"single_charge_limit_minor": {
"type": "integer",
"minimum": 0,
"maximum": 100000
},
"max_rooms": {
"type": "integer",
"minimum": 1,
"maximum": 10
},
"allow_setup": {
"type": "boolean"
},
"starts_at": {
"type": "string",
"description": "UTC window start"
},
"expires_at": {
"type": "string",
"description": "UTC window end; at most seven days after start"
},
"credential_binding_refs": {
"type": "array",
"items": {
"type": "string",
"maxLength": 160,
"pattern": "^[A-Za-z0-9_-]{1,160}$"
},
"maxItems": 20,
"uniqueItems": true
},
"room_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 160,
"pattern": "^[A-Za-z0-9_-]{1,160}$"
},
"maxItems": 20,
"uniqueItems": true
}
},
"required": [
"monthly_limit_minor",
"recurring_limit_minor",
"single_charge_limit_minor",
"max_rooms",
"allow_setup",
"starts_at",
"expires_at",
"credential_binding_refs"
],
"additionalProperties": false
}
}
}
}
}
},
"/mandates/{mandate}/revocation": {
"post": {
"operationId": "revoke_mandate",
"summary": "Revoke an owned spending mandate.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "mandate",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/mandates/{mandate}/approval": {
"post": {
"operationId": "approve_mandate",
"summary": "Approve a reviewed pending mandate in the owner session.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "mandate",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"confirm": {
"type": "boolean"
},
"intent_id": {
"type": "string",
"description": "Fresh owner review intent"
},
"challenge": {
"type": "string",
"description": "Exact owner review challenge"
},
"expected_version": {
"type": "integer",
"minimum": 1
}
},
"required": [
"confirm",
"intent_id",
"challenge",
"expected_version"
],
"additionalProperties": false
}
}
}
}
}
},
"/mandates/{mandate}/approval-intents": {
"post": {
"operationId": "mandate_intent",
"summary": "Prepare a fresh exact-term owner mandate review.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"intent_id": {
"type": "string"
},
"challenge": {
"type": "string"
},
"expected_version": {
"type": "integer"
},
"expires_at": {
"type": "string"
},
"review": {
"type": "object"
}
},
"required": [
"intent_id",
"challenge",
"expected_version",
"expires_at",
"review"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "mandate",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/support/tickets": {
"post": {
"operationId": "ticket",
"summary": "Create an owned local support record.",
"security": [
{
"lockerOAuth": [
"locker.support.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"subject": {
"type": "string",
"maxLength": 160
},
"message": {
"type": "string",
"maxLength": 5000
}
},
"required": [
"subject",
"message"
],
"additionalProperties": false
}
}
}
}
},
"get": {
"operationId": "tickets",
"summary": "Read owned support tickets.",
"security": [
{
"lockerOAuth": [
"locker.support.write"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/events": {
"get": {
"operationId": "events",
"summary": "Read redacted account events.",
"security": [
{
"lockerOAuth": [
"locker.events.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
}
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "limit",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"description": "Last item ID from the previous page"
}
}
]
}
},
"/connection-requests": {
"post": {
"operationId": "connection_request",
"summary": "Request hosted owner approval of a model connection for a quoted room.",
"security": [
{
"lockerOAuth": [
"locker.connections.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"request_id": {
"type": "string"
},
"status": {
"enum": [
"pending",
"approved"
]
},
"owner_subject": {
"type": "string"
},
"room_id": {
"type": "string"
},
"purpose": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"binding_ref": {
"type": [
"string",
"null"
]
},
"approval_url": {
"type": "string"
}
},
"required": [
"request_id",
"status",
"owner_subject",
"room_id",
"expires_at",
"approval_url"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"quote_id": {
"type": "string",
"description": "Owned unexpired quote"
},
"endpoint": {
"type": "string",
"description": "Published supported model endpoint"
}
},
"required": [
"quote_id",
"endpoint"
],
"additionalProperties": false
}
}
}
}
}
},
"/connection-requests/{request}": {
"get": {
"operationId": "connection_request_status",
"summary": "Read the owner-approved connection request for a quoted room.",
"security": [
{
"lockerOAuth": [
"locker.account.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"request_id": {
"type": "string"
},
"status": {
"enum": [
"pending",
"approved"
]
},
"owner_subject": {
"type": "string"
},
"room_id": {
"type": "string"
},
"purpose": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"binding_ref": {
"type": [
"string",
"null"
]
},
"approval_url": {
"type": "string"
}
},
"required": [
"request_id",
"status",
"owner_subject",
"room_id",
"expires_at",
"approval_url"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "request",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "quote_id",
"in": "query",
"required": true,
"schema": {
"type": "string",
"description": "Owned quote"
}
}
]
}
},
"/rooms/{room}/recovery-intents": {
"post": {
"operationId": "recovery_intent",
"summary": "Prepare an explicit restore or import confirmation.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"room_id": {
"type": "string"
},
"state": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
}
},
"required": [],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": [
"restore",
"import"
]
}
},
"required": [
"action"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/onboarding": {
"get": {
"operationId": "onboarding",
"summary": "Read observed setup state and verified optional integrations.",
"security": [
{
"lockerOAuth": [
"locker.rooms.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"room_id": {
"type": "string"
},
"version": {
"type": "integer"
},
"name": {
"type": "string"
},
"owner_subject": {
"type": "string"
},
"model": {
"type": "object"
},
"model_test": {
"type": "object"
},
"workspace": {
"type": "object"
},
"channel": {
"type": "object"
},
"starter": {
"type": "object"
},
"steps": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"room_id",
"version",
"model",
"model_test",
"workspace",
"channel",
"starter"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/rooms/{room}/onboarding/model-test": {
"post": {
"operationId": "onboarding_model_test",
"summary": "Queue the image-verified bounded model connection check.",
"security": [
{
"lockerOAuth": [
"locker.chat"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/onboarding/starter-workflow": {
"post": {
"operationId": "onboarding_starter",
"summary": "Ask the agent to perform a published starter task under chat execution permission.",
"security": [
{
"lockerOAuth": [
"locker.chat"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"workflow_id": {
"type": "string",
"enum": [
"welcome-note"
]
}
},
"required": [
"workflow_id"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/onboarding/channel": {
"post": {
"operationId": "onboarding_channel",
"summary": "Configure a verified optional channel with explicit allowed operators and an ID binding.",
"security": [
{
"lockerOAuth": [
"locker.connections.write",
"locker.rooms.control"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"channel_id": {
"type": "string",
"description": "Exact verified channel"
},
"credential_binding_ref": {
"type": "string",
"description": "ID owner-approved channel.configure binding"
},
"allowed_operator_ids": {
"type": "array",
"items": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,160}$"
},
"minItems": 1,
"maxItems": 20,
"uniqueItems": true
}
},
"required": [
"channel_id",
"credential_binding_ref",
"allowed_operator_ids"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/onboarding/channel-connection-requests": {
"post": {
"operationId": "channel_request",
"summary": "Request owner approval for an exact verified optional channel.",
"security": [
{
"lockerOAuth": [
"locker.connections.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"request_id": {
"type": "string"
},
"status": {
"enum": [
"pending",
"approved"
]
},
"owner_subject": {
"type": "string"
},
"room_id": {
"type": "string"
},
"purpose": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"binding_ref": {
"type": [
"string",
"null"
]
},
"approval_url": {
"type": "string"
}
},
"required": [
"request_id",
"status",
"owner_subject",
"room_id",
"expires_at",
"approval_url"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"channel_id": {
"type": "string",
"description": "Exact verified optional channel"
}
},
"required": [
"channel_id"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/onboarding/channel-connection-requests/{request}": {
"get": {
"operationId": "channel_request_status",
"summary": "Read current owner approval for this room channel.",
"security": [
{
"lockerOAuth": [
"locker.connections.write"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"request_id": {
"type": "string"
},
"status": {
"enum": [
"pending",
"approved"
]
},
"owner_subject": {
"type": "string"
},
"room_id": {
"type": "string"
},
"purpose": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"binding_ref": {
"type": [
"string",
"null"
]
},
"approval_url": {
"type": "string"
}
},
"required": [
"request_id",
"status",
"owner_subject",
"room_id",
"expires_at",
"approval_url"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "request",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/rooms/{room}/rebind-connection-requests": {
"post": {
"operationId": "rebind_connection_request",
"summary": "Request owner approval for a replacement model connection.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"request_id": {
"type": "string"
},
"status": {
"enum": [
"pending",
"approved"
]
},
"owner_subject": {
"type": "string"
},
"room_id": {
"type": "string"
},
"purpose": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"binding_ref": {
"type": [
"string",
"null"
]
},
"approval_url": {
"type": "string"
}
},
"required": [
"request_id",
"status",
"owner_subject",
"room_id",
"expires_at",
"approval_url"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"model_option_id": {
"type": "string",
"description": "Verified replacement model option"
}
},
"required": [
"model_option_id"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/rebind-connection-requests/{request}": {
"get": {
"operationId": "rebind_connection_status",
"summary": "Read owner approval of the replacement model connection.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"request_id": {
"type": "string"
},
"status": {
"enum": [
"pending",
"approved"
]
},
"owner_subject": {
"type": "string"
},
"room_id": {
"type": "string"
},
"purpose": {
"type": "string"
},
"endpoint": {
"type": "string"
},
"expires_at": {
"type": "integer"
},
"binding_ref": {
"type": [
"string",
"null"
]
},
"approval_url": {
"type": "string"
}
},
"required": [
"request_id",
"status",
"owner_subject",
"room_id",
"expires_at",
"approval_url"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "request",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/rooms/{room}/logs": {
"get": {
"operationId": "logs",
"summary": "Read bounded event-code-only runtime observations from a verified image collector.",
"security": [
{
"lockerOAuth": [
"locker.rooms.read"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"entries": {
"type": "array",
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"observed_at": {
"type": "string"
},
"level": {
"enum": [
"info",
"warning",
"error"
]
},
"event": {
"enum": [
"runtime_started",
"runtime_stopped",
"runtime_restarted",
"gateway_ready",
"gateway_unhealthy",
"model_test_passed",
"model_test_failed",
"workspace_ready",
"workspace_unavailable",
"backup_started",
"backup_completed",
"backup_failed",
"restore_started",
"restore_completed",
"restore_failed",
"connection_revoked",
"permission_denied",
"resource_limit",
"maintenance_completed",
"maintenance_failed"
]
}
},
"required": [
"observed_at",
"level",
"event"
],
"additionalProperties": true
}
},
"next_cursor": {
"type": [
"string",
"null"
]
},
"observed_at": {
"type": "string"
},
"redaction": {
"const": "event_codes_only"
},
"scope": {
"const": "instance"
}
},
"required": [
"entries",
"next_cursor",
"observed_at",
"redaction",
"scope"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "string",
"pattern": "^lc_[0-9]{1,20}_[a-f0-9]{16}$",
"maxLength": 40
}
}
]
}
},
"/rooms/{room}/rebind-intents": {
"post": {
"operationId": "rebind_intent",
"summary": "Review exact credential, model and backup before replacing a runtime.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"intent_id": {
"type": "string"
},
"challenge": {
"type": "string"
},
"expected_version": {
"type": "integer"
},
"expires_at": {
"type": "string"
},
"review": {
"type": "object"
}
},
"required": [
"intent_id",
"challenge",
"expected_version",
"expires_at",
"review"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"credential_binding_ref": {
"type": "string",
"description": "Approved model binding for this room"
},
"model_option_id": {
"type": "string",
"description": "Exact verified model option"
},
"backup_id": {
"type": "string",
"description": "Owned verified recovery point; newer workspace changes will not be copied"
}
},
"required": [
"credential_binding_ref",
"model_option_id",
"backup_id"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/rebinds": {
"post": {
"operationId": "rebind",
"summary": "Confirm the owner-reviewed credential replacement.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"intent_id": {
"type": "string",
"description": "Fresh owner replacement review"
},
"challenge": {
"type": "string",
"description": "Exact reviewed challenge"
},
"expected_version": {
"type": "integer",
"minimum": 1
},
"confirm": {
"type": "boolean",
"const": true
}
},
"required": [
"intent_id",
"challenge",
"expected_version",
"confirm"
],
"additionalProperties": false
}
}
}
}
}
},
"/exports/{export}/descriptor": {
"get": {
"operationId": "export_descriptor",
"summary": "Download the private portable package descriptor and its one-archive content key.",
"security": [
{
"lockerOAuth": [
"locker.exports.create"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"format": {
"const": "ursy.portable-archive.v1"
},
"export_id": {
"type": "string"
},
"manifest_bytes": {
"type": "integer"
},
"manifest_sha256": {
"type": "string"
},
"chunk_count": {
"type": "integer"
},
"file_bytes": {
"type": "integer"
},
"expires_at": {
"type": "string"
},
"manifest_endpoint": {
"type": "string"
},
"parts_endpoint": {
"type": "string"
},
"descriptor_url": {
"type": "string"
},
"archive_key_base64": {
"type": "string"
}
},
"required": [
"format",
"export_id",
"manifest_bytes",
"manifest_sha256",
"chunk_count",
"file_bytes",
"expires_at",
"manifest_endpoint",
"parts_endpoint",
"archive_key_base64"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "export",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/exports/{export}/manifest": {
"get": {
"operationId": "export_manifest",
"summary": "Read a bounded portable manifest page.",
"security": [
{
"lockerOAuth": [
"locker.exports.create"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"export_id": {
"type": "string"
},
"offset": {
"type": "integer"
},
"bytes_base64": {
"type": "string"
},
"total_bytes": {
"type": "integer"
},
"sha256": {
"type": "string"
},
"next_offset": {
"type": [
"integer",
"null"
]
}
},
"required": [
"export_id",
"offset",
"bytes_base64",
"total_bytes",
"sha256",
"next_offset"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "export",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "offset",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 0,
"maximum": 4198400
}
}
]
}
},
"/exports/{export}/parts": {
"get": {
"operationId": "export_parts",
"summary": "Get bounded fresh download grants for this owned portable package.",
"security": [
{
"lockerOAuth": [
"locker.exports.create"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"export_id": {
"type": "string"
},
"parts": {
"type": "array",
"maxItems": 16,
"items": {
"type": "object",
"properties": {
"index": {
"type": "integer"
},
"bytes": {
"type": "integer"
},
"sha256": {
"type": "string"
},
"download": {
"type": "object"
}
},
"required": [
"index",
"bytes",
"sha256",
"download"
],
"additionalProperties": true
}
},
"next_cursor": {
"type": [
"integer",
"null"
]
},
"grants_ttl_seconds": {
"const": 120
}
},
"required": [
"export_id",
"parts",
"next_cursor",
"grants_ttl_seconds"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "export",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "cursor",
"in": "query",
"required": false,
"schema": {
"type": "integer",
"minimum": 0,
"maximum": 8192
}
}
]
}
},
"/rooms/{room}/portable-imports": {
"post": {
"operationId": "portable_import_create",
"summary": "Create a bounded workspace upload target; this does not run or restore data.",
"security": [
{
"lockerOAuth": [
"locker.files.write",
"locker.rooms.control",
"locker.backups.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"import_id": {
"type": "string"
},
"target_room_id": {
"type": "string"
},
"target_backup_id": {
"type": "string"
},
"archive_key_base64": {
"type": "string"
},
"manifest_metadata": {
"type": "object"
},
"manifest_received_bytes": {
"const": 0
},
"approval_url": {
"type": "string"
},
"quota": {
"type": "integer"
},
"manifest_page_bytes": {
"const": 32768
},
"upload_requires_fresh_authorisation": {
"const": true
}
},
"required": [
"import_id",
"target_room_id",
"target_backup_id",
"archive_key_base64",
"manifest_metadata",
"manifest_received_bytes",
"approval_url",
"quota"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"template": {
"type": "string",
"description": "Exact pinned target image"
},
"file_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 34359738368
},
"file_count": {
"type": "integer",
"minimum": 0,
"maximum": 4096
}
},
"required": [
"template",
"file_bytes",
"file_count"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/portable-imports/{import}": {
"get": {
"operationId": "portable_import_read",
"summary": "Read owned portable upload verification state.",
"security": [
{
"lockerOAuth": [
"locker.files.write",
"locker.rooms.control",
"locker.backups.write"
]
}
],
"description": "Reads (GET and HEAD): 120 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^import_[a-f0-9]{32}$"
},
"import_id": {
"type": "string",
"pattern": "^import_[a-f0-9]{32}$"
},
"room_id": {
"type": "string"
},
"state": {
"enum": [
"awaiting_manifest",
"uploading",
"upload_verified",
"confirmed",
"purging",
"purged"
]
},
"version": {
"type": "integer",
"minimum": 1
},
"manifest_received_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 4198400
},
"manifest_bytes": {
"type": "integer",
"minimum": 1,
"maximum": 4198400
},
"manifest_sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"file_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 34359738368
},
"file_count": {
"type": "integer",
"minimum": 0,
"maximum": 4096
},
"verified_chunks": {
"type": "integer",
"minimum": 0,
"maximum": 8192
},
"chunk_count": {
"type": "integer",
"minimum": 0,
"maximum": 8192
},
"approval_url": {
"type": "string"
},
"expires_at": {
"type": "string"
},
"next_offset": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 4198400
}
},
"required": [
"id",
"import_id",
"room_id",
"state",
"version",
"manifest_received_bytes",
"file_bytes",
"file_count",
"verified_chunks",
"approval_url",
"expires_at"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "import",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
}
]
}
},
"/rooms/{room}/portable-imports/{import}/manifest": {
"post": {
"operationId": "portable_import_manifest",
"summary": "Append the next bounded target manifest page.",
"security": [
{
"lockerOAuth": [
"locker.files.write",
"locker.rooms.control",
"locker.backups.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^import_[a-f0-9]{32}$"
},
"import_id": {
"type": "string",
"pattern": "^import_[a-f0-9]{32}$"
},
"room_id": {
"type": "string"
},
"state": {
"enum": [
"awaiting_manifest",
"uploading",
"upload_verified",
"confirmed",
"purging",
"purged"
]
},
"version": {
"type": "integer",
"minimum": 1
},
"manifest_received_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 4198400
},
"manifest_bytes": {
"type": "integer",
"minimum": 1,
"maximum": 4198400
},
"manifest_sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"file_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 34359738368
},
"file_count": {
"type": "integer",
"minimum": 0,
"maximum": 4096
},
"verified_chunks": {
"type": "integer",
"minimum": 0,
"maximum": 8192
},
"chunk_count": {
"type": "integer",
"minimum": 0,
"maximum": 8192
},
"approval_url": {
"type": "string"
},
"expires_at": {
"type": "string"
},
"next_offset": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 4198400
}
},
"required": [
"id",
"import_id",
"room_id",
"state",
"version",
"manifest_received_bytes",
"file_bytes",
"file_count",
"verified_chunks",
"approval_url",
"expires_at"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "import",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"offset": {
"type": "integer",
"minimum": 0,
"maximum": 4198400
},
"total_bytes": {
"type": "integer",
"minimum": 1,
"maximum": 4198400
},
"sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"bytes_base64": {
"type": "string",
"maxLength": 43692
}
},
"required": [
"offset",
"total_bytes",
"sha256",
"bytes_base64"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/portable-imports/{import}/upload-grants": {
"post": {
"operationId": "portable_import_upload",
"summary": "Issue one exact private chunk upload grant.",
"security": [
{
"lockerOAuth": [
"locker.files.write",
"locker.rooms.control",
"locker.backups.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"import_id": {
"type": "string"
},
"index": {
"type": "integer"
},
"bytes": {
"type": "integer"
},
"sha256": {
"type": "string"
},
"upload": {
"type": "object"
}
},
"required": [
"import_id",
"index",
"bytes",
"sha256",
"upload"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "import",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"index": {
"type": "integer",
"minimum": 0,
"maximum": 8191
}
},
"required": [
"index"
],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/portable-imports/{import}/verify": {
"post": {
"operationId": "portable_import_verify",
"summary": "Independently verify up to sixteen uploaded storage chunks.",
"security": [
{
"lockerOAuth": [
"locker.files.write",
"locker.rooms.control",
"locker.backups.write"
]
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^import_[a-f0-9]{32}$"
},
"import_id": {
"type": "string",
"pattern": "^import_[a-f0-9]{32}$"
},
"room_id": {
"type": "string"
},
"state": {
"enum": [
"awaiting_manifest",
"uploading",
"upload_verified",
"confirmed",
"purging",
"purged"
]
},
"version": {
"type": "integer",
"minimum": 1
},
"manifest_received_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 4198400
},
"manifest_bytes": {
"type": "integer",
"minimum": 1,
"maximum": 4198400
},
"manifest_sha256": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"file_bytes": {
"type": "integer",
"minimum": 0,
"maximum": 34359738368
},
"file_count": {
"type": "integer",
"minimum": 0,
"maximum": 4096
},
"verified_chunks": {
"type": "integer",
"minimum": 0,
"maximum": 8192
},
"chunk_count": {
"type": "integer",
"minimum": 0,
"maximum": 8192
},
"approval_url": {
"type": "string"
},
"expires_at": {
"type": "string"
},
"next_offset": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 4198400
}
},
"required": [
"id",
"import_id",
"room_id",
"state",
"version",
"manifest_received_bytes",
"file_bytes",
"file_count",
"verified_chunks",
"approval_url",
"expires_at"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "import",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/portable-imports/{import}/approval-intents": {
"post": {
"operationId": "portable_import_review",
"summary": "Review exact workspace import and replacement consequences.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"intent_id": {
"type": "string"
},
"challenge": {
"type": "string"
},
"expected_version": {
"type": "integer"
},
"expires_at": {
"type": "string"
},
"review": {
"type": "object"
}
},
"required": [
"intent_id",
"challenge",
"expected_version",
"expires_at",
"review"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "import",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": [],
"required": [],
"additionalProperties": false
}
}
}
}
}
},
"/rooms/{room}/portable-imports/{import}/confirm": {
"post": {
"operationId": "portable_import_confirm",
"summary": "Confirm the owner-reviewed import after a pre-change backup.",
"security": [
{
"lockerOAuth": []
}
],
"description": "Commands: 30 requests per grant per fixed UTC minute. Buckets are separate for reads and commands. Request bodies are limited to 65,536 bytes. Retry a 429 only after Retry-After; retain the original Idempotency-Key for an unchanged command.",
"responses": {
"200": {
"description": "Successful query or command receipt",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"202": {
"description": "Accepted durable asynchronous operation; poll Location after Retry-After",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"data",
"meta"
],
"properties": {
"data": {
"type": "object",
"properties": {
"operation_id": {
"type": "string"
},
"status": {
"type": "string",
"enum": [
"queued",
"checkout_queued"
]
},
"poll_after_seconds": {
"type": "integer",
"minimum": 0
},
"order_id": {
"type": "string"
},
"room_id": {
"type": "string"
}
},
"required": [
"operation_id",
"status"
],
"additionalProperties": true
},
"meta": {
"type": "object",
"required": [
"request_id"
],
"properties": {
"request_id": {
"type": "string"
},
"next_cursor": {
"type": [
"string",
"null"
]
}
},
"additionalProperties": true
}
},
"additionalProperties": false
}
}
},
"headers": {
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"Location": {
"description": "Authorized operation status URL when operation_id is returned.",
"schema": {
"type": "string",
"format": "uri"
}
},
"Retry-After": {
"description": "Wait this many seconds before polling the operation.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"400": {
"description": "Invalid input or JSON object; correct the request before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Missing or invalid resource-bound identity",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"WWW-Authenticate": {
"description": "Bearer challenge linking the Locker protected-resource metadata.",
"schema": {
"type": "string"
}
}
}
},
"403": {
"description": "Scope or ownership denied",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"404": {
"description": "Unknown route/method, missing resource or resource unavailable to this actor",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "Version, state or idempotency conflict; inspect the error before retrying",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"413": {
"description": "Request exceeds the 65,536-byte body limit; reduce the body",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"415": {
"description": "A non-empty request body must use application/json",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "The fixed-minute read or command bucket is exhausted; wait Retry-After seconds",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
},
"headers": {
"Retry-After": {
"description": "Seconds until the limit resets; retry with bounded backoff.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Limit": {
"description": "Read bucket 120; command bucket 30.",
"schema": {
"type": "integer",
"minimum": 1
}
},
"X-RateLimit-Remaining": {
"description": "Requests left in this bucket after this request.",
"schema": {
"type": "integer",
"minimum": 0
}
},
"X-RateLimit-Reset": {
"description": "Unix time in seconds at the next minute boundary.",
"schema": {
"type": "integer",
"minimum": 1
}
}
}
},
"503": {
"description": "Required integration unavailable; no success is assumed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"default": {
"description": "Typed service error; obey error.retryable and error.next_action. A response is not proof that an action completed.",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "object",
"required": [
"code",
"message",
"request_id",
"retryable"
],
"properties": {
"code": {
"type": "string"
},
"message": {
"type": "string"
},
"request_id": {
"type": "string"
},
"retryable": {
"type": "boolean"
},
"next_action": {
"type": [
"object",
"null"
]
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Unexpected server fault. The body may not be JSON and no success is assumed; for a command, retry later with the same Idempotency-Key."
}
},
"parameters": [
{
"name": "room",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "import",
"in": "path",
"required": true,
"schema": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$"
}
},
{
"name": "Idempotency-Key",
"in": "header",
"required": true,
"schema": {
"type": "string",
"minLength": 8,
"maxLength": 128
}
}
],
"requestBody": {
"required": false,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"intent_id": {
"type": "string",
"description": "Fresh owner upload review"
},
"challenge": {
"type": "string",
"description": "Exact challenge"
},
"expected_version": {
"type": "integer",
"minimum": 1
},
"confirm": {
"type": "boolean",
"const": true
}
},
"required": [
"intent_id",
"challenge",
"expected_version",
"confirm"
],
"additionalProperties": false
}
}
}
}
}
}
},
"components": {
"schemas": [],
"securitySchemes": {
"lockerOAuth": {
"type": "oauth2",
"flows": {
"authorizationCode": {
"authorizationUrl": "https://ursy.id/oidc/authorize",
"tokenUrl": "https://ursy.id/oidc/token",
"scopes": {
"locker.account.read": "Subject to owner, room, grant and release policy.",
"locker.rooms.read": "Subject to owner, room, grant and release policy.",
"locker.events.read": "Subject to owner, room, grant and release policy.",
"locker.rooms.create": "Subject to owner, room, grant and release policy.",
"locker.purchase": "Subject to owner, room, grant and release policy.",
"locker.billing.read": "Subject to owner, room, grant and release policy.",
"locker.rooms.control": "Subject to owner, room, grant and release policy.",
"locker.rooms.delete": "Subject to owner, room, grant and release policy.",
"locker.chat": "Subject to owner, room, grant and release policy.",
"locker.files.read": "Subject to owner, room, grant and release policy.",
"locker.files.write": "Subject to owner, room, grant and release policy.",
"locker.connections.write": "Subject to owner, room, grant and release policy.",
"locker.backups.read": "Subject to owner, room, grant and release policy.",
"locker.backups.write": "Subject to owner, room, grant and release policy.",
"locker.exports.create": "Subject to owner, room, grant and release policy.",
"locker.subscriptions.write": "Subject to owner, room, grant and release policy.",
"locker.mandates.read": "Subject to owner, room, grant and release policy.",
"locker.support.write": "Subject to owner, room, grant and release policy."
}
}
}
}
}
}
}