{"components":{"schemas":{"Analysis":{"additionalProperties":false,"properties":{"applied":{"anyOf":[{"$ref":"#/components/schemas/AppliedRepair"},{"type":"null"}]},"dimensions_mm":{"maxItems":3,"minItems":3,"prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}],"title":"Dimensions Mm","type":"array"},"faces":{"exclusiveMinimum":0,"title":"Faces","type":"integer"},"fidelity":{"$ref":"#/components/schemas/FidelityReport"},"is_watertight":{"title":"Is Watertight","type":"boolean"},"recommendation_assessment":{"anyOf":[{"$ref":"#/components/schemas/RecommendationAssessment"},{"type":"null"}]},"recommendation_assessments_by_scale":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/RecommendationAssessment"},"type":"object"},{"type":"null"}],"title":"Recommendation Assessments By Scale"},"recommended":{"anyOf":[{"$ref":"#/components/schemas/RepairParams"},{"type":"null"}]},"recommended_by_scale":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/RepairParams"},"type":"object"},{"type":"null"}],"title":"Recommended By Scale"},"schema_version":{"const":"1","default":"1","title":"Schema Version","type":"string"},"shells":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"title":"Shells"},"simulated":{"title":"Simulated","type":"boolean"},"surface_area_mm2":{"minimum":0,"title":"Surface Area Mm2","type":"number"},"vertices":{"exclusiveMinimum":0,"title":"Vertices","type":"integer"},"volume_mm3":{"minimum":0,"title":"Volume Mm3","type":"number"},"warnings":{"items":{"type":"string"},"maxItems":100,"title":"Warnings","type":"array"}},"required":["simulated","vertices","faces","volume_mm3","surface_area_mm2","dimensions_mm","is_watertight"],"title":"Analysis","type":"object"},"ApiKey":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expires At"},"grace_until":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Grace Until"},"id":{"title":"Id","type":"string"},"kind":{"enum":["live","test"],"title":"Kind","type":"string"},"last_used_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Last Used At"},"name":{"title":"Name","type":"string"},"org_id":{"title":"Org Id","type":"string"},"prefix":{"title":"Prefix","type":"string"},"revoked_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Revoked At"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"title":"Scopes","type":"array"},"superseded_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Superseded By"}},"required":["id","org_id","kind","prefix","name","scopes","created_at","expires_at","last_used_at","revoked_at","superseded_by","grace_until"],"title":"ApiKey","type":"object"},"ApiKeyPage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/ApiKey"},"title":"Data","type":"array"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"required":["data"],"title":"ApiKeyPage","type":"object"},"AppliedRepair":{"additionalProperties":false,"description":"What the repair actually ran with, and where each value came from.\n\n``wall_thickness_applied_mm`` is the wall the engine pushed to, which is\n``params.wall_thickness_mm`` unless the engine raised it: the wall is floored at four\nvoxels of the fine grid (a 0.7 mm request became 1.46 mm on a 20-inch print) and\nclamped at 10 % of the longest axis (fact: PrepEngine.cpp wallThicknessAppliedMM /\nwallThicknessClamped). ``wall_thickness_clamped`` says whether it differs. Both are\nNone when the engine did not report them (a sandbox that predates them).","properties":{"diagnostic_overrides":{"additionalProperties":{"anyOf":[{"type":"integer"},{"type":"boolean"}]},"title":"Diagnostic Overrides","type":"object"},"effective_engine_settings":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object"},{"type":"null"}],"title":"Effective Engine Settings"},"params":{"$ref":"#/components/schemas/RepairParams"},"sources":{"additionalProperties":{"enum":["explicit","printer","profile","recommended","default"],"type":"string"},"title":"Sources","type":"object"},"wall_thickness_applied_mm":{"anyOf":[{"minimum":0,"type":"number"},{"type":"null"}],"title":"Wall Thickness Applied Mm"},"wall_thickness_clamped":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Wall Thickness Clamped"}},"required":["params","sources"],"title":"AppliedRepair","type":"object"},"Artifact":{"properties":{"id":{"title":"Id","type":"string"},"job_id":{"title":"Job Id","type":"string"},"label":{"title":"Label","type":"string"},"media_type":{"title":"Media Type","type":"string"},"sha256":{"title":"Sha256","type":"string"},"size_bytes":{"title":"Size Bytes","type":"integer"}},"required":["id","job_id","label","size_bytes","sha256","media_type"],"title":"Artifact","type":"object"},"ArtifactList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Artifact"},"title":"Data","type":"array"}},"required":["data"],"title":"ArtifactList","type":"object"},"Balance":{"description":"The organization's credits. ``available`` = included + purchased - held.\n\nIncluded credits come with the plan each period and expire at its end; purchased\ncredits never expire and go negative when a job runs longer than its balance covered.","properties":{"available_credits":{"title":"Available Credits","type":"integer"},"exhausted":{"title":"Exhausted","type":"boolean"},"held_credits":{"title":"Held Credits","type":"integer"},"included_credits":{"title":"Included Credits","type":"integer"},"low":{"title":"Low","type":"boolean"},"period_end":{"format":"date-time","title":"Period End","type":"string"},"period_start":{"format":"date-time","title":"Period Start","type":"string"},"purchased_credits":{"title":"Purchased Credits","type":"integer"}},"required":["included_credits","purchased_credits","held_credits","available_credits","period_start","period_end","low","exhausted"],"title":"Balance","type":"object"},"CadCheckResult":{"properties":{"accuracy_mm":{"title":"Accuracy Mm","type":"number"},"open_parts":{"title":"Open Parts","type":"integer"},"pairs":{"title":"Pairs","type":"integer"},"parts":{"title":"Parts","type":"integer"},"placed_copies":{"title":"Placed Copies","type":"integer"},"sample_limit_per_shape":{"title":"Sample Limit Per Shape","type":"integer"},"schema_version":{"title":"Schema Version","type":"integer"},"sheet_parts":{"title":"Sheet Parts","type":"integer"},"truncated":{"title":"Truncated","type":"boolean"},"unsupported_placements":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"Placements in the file the checker could not read, so the parts they place were not measured. An evaluation reports them as `PLACEMENTS_UNREAD`. `null` for a file checked before 2026-11-10, whose checker did not count them.","title":"Unsupported Placements"}},"required":["schema_version","parts","placed_copies","pairs","open_parts","sheet_parts","accuracy_mm","sample_limit_per_shape","truncated"],"title":"CadCheckResult","type":"object"},"Capacity":{"properties":{"reason":{"anyOf":[{"enum":["paused","spend_limit","no_gpu_available","controller_offline"],"type":"string"},{"type":"null"}],"title":"Reason"},"retry_after_s":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After S"},"state":{"enum":["available","busy","exhausted"],"title":"State","type":"string"}},"required":["state"],"title":"Capacity","type":"object"},"CreateApiKey":{"additionalProperties":false,"properties":{"expires_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Expires At"},"name":{"maxLength":100,"minLength":1,"title":"Name","type":"string"},"scopes":{"items":{"$ref":"#/components/schemas/Scope"},"maxItems":10,"minItems":1,"title":"Scopes","type":"array"}},"required":["name","scopes"],"title":"CreateApiKey","type":"object"},"CreateExport":{"additionalProperties":false,"properties":{"format":{"enum":["glb","obj","3mf","stl","ply"],"title":"Format","type":"string"}},"required":["format"],"title":"CreateExport","type":"object"},"CreateFile":{"additionalProperties":false,"properties":{"filename":{"maxLength":200,"minLength":5,"title":"Filename","type":"string"},"sha256":{"pattern":"^[a-f0-9]{64}$","title":"Sha256","type":"string"},"size_bytes":{"exclusiveMinimum":0,"maximum":10485760,"title":"Size Bytes","type":"integer"}},"required":["filename","size_bytes","sha256"],"title":"CreateFile","type":"object"},"CreateJob":{"additionalProperties":false,"properties":{"input_file_id":{"pattern":"^file_[0-9A-HJKMNP-TV-Z]{26}$","title":"Input File Id","type":"string"},"notify":{"anyOf":[{"$ref":"#/components/schemas/NotifyTarget"},{"type":"null"}]},"params":{"anyOf":[{"$ref":"#/components/schemas/RepairParams"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"},"recipe":{"default":"inspect","enum":["inspect","repair","tool","cad_check"],"title":"Recipe","type":"string"},"tool":{"anyOf":[{"enum":["measure","convert","cut","lattice","label","mirror","remove_small_parts","thickness","analyze","medial","structural.components","structural.fea","structural.heatmap","structural.fragility","structural.measure_all","structural.relief"],"type":"string"},{"type":"null"}],"title":"Tool"}},"required":["input_file_id"],"title":"CreateJob","type":"object"},"CreateResumableFile":{"additionalProperties":false,"properties":{"filename":{"maxLength":200,"minLength":5,"title":"Filename","type":"string"},"input_format":{"enum":["stl","obj","3mf","ply","wrl","vrm","fbx","gltf","glb","dae","off","dcm","dicom","las","laz","step","zip","tar","tgz","rar"],"title":"Input Format","type":"string"},"sha256":{"pattern":"^[a-f0-9]{64}$","title":"Sha256","type":"string"},"size_bytes":{"exclusiveMinimum":0,"maximum":1073741824,"title":"Size Bytes","type":"integer"}},"required":["filename","size_bytes","sha256","input_format"],"title":"CreateResumableFile","type":"object"},"CreateWebhookEndpoint":{"additionalProperties":false,"description":"An HTTPS address that resolves to a public host. Anything else is refused.","properties":{"url":{"maxLength":2048,"minLength":9,"title":"Url","type":"string"}},"required":["url"],"title":"CreateWebhookEndpoint","type":"object"},"CreditTransaction":{"properties":{"available_after":{"title":"Available After","type":"integer"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"held_delta":{"title":"Held Delta","type":"integer"},"included_delta":{"title":"Included Delta","type":"integer"},"job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Job Id"},"kind":{"enum":["plan_grant","expire","topup","adjust","hold","settle"],"title":"Kind","type":"string"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"purchased_delta":{"title":"Purchased Delta","type":"integer"},"sequence":{"title":"Sequence","type":"integer"}},"required":["sequence","kind","included_delta","purchased_delta","held_delta","available_after","created_at"],"title":"CreditTransaction","type":"object"},"CreditTransactionPage":{"description":"Newest first; pass ``next_before`` as ``before`` for the next page.","properties":{"data":{"items":{"$ref":"#/components/schemas/CreditTransaction"},"title":"Data","type":"array"},"next_before":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Next Before"}},"required":["data"],"title":"CreditTransactionPage","type":"object"},"DataNotice":{"properties":{"processing_region":{"title":"Processing Region","type":"string"},"retention_days":{"title":"Retention Days","type":"integer"}},"required":["processing_region","retention_days"],"title":"DataNotice","type":"object"},"ErrorCode":{"description":"Every code the API may emit, public plane and worker plane.","enum":["malformed_request","unauthenticated","invalid_api_key","bootstrap_invalid","insufficient_credits","insufficient_scope","org_required","origin_not_allowed","ip_not_allowed","image_not_allowed","account_pending","not_found","method_not_allowed","conflict","job_not_cancellable","idempotency_in_progress","lease_expired","lease_terminal","expired","file_too_large","unsupported_format","validation_failed","idempotency_key_reused","input_too_large","contracts_mismatch","rate_limited","concurrency_limit","quota_exceeded","internal","feature_unavailable","service_unavailable","capacity_exhausted"],"title":"ErrorCode","type":"string"},"Evaluation":{"properties":{"findings":{"items":{"$ref":"#/components/schemas/Finding"},"title":"Findings","type":"array"},"material":{"title":"Material","type":"string"},"process":{"title":"Process","type":"string"},"summary":{"enum":["ok","warnings","blocked"],"title":"Summary","type":"string"}},"required":["process","material","summary","findings"],"title":"Evaluation","type":"object"},"EvaluationList":{"description":"Verdicts for one stored check, and the version of the limits table they were judged by.","properties":{"items":{"items":{"$ref":"#/components/schemas/Evaluation"},"title":"Items","type":"array"},"table_version":{"title":"Table Version","type":"integer"}},"required":["table_version","items"],"title":"EvaluationList","type":"object"},"EventPage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/JobEvent"},"title":"Data","type":"array"},"next_after":{"title":"Next After","type":"integer"}},"required":["data","next_after"],"title":"EventPage","type":"object"},"Export":{"description":"A job's mesh output in one format, every piece in it (ADR-0058).\n\n``ready``: download ``artifact`` (GET /v1/artifacts/{id}/download). ``converting``: the\nformat was not generated, a conversion job (``conversion_job_id``, charged like any\n``convert`` job) is making it; ask again. ``failed``: ``error_code`` says why; creating the\nexport again starts a new conversion.","properties":{"artifact":{"anyOf":[{"$ref":"#/components/schemas/Artifact"},{"type":"null"}]},"conversion_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversion Job Id"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"format":{"enum":["glb","obj","3mf","stl","ply"],"title":"Format","type":"string"},"job_id":{"title":"Job Id","type":"string"},"status":{"enum":["ready","converting","failed"],"title":"Status","type":"string"}},"required":["job_id","format","status"],"title":"Export","type":"object"},"FidelityReport":{"additionalProperties":false,"description":"An artifact-bound comparison; absent or uncalibrated evidence never passes.","properties":{"calibration_id":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"title":"Calibration Id"},"config_sha256":{"anyOf":[{"pattern":"^[a-f0-9]{64}$","type":"string"},{"type":"null"}],"title":"Config Sha256"},"coordinate_frame":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"title":"Coordinate Frame"},"error":{"anyOf":[{"maxLength":500,"type":"string"},{"type":"null"}],"title":"Error"},"input_sha256":{"anyOf":[{"pattern":"^[a-f0-9]{64}$","type":"string"},{"type":"null"}],"title":"Input Sha256"},"limitations":{"items":{"type":"string"},"maxItems":100,"title":"Limitations","type":"array"},"method_version":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"title":"Method Version"},"metrics":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"title":"Metrics","type":"object"},"output_sha256":{"anyOf":[{"pattern":"^[a-f0-9]{64}$","type":"string"},{"type":"null"}],"title":"Output Sha256"},"reason_codes":{"items":{"type":"string"},"maxItems":100,"title":"Reason Codes","type":"array"},"schema_version":{"const":"1","default":"1","title":"Schema Version","type":"string"},"source_scope":{"default":"original_input","enum":["original_input","engine_transformed_source"],"title":"Source Scope","type":"string"},"source_sha256":{"anyOf":[{"pattern":"^[a-f0-9]{64}$","type":"string"},{"type":"null"}],"title":"Source Sha256"},"source_to_output_transform":{"anyOf":[{"items":{"items":{"type":"number"},"type":"array"},"type":"array"},{"type":"null"}],"title":"Source To Output Transform"},"status":{"default":"not_assessed","enum":["not_assessed","needs_review","passed","failed"],"title":"Status","type":"string"},"thresholds":{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"title":"Thresholds","type":"object"},"thresholds_calibrated":{"default":false,"title":"Thresholds Calibrated","type":"boolean"},"transform_verified":{"default":false,"title":"Transform Verified","type":"boolean"}},"title":"FidelityReport","type":"object"},"File":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"filename":{"title":"Filename","type":"string"},"id":{"title":"Id","type":"string"},"input_format":{"default":"stl","enum":["stl","obj","3mf","ply","wrl","vrm","fbx","gltf","glb","dae","off","dcm","dicom","las","laz","step","zip","tar","tgz","rar"],"title":"Input Format","type":"string"},"kind":{"default":"mesh","enum":["mesh","splat","pointcloud","medical","cad","archive"],"title":"Kind","type":"string"},"livemode":{"title":"Livemode","type":"boolean"},"rejected_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rejected Reason"},"sha256":{"title":"Sha256","type":"string"},"size_bytes":{"title":"Size Bytes","type":"integer"},"status":{"enum":["awaiting_upload","verifying","ready","rejected"],"title":"Status","type":"string"}},"required":["id","filename","size_bytes","sha256","status","livemode","created_at"],"title":"File","type":"object"},"FilePage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/File"},"title":"Data","type":"array"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"required":["data"],"title":"FilePage","type":"object"},"FileUpload":{"properties":{"file":{"$ref":"#/components/schemas/File"},"upload":{"$ref":"#/components/schemas/Transfer"}},"required":["file","upload"],"title":"FileUpload","type":"object"},"Finding":{"properties":{"code":{"title":"Code","type":"string"},"frame":{"anyOf":[{"enum":["part","assembly"],"type":"string"},{"type":"null"}],"description":"The frame of `location`: `part` (the shape's own frame, before it is placed; the point applies to every placed copy of the part) or `assembly` (the frame of the whole assembly). Null when `location` is null.","title":"Frame"},"limit_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Limit Mm"},"location":{"anyOf":[{"items":{"type":"number"},"type":"array"},{"type":"null"}],"description":"A point in millimetres, or null. A wall, or a gap measured inside one body, is in that shape's own frame and applies to every placed copy of the part. A finding between two parts, or between two bodies of one part, is in the frame of the whole assembly. `frame` says which.","title":"Location"},"message":{"title":"Message","type":"string"},"part":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Part"},"severity":{"enum":["information","warning","blocking"],"title":"Severity","type":"string"},"value_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value Mm"}},"required":["code","severity","message","part","value_mm","limit_mm","location"],"title":"Finding","type":"object"},"Format":{"properties":{"enabled":{"title":"Enabled","type":"boolean"},"ext":{"title":"Ext","type":"string"},"kind":{"$ref":"#/components/schemas/FormatKind"},"test_enabled":{"default":false,"title":"Test Enabled","type":"boolean"}},"required":["ext","kind","enabled"],"title":"Format","type":"object"},"FormatKind":{"description":"`formats.kind`. Same members as FileKind; kept separate because the\nformats table describes an extension and a file describes an upload.","enum":["mesh","splat","pointcloud","medical","cad","archive"],"title":"FormatKind","type":"string"},"FormatList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Format"},"title":"Data","type":"array"}},"required":["data"],"title":"FormatList","type":"object"},"IssuedApiKey":{"properties":{"api_key":{"$ref":"#/components/schemas/ApiKey"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"}},"required":["api_key"],"title":"IssuedApiKey","type":"object"},"IssuedWebhookEndpoint":{"description":"The only response that carries the signing secret.","properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"enabled":{"title":"Enabled","type":"boolean"},"id":{"title":"Id","type":"string"},"livemode":{"description":"True when registered with a live key. An endpoint is told only about jobs of its own mode, and only keys of that mode can list, name or delete it.","title":"Livemode","type":"boolean"},"secret":{"title":"Secret","type":"string"},"url":{"title":"Url","type":"string"}},"required":["id","url","enabled","livemode","created_at","secret"],"title":"IssuedWebhookEndpoint","type":"object"},"Job":{"properties":{"analysis":{"anyOf":[{"$ref":"#/components/schemas/Analysis"},{"type":"null"}]},"attempt":{"title":"Attempt","type":"integer"},"created_at":{"format":"date-time","title":"Created At","type":"string"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"error_detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Detail"},"id":{"title":"Id","type":"string"},"input_file_id":{"title":"Input File Id","type":"string"},"livemode":{"title":"Livemode","type":"boolean"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"queue":{"anyOf":[{"$ref":"#/components/schemas/JobQueue"},{"type":"null"}]},"recipe":{"enum":["inspect","repair","tool","cad_check"],"title":"Recipe","type":"string"},"result":{"anyOf":[{"$ref":"#/components/schemas/RepairResult"},{"$ref":"#/components/schemas/ToolResult"},{"$ref":"#/components/schemas/CadCheckResult"},{"type":"null"}],"title":"Result"},"simulated":{"default":true,"title":"Simulated","type":"boolean"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"status":{"enum":["queued","running","verifying","succeeded","failed","cancelled"],"title":"Status","type":"string"},"tool":{"anyOf":[{"enum":["measure","convert","cut","lattice","label","mirror","remove_small_parts","thickness","analyze","medial","structural.components","structural.fea","structural.heatmap","structural.fragility","structural.measure_all","structural.relief"],"type":"string"},{"type":"null"}],"title":"Tool"},"updated_at":{"format":"date-time","title":"Updated At","type":"string"},"usage":{"anyOf":[{"$ref":"#/components/schemas/JobUsage"},{"type":"null"}]}},"required":["id","input_file_id","recipe","status","livemode","attempt","created_at","updated_at"],"title":"Job","type":"object"},"JobEvent":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"},"sequence":{"title":"Sequence","type":"integer"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"status":{"title":"Status","type":"string"}},"required":["sequence","status","created_at"],"title":"JobEvent","type":"object"},"JobPage":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Job"},"title":"Data","type":"array"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"}},"required":["data"],"title":"JobPage","type":"object"},"JobQueue":{"description":"A queued live job's place. Refreshed every 30 s; a stale estimate is left out.","properties":{"capacity":{"anyOf":[{"$ref":"#/components/schemas/Capacity"},{"type":"null"}]},"estimated_start_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}],"title":"Estimated Start At"},"position":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Position"}},"title":"JobQueue","type":"object"},"JobUsage":{"description":"Credits of one live job: held at admission, charged once it finishes.","properties":{"charge_basis":{"anyOf":[{"enum":["run_time","minimum","free"],"type":"string"},{"type":"null"}],"title":"Charge Basis"},"charged_credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Charged Credits"},"held_credits":{"title":"Held Credits","type":"integer"}},"required":["held_credits"],"title":"JobUsage","type":"object"},"JsonValue":{},"NotifyTarget":{"additionalProperties":false,"description":"The registered endpoint to tell when the job finishes. Ad-hoc URLs are not accepted.","properties":{"webhook_endpoint":{"pattern":"^whe_[0-9A-HJKMNP-TV-Z]{26}$","title":"Webhook Endpoint","type":"string"}},"required":["webhook_endpoint"],"title":"NotifyTarget","type":"object"},"Organization":{"properties":{"id":{"title":"Id","type":"string"},"name":{"title":"Name","type":"string"},"plan_id":{"title":"Plan Id","type":"string"},"status":{"enum":["active","suspended","deleting"],"title":"Status","type":"string"}},"required":["id","name","plan_id","status"],"title":"Organization","type":"object"},"Problem":{"additionalProperties":true,"description":"The single error envelope (api.md §3.2).\n\n`model_config.extra = \"allow\"` carries the code-specific extras — `required`\nand `available` on `insufficient_credits`, for instance — without a subclass\nper code.","properties":{"code":{"$ref":"#/components/schemas/ErrorCode"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"errors":{"items":{"$ref":"#/components/schemas/ProblemField"},"title":"Errors","type":"array"},"instance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"},"status":{"title":"Status","type":"integer"},"title":{"title":"Title","type":"string"},"type":{"title":"Type","type":"string"}},"required":["type","title","status","code"],"title":"Problem","type":"object"},"ProblemField":{"description":"One field-level validation failure inside `Problem.errors`.","properties":{"field":{"title":"Field","type":"string"},"message":{"title":"Message","type":"string"}},"required":["field","message"],"title":"ProblemField","type":"object"},"QualityAssessment":{"additionalProperties":false,"properties":{"print_readiness":{"const":"not_assessed","default":"not_assessed","title":"Print Readiness","type":"string"},"reason_codes":{"items":{"type":"string"},"maxItems":100,"title":"Reason Codes","type":"array"},"status":{"default":"not_assessed","enum":["not_assessed","needs_review","passed","failed"],"title":"Status","type":"string"}},"title":"QualityAssessment","type":"object"},"RecommendationAssessment":{"additionalProperties":false,"description":"Source-wall prediction at one size, never a certificate of the repaired print.","properties":{"clearance_basis":{"default":"unavailable","enum":["shell_count_heuristic","unavailable"],"title":"Clearance Basis","type":"string"},"measurement_confidence":{"default":"unavailable","enum":["unavailable","limited"],"title":"Measurement Confidence","type":"string"},"open_surface_fraction":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"title":"Open Surface Fraction"},"predicted_minimum_size_mm":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"title":"Predicted Minimum Size Mm"},"process":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"title":"Process"},"reason_codes":{"items":{"type":"string"},"maxItems":100,"title":"Reason Codes","type":"array"},"source_below_wall_fraction":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"title":"Source Below Wall Fraction"},"source_below_wall_fraction_lower":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"title":"Source Below Wall Fraction Lower"},"source_below_wall_fraction_upper":{"anyOf":[{"maximum":1,"minimum":0,"type":"number"},{"type":"null"}],"title":"Source Below Wall Fraction Upper"},"status":{"default":"not_assessed","enum":["not_assessed","needs_review"],"title":"Status","type":"string"},"target_mm":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"title":"Target Mm"},"verified_minimum_size_mm":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"title":"Verified Minimum Size Mm"},"wall_basis":{"default":"unavailable","enum":["unavailable","measured","percentile_interpolation"],"title":"Wall Basis","type":"string"},"wall_floor_mm":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"type":"null"}],"title":"Wall Floor Mm"},"wall_quantile_sizes_mm":{"additionalProperties":{"type":"number"},"title":"Wall Quantile Sizes Mm","type":"object"}},"title":"RecommendationAssessment","type":"object"},"RepairIssue":{"properties":{"description":{"title":"Description","type":"string"},"fixed":{"title":"Fixed","type":"boolean"},"name":{"title":"Name","type":"string"},"severity":{"enum":["critical","warning","info"],"title":"Severity","type":"string"}},"required":["severity","name","description","fixed"],"title":"RepairIssue","type":"object"},"RepairParams":{"additionalProperties":false,"description":"Bounds follow the 3D Prep Pro request schema kept for continuity (api.md §6).","properties":{"clearance_mm":{"default":1.5,"maximum":10,"minimum":0,"title":"Clearance Mm","type":"number"},"close_holes_mm":{"default":0,"maximum":2000,"minimum":0,"title":"Close Holes Mm","type":"number"},"cut_transparent":{"default":false,"title":"Cut Transparent","type":"boolean"},"hollow_mm":{"default":0,"maximum":20,"minimum":0,"title":"Hollow Mm","type":"number"},"mix_textures":{"default":false,"title":"Mix Textures","type":"boolean"},"preserve_shells":{"default":false,"title":"Preserve Shells","type":"boolean"},"printer":{"anyOf":[{"enum":["mimaki","fdm"],"type":"string"},{"type":"null"}],"title":"Printer"},"profile":{"default":"recommended","enum":["recommended","character","mechanical","vehicle","custom"],"title":"Profile","type":"string"},"quality":{"default":"standard","enum":["draft","standard","high"],"title":"Quality","type":"string"},"scale":{"$ref":"#/components/schemas/Scale"},"smoothing":{"$ref":"#/components/schemas/Smoothing"},"target_faces":{"default":0,"maximum":5000000,"minimum":0,"title":"Target Faces","type":"integer"},"thickness":{"$ref":"#/components/schemas/Thickness"},"wall_thickness_mm":{"default":1,"maximum":10,"minimum":0,"title":"Wall Thickness Mm","type":"number"}},"title":"RepairParams","type":"object"},"RepairProfile":{"properties":{"description":{"title":"Description","type":"string"},"id":{"enum":["recommended","character","mechanical","vehicle","custom"],"title":"Id","type":"string"},"params":{"additionalProperties":true,"title":"Params","type":"object"}},"required":["id","description","params"],"title":"RepairProfile","type":"object"},"RepairProfileList":{"properties":{"data":{"items":{"$ref":"#/components/schemas/RepairProfile"},"title":"Data","type":"array"}},"required":["data"],"title":"RepairProfileList","type":"object"},"RepairResult":{"description":"Before/after comparison; shape follows the Windows worker's result document.","properties":{"after":{"$ref":"#/components/schemas/Analysis"},"applied":{"anyOf":[{"$ref":"#/components/schemas/AppliedRepair"},{"type":"null"}]},"before":{"$ref":"#/components/schemas/Analysis"},"improvements":{"items":{"type":"string"},"maxItems":100,"title":"Improvements","type":"array"},"issues":{"items":{"$ref":"#/components/schemas/RepairIssue"},"maxItems":100,"title":"Issues","type":"array"},"output_bytes":{"minimum":0,"title":"Output Bytes","type":"integer"},"printability_score":{"maximum":100,"minimum":0,"title":"Printability Score","type":"integer"},"quality":{"$ref":"#/components/schemas/QualityAssessment"},"schema_version":{"const":"1","default":"1","title":"Schema Version","type":"string"},"simulated":{"title":"Simulated","type":"boolean"}},"required":["simulated","before","after","printability_score","output_bytes"],"title":"RepairResult","type":"object"},"ResumableFileUpload":{"properties":{"file":{"$ref":"#/components/schemas/File"},"upload":{"$ref":"#/components/schemas/ResumableUpload"}},"required":["file","upload"],"title":"ResumableFileUpload","type":"object"},"ResumableUpload":{"description":"An S3 multipart upload (api.md §4.1).\n\n``parts`` lists only the parts the store does not hold yet, each with its own URL. Send them\nin any order or in parallel, then complete the file. Replaying the request that created the\nfile returns fresh URLs for the parts still missing; parts already sent are kept.","properties":{"expires_at":{"format":"date-time","title":"Expires At","type":"string"},"method":{"const":"PUT","default":"PUT","title":"Method","type":"string"},"part_size_bytes":{"title":"Part Size Bytes","type":"integer"},"parts":{"items":{"$ref":"#/components/schemas/UploadPart"},"title":"Parts","type":"array"},"protocol":{"const":"s3_multipart","default":"s3_multipart","title":"Protocol","type":"string"}},"required":["part_size_bytes","expires_at","parts"],"title":"ResumableUpload","type":"object"},"RotateApiKey":{"additionalProperties":false,"properties":{"grace_seconds":{"default":86400,"maximum":604800,"minimum":0,"title":"Grace Seconds","type":"integer"}},"title":"RotateApiKey","type":"object"},"Scale":{"additionalProperties":false,"properties":{"mode":{"default":"none","enum":["none","target","multiplier"],"title":"Mode","type":"string"},"unit":{"default":"mm","enum":["mm","cm","in"],"title":"Unit","type":"string"},"value":{"anyOf":[{"exclusiveMinimum":0,"maximum":10000,"type":"number"},{"type":"null"}],"title":"Value"}},"title":"Scale","type":"object"},"Scope":{"enum":["files:read","files:write","jobs:read","jobs:write","artifacts:read","webhooks:manage","keys:manage","usage:read","org:read","admin:billing"],"title":"Scope","type":"string"},"SizeBand":{"properties":{"up_to_mm":{"title":"Up To Mm","type":"number"},"wall_mm":{"title":"Wall Mm","type":"number"}},"required":["up_to_mm","wall_mm"],"title":"SizeBand","type":"object"},"Smoothing":{"additionalProperties":false,"properties":{"clr":{"default":0,"maximum":256,"minimum":0,"title":"Clr","type":"integer"},"post_construct":{"default":0,"maximum":50,"minimum":0,"title":"Post Construct","type":"integer"},"pre_smooth":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pre Smooth"}},"title":"Smoothing","type":"object"},"TechnologyRow":{"additionalProperties":false,"properties":{"gap_assembled_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gap Assembled Mm"},"gap_inside_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gap Inside Mm"},"gap_moving_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Gap Moving Mm"},"hole_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hole Count"},"hole_min_diameter_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Hole Min Diameter Mm"},"interior":{"enum":["closed_ok","needs_holes","not_offered"],"title":"Interior","type":"string"},"label":{"title":"Label","type":"string"},"material":{"title":"Material","type":"string"},"process":{"title":"Process","type":"string"},"source":{"title":"Source","type":"string"},"wall_by_size":{"anyOf":[{"items":{"$ref":"#/components/schemas/SizeBand"},"type":"array"},{"type":"null"}],"title":"Wall By Size"},"wall_min_mm":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Wall Min Mm"}},"required":["process","material","label","wall_min_mm","gap_inside_mm","gap_assembled_mm","gap_moving_mm","interior","hole_count","hole_min_diameter_mm","source"],"title":"TechnologyRow","type":"object"},"TechnologyTable":{"properties":{"gap_floor_mm":{"title":"Gap Floor Mm","type":"number"},"notice":{"$ref":"#/components/schemas/DataNotice"},"rows":{"items":{"$ref":"#/components/schemas/TechnologyRow"},"title":"Rows","type":"array"},"version":{"title":"Version","type":"integer"}},"required":["version","gap_floor_mm","notice","rows"],"title":"TechnologyTable","type":"object"},"Thickness":{"additionalProperties":false,"description":"The thickness stage's instrument (engine ``thicknessMethod``, Settings.h) and its target.\n\n``medial`` measures every wall with the maximum inscribed ball (orientation- and\ncurvature-invariant, engine MedialThickening), pushes the measured deficit along the\ncaliper axis and caps it by the free room on each side; with ``structural`` on, the beam\nreduction raises the target on the shank of a thin feature that fails under ``tip_load_n``\nat ``target_sf``. ``lattice`` is the voxel heatmap the 3D Prep Pro pipeline ships. The tip\nload is the constant the coupon matrix has not measured (engine docs/medial-axis.md §6):\nit is echoed on every result and never a hidden default.","properties":{"method":{"default":"medial","enum":["medial","lattice"],"title":"Method","type":"string"},"structural":{"default":true,"title":"Structural","type":"boolean"},"target_sf":{"default":2,"maximum":10,"minimum":1,"title":"Target Sf","type":"number"},"tip_load_n":{"default":0.5,"exclusiveMinimum":0,"maximum":50,"title":"Tip Load N","type":"number"}},"title":"Thickness","type":"object"},"ToolResult":{"description":"The engine's stdout envelope ``result`` object, path keys removed by the worker.","properties":{"result":{"additionalProperties":true,"title":"Result","type":"object"},"schema_version":{"const":"1","default":"1","title":"Schema Version","type":"string"},"simulated":{"title":"Simulated","type":"boolean"},"tool":{"enum":["measure","convert","cut","lattice","label","mirror","remove_small_parts","thickness","analyze","medial","structural.components","structural.fea","structural.heatmap","structural.fragility","structural.measure_all","structural.relief"],"title":"Tool","type":"string"}},"required":["simulated","tool","result"],"title":"ToolResult","type":"object"},"Transfer":{"properties":{"expires_at":{"format":"date-time","title":"Expires At","type":"string"},"headers":{"additionalProperties":{"type":"string"},"title":"Headers","type":"object"},"method":{"enum":["GET","PUT"],"title":"Method","type":"string"},"url":{"title":"Url","type":"string"}},"required":["url","method","expires_at"],"title":"Transfer","type":"object"},"UploadPart":{"description":"One part of a multipart upload: PUT exactly ``size_bytes`` from ``offset`` to ``url``.","properties":{"offset":{"minimum":0,"title":"Offset","type":"integer"},"part_number":{"maximum":10000,"minimum":1,"title":"Part Number","type":"integer"},"size_bytes":{"exclusiveMinimum":0,"title":"Size Bytes","type":"integer"},"url":{"title":"Url","type":"string"}},"required":["part_number","offset","size_bytes","url"],"title":"UploadPart","type":"object"},"WebhookEndpoint":{"properties":{"created_at":{"format":"date-time","title":"Created At","type":"string"},"enabled":{"title":"Enabled","type":"boolean"},"id":{"title":"Id","type":"string"},"livemode":{"description":"True when registered with a live key. An endpoint is told only about jobs of its own mode, and only keys of that mode can list, name or delete it.","title":"Livemode","type":"boolean"},"url":{"title":"Url","type":"string"}},"required":["id","url","enabled","livemode","created_at"],"title":"WebhookEndpoint","type":"object"},"WebhookEndpointPage":{"properties":{"data":{"description":"Every endpoint of the key's mode, oldest first. The list is not paged: an account holds at most 20 endpoints of each mode.","items":{"$ref":"#/components/schemas/WebhookEndpoint"},"title":"Data","type":"array"}},"required":["data"],"title":"WebhookEndpointPage","type":"object"}},"securitySchemes":{"CustomerApiKey":{"scheme":"bearer","type":"http"}}},"info":{"description":"Mesh preparation: upload a file, get analysis, a repaired print-ready mesh, or tool results. Reference: https://docs.printy3d.com","title":"Printy3D API","version":"0.1.0"},"openapi":"3.1.0","paths":{"/healthz":{"get":{"description":"Liveness: the process is up. Never touches a dependency.","operationId":"healthz_healthz_get","responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"Successful Response"}},"summary":"Liveness","tags":["status"]}},"/readyz":{"get":{"description":"Check the migrated database, non-owner runtime role and local storage.\n\nRedis is not required for the local sandbox. Hosted object storage is\nnot probed here until staging qualifies it (render-platform.md §4).","operationId":"readyz_readyz_get","responses":{"200":{"content":{"application/json":{"schema":{}}},"description":"Successful Response"}},"summary":"Readiness","tags":["status"]}},"/v1/api_keys":{"get":{"description":"Requires keys:manage. Lists metadata in this organization and live/test mode.","operationId":"list_api_keys","parameters":[{"in":"query","name":"cursor","required":false,"schema":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"title":"Cursor"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyPage"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"List Api Keys","tags":["customer access"]},"post":{"description":"Requires keys:manage; scopes and restrictions cannot exceed the issuer.\n\nIdempotency-Key is retained for 24 hours. Replays return issuance metadata\nwith secret=null and Idempotent-Replayed=true; plaintext is returned once.","operationId":"create_api_key","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"pattern":"^[\\x21-\\x7e]+$","title":"Idempotency-Key","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKey"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedApiKey"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"Create Api Key","tags":["customer access"]}},"/v1/api_keys/{key_id}":{"delete":{"description":"Requires keys:manage. Repeated revocation of the same visible key is harmless.","operationId":"revoke_api_key","parameters":[{"in":"path","name":"key_id","required":true,"schema":{"title":"Key Id","type":"string"}}],"responses":{"204":{"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"Revoke Api Key","tags":["customer access"]},"get":{"description":"Requires keys:manage. Never returns a credential secret or its hash.","operationId":"get_api_key","parameters":[{"in":"path","name":"key_id","required":true,"schema":{"title":"Key Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKey"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"Get Api Key","tags":["customer access"]}},"/v1/api_keys/{key_id}/rotate":{"post":{"description":"Requires keys:manage. Creates one successor without broadening authority.\n\nThe old key works during its grace period unless expired or revoked.\nAn idempotent replay returns metadata with secret=null. Retain a recovery\nmanager when requesting zero-grace self-rotation.","operationId":"rotate_api_key","parameters":[{"in":"path","name":"key_id","required":true,"schema":{"title":"Key Id","type":"string"}},{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"pattern":"^[\\x21-\\x7e]+$","title":"Idempotency-Key","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RotateApiKey"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedApiKey"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"Rotate Api Key","tags":["customer access"]}},"/v1/artifacts/{artifact_id}/download":{"get":{"description":"Requires artifacts:read. Return a temporary download URL; keep it confidential.","operationId":"download_artifact","parameters":[{"in":"path","name":"artifact_id","required":true,"schema":{"title":"Artifact Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Transfer"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Download","tags":["artifacts"]}},"/v1/balance":{"get":{"description":"Requires usage:read. The organization's credits; 1 credit = 1 second of a job's run.\n\nLive jobs hold credits when submitted and are charged their run time when they finish;\ntest-mode jobs never change the balance. `POST /v1/jobs` answers `402\ninsufficient_credits` when a live job's hold exceeds `available_credits`.","operationId":"get_balance","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Balance"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"Get Balance","tags":["billing"]}},"/v1/balance/transactions":{"get":{"description":"Requires usage:read. Every credit movement, newest first.","operationId":"list_credit_transactions","parameters":[{"in":"query","name":"before","required":false,"schema":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"title":"Before"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditTransactionPage"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"List Transactions","tags":["billing"]}},"/v1/files":{"get":{"description":"Requires files:read. Cursor pagination within this organization and key mode.","operationId":"list_files","parameters":[{"in":"query","name":"cursor","required":false,"schema":{"default":"","maxLength":100,"title":"Cursor","type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FilePage"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"List Files","tags":["files"]},"post":{"description":"Requires files:write. Reserve an immutable upload of up to 10 MiB in any accepted format.\n\nPUT the exact bytes to upload.url with the returned headers, then complete the upload; the\nAPI verifies size, SHA-256 and the file's contents before it becomes ready. Live uploads\nneed an approved account. Larger files use POST /v1/files/resumable. Idempotency-Key\nreplays for 24 hours return a renewed upload URL.","operationId":"create_file","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"pattern":"^[\\x21-\\x7e]+$","title":"Idempotency-Key","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFile"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileUpload"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Create File","tags":["files"]}},"/v1/files/resumable":{"post":{"description":"Reserve a file larger than a simple upload allows, up to the plan's limit (at most 1 GiB).\n\nNeeds an approved account (or an internal storage grant). The answer is an S3 multipart\nupload: PUT each listed part to its URL (exact size, any order). Part URLs are capabilities:\nkeep them private. Replay the same request with the same Idempotency-Key to resume or to\nrenew URLs; parts already sent are kept (at most three new multipart starts per file,\nfailed responses included). Complete assembles the parts and always queues background\nverification; poll the file until ready or rejected.","operationId":"create_resumable_file","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"pattern":"^[\\x21-\\x7e]+$","title":"Idempotency-Key","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateResumableFile"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResumableFileUpload"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Create Resumable File","tags":["files"]}},"/v1/files/{file_id}":{"get":{"description":"Requires files:read.","operationId":"get_file","parameters":[{"in":"path","name":"file_id","required":true,"schema":{"title":"File Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Get File","tags":["files"]}},"/v1/files/{file_id}/complete":{"post":{"description":"Requires files:write. Prefer: respond-async queues durable verification.\n\nPoll GET /v1/files/{file_id} until ready or rejected before creating a job.\nResumable uploads always complete asynchronously. Without the preference,\nbounded legacy uploads still complete synchronously.\nRepeated completion calls do not enqueue duplicate verification work.","operationId":"complete_file_upload","parameters":[{"in":"path","name":"file_id","required":true,"schema":{"title":"File Id","type":"string"}},{"in":"header","name":"prefer","required":false,"schema":{"default":"","maxLength":200,"title":"Prefer","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}},"description":"Successful Response"},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/File"}}},"description":"Verification queued; poll Location."},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Complete File","tags":["files"]}},"/v1/formats":{"get":{"description":"Requires files:read. enabled is live qualification; test_enabled is local sandbox support.","operationId":"list_formats","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FormatList"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"List Formats","tags":["customer access"]}},"/v1/jobs":{"get":{"description":"Requires jobs:read. Cursor pagination within this organization and key mode.","operationId":"list_jobs","parameters":[{"in":"query","name":"cursor","required":false,"schema":{"default":"","maxLength":100,"title":"Cursor","type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":20,"maximum":100,"minimum":1,"title":"Limit","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobPage"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"List Jobs","tags":["jobs"]},"post":{"description":"Requires jobs:write. Queue a job for a ready file.\n\nSandbox (test-key) jobs return explicitly simulated results and incur no charge. A\nlive job holds its expected cost in credits and is charged its run time when it\nfinishes (`usage`); `402 insufficient_credits` names the `required` and `available`\ncredits when the balance cannot cover the hold (GET /v1/balance). `503\ncapacity_exhausted` (with `Retry-After` and a `reason`) means a live job cannot start\nnow: no GPU for a GPU recipe (`paused`, `spend_limit`, `no_gpu_available`,\n`controller_offline`), or no Exact Check worker running for a `cad_check`\n(`cad_unavailable`); nothing is queued or held. `501 feature_unavailable` when live work,\nthe input's format or size, or a live `cad_check` (its CPU lane's build) is not enabled.\nWhile a live job waits, `queue` gives its `position`, `estimated_start_at` and the GPU\nfleet's `capacity` (null for a `cad_check`); a queued live job fails free\n(`capacity_exhausted`) after 10 minutes without GPU capacity (a `cad_check`: without an\nExact Check worker) or 24 hours in the queue. The Idempotency-Key is required; a replay\nwithin 24 hours returns the job as it is now, with `Idempotent-Replayed: true`.","operationId":"create_job","parameters":[{"in":"header","name":"Idempotency-Key","required":true,"schema":{"maxLength":255,"minLength":1,"pattern":"^[\\x21-\\x7e]+$","title":"Idempotency-Key","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateJob"}}},"required":true},"responses":{"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Payment Required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Service Unavailable"}},"security":[{"CustomerApiKey":[]}],"summary":"Create Job","tags":["jobs"]}},"/v1/jobs/{job_id}":{"get":{"description":"Requires jobs:read. Poll status; analysis is published only after trusted verification.","operationId":"get_job","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"title":"Job Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Get Job","tags":["jobs"]}},"/v1/jobs/{job_id}/artifacts":{"get":{"description":"Requires artifacts:read. Empty until the entire result manifest has passed verification.","operationId":"list_job_artifacts","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"title":"Job Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactList"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Artifacts","tags":["artifacts"]}},"/v1/jobs/{job_id}/cancel":{"post":{"description":"Requires jobs:write. Fence the attempt; accepted cancellation prevents result publication.","operationId":"cancel_job","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"title":"Job Id","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Job"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Cancel Job","tags":["jobs"]}},"/v1/jobs/{job_id}/evaluation":{"get":{"description":"Requires jobs:read. Free: judge the stored measurements of a succeeded cad_check job\nagainst the limits table of this organization, without a new job. Without process every\nprocess and material is judged; process alone judges each of its materials; material needs a\nprocess. 409 when the job is not a succeeded cad_check or its stored measurements expired;\n503 (with Retry-After) when the limits table cannot be read.","operationId":"get_job_evaluation","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"title":"Job Id","type":"string"}},{"in":"query","name":"process","required":false,"schema":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"title":"Process"}},{"in":"query","name":"material","required":false,"schema":{"anyOf":[{"maxLength":64,"type":"string"},{"type":"null"}],"title":"Material"}},{"in":"query","name":"scale","required":false,"schema":{"default":1,"exclusiveMinimum":0,"title":"Scale","type":"number"}},{"in":"query","name":"assembly_intent","required":false,"schema":{"default":"separate","enum":["separate","together"],"title":"Assembly Intent","type":"string"}},{"in":"query","name":"moving","required":false,"schema":{"default":false,"title":"Moving","type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationList"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Service Unavailable"}},"security":[{"CustomerApiKey":[]}],"summary":"Job Evaluation","tags":["jobs"]}},"/v1/jobs/{job_id}/events":{"get":{"description":"Requires jobs:read. Durable ordered events; pass next_after to resume polling.","operationId":"list_job_events","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"title":"Job Id","type":"string"}},{"in":"query","name":"after","required":false,"schema":{"default":0,"minimum":0,"title":"After","type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventPage"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Job Events","tags":["jobs"]}},"/v1/jobs/{job_id}/exports":{"post":{"description":"Requires jobs:write. A succeeded job's mesh output in one format, every piece in it.\n\n`200 ready` with the `artifact` when the job generated that format. Otherwise `202\nconverting`: one conversion job (`conversion_job_id`) makes it on the GPU fleet and is\ncharged like any `convert` job (credits held and charged; `402`, `429` and `503` as for\nPOST /v1/jobs). Asking again returns the same conversion, or starts a new one after a\nfailure; poll GET /v1/jobs/{job_id}/exports/{format}. Test keys export only the formats a\njob generated (`501` for a conversion).","operationId":"create_export","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"title":"Job Id","type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateExport"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}},"description":"Successful Response"},"202":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}},"description":"Accepted"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"402":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Payment Required"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Service Unavailable"}},"security":[{"CustomerApiKey":[]}],"summary":"Create Export","tags":["artifacts"]}},"/v1/jobs/{job_id}/exports/{format}":{"get":{"description":"Requires artifacts:read. The export's state; `404` when it was never asked for.","operationId":"get_export","parameters":[{"in":"path","name":"job_id","required":true,"schema":{"title":"Job Id","type":"string"}},{"in":"path","name":"format","required":true,"schema":{"enum":["glb","obj","3mf","stl","ply"],"title":"Format","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Export"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"413":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Request Entity Too Large"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Get Export","tags":["artifacts"]}},"/v1/org":{"get":{"description":"Requires org:read. Returns only the authenticated organization.","operationId":"get_organization","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"Get Organization","tags":["customer access"]}},"/v1/profiles":{"get":{"description":"Requires files:read. The values each repair ``profile`` fixes; the rest is filled from\nthe engine's recommendation (``recommended``) or the documented defaults.","operationId":"list_repair_profiles","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RepairProfileList"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"}},"security":[{"CustomerApiKey":[]}],"summary":"List Repair Profiles","tags":["customer access"]}},"/v1/technologies":{"get":{"description":"Requires jobs:read. The limits per process and material that apply to this organization:\nthe global table with the organization's own overrides merged over it. ``version`` changes\nwhenever either changes; nothing stores it with a check, and each evaluation answers with\nthe version it judged by (``table_version``). ``gap_floor_mm`` is the higher of the global\nfloor and any floor set for this organization.","operationId":"get_technologies","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TechnologyTable"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"503":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Service Unavailable"}},"security":[{"CustomerApiKey":[]}],"summary":"Get Technologies","tags":["technologies"]}},"/v1/webhook_endpoints":{"get":{"description":"Requires webhooks:manage. Every endpoint of the organization of this key's mode, oldest\nfirst, without secrets. Not paged: an account holds at most 20 endpoints of each mode, and\nall of them are in ``data``.","operationId":"list_webhook_endpoints","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpointPage"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"List Webhook Endpoints","tags":["webhooks"]},"post":{"description":"Requires webhooks:manage. Register an HTTPS address to be told when a cad_check job\nfinishes (name it in ``notify.webhook_endpoint`` when creating the job). The endpoint\nbelongs to the key's mode: only keys of that mode can list, name or delete it. An account\nholds at most 20 endpoints of each mode; registering another is ``409 conflict`` (delete one\nfirst).\n\nThe address must be ``https`` on port 443 or 1024 to 65535, and resolve to public hosts\nonly: private, loopback, link-local and other non-routable addresses are refused (``422``,\nwith the same sentence whether or not the name resolves), and checked again at every\ndelivery.\n\nThe response holds the signing secret; verify ``Printy3D-Signature: t=<unix>,v1=<hex>`` as\nHMAC-SHA256 of ``<t>.<raw body>`` under it, in constant time, and reject a ``t`` more than\n300 seconds from your clock. The payload is ``{event, job_id, status}`` and nothing else;\nfetch the job for the rest. A delivery is attempted up to 5 times in all, 1 m, 5 m, 30 m and\n2 h apart. With an ``Idempotency-Key`` (kept 24 hours), a retry returns the same endpoint and\nsecret with ``Idempotent-Replayed: true`` instead of registering a second one.","operationId":"create_webhook_endpoint","parameters":[{"in":"header","name":"Idempotency-Key","required":false,"schema":{"anyOf":[{"maxLength":255,"minLength":1,"pattern":"^[\\x21-\\x7e]+$","type":"string"},{"type":"null"}],"title":"Idempotency-Key"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookEndpoint"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedWebhookEndpoint"}}},"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"409":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Conflict"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Create Webhook Endpoint","tags":["webhooks"]}},"/v1/webhook_endpoints/{endpoint_id}":{"delete":{"description":"Requires webhooks:manage. An endpoint of this key's mode; deliveries still waiting for\nit are called off. One already being sent when the endpoint is deleted may still arrive.","operationId":"delete_webhook_endpoint","parameters":[{"in":"path","name":"endpoint_id","required":true,"schema":{"title":"Endpoint Id","type":"string"}}],"responses":{"204":{"description":"Successful Response"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Unprocessable Entity"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Too Many Requests"},"501":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Problem"}},"application/problem+json":{}},"description":"Not Implemented"}},"security":[{"CustomerApiKey":[]}],"summary":"Delete Webhook Endpoint","tags":["webhooks"]}}}}