{"openapi":"3.1.0","info":{"title":"Unwrite Make API","version":"1","description":"Design, read and build parts with an API key. Every call that creates something takes an Idempotency-Key header. Bodies are JSON and are refused unless the Content-Type says so. The same operations are available as tools over the Model Context Protocol endpoint, which is documented here as its own protocol surface."},"servers":[{"url":"https://make-api.unwrite.co"}],"x-mcp":{"path":"/v1/public/make/mcp","transport":"streamable-http","protocolVersion":"2025-11-25","supportedProtocolVersions":["2025-03-26","2025-06-18","2025-11-25"],"tools":["make_inspect_assembly_pair","make_list_assemblies","make_get_assembly","make_revise_assembly","make_get_design","make_list_projects","make_create_project","make_get_project","make_get_revision","make_list_exports","make_get_assembly_bom","make_retry_job","make_get_job","make_cancel_job","make_cancel_design","make_start_design","make_get_usage","make_download_export","make_search_standard_parts","make_set_feature_parameter"]},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Make API key"}},"schemas":{"JsonRpcRequest":{"type":"object","properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","integer"]},"method":{"type":"string","enum":["initialize","ping","tools/list","tools/call"]},"params":{"type":"object"}},"required":["jsonrpc","method"]},"JsonRpcResponse":{"type":"object","properties":{"jsonrpc":{"type":"string","const":"2.0"},"id":{"type":["string","integer","null"]},"result":{"type":"object"},"error":{"type":"object","properties":{"code":{"type":"integer"},"message":{"type":"string"},"data":{"type":"object","properties":{"code":{"type":"string"},"status":{"type":"integer"}}}},"required":["code","message"]}},"required":["jsonrpc"]},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"requestId":{"type":"string"}},"required":["code","message"]}},"required":["error"]}}},"paths":{"/v1/public/make":{"get":{"operationId":"get_v_public_make","summary":"This description. No key needed.","security":[],"parameters":[],"responses":{"200":{"description":"This description. No key needed."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/projects":{"get":{"operationId":"get_v_public_make_projects","summary":"Every part this key opens, most recently worked on first, 50 to a page. Send the nextCursor you were given back as the before parameter for the page after that. Start here: everything else needs a part named.","x-required-scope":"projects:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"before","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Every part this key opens, most recently worked on first, 50 to a page. Send the nextCursor you were given back as the before parameter for the page after that. Start here: everything else needs a part named."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"post_v_public_make_projects","summary":"Make a new part to work on. Send {\"name\": \"...\"} and an Idempotency-Key header. Answers 201 the first time and 200 with the same part if you send it again. Needs a key issued over the whole account.","x-required-scope":"designs:write","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Your own name for this call, so sending it again does the work once.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120}},"required":["name"],"additionalProperties":false}}}},"responses":{"200":{"description":"The same key again: the answer the first call produced."},"201":{"description":"Make a new part to work on. Send {\"name\": \"...\"} and an Idempotency-Key header. Answers 201 the first time and 200 with the same part if you send it again. Needs a key issued over the whole account."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/openapi.json":{"get":{"operationId":"get_v_public_make_openapi_json","summary":"This same surface as an OpenAPI 3.1 document. No key needed.","security":[],"parameters":[],"responses":{"200":{"description":"This same surface as an OpenAPI 3.1 document. No key needed."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/projects/{projectId}":{"get":{"operationId":"get_v_public_make_projects_projectId_","summary":"One of the parts this key opens.","x-required-scope":"projects:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"One of the parts this key opens."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/revisions/{revisionId}":{"get":{"operationId":"get_v_public_make_revisions_revisionId_","summary":"One saved version of a design, with the requirements it was built to. The feature graph rides along only for a key that also carries revisions:graph.","x-required-scope":"revisions:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"revisionId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"One saved version of a design, with the requirements it was built to. The feature graph rides along only for a key that also carries revisions:graph."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/revisions/{revisionId}/mutations":{"post":{"operationId":"post_v_public_make_revisions_revisionId_mutations","summary":"Change one parameter and save the result as a new version. Needs an Idempotency-Key header. Answers 201 the first time and 200 with the same version if you send it again.","x-required-scope":"revisions:write","security":[{"bearerAuth":[]}],"parameters":[{"name":"revisionId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Your own name for this call, so sending it again does the work once.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"mutation":{"oneOf":[{"type":"object","properties":{"type":{"type":"string","const":"set_feature_parameter"},"featureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"parameter":{"type":"string","pattern":"^[a-zA-Z][a-zA-Z0-9_]{0,63}$"},"value":{"anyOf":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"string","maxLength":500},{"type":"boolean"}]}},"required":["type","featureId","parameter","value"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"translate_feature"},"featureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"delta":{"type":"array","prefixItems":[{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000},{"type":"number","minimum":-1000000,"maximum":1000000}]}},"required":["type","featureId","delta"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"rotate_feature"},"featureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"newFeatureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"angles":{"type":"array","prefixItems":[{"type":"number","minimum":-360,"maximum":360},{"type":"number","minimum":-360,"maximum":360},{"type":"number","minimum":-360,"maximum":360}]}},"required":["type","featureId","newFeatureId","angles"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"replace_sketch"},"featureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"sketch":{"type":"object","properties":{"schemaVersion":{"type":"string","const":"1.0"},"units":{"type":"string","const":"mm"},"plane":{"type":"string","enum":["xy","xz","yz"]},"origin":{"$ref":"#/$defs/point"},"entities":{"minItems":1,"maxItems":1000,"type":"array","items":{"oneOf":[{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},"type":{"type":"string","const":"line"},"start":{"type":"array","prefixItems":[{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"}]},"end":{"type":"array","prefixItems":[{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"}]},"construction":{"type":"boolean"}},"required":["id","type","start","end"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},"type":{"type":"string","const":"circle"},"centre":{"type":"array","prefixItems":[{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"}]},"radius":{"$ref":"#/$defs/size"},"construction":{"type":"boolean"}},"required":["id","type","centre","radius"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},"type":{"type":"string","const":"arc"},"centre":{"type":"array","prefixItems":[{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"}]},"radius":{"$ref":"#/$defs/size"},"startAngle":{"type":"number"},"endAngle":{"type":"number"},"construction":{"type":"boolean"}},"required":["id","type","centre","radius","startAngle","endAngle"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},"type":{"type":"string","const":"bezier"},"controlPoints":{"minItems":2,"maxItems":10,"type":"array","items":{"type":"array","prefixItems":[{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"}]}},"construction":{"type":"boolean"}},"required":["id","type","controlPoints"],"additionalProperties":false},{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},"type":{"type":"string","const":"spline"},"points":{"minItems":2,"maxItems":1000,"type":"array","items":{"type":"array","prefixItems":[{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"}]}},"construction":{"type":"boolean"},"fitToleranceMm":{"type":"number","exclusiveMinimum":0}},"required":["id","type","points"],"additionalProperties":false}]}},"constraints":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},"type":{"type":"string","enum":["fixed","horizontal","vertical","length","radius","coincident","distance","equal","parallel","perpendicular","angle"]},"entityA":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},"entityB":{"anyOf":[{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,127}$"},{"type":"null"}]},"pointA":{"anyOf":[{"type":"string","enum":["start","end","centre"]},{"type":"null"}]},"pointB":{"anyOf":[{"type":"string","enum":["start","end","centre"]},{"type":"null"}]},"value":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["id","type","entityA","entityB","pointA","pointB","value"],"additionalProperties":false}}},"required":["schemaVersion","units","plane","entities","constraints"],"additionalProperties":false}},"required":["type","featureId","sketch"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"replace_outline_points"},"featureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"points":{"minItems":3,"maxItems":100,"type":"array","items":{"type":"object","properties":{"radius":{"type":"number","minimum":-1000000,"maximum":1000000},"z":{"type":"number","minimum":-1000000,"maximum":1000000}},"required":["radius","z"],"additionalProperties":false}}},"required":["type","featureId","points"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"add_fillet"},"featureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"newFeatureId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"size":{"type":"number","exclusiveMinimum":0,"maximum":1000}},"required":["type","featureId","newFeatureId","size"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"set_manufacturing_profile"},"process":{"type":"string","minLength":1,"maxLength":80},"material":{"type":"string","maxLength":120},"settings":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type","process","material","settings"],"additionalProperties":false}]}},"required":["mutation"],"additionalProperties":false,"$defs":{"point":{"type":"array","prefixItems":[{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"},{"$ref":"#/$defs/dimension"}]},"dimension":{"anyOf":[{"type":"number"},{"type":"object","properties":{"value":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":64}},"required":["parameter"],"additionalProperties":false}]},"unit":{"type":"string","enum":["mm","in","deg"]}},"required":["value","unit"],"additionalProperties":false},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":64}},"required":["parameter"],"additionalProperties":false}]},"size":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"object","properties":{"value":{"anyOf":[{"type":"number"},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":64}},"required":["parameter"],"additionalProperties":false}]},"unit":{"type":"string","enum":["mm","in"]}},"required":["value","unit"],"additionalProperties":false},{"type":"object","properties":{"parameter":{"type":"string","minLength":1,"maxLength":64}},"required":["parameter"],"additionalProperties":false}]}}}}}},"responses":{"200":{"description":"The same key again: the answer the first call produced."},"201":{"description":"Change one parameter and save the result as a new version. Needs an Idempotency-Key header. Answers 201 the first time and 200 with the same version if you send it again."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/revisions/{revisionId}/exports":{"get":{"operationId":"get_v_public_make_revisions_revisionId_exports","summary":"The finished files for a version, which is where the geometry lives.","x-required-scope":"exports:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"revisionId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"The finished files for a version, which is where the geometry lives."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/revisions/{revisionId}/exports/{exportId}/content":{"get":{"operationId":"get_v_public_make_revisions_revisionId_exports_exportId_content","summary":"Download a finished file using the same API key. The file must belong to this revision.","x-required-scope":"exports:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"revisionId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},{"name":"exportId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"Download a finished file using the same API key. The file must belong to this revision."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/projects/{projectId}/assemblies":{"get":{"operationId":"get_v_public_make_projects_projectId_assemblies","summary":"The assemblies saved against one part, newest first, 50 to a page. Send the nextCursor you were given back as the before parameter for the page after that.","x-required-scope":"assemblies:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},{"name":"before","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"The assemblies saved against one part, newest first, 50 to a page. Send the nextCursor you were given back as the before parameter for the page after that."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/assemblies/{assemblyId}":{"get":{"operationId":"get_v_public_make_assemblies_assemblyId_","summary":"One assembly and its parts list.","x-required-scope":"assemblies:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"assemblyId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"One assembly and its parts list."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/assemblies/{assemblyId}/revisions":{"post":{"operationId":"post_v_public_make_assemblies_assemblyId_revisions","summary":"Save a new revision of an assembly from a complete definition, sent as {\"assembly\": ...}. The solver runs again. Needs an Idempotency-Key header, and answers 201 the first time and 200 with the same revision if you send it again. The tool list carries the full assembly schema.","x-required-scope":"assemblies:write","security":[{"bearerAuth":[]}],"parameters":[{"name":"assemblyId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Your own name for this call, so sending it again does the work once.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"assembly":{"type":"object","properties":{"schemaVersion":{"type":"string","const":"1.0"},"units":{"type":"string","const":"mm"},"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"name":{"type":"string","minLength":1,"maxLength":160},"components":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"partRevisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"name":{"type":"string","minLength":1,"maxLength":160},"bounds":{"type":"array","prefixItems":[{"type":"number","exclusiveMinimum":0},{"type":"number","exclusiveMinimum":0},{"type":"number","exclusiveMinimum":0}]},"massGrams":{"type":"number","minimum":0},"transform":{"type":"object","properties":{"translation":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"rotationDeg":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]}},"required":["translation","rotationDeg"],"additionalProperties":false},"fixed":{"type":"boolean"},"visible":{"default":true,"type":"boolean"}},"required":["id","partRevisionId","name","bounds","massGrams","transform","fixed"],"additionalProperties":false}},"connectors":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"componentId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"position":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]},"axis":{"type":"array","prefixItems":[{"type":"number"},{"type":"number"},{"type":"number"}]}},"required":["id","componentId","position","axis"],"additionalProperties":false}},"mates":{"maxItems":5000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"type":{"type":"string","enum":["fixed","coincident","concentric","parallel","perpendicular","distance","angle","tangent"]},"connectorA":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"connectorB":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"value":{"type":"number"}},"required":["id","type","connectorA","connectorB","value"],"additionalProperties":false}},"joints":{"maxItems":1000,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"type":{"type":"string","enum":["fixed","revolute","prismatic","cylindrical","planar","ball","screw"]},"componentA":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"componentB":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"connectorA":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"connectorB":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"lower":{"type":"number"},"upper":{"type":"number"},"secondary":{"default":null,"anyOf":[{"type":"object","properties":{"lower":{"type":"number"},"upper":{"type":"number"}},"required":["lower","upper"],"additionalProperties":false},{"type":"null"}]},"tertiary":{"default":null,"anyOf":[{"type":"object","properties":{"lower":{"type":"number"},"upper":{"type":"number"}},"required":["lower","upper"],"additionalProperties":false},{"type":"null"}]},"pitch":{"anyOf":[{"type":"number","exclusiveMinimum":0},{"type":"null"}]}},"required":["id","type","componentA","componentB","connectorA","connectorB","lower","upper","pitch"],"additionalProperties":false}}},"required":["schemaVersion","units","id","name","components","connectors","mates","joints"],"additionalProperties":false}},"required":["assembly"],"additionalProperties":false}}}},"responses":{"200":{"description":"The same key again: the answer the first call produced."},"201":{"description":"Save a new revision of an assembly from a complete definition, sent as {\"assembly\": ...}. The solver runs again. Needs an Idempotency-Key header, and answers 201 the first time and 200 with the same revision if you send it again. The tool list carries the full assembly schema."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/assemblies/{assemblyId}/inspect-pair":{"post":{"operationId":"post_v_public_make_assemblies_assemblyId_inspect_pair","summary":"Measure exact clearance or overlapping volume between two assembly parts at a specified assembly revision. Uses bounded geometry runtime capacity without changing the design.","x-required-scope":"assemblies:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"assemblyId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"assemblyRevisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"componentA":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"componentB":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["assemblyRevisionId","componentA","componentB"],"additionalProperties":false}}}},"responses":{"200":{"description":"Measure exact clearance or overlapping volume between two assembly parts at a specified assembly revision. Uses bounded geometry runtime capacity without changing the design."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/jobs/{jobId}":{"get":{"operationId":"get_v_public_make_jobs_jobId_","summary":"How one build is going: queued, running, succeeded, failed or cancelled, what that means in words, and the version it produced.","x-required-scope":"projects:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"How one build is going: queued, running, succeeded, failed or cancelled, what that means in words, and the version it produced."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/jobs/{jobId}/retry":{"post":{"operationId":"post_v_public_make_jobs_jobId_retry","summary":"Run a build again after it failed or was stopped. Needs an Idempotency-Key header.","x-required-scope":"jobs:write","security":[{"bearerAuth":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},{"name":"Idempotency-Key","in":"header","required":true,"description":"Your own name for this call, so sending it again does the work once.","schema":{"type":"string","minLength":8,"maxLength":128}}],"responses":{"200":{"description":"The same key again: the answer the first call produced."},"202":{"description":"Run a build again after it failed or was stopped. Needs an Idempotency-Key header."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/jobs/{jobId}/cancel":{"post":{"operationId":"post_v_public_make_jobs_jobId_cancel","summary":"Stop a build that is still queued or running. Send it again as often as you like: a build that has already stopped or finished comes back as it stands.","x-required-scope":"jobs:write","security":[{"bearerAuth":[]}],"parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"Stop a build that is still queued or running. Send it again as often as you like: a build that has already stopped or finished comes back as it stands."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/designs/{projectId}/cancel":{"post":{"operationId":"post_v_public_make_designs_projectId_cancel","summary":"Stop a design that is still going. On current credit the work already done stays charged and anything set aside for work that never happened goes back. On legacy credit a run that doesn't finish is refunded in full. Send it again as often as you like.","x-required-scope":"designs:write","security":[{"bearerAuth":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"Stop a design that is still going. On current credit the work already done stays charged and anything set aside for work that never happened goes back. On legacy credit a run that doesn't finish is refunded in full. Send it again as often as you like."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/designs":{"post":{"operationId":"post_v_public_make_designs","summary":"Start a new design from a written description, on the part you name in projectId. You can leave projectId out if this key opens exactly one part. This is the one call that costs money: it sets aside the most the design could use, charges what it did use when it ends, and returns the rest. It is also available as a tool.","x-required-scope":"designs:write","security":[{"bearerAuth":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"description":"Your own name for this call, so sending it again does the work once.","schema":{"type":"string","minLength":8,"maxLength":128}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"requirements":{"type":"string","minLength":1,"maxLength":20000},"mode":{"type":"string","enum":["unattended","step_by_step"]},"detail":{"type":"boolean"},"projectId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["requirements"],"additionalProperties":false}}}},"responses":{"200":{"description":"The same key again: the answer the first call produced."},"202":{"description":"Start a new design from a written description, on the part you name in projectId. You can leave projectId out if this key opens exactly one part. This is the one call that costs money: it sets aside the most the design could use, charges what it did use when it ends, and returns the rest. It is also available as a tool."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/designs/{projectId}":{"get":{"operationId":"get_v_public_make_designs_projectId_","summary":"Read the project's current design progress and questions without spending credit.","x-required-scope":"projects:read","security":[{"bearerAuth":[]}],"parameters":[{"name":"projectId","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}}],"responses":{"200":{"description":"Read the project's current design progress and questions without spending credit."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/usage":{"get":{"operationId":"get_v_public_make_usage","summary":"What is left of the credit on this account, in money, and the most the next design can cost.","x-required-scope":"projects:read","security":[{"bearerAuth":[]}],"parameters":[],"responses":{"200":{"description":"What is left of the credit on this account, in money, and the most the next design can cost."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/make/standard-parts":{"get":{"operationId":"get_v_make_standard_parts","summary":"Search the standard parts library. `q` searches, `limit` sizes the page and `from` moves through it. Any working key gets the full page, a count and paging past the first page; without one you get a shorter page and no count.","security":[],"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Search the standard parts library. `q` searches, `limit` sizes the page and `from` moves through it. Any working key gets the full page, a count and paging past the first page; without one you get a shorter page and no count."},"400":{"description":"error.code is one of: idempotency_key_required, invalid_arguments, invalid_assembly_pair, invalid_mutation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"error.code is one of: key_expired, key_invalid, key_revoked, unauthenticated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"402":{"description":"error.code is one of: usage_balance_required, usage_capacity_exhausted.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"error.code is one of: project_creation_denied, scope_denied.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"error.code is one of: assembly_not_found, export_not_found, job_not_found, not_found, project_not_found, revision_not_found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"error.code is one of: MODEL_SPEND_HISTORY_UNPRICED, assembly_inspection_cancelled, assembly_revision_changed, build_already_running, design_start_in_progress, idempotency_key_in_use, request_cancelled, revision_not_confirmed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"413":{"description":"error.code is one of: body_too_large, export_too_large.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"415":{"description":"error.code is one of: unsupported_media_type.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"error.code is one of: mutation_refused.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"error.code is one of: MODEL_SPEND_LIMIT_REACHED, daily_job_limit_reached, design_retry_limit_reached, rate_limited, usage_daily_cap_reached.","headers":{"Retry-After":{"description":"Seconds to wait before sending this again.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"error.code is one of: internal_error.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"502":{"description":"error.code is one of: assembly_inspection_invalid.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"error.code is one of: MODEL_SPEND_CONTEXT_REQUIRED, MODEL_SPEND_QUOTE_EXCEEDED, MODEL_SPEND_QUOTE_UNAVAILABLE, assembly_inspection_unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/public/make/mcp":{"post":{"operationId":"post_v1_public_make_mcp","summary":"The same operations as tools, over JSON-RPC, for a client that speaks the Model Context Protocol. Point your client here and send the key as a bearer token.","description":"A JSON-RPC 2.0 endpoint over the Streamable HTTP transport. Send initialize first, naming a protocolVersion from 2025-03-26, 2025-06-18, 2025-11-25. A missing or empty protocolVersion is refused; an unsupported version receives a supported alternative. The answer carries an Mcp-Session-Id header that encodes the agreed version and a unique suffix: return that exact value on every later message, with an MCP-Protocol-Version header matching the version agreed. The session is not a credential. A message with no session is refused with 400 and one naming an unknown session with 404. notifications/cancelled aborts an in-flight call on this isolate; cancel-design is the durable stop across isolates. Anything other than POST is answered 405. tools/list needs no key; every tools/call is authorised against the scope its tool costs. A body over the size limit is answered 200 with a JSON-RPC error of -32600 and data.code body_too_large.","security":[{"bearerAuth":[]},{}],"parameters":[{"name":"Mcp-Session-Id","in":"header","required":false,"description":"The session initialize opened. Required on every message after it.","schema":{"type":"string"}},{"name":"MCP-Protocol-Version","in":"header","required":false,"description":"The version this session agreed. Current: 2025-11-25.","schema":{"type":"string","enum":["2025-03-26","2025-06-18","2025-11-25"]}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcRequest"}}}},"responses":{"200":{"description":"A JSON-RPC result, or a JSON-RPC error a client branches on.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonRpcResponse"}}}},"202":{"description":"A notification was accepted. There is no answer body."},"400":{"description":"No session, or a protocol version this server does not speak."},"404":{"description":"A session this server does not know. Send initialize again."},"405":{"description":"Only POST is served: there is no subscription and no session to delete."}}}}}}