{"openapi":"3.1.0","info":{"title":"Four Echelon API","version":"1.4.0","summary":"Geometry infrastructure for engineering AI: Four Cad extraction and Rowe spatial reasoning.","description":"Two calls. POST /api/v1/cad/extract turns STEP, IGES, DXF, PDF, SVG, or draw.io files into four-cad.extraction.v1 (solids, drawing entities, dimensions, diagram graphs). POST /api/v1/responses runs Rowe 1.0 over a cad_scene or point_cloud_scene with a task_type and returns typed spatial output. Everything is billed by spatial tokens under your API key; non-2xx responses are never billed. The same API is available as a Model Context Protocol server at POST /api/mcp.","termsOfService":"https://fourechelon.com/terms-of-service","contact":{"name":"Four Echelon","url":"https://fourechelon.com","email":"support@fourechelon.com"},"x-logo":{"url":"https://fourechelon.com/Four%20Echelon%20Logo.svg"}},"servers":[{"url":"https://fourechelon.com","description":"Production"}],"externalDocs":{"url":"https://fourechelon.com/docs","description":"Guides, concepts, and the human-readable reference"},"security":[{"bearerAuth":[]}],"tags":[{"name":"Four Cad","description":"CAD, drawing, and diagram extraction"},{"name":"Rowe","description":"Spatial reasoning over structured geometry"},{"name":"Models","description":"Model cards, pricing, and runtime availability"},{"name":"Partners","description":"Feature-tree import for CAD partners"},{"name":"MCP","description":"Model Context Protocol server"},{"name":"Operations","description":"Health and status"}],"paths":{"/api/v1/models":{"get":{"tags":["Models"],"operationId":"listModels","summary":"List models and runtime availability","description":"Public. Returns the model cards with pricing, supported tasks, and input modalities, plus whether the desktop inference runtime is available right now (runtime_available). Never billed.","security":[],"responses":{"200":{"description":"Model list","headers":{"X-Request-ID":{"description":"Request id for support and debugging. Also present in the body as request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelList"}}}}}}},"/api/v1/responses":{"post":{"tags":["Rowe"],"operationId":"createResponse","summary":"Run Rowe over a scene","description":"Send a cad_scene (from /api/v1/cad/extract, ideally target_contract both) or a point_cloud_scene with a task_type. Returns typed spatial output, usage, and a request_id. Worker validation failures are 422 invalid_request_error; an unavailable runtime is 503 desktop_inference_unavailable. Requests wait up to 18 s for the desktop worker.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponsesRequest"}}}},"responses":{"200":{"description":"Typed spatial output","headers":{"X-Request-ID":{"description":"Request id for support and debugging. Also present in the body as request_id.","schema":{"type":"string"}},"Idempotency-Replayed":{"description":"true when a stored response was replayed for the Idempotency-Key","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponsesResponse"}}}},"400":{"description":"invalid_request_error: bad body, model, or Idempotency-Key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"authentication_error: missing, revoked, or invalid API key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"payment_required: an active or trialing paid API subscription is required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"idempotency_conflict / idempotency_in_progress","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"invalid_request_error: the Rowe worker rejected the input (for example a task that needs an image, or a point cloud kind outside unknown/box/surface/container)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limit_exceeded (per-minute or billing-period ceiling; see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"desktop_inference_unavailable / billing_unavailable / usage_finalization_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/responses/batch":{"post":{"tags":["Rowe"],"operationId":"createResponseBatch","summary":"Run up to 32 Rowe requests in one call","description":"Each item has the same shape as POST /api/v1/responses. The envelope returns 200 when every item succeeded and 207 when any item failed; data[] is in request order and every entry carries its own status.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["requests"],"properties":{"requests":{"type":"array","minItems":1,"maxItems":32,"items":{"$ref":"#/components/schemas/ResponsesRequest"}}}}}}},"responses":{"200":{"description":"Every item succeeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseBatch"}}}},"207":{"description":"At least one item failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResponseBatch"}}}},"400":{"description":"invalid_request_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"authentication_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/cad/extract":{"post":{"tags":["Four Cad"],"operationId":"extractCad","summary":"Extract a CAD, drawing, or draw.io file","description":"Accepts STEP, STP, IGES, IGS, DXF, PDF, SVG, DRAWIO, XML, PNG (xml and png only when they carry a draw.io diagram). Send the file as multipart/form-data, as JSON with content_base64, or as JSON with content_url for the server to download. The hosting platform caps request bodies at about 6 MB, so inline uploads work up to roughly 4 MB; larger files (up to 26214400 bytes) must use content_url. Returns four-cad.extraction.v1. Billed as input tokens = ceil(bytes / 4) and output tokens = ceil(response JSON / 4); non-2xx is never billed.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CadExtractRequest"},"examples":{"inline":{"summary":"Inline base64 (files under ~4 MB)","value":{"file_name":"bracket.step","target_contract":"structured","content_base64":"SVNPLTEwMzAzLTIxOw=="}},"byUrl":{"summary":"By URL (files up to 25 MB)","value":{"file_name":"assembly.step","target_contract":"both","content_url":"https://files.example.com/exports/assembly.step"}}}},"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","format":"binary","description":"The CAD, drawing, or diagram file. The extension selects the parser."},"target_contract":{"$ref":"#/components/schemas/TargetContract"}}}}}},"responses":{"200":{"description":"four-cad.extraction.v1","headers":{"X-Request-ID":{"description":"Request id for support and debugging. Also present in the body as request_id.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CadExtraction"}}}},"400":{"description":"invalid_request_error: missing file_name, bad base64, refused content_url, or invalid target_contract","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"authentication_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"payment_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large: body over the ~6 MB platform limit or file over 25 MB","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"unsupported_file_type (SolidWorks native files: export STEP)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"parse_error / timeout_error passed through from the converter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"converter_unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/cad/extract/batch":{"post":{"tags":["Four Cad"],"operationId":"createCadExtractBatch","summary":"Submit up to 32 files for asynchronous extraction","description":"Multipart (repeat the files part) or JSON items[]. Returns 202 with a batch id and status_url; poll GET /api/v1/cad/extract/batch/{id}. Results and staged files are deleted 24 hours after submission. Only 2xx items are billed.","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","minItems":1,"maxItems":32,"items":{"$ref":"#/components/schemas/CadExtractRequest"}}}}},"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","items":{"type":"string","format":"binary"}},"target_contract":{"$ref":"#/components/schemas/TargetContract"}}}}}},"responses":{"202":{"description":"Batch accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CadExtractBatch"}}}},"400":{"description":"invalid_request_error (details name the offending item)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"authentication_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"request_too_large","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"unsupported_file_type (the whole batch is rejected before anything is staged)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"rate_limit_exceeded: more than 5 batches in flight or 10 submitted per minute on one key","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/cad/extract/batch/{id}":{"get":{"tags":["Four Cad"],"operationId":"getCadExtractBatch","summary":"Poll a batch","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^cb_"}}],"responses":{"200":{"description":"Batch status and per-item results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CadExtractBatch"}}}},"401":{"description":"authentication_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"not_found: unknown id or another account's batch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/cad/import-feature-tree":{"post":{"tags":["Partners"],"operationId":"importFeatureTree","summary":"Import a partner feature tree as a cad_scene","description":"For CAD partners (Adam, Onshape-style feature trees). Authenticated with the caller's API key; the feature tree becomes a scene Rowe can reason over.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureTreeImport"}}}},"responses":{"200":{"description":"Imported scene","content":{"application/json":{"schema":{"type":"object","properties":{"scene_id":{"type":"string"},"request_id":{"type":"string"}},"additionalProperties":true}}}},"400":{"description":"invalid_request_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"authentication_error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"payment_required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/cad/partner-webhook":{"post":{"tags":["Partners"],"operationId":"partnerWebhook","summary":"Receive a signed partner feature-tree event","description":"Signed with HMAC-SHA256 over the raw body using the partner webhook secret, sent in X-Four-Echelon-Signature. Unsigned or badly signed posts are 401.","security":[{"partnerSignature":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureTreeImport"}}}},"responses":{"200":{"description":"Accepted","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"401":{"description":"invalid or missing signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/mcp":{"post":{"tags":["MCP"],"operationId":"mcp","summary":"Model Context Protocol server (Streamable HTTP, stateless JSON)","description":"JSON-RPC 2.0. Methods: initialize, ping, tools/list, tools/call, prompts/list, prompts/get, resources/list, resources/read. Tools: extract_cad, extract_cad_from_url, rowe_respond, list_models, list_supported_formats. Billed tools forward to the REST routes they mirror under the same Authorization header. A missing key on a billed tool is HTTP 401 with a JSON-RPC error.","security":[{"bearerAuth":[]},{}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"},"examples":{"listTools":{"value":{"jsonrpc":"2.0","id":1,"method":"tools/list"}},"extract":{"value":{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"extract_cad","arguments":{"file_name":"cabinet.drawio","content_base64":"<base64>","target_contract":"structured"}}}}}}}},"responses":{"200":{"description":"JSON-RPC response or batch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"Notification accepted (no body)"},"401":{"description":"Billed tool called without Authorization","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}}}}},"/api/health":{"get":{"tags":["Operations"],"operationId":"health","summary":"Aggregate health","description":"Public. 200 with status healthy or degraded, 503 when down. Checks Convex, the Four Cad converter, the Rowe runtime, and desktop inference availability (rowe_availability).","security":[],"responses":{"200":{"description":"healthy or degraded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}},"503":{"description":"down","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"fe_live_...","description":"API key from the dashboard (Settings → API). Send as Authorization: Bearer fe_live_... . Keys are hashed at rest and can be revoked at any time."},"partnerSignature":{"type":"apiKey","in":"header","name":"X-Four-Echelon-Signature","description":"HMAC-SHA256 of the raw request body with the partner webhook secret."}},"parameters":{"IdempotencyKey":{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Retry-safe replays for 24 h: the same key with the same payload returns the stored response with Idempotency-Replayed: true; a different payload is 409 idempotency_conflict; a still-running request is 409 idempotency_in_progress."}},"schemas":{"Error":{"type":"object","required":["error","request_id"],"properties":{"error":{"type":"object","required":["message","type"],"properties":{"message":{"type":"string"},"type":{"type":"string","description":"Stable machine-readable error type (invalid_request_error, authentication_error, payment_required, rate_limit_exceeded, request_too_large, unsupported_file_type, parse_error, desktop_inference_unavailable, converter_unavailable, ...)"},"details":{"type":"object","additionalProperties":true}}},"request_id":{"type":"string"}}},"TargetContract":{"type":"string","enum":["structured","point_cloud_scene","both"],"default":"structured","description":"structured: entities, dimensions, solids, or the diagram2d graph. point_cloud_scene: sampled points only. both: everything (use this when the result feeds Rowe)."},"CadExtractRequest":{"type":"object","required":["file_name"],"properties":{"file_name":{"type":"string","maxLength":255,"description":"Name with extension; the extension selects the parser (step, stp, iges, igs, dxf, pdf, svg, drawio, xml, png)."},"content_base64":{"type":"string","description":"Standard base64 of the file bytes. Inline bodies are capped at ~6 MB by the platform (about 4 MB of file)."},"content_url":{"type":"string","format":"uri","description":"Public http(s) URL the server downloads (up to 26214400 bytes, 20 s). Private, loopback, and link-local hosts are refused. Use for files over ~4 MB."},"target_contract":{"$ref":"#/components/schemas/TargetContract"}},"oneOf":[{"required":["content_base64"]},{"required":["content_url"]}]},"Usage":{"type":"object","properties":{"input_tokens":{"type":"integer"},"output_tokens":{"type":"integer"},"estimated_input_cost_usd":{"type":"number"},"estimated_output_cost_usd":{"type":"number"},"estimated_cost_usd":{"type":"number"}},"description":"Spatial tokens metered for this request. Reported on every response; charged only on 2xx."},"PointCloud":{"type":"object","required":["object_id","points"],"properties":{"object_id":{"type":"string"},"kind":{"type":"string","enum":["unknown","box","surface","container"],"default":"unknown"},"points":{"type":"array","items":{"type":"object","required":["x","y","z"],"properties":{"x":{"type":"number"},"y":{"type":"number"},"z":{"type":"number"}}}}}},"PointCloudScene":{"type":"object","required":["point_clouds"],"properties":{"scene_id":{"type":"string"},"point_clouds":{"type":"array","items":{"$ref":"#/components/schemas/PointCloud"}}}},"CadExtraction":{"type":"object","required":["schema","source_format","units","statistics","warnings","request_id"],"properties":{"schema":{"type":"string","const":"four-cad.extraction.v1"},"source_format":{"type":"string","description":"Detected format: step, iges, dxf, pdf, svg, drawio"},"units":{"type":"string","description":"millimeter, inch, pixel, ..."},"structure":{"type":"object","description":"Present for target_contract structured or both.","properties":{"kind":{"type":"string","enum":["brep","drawing2d","diagram2d"]},"solids":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"brep: per-solid bbox, volume, surface_area, center_of_mass, faces"},"layers":{"type":"array","items":{"type":"object","additionalProperties":true}},"entities":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"drawing2d/diagram2d: typed entities with geometry"},"dimensions":{"type":"array","items":{"type":"object","additionalProperties":true}},"annotations":{"type":"array","items":{"type":"object","additionalProperties":true}},"pages":{"type":"array","items":{"$ref":"#/components/schemas/DiagramPage"},"description":"diagram2d only"},"callouts":{"type":"array","description":"DXF/PDF: typed engineering callouts (thread, hole, counterbore, countersink, spotface, tolerance, fit, radius, chamfer, surface_finish, reference_dimension, limit) parsed from dimension and note text, with quantity, through/depth, source text id, and position.","items":{"type":"object","required":["id","type","text","source"],"properties":{"id":{"type":"string"},"type":{"type":"string"},"text":{"type":"string"},"source":{"type":"string"},"quantity":{"type":"integer"},"through":{"type":"boolean"},"depth":{"type":"number"},"position":{"type":"array","items":{"type":"number"}}},"additionalProperties":true}},"drawing_metadata":{"type":"object","description":"DXF and PDF drawings: title block, parts list, revision table, and notes read from the vector text (never OCR), each with source annotation ids and a confidence. Omitted when the sheet has none.","properties":{"title_block":{"type":"object","properties":{"fields":{"type":"object","additionalProperties":{"type":"string"},"description":"title, drawing_number, part_number, revision, material, finish, scale, sheet, size, drawn_by, checked_by, approved_by, date, weight, tolerances, units, project, customer, company, cage_code"},"confidence":{"type":"number"},"sources":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"bom":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"string"}},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"confidence":{"type":"number"}}},"revisions":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"string"}},"rows":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"confidence":{"type":"number"}}},"notes":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"number":{"type":"integer"},"text":{"type":"string"}}}},"confidence":{"type":"number"}}}}}},"additionalProperties":true},"point_cloud_scene":{"$ref":"#/components/schemas/PointCloudScene"},"statistics":{"type":"object","properties":{"entity_counts":{"type":"object","additionalProperties":{"type":"integer"}},"total_points":{"type":"integer"},"bbox":{"type":"object","properties":{"min":{"type":"array","items":{"type":"number"}},"max":{"type":"array","items":{"type":"number"}}}}}},"warnings":{"type":"array","items":{"type":"string"}},"file_name":{"type":"string"},"target_contract":{"$ref":"#/components/schemas/TargetContract"},"usage":{"$ref":"#/components/schemas/Usage"},"request_id":{"type":"string"}}},"DiagramPage":{"type":"object","description":"One draw.io page as an agent-readable graph.","properties":{"id":{"type":"string"},"name":{"type":"string"},"nodes":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string","description":"Plain text; HTML stripped"},"shape":{"type":"string"},"bbox":{"type":"object","properties":{"x":{"type":"number"},"y":{"type":"number"},"width":{"type":"number"},"height":{"type":"number"}},"description":"Absolute page coordinates (container offsets applied)"},"center":{"type":"array","items":{"type":"number"}},"parent":{"type":["string","null"]},"children":{"type":"array","items":{"type":"string"}},"is_container":{"type":"boolean"},"is_text":{"type":"boolean"},"link":{"type":"string"},"attributes":{"type":"object","additionalProperties":{"type":"string"}}}}},"edges":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"source":{"type":["string","null"]},"target":{"type":["string","null"]},"directed":{"type":"boolean"},"bidirectional":{"type":"boolean"},"label":{"type":"string"},"connector":{"type":"string"},"dashed":{"type":"boolean"},"waypoints":{"type":"array","items":{"type":"array","items":{"type":"number"}}}}}},"relations":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["contains","left_of","right_of","above","below","overlaps"]},"subject":{"type":"string"},"object":{"type":"string"},"via_edge":{"type":"string"}}}},"graph":{"type":"object","properties":{"node_count":{"type":"integer"},"edge_count":{"type":"integer"},"roots":{"type":"array","items":{"type":"string"}},"sinks":{"type":"array","items":{"type":"string"}},"isolated":{"type":"array","items":{"type":"string"}},"components":{"type":"integer"},"has_cycle":{"type":"boolean"}}}}},"ResponsesRequest":{"type":"object","required":["input"],"properties":{"model":{"type":"string","default":"rowe-1.0","enum":["rowe-1.0"]},"input":{"type":"object","required":["task_type"],"properties":{"task_type":{"type":"string","enum":["fit","stability","placement","embed","describe","classify","compare","understand","reconstruct","predict","act","optimize"]},"cad_scene":{"$ref":"#/components/schemas/CadExtraction","description":"A Four Cad extraction (target_contract both recommended so it carries a point_cloud_scene)."},"previous_cad_scene":{"$ref":"#/components/schemas/CadExtraction"},"point_cloud_scene":{"$ref":"#/components/schemas/PointCloudScene"},"previous_point_cloud_scene":{"$ref":"#/components/schemas/PointCloudScene"},"image":{"type":"object","additionalProperties":true,"description":"Raster frame or depth map; required by the learned fit, stability, placement, and embed tasks"},"images":{"type":"array","items":{"type":"object","additionalProperties":true}},"sensor_readings":{"type":"array","items":{"type":"object","additionalProperties":true}},"goal":{"type":"object","additionalProperties":true},"object_id":{"type":"string","description":"Primary object id (fit, stability, placement, embed, act)"},"secondary_id":{"type":"string","description":"Target or container id (fit, placement)"},"detail":{"type":"string","enum":["compact","standard","debug"],"default":"standard"}},"additionalProperties":true},"request_id":{"type":"string","description":"Optional caller request id, echoed back"}}},"ResponsesResponse":{"type":"object","properties":{"id":{"type":"string"},"object":{"type":"string","const":"response"},"model":{"type":"string"},"output":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Typed spatial outputs for the task. With a cad_scene in the request, understand/describe/compare include data.cad_scene (objects with absolute bounds and parents, connected_to relations with direction, containment and spatial relations, title block, callout counts) and compare includes data.cad_scene_diff."},"usage":{"$ref":"#/components/schemas/Usage"},"request_id":{"type":"string"},"router":{"type":"object","additionalProperties":true,"description":"Provenance: which runtime answered"}},"additionalProperties":true},"ResponseBatch":{"type":"object","properties":{"object":{"type":"string","const":"response_batch"},"request_id":{"type":"string"},"data":{"type":"array","items":{"type":"object","properties":{"status":{"type":"integer"}},"additionalProperties":true}}}},"CadExtractBatch":{"type":"object","properties":{"object":{"type":"string","const":"cad_extract_batch"},"id":{"type":"string"},"status":{"type":"string","enum":["queued","running","done","failed","expired"]},"status_url":{"type":"string"},"counts":{"type":"object","additionalProperties":{"type":"integer"}},"items":{"type":"array","items":{"type":"object","additionalProperties":true}},"usage":{"$ref":"#/components/schemas/Usage"},"expires_at":{"type":"string","format":"date-time"}}},"FeatureTreeImport":{"type":"object","required":["partner","document_id","feature_tree"],"properties":{"partner":{"type":"string","examples":["adam"]},"document_id":{"type":"string"},"feature_tree":{"type":"array","items":{"type":"object","required":["id","feature_type"],"properties":{"id":{"type":"string"},"feature_type":{"type":"string"}},"additionalProperties":true}}}},"ModelCard":{"type":"object","properties":{"id":{"type":"string"},"display_name":{"type":"string"},"description":{"type":"string"},"io":{"type":"object","additionalProperties":true},"pricing":{"type":"object","additionalProperties":true}},"additionalProperties":true},"ModelList":{"type":"object","properties":{"object":{"type":"string","const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/ModelCard"}},"runtime_configured":{"type":"boolean"},"runtime_available":{"type":"boolean","description":"Whether a healthy desktop worker can take a request right now"},"runtime_status":{"type":"string"},"upstream_status":{"type":"string"}}},"JsonRpcRequest":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","integer","null"]},"method":{"type":"string"},"params":{"type":"object","additionalProperties":true}}},"JsonRpcResponse":{"type":"object","required":["jsonrpc","id"],"properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","integer","null"]},"result":{"type":"object","additionalProperties":true},"error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{}}}}},"Health":{"type":"object","properties":{"status":{"type":"string","enum":["healthy","degraded","down"]},"timestamp":{"type":"string","format":"date-time"},"services":{"type":"object","additionalProperties":{"type":"string"}},"checks":{"type":"object","additionalProperties":{"type":"object","properties":{"status":{"type":"string"},"latencyMs":{"type":["number","null"]},"detail":{"type":"string"}}}}}}}}}