{"openapi": "3.1.0", "info": {"title": "Lunde Films Customer Agent API", "version": "1.0.0", "description": "Order a custom sample film through the customer's own agent. No signup, one private order token, explicit script approval and Stripe-hosted payment. Production is asynchronous."}, "servers": [{"url": "https://lundefilms.com/api/v1"}], "externalDocs": {"url": "https://lundefilms.com/agents"}, "components": {"schemas": {"Order": {"type": "object", "required": ["id", "status", "product", "payment_status", "next_action", "files", "messages"], "properties": {"id": {"type": "string"}, "status": {"enum": ["submitted", "preparing_script", "script_ready", "awaiting_payment", "queued", "in_production", "delivered", "revision_requested", "cancellation_requested", "cancelled", "production_issue"]}, "created_at": {"type": "string", "format": "date-time"}, "updated_at": {"type": "string", "format": "date-time"}, "brief": {"type": "object", "additionalProperties": false, "properties": {"product_id": {"type": "string", "enum": ["sample-film"]}, "name": {"type": "string", "maxLength": 120}, "email": {"type": "string", "maxLength": 200}, "organization": {"type": "string", "maxLength": 200}, "brief": {"type": "string", "maxLength": 20000}, "audience": {"type": "string", "maxLength": 2000}, "language": {"type": "string", "maxLength": 100}, "direction": {"type": "string", "maxLength": 5000}, "voice": {"type": "string", "maxLength": 2000}, "material_urls": {"type": "array", "maxItems": 40, "items": {"type": "string", "format": "uri", "maxLength": 2000}}, "customer_authorized": {"type": "boolean", "const": true, "description": "Only true with the customer's permission for this action."}}, "required": ["product_id", "name", "email", "brief", "customer_authorized"]}, "product": {"type": "object", "required": ["id", "name", "amount_cents", "payment_timing", "terms"], "properties": {"id": {"type": "string"}, "name": {"type": "string"}, "description": {"type": "string"}, "amount_cents": {"type": "integer", "minimum": 1}, "payment_timing": {"enum": ["before_production", "on_delivery"]}, "terms": {"type": "string"}, "currency": {"type": "string"}}}, "script": {"type": ["string", "null"]}, "script_digest": {"type": ["string", "null"]}, "approved_digest": {"type": ["string", "null"]}, "payment_status": {"enum": ["unpaid", "paid"]}, "online_payment_available": {"type": "boolean"}, "next_action": {"type": "string"}, "poll_after_seconds": {"type": "integer"}, "status_url": {"type": "string"}, "delivery_url": {"type": ["string", "null"]}, "messages": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "integer"}, "created_at": {"type": "string"}, "author": {"type": "string"}, "message": {"type": "string"}}}}, "uploads": {"type": "array", "items": {"$ref": "#/components/schemas/Upload"}}, "files": {"type": "array", "items": {"type": "object", "properties": {"id": {"type": "string"}, "name": {"type": "string"}, "mime_type": {"type": "string"}, "bytes": {"type": "integer"}, "sha256": {"type": "string"}, "kind": {"enum": ["preview", "deliverable"]}, "download_url": {"type": ["string", "null"]}}}}}}, "Upload": {"type": "object", "properties": {"id": {"type": "string"}, "created_at": {"type": "string"}, "name": {"type": "string"}, "mime_type": {"type": "string"}, "bytes": {"type": "integer"}, "sha256": {"type": "string"}, "download_url": {"type": "string"}}}, "CreatedOrder": {"allOf": [{"$ref": "#/components/schemas/Order"}, {"type": "object", "required": ["access_token", "created"], "properties": {"access_token": {"type": "string"}, "created": {"type": "boolean"}, "token_notice": {"type": "string"}}}]}, "Catalog": {"type": "object", "properties": {"currency": {"type": "string"}, "products": {"type": "array", "items": {"type": "object", "required": ["id", "name", "amount_cents", "payment_timing", "terms"], "properties": {"id": {"type": "string"}, "name": {"type": "string"}, "description": {"type": "string"}, "amount_cents": {"type": "integer", "minimum": 1}, "payment_timing": {"enum": ["before_production", "on_delivery"]}, "terms": {"type": "string"}, "currency": {"type": "string"}}}}, "orders_available": {"type": "boolean"}, "producer_review_required": {"type": "boolean"}, "online_payment_available": {"type": "boolean"}, "payment_environment": {"enum": ["live", "test"]}}}, "Checkout": {"type": "object", "properties": {"order_id": {"type": "string"}, "checkout_url": {"type": ["string", "null"]}, "amount_cents": {"type": "integer"}, "currency": {"type": "string"}, "payment_status": {"type": "string"}, "next_action": {"type": "string"}}}, "Error": {"type": "object", "required": ["error"], "properties": {"error": {"type": "object", "required": ["code", "message"], "properties": {"code": {"type": "string"}, "message": {"type": "string"}}}}}}, "securitySchemes": {"orderToken": {"type": "http", "scheme": "bearer", "description": "Private per-order access_token returned at order creation. Never put it in a URL."}}}, "paths": {"/catalog": {"get": {"operationId": "getCatalog", "summary": "Discover trial, terms, pricing and live payment availability", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Catalog"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}}}, "/orders": {"post": {"operationId": "createOrder", "summary": "Submit a brief; no charge or production until approved", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CreatedOrder"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "properties": {"product_id": {"type": "string", "enum": ["sample-film"]}, "name": {"type": "string", "maxLength": 120}, "email": {"type": "string", "maxLength": 200}, "organization": {"type": "string", "maxLength": 200}, "brief": {"type": "string", "maxLength": 20000}, "audience": {"type": "string", "maxLength": 2000}, "language": {"type": "string", "maxLength": 100}, "direction": {"type": "string", "maxLength": 5000}, "voice": {"type": "string", "maxLength": 2000}, "material_urls": {"type": "array", "maxItems": 40, "items": {"type": "string", "format": "uri", "maxLength": 2000}}, "customer_authorized": {"type": "boolean", "const": true, "description": "Only true with the customer's permission for this action."}}, "required": ["product_id", "name", "email", "brief", "customer_authorized"]}}}}, "parameters": [{"in": "header", "name": "Idempotency-Key", "required": true, "description": "Private random UUID. Reuse for exact retries only.", "schema": {"type": "string", "minLength": 24, "maxLength": 128}}]}}, "/orders/{order_id}": {"get": {"operationId": "getOrder", "summary": "Read script, payment, messages, status and delivery files", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Order"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "security": [{"orderToken": []}]}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}]}, "/orders/{order_id}/approve": {"post": {"operationId": "approveScript", "summary": "Approve the exact script, scope, price and terms", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Order"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "security": [{"orderToken": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "properties": {"script_digest": {"type": "string", "pattern": "^[0-9a-f]{64}$"}, "customer_authorized": {"type": "boolean", "const": true, "description": "Only true with the customer's permission for this action."}}, "required": ["script_digest", "customer_authorized"]}}}}}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}]}, "/orders/{order_id}/checkout": {"post": {"operationId": "createCheckout", "summary": "Get a Stripe-hosted payment URL; does not itself charge a card", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Checkout"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "security": [{"orderToken": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "properties": {"return_to": {"enum": ["agent", "human"], "default": "agent", "description": "Fixed return page after Checkout; never an arbitrary URL."}}, "required": []}}}}}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}]}, "/orders/{order_id}/messages": {"post": {"operationId": "sendFeedback", "summary": "Send directions, material links or revision requests", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Order"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "security": [{"orderToken": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "properties": {"message": {"type": "string", "minLength": 1, "maxLength": 10000}, "request_revision": {"type": "boolean"}}, "required": ["message"]}}}}}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}]}, "/orders/{order_id}/cancel": {"post": {"operationId": "cancelOrder", "summary": "Cancel a new brief or request producer-assisted cancellation/refund", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Order"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "security": [{"orderToken": []}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "additionalProperties": false, "properties": {}, "required": []}}}}}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}]}, "/orders/{order_id}/files/{file_id}": {"get": {"operationId": "downloadFile", "summary": "Download a private preview or paid deliverable", "responses": {"200": {"description": "Binary file; compare its SHA-256 and byte size to the order manifest.", "content": {"application/octet-stream": {"schema": {"type": "string", "format": "binary"}}}}, "400": {"description": "Invalid request", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Private order token required", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "State or idempotency conflict", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Required service unavailable", "content": {"application/json": {"schema": {"type": "object"}}}}, "402": {"description": "Confirmed payment required for final files"}}, "security": [{"orderToken": []}]}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}, {"name": "file_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^file_[0-9a-f]{24}$"}}]}, "/orders/{order_id}/uploads": {"post": {"operationId": "uploadMaterial", "summary": "Send the customer's own photos, footage, audio, PDFs or text", "responses": {"200": {"description": "Success", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Upload"}}}}, "400": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "401": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "409": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "429": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "503": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "404": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "413": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "415": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "500": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}, "502": {"description": "Read error.code and error.message for the next step.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Error"}}}}}, "security": [{"orderToken": []}], "requestBody": {"required": true, "content": {"application/octet-stream": {"schema": {"type": "string", "format": "binary"}}}}, "parameters": [{"in": "header", "name": "X-Filename", "required": true, "schema": {"type": "string"}, "description": "Original file name, URL-encoded UTF-8; no folder path."}, {"in": "header", "name": "X-Content-SHA256", "required": true, "schema": {"type": "string", "pattern": "^[0-9a-f]{64}$"}}, {"in": "header", "name": "Content-Length", "required": true, "schema": {"type": "integer", "minimum": 1, "maximum": 262144000}}]}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}]}, "/orders/{order_id}/uploads/{upload_id}": {"get": {"operationId": "downloadUploadedMaterial", "summary": "Retrieve material previously uploaded for this order", "responses": {"200": {"description": "Original uploaded bytes", "content": {"application/octet-stream": {"schema": {"type": "string", "format": "binary"}}}}, "400": {"description": "Invalid request", "content": {"application/json": {"schema": {"type": "object"}}}}, "401": {"description": "Private order token required", "content": {"application/json": {"schema": {"type": "object"}}}}, "409": {"description": "State or idempotency conflict", "content": {"application/json": {"schema": {"type": "object"}}}}, "429": {"description": "Rate limited", "content": {"application/json": {"schema": {"type": "object"}}}}, "503": {"description": "Required service unavailable", "content": {"application/json": {"schema": {"type": "object"}}}}}, "security": [{"orderToken": []}]}, "parameters": [{"name": "order_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^ord_[0-9a-f]{32}$"}}, {"name": "upload_id", "in": "path", "required": true, "schema": {"type": "string", "pattern": "^upl_[0-9a-f]{32}$"}}]}}}