{"openapi":"3.1.0","info":{"title":"Cut List & Kerf API","version":"1.0.0","description":"Cut-list maths for woodworking and material cutting as an API, computed locally and deterministically. The cuts endpoint computes how many pieces of a target length come from one stock length once the saw kerf — the width of material each cut removes — is accounted for, using pieces = floor((stock + kerf)/(piece + kerf)) since the final cut leaves no kerf, and returns the used length, the leftover offcut, the waste percentage and the total kerf loss; a 2400 mm board cut into 300 mm pieces with a 3 mm kerf yields 7 pieces with a 282 mm offcut, not the 8 you would expect ignoring the blade. The boards endpoint works out how many stock lengths a job of a given quantity needs and how many spare pieces are left over. The yield endpoint reports the overall material efficiency — total piece length divided by total stock length — for a whole cutting job. All lengths share one consistent unit (mm, cm or inches). Everything is computed locally and deterministically, so it is instant and private. Ideal for woodworking, carpentry, metal-fabrication, contractor, maker and shop-software developers, cut-list and offcut calculators, and material-ordering tools. Pure local computation — no key, no third-party service, instant. Live, nothing stored. 3 endpoints. This is single-length (1D) cut optimisation; for loose-material volume use a mulch/volume API.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/kerf-api","description":"oanor gateway"}],"tags":[{"name":"CutList"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/boards":{"get":{"operationId":"get_v1_boards","tags":["CutList"],"summary":"Stock needed for a quantity","description":"","parameters":[{"name":"stock_length","in":"query","required":true,"description":"Stock length","schema":{"type":"string"},"example":"2400"},{"name":"piece_length","in":"query","required":true,"description":"Cut piece length","schema":{"type":"string"},"example":"300"},{"name":"quantity","in":"query","required":true,"description":"Pieces needed","schema":{"type":"string"},"example":"20"},{"name":"kerf","in":"query","required":false,"description":"Saw kerf per cut","schema":{"type":"string"},"example":"3"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Stock needed = ⌈quantity / pieces-per-stock⌉. Leftover pieces are spare cuts on the last stock length.","inputs":{"kerf":3,"quantity":20,"piece_length":300,"stock_length":2400},"stock_needed":3,"leftover_pieces":1,"total_kerf_loss":54,"pieces_per_stock":7},"meta":{"timestamp":"2026-06-05T19:50:19.200Z","request_id":"16c36576-4ef7-4b06-8ea6-bcb12d79b530"},"status":"ok","message":"Stock needed","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/cuts":{"get":{"operationId":"get_v1_cuts","tags":["CutList"],"summary":"Pieces per stock length","description":"","parameters":[{"name":"stock_length","in":"query","required":true,"description":"Stock length","schema":{"type":"string"},"example":"2400"},{"name":"piece_length","in":"query","required":true,"description":"Cut piece length","schema":{"type":"string"},"example":"300"},{"name":"kerf","in":"query","required":false,"description":"Saw kerf per cut (default 0)","schema":{"type":"string"},"example":"3"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Pieces per stock = floor((stock + kerf)/(piece + kerf)); the final cut needs no kerf. The offcut is what's left over on one stock length.","inputs":{"kerf":3,"piece_length":300,"stock_length":2400},"kerf_loss":18,"used_length":2118,"offcut_length":282,"waste_percent":11.75,"pieces_per_stock":7},"meta":{"timestamp":"2026-06-05T19:50:19.313Z","request_id":"77c5b2bb-1d16-4b01-a436-fb8c9f64ac03"},"status":"ok","message":"Pieces per stock","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/yield":{"get":{"operationId":"get_v1_yield","tags":["CutList"],"summary":"Material efficiency","description":"","parameters":[{"name":"stock_length","in":"query","required":true,"description":"Stock length","schema":{"type":"string"},"example":"2400"},{"name":"piece_length","in":"query","required":true,"description":"Cut piece length","schema":{"type":"string"},"example":"300"},{"name":"quantity","in":"query","required":true,"description":"Pieces needed","schema":{"type":"string"},"example":"20"},{"name":"kerf","in":"query","required":false,"description":"Saw kerf per cut","schema":{"type":"string"},"example":"3"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Efficiency = total piece length / total stock length. Waste includes both kerf loss and end offcuts.","inputs":{"kerf":3,"quantity":20,"piece_length":300,"stock_length":2400},"stock_needed":3,"efficiency_percent":83.3333,"total_piece_length":6000,"total_stock_length":7200,"total_waste_length":1200},"meta":{"timestamp":"2026-06-05T19:50:19.425Z","request_id":"fe2d9ba4-387a-4f6c-8116-9a94a6db526e"},"status":"ok","message":"Material efficiency","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Spec","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"notes":"All lengths share one unit (mm, cm, in…). Kerf is the width of material the blade removes per cut (default 0); a thin-kerf blade is ≈2–3 mm. This is single-length (1D) cutting, not 2D sheet nesting.","service":"kerf-api","endpoints":{"GET /v1/cuts":"Pieces and offcut from one stock length.","GET /v1/meta":"This document.","GET /v1/yield":"Total material efficiency of a cutting job.","GET /v1/boards":"Stock pieces needed for a quantity of cuts."},"description":"Cut-list maths for woodworking and material cutting: pieces per stock with the saw kerf, offcut, stock needed, and material efficiency."},"meta":{"timestamp":"2026-06-05T19:50:19.515Z","request_id":"a1d58db5-dae1-47dc-8deb-fc885dde96f4"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":7600,"rps_limit":2,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":390,"monthly_call_quota":76000,"rps_limit":6,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":1080,"monthly_call_quota":335000,"rps_limit":15,"hard_limit":true},{"slug":"mega","name":"Mega","price_cents_month":3300,"monthly_call_quota":1780000,"rps_limit":40,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/kerf-api"}