{"name":"Unwrite Make","version":"1","billing":{"currency":"USD","chargedBy":"usage","ordinaryDesignMaxCents":704,"detailDesignMaxCents":2814,"minimumStartCents":100,"legacyOrdinaryDesignCents":50,"priceDescription":"Prepaid credit is charged by usage. When a design starts we set aside the most it could use, which is US$7.04, or US$28.14 in Detail Mode because it works for longer. If your balance is lower than that, the design runs on what you have, as long as it's at least US$1.00. When the design ends you're charged for what it actually used and the rest goes straight back to your balance.","capacityDescription":"Usage is charged whether or not the design finished. A design that failed, or one you stopped, still did the work it's charged for, and it costs only that. If we can't tell what a design used, it's charged everything that was set aside for it. Some older top-ups also carry a separate generation capacity that earlier failed attempts used up without spending the money. If that runs out first, the API answers usage_capacity_exhausted, your money stays in your account, and we'll refund it if you ask.","legacyDescription":"Legacy credit keeps its original terms: US$0.50 for an ordinary design, returned in full if the run doesn't finish. It can't be bought any more. New top-ups are charged by usage, and buying more doesn't renew the old offer.","cancellationDescription":"Stop a design and the work already done on current credit stays charged, while anything set aside for work that never happened goes back to your balance. A design paid for with legacy credit works the other way: if its run doesn't finish, the whole charge is returned.","creditNote":"When a design starts we set aside the most it could use, and when it ends we return whatever it didn't. A design that failed, or one you stopped, is still charged for the work it did. Detail Mode works for longer, so it can use more. Credit never expires, and we'll refund anything unspent if you ask.","usagePath":"/v1/public/make/usage"},"authentication":{"header":"Authorization","format":"Bearer {your API key}","note":"A key belongs to your account, and it opens either every part you own or just the parts you picked when you made it, with only the scopes you gave it. Make, list and revoke your keys in Make settings. Revoking takes effect on the next call."},"idempotency":{"header":"Idempotency-Key","format":"8 to 128 letters, numbers, dots, colons, hyphens or underscores","note":"Required on every call that creates something. Send the same key again and you get the first answer back rather than a second thing made.","retentionDays":35,"replay":"A key is kept for 35 days from the call that first used it. Within that window, sending it again gives you back what the first call produced: the saved version for a parameter change, the project's current run for a design, the same build for a retry. After the window the key is forgotten, so the same call would be treated as new work. Make up a fresh key for each new operation and you will never meet that edge.","concurrent":"Two calls sharing one key never both do the work: the first takes the key and the second is answered from it. If the first has not finished, the second gets 409 idempotency_key_in_use, and a build retry racing another gets 409 build_already_running. Two design starts with different keys on one project never both pay: while the first is still between taking the credit and starting, the second gets 409 design_start_in_progress with its key handed back, and once the first run is live the second is answered with that run. Wait, read the current state, and only then decide. A call that was refused before it made anything gives its key straight back, so correcting the problem and sending the same call again works."},"limits":{"note":"Each key has its own allowance per minute, and so does the address you call from. Over either one you get a 429 with a Retry-After header saying how long to wait. Every answer carries RateLimit-Limit and RateLimit-Policy naming those allowances and the window. The limiter reports admission, not a live remaining count or a fixed reset timer, so Remaining and Reset are not invented on the answer. A 429 can also mean a spend or retry cap rather than an empty request-rate bucket. RateLimit-Policy lists every allowance that bound the call, so you can pace yourself against whichever binds first.","perAddressPerMinute":120,"perKeyPerMinute":300,"maxRequestBodyBytes":65536,"body":"A request body over 65536 bytes is refused before anything is read out of it. On a route that is HTTP 413 with error.code body_too_large. On the tool endpoint it is HTTP 200 carrying a JSON-RPC error of -32600 with data.code body_too_large, because that is where a JSON-RPC client looks."},"scopes":{"projects:read":"Read the parts this key opens.","revisions:read":"Read saved versions and the requirements behind them.","revisions:graph":"Read the internal shape description on a version as well. Ask for this only if you need it.","revisions:write":"Change a parameter and save a new version.","exports:read":"List the finished files for a version.","assemblies:read":"Read assemblies and their parts lists.","assemblies:write":"Save a new revision of an assembly you already own.","jobs:write":"Run a build again, or stop one that is still going.","designs:write":"Start a new design, or stop one. This is the one scope that spends money, so leave it off any key that only needs to read."},"routes":[{"method":"GET","path":"/v1/public/make","scope":null,"summary":"This description. No key needed."},{"method":"GET","path":"/v1/public/make/projects","scope":"projects:read","query":["before"],"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."},{"method":"POST","path":"/v1/public/make/projects","status":201,"idempotent":true,"scope":"designs:write","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.","body":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120}},"required":["name"],"additionalProperties":false}},{"method":"GET","path":"/v1/public/make/openapi.json","scope":null,"summary":"This same surface as an OpenAPI 3.1 document. No key needed."},{"method":"GET","path":"/v1/public/make/projects/{projectId}","scope":"projects:read","summary":"One of the parts this key opens."},{"method":"GET","path":"/v1/public/make/revisions/{revisionId}","scope":"revisions:read","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."},{"method":"POST","path":"/v1/public/make/revisions/{revisionId}/mutations","status":201,"idempotent":true,"scope":"revisions:write","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.","body":{"$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}]}}}},{"method":"GET","path":"/v1/public/make/revisions/{revisionId}/exports","scope":"exports:read","summary":"The finished files for a version, which is where the geometry lives."},{"method":"GET","path":"/v1/public/make/revisions/{revisionId}/exports/{exportId}/content","scope":"exports:read","summary":"Download a finished file using the same API key. The file must belong to this revision."},{"method":"GET","path":"/v1/public/make/projects/{projectId}/assemblies","scope":"assemblies:read","query":["before"],"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."},{"method":"GET","path":"/v1/public/make/assemblies/{assemblyId}","scope":"assemblies:read","summary":"One assembly and its parts list."},{"method":"POST","path":"/v1/public/make/assemblies/{assemblyId}/revisions","status":201,"idempotent":true,"scope":"assemblies:write","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.","body":{"$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}},{"method":"POST","path":"/v1/public/make/assemblies/{assemblyId}/inspect-pair","scope":"assemblies:read","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.","body":{"$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}},{"method":"GET","path":"/v1/public/make/jobs/{jobId}","scope":"projects:read","summary":"How one build is going: queued, running, succeeded, failed or cancelled, what that means in words, and the version it produced."},{"method":"POST","path":"/v1/public/make/jobs/{jobId}/retry","status":202,"idempotent":true,"scope":"jobs:write","summary":"Run a build again after it failed or was stopped. Needs an Idempotency-Key header."},{"method":"POST","path":"/v1/public/make/jobs/{jobId}/cancel","scope":"jobs:write","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."},{"method":"POST","path":"/v1/public/make/designs/{projectId}/cancel","scope":"designs:write","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."},{"method":"POST","path":"/v1/public/make/designs","status":202,"idempotent":true,"scope":"designs:write","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.","body":{"$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}},{"method":"GET","path":"/v1/public/make/designs/{projectId}","scope":"projects:read","summary":"Read the project's current design progress and questions without spending credit."},{"method":"GET","path":"/v1/public/make/usage","scope":"projects:read","summary":"What is left of the credit on this account, in money, and the most the next design can cost."},{"method":"GET","path":"/v1/make/standard-parts","scope":null,"query":["q","limit","from"],"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."},{"method":"POST","path":"/v1/public/make/mcp","scope":null,"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."}],"openapi":"/v1/public/make/openapi.json","mcp":{"path":"/v1/public/make/mcp","transport":"streamable-http","protocolVersion":"2025-11-25","supportedProtocolVersions":["2025-03-26","2025-06-18","2025-11-25"],"sessionRequired":true,"sessionHeader":"Mcp-Session-Id","lifecycle":"Send initialize first, naming a protocolVersion from the list above. A missing or empty protocolVersion is refused. An unsupported version receives a supported alternative for you to accept or leave. The answer carries an Mcp-Session-Id header that encodes the agreed version and a unique suffix: send that exact value back on every later message, along with an MCP-Protocol-Version header matching the version you agreed. A message that arrives without a session is refused with HTTP 400, and one naming a session we do not know with HTTP 404. The session is not a credential; every tools/call still needs the bearer scope. notifications/cancelled aborts the in-flight call it names when this isolate is still running it. If the notification lands on a different isolate, it answers 202 without stopping the call; cancel the design on the REST route for the durable stop."},"tools":[{"name":"make_inspect_assembly_pair","description":"Measure the exact clearance or overlapping volume between two parts of an owned assembly. Read the assembly first and send its current revision ID. This check is subject to build-service limits and does not change the design.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"assemblyId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"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":["assemblyId","assemblyRevisionId","componentA","componentB"],"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"inspection":{"type":"object","properties":{"analysis":{"type":"string","const":"exact_brep"},"method":{"type":"string","enum":["exact_solid_measurement"]},"toleranceMm":{"type":"number","minimum":0},"bodyCount":{"type":"number","const":2},"pairCount":{"type":"number","const":1},"measuredPairCount":{"type":"integer","minimum":0,"maximum":1},"unknownCount":{"type":"integer","minimum":0,"maximum":1},"pairs":{"minItems":1,"maxItems":1,"type":"array","items":{"type":"object","properties":{"bodyA":{"type":"string"},"bodyB":{"type":"string"},"distanceMm":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"overlapVolumeMm3":{"anyOf":[{"type":"number","minimum":0},{"type":"null"}]},"relationship":{"type":"string","enum":["separated","within_tolerance","touching","overlapping","unknown"]}},"required":["bodyA","bodyB","distanceMm","overlapVolumeMm3","relationship"],"additionalProperties":false}},"sourceRevisions":{"minItems":2,"maxItems":2,"type":"array","items":{"type":"object","properties":{"componentId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"revisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"required":["componentId","revisionId","sha256"],"additionalProperties":false}},"assemblyRevisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["analysis","method","toleranceMm","bodyCount","pairCount","measuredPairCount","unknownCount","pairs","sourceRevisions","assemblyRevisionId"],"additionalProperties":false}},"required":["inspection"],"additionalProperties":false}},{"name":"make_list_assemblies","description":"List the saved assemblies of one part, newest first, 50 to a page. Send the nextCursor you were given as `before` to read the page after that. Name the part unless this key opens exactly one.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"projectId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"before":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"additionalProperties":false},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"assemblies":{"maxItems":50,"type":"array","items":{"type":"object","properties":{"assemblyId":{"type":"string"},"revisionId":{"type":"string"},"name":{"type":"string"},"revisionNumber":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"createdAt":{"type":"string"}},"required":["assemblyId","revisionId","name","revisionNumber","createdAt"],"additionalProperties":false}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["assemblies","nextCursor"],"additionalProperties":false}},{"name":"make_get_assembly","description":"Read one saved assembly at its latest revision: the parts and where each one sits, the mate diagnostics, the bill of materials and the robot descriptions.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"assemblyId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["assemblyId"],"additionalProperties":false}},{"name":"make_revise_assembly","description":"Save a new revision of an owned assembly from a complete assembly definition. The solver runs again and the answer carries the new revision. Send the same idempotency key again to get the first revision back rather than saving a second one.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"assemblyId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"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},"idempotencyKey":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{7,127}$"}},"required":["assemblyId","assembly","idempotencyKey"],"additionalProperties":false}},{"name":"make_get_design","description":"Read a project's current design status, progress and questions after starting a design. This doesn't spend credit. Name the project unless this key opens exactly one.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"additionalProperties":false}},{"name":"make_list_projects","description":"List projects accessible to this API key, most recently updated first, 50 per page. Pass nextCursor as before to fetch the next page. Use this to find a projectId when needed.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"before":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"additionalProperties":false},"outputSchema":{"type":"object","properties":{"projects":{"type":"array","maxItems":50,"items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"status":{"type":"string","enum":["active","archived"]},"updatedAt":{"type":"string"}},"required":["id","name","status","updatedAt"],"additionalProperties":false}},"nextCursor":{"type":["string","null"]}},"required":["projects","nextCursor"],"additionalProperties":false}},{"name":"make_create_project","description":"Create a project and return its ID. Reuse the same idempotencyKey to return the original project instead of creating another. Requires an account-wide API key.","annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"idempotencyKey":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{7,127}$"}},"required":["name","idempotencyKey"],"additionalProperties":false}},{"name":"make_get_project","description":"Read a project. Supply projectId unless the API key is restricted to one project.","inputSchema":{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"additionalProperties":false}},{"name":"make_get_revision","description":"Read one immutable project revision. Geometry comes from exports; use make_list_exports for STEP, STL, 3MF and GLB.","inputSchema":{"type":"object","properties":{"revisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["revisionId"],"additionalProperties":false}},{"name":"make_list_exports","description":"List generated exports for an immutable project revision.","inputSchema":{"type":"object","properties":{"revisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["revisionId"],"additionalProperties":false}},{"name":"make_get_assembly_bom","description":"Read the grouped bill of materials for an owned assembly.","inputSchema":{"type":"object","properties":{"assemblyId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["assemblyId"],"additionalProperties":false}},{"name":"make_retry_job","description":"Retry a failed or cancelled build job with an idempotency key.","inputSchema":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"idempotencyKey":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{7,127}$"}},"required":["jobId","idempotencyKey"],"additionalProperties":false}},{"name":"make_get_job","description":"Read a build job's status, explanation and resulting revision, when available.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["jobId"],"additionalProperties":false}},{"name":"make_cancel_job","description":"Stop a build that is still queued or running. Safe to send again: a build that has already stopped or finished comes back as it stands.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"jobId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["jobId"],"additionalProperties":false}},{"name":"make_cancel_design","description":"Cancel an active design. With current credit, the work already done stays charged and anything set aside for work that never happened goes back to the balance. With legacy credit, an unfinished run is refunded in full. Repeating this call is safe. Supply projectId unless the API key is restricted to one project.","annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"projectId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"additionalProperties":false}},{"name":"make_start_design","description":"Start a paid design from a written description in a project. Supply projectId unless the API key is restricted to one project. Reuse idempotencyKey to return the original run instead of starting another.","inputSchema":{"type":"object","properties":{"requirements":{"type":"string","minLength":1,"maxLength":20000},"mode":{"type":"string","enum":["unattended","step_by_step"]},"detail":{"type":"boolean","description":"Choose Detail Mode before starting. It works for longer and in more detail, so it uses more credit. It is charged for what it uses, like any design."},"projectId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"idempotencyKey":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{7,127}$"}},"required":["requirements","idempotencyKey"],"additionalProperties":false}},{"name":"make_get_usage","description":"Check the account’s remaining credit before starting paid work.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{},"additionalProperties":false}},{"name":"make_download_export","description":"Fetch one finished file for a revision, as base64 bytes you can save. Use make_list_exports first to find the file. A file larger than 8 MB is fetched from its download URL instead.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"revisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"exportId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"}},"required":["revisionId","exportId"],"additionalProperties":false}},{"name":"make_search_standard_parts","description":"Search the standard parts library: fasteners, bearings and the rest, with the dimensions a design has to be built around.","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true},"inputSchema":{"type":"object","properties":{"q":{"type":"string","maxLength":120},"limit":{"type":"integer","minimum":1,"maximum":200},"from":{"type":"integer","minimum":0,"maximum":100000}},"additionalProperties":false}},{"name":"make_set_feature_parameter","description":"Save a new version of a design with one parameter changed. Send the same idempotency key again to get the first result back rather than making a second version.","inputSchema":{"type":"object","properties":{"revisionId":{"type":"string","pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{2,127}$"},"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"},{"type":"string","maxLength":500},{"type":"boolean"}]},"idempotencyKey":{"type":"string","minLength":8,"maxLength":128,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_.:-]{7,127}$"}},"required":["revisionId","featureId","parameter","value","idempotencyKey"],"additionalProperties":false}}],"errors":{"MODEL_SPEND_CONTEXT_REQUIRED":{"status":503,"meaning":"We've paused this run because we couldn't check its allowance. The problem is on our side, and your design is saved."},"MODEL_SPEND_HISTORY_UNPRICED":{"status":409,"meaning":"We've paused this run because some earlier work has no recorded cost, so we can't confirm the remaining allowance. Your design is saved; you can review it while this cost issue remains unresolved."},"MODEL_SPEND_LIMIT_REACHED":{"status":429,"meaning":"This run has paused because the next step would exceed the available allowance. Your design is saved. Check your usage before continuing."},"MODEL_SPEND_QUOTE_EXCEEDED":{"status":503,"meaning":"We've paused this run because its cost exceeded the confirmed limit. Your design is saved. Check your usage before deciding whether to continue."},"MODEL_SPEND_QUOTE_UNAVAILABLE":{"status":503,"meaning":"We've paused this run because we couldn't confirm the cost of its next step. The problem is on our side, and your design is saved."},"assembly_inspection_cancelled":{"status":409,"meaning":"You cancelled this check."},"assembly_inspection_invalid":{"status":502,"meaning":"We couldn't verify the check for these parts."},"assembly_inspection_unavailable":{"status":503,"meaning":"We couldn't check these parts just now. Try again shortly."},"assembly_not_found":{"status":404,"meaning":"No assembly of that name is open to this key."},"assembly_revision_changed":{"status":409,"meaning":"The assembly has changed. Read its latest revision and try again."},"body_too_large":{"status":413,"meaning":"That request body is larger than the 64 KB this API accepts. Send a smaller one."},"design_retry_limit_reached":{"status":429,"meaning":"A lot of designs have stopped short on this account today, so we've paused new ones until midnight UTC. None of them cost you anything. If something on our side is breaking them, tell us and we'll put it right."},"design_start_in_progress":{"status":409,"meaning":"Another call is already starting a design for this part. Read the project shortly and send this call again if it is still needed."},"export_not_found":{"status":404,"meaning":"No export of that name is open to this key."},"export_too_large":{"status":413,"meaning":"That file is too large to send inside a tool answer. Fetch it from the download URL on the file instead."},"idempotency_key_in_use":{"status":409,"meaning":"That idempotency key is already in use for a different change. Use a fresh one."},"idempotency_key_required":{"status":400,"meaning":"Send an Idempotency-Key header of 8 to 128 letters, numbers, dots, colons, hyphens or underscores, so a repeated call does the work once."},"invalid_arguments":{"status":400,"meaning":"One of the values sent isn't the right shape. Check them and retry."},"invalid_assembly_pair":{"status":400,"meaning":"Choose two different parts from this assembly."},"invalid_mutation":{"status":400,"meaning":"Describe the change as one bounded parameter change and retry."},"job_not_found":{"status":404,"meaning":"No build of that name is open to this key."},"key_expired":{"status":401,"meaning":"That API key has passed its expiry date, so create a new one to carry on."},"key_invalid":{"status":401,"meaning":"That API key isn't one we recognise, so check it, or create a new one."},"key_revoked":{"status":401,"meaning":"That API key was revoked, so create a new one to carry on."},"mutation_refused":{"status":422,"meaning":"That change can't be made to this design."},"project_creation_denied":{"status":403,"meaning":"This key was issued for named parts, so it cannot make new ones. Use a key that covers the whole account."},"project_not_found":{"status":404,"meaning":"No project of that name is open to this key."},"request_cancelled":{"status":409,"meaning":"You stopped this call before it began, so nothing was started and nothing was charged."},"revision_not_found":{"status":404,"meaning":"No revision of that name is open to this key."},"unauthenticated":{"status":401,"meaning":"Send your API key as an Authorization header, in the form Bearer followed by the key."},"unsupported_media_type":{"status":415,"meaning":"Send the body as JSON, with a Content-Type header of application/json."},"usage_balance_required":{"status":402,"meaning":"There isn't enough credit on this account to start a design. It needs at least US$1.00, so add credit to carry on."},"usage_capacity_exhausted":{"status":402,"meaning":"Your prepaid generation capacity is used up. Your remaining credit is still in your account."},"usage_daily_cap_reached":{"status":429,"meaning":"This account has reached the daily spending limit set on it. It lifts at midnight UTC."},"scope_denied":{"status":403,"meaning":"The key works but was not given the scope this call needs."},"rate_limited":{"status":429,"meaning":"Too many calls too quickly. Wait as long as the Retry-After header says."},"daily_job_limit_reached":{"status":429,"meaning":"The day's builds are used up. Wait as long as the Retry-After header says."},"build_already_running":{"status":409,"meaning":"This project is already building. Wait for that build to finish."},"revision_not_confirmed":{"status":409,"meaning":"Nobody has confirmed this version of the design, so there is nothing to build."}}}