Skip to main content
Glama

Server Details

Price machined and sheet-metal parts from a STEP file or drawing: an itemised should-cost across every lot size, each figure traced to the physics behind it.

Ownership verified
Status
Healthy
Uptime
0.3% over 22 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

Score is being calculated.

Available Tools

212 tools
arcnm_apply_adjustmentARCNM Apply AdjustmentInspect

Make a what-if stick: write moved factors into the calculation's costing environment the way the app's 'apply to this environment' dialog does. Read the factors with arcnm_cost_factors and try them with arcnm_preview_cost first. By default (apply=false) this PLANS only — it returns, per factor, the exact REST write it would make (endpoint, today's value, the new value) and refuses by name what it will not write — and changes nothing. Call again with apply=true to perform the writes. Rates (labour, overheads) and economics scalars are set; tuning factors are set per process; the material price is set for the calculation's grade; a base-seconds knob (setup base, programming base, an allowance) is TAUGHT — the what-if's before and after seconds become one calibration observation, which moves the environment's learned factor rather than pinning a value. A machine's own hourly rate, cutting data, the lot size, a scrap price and the tuning panel's own settings (the remnant value factor, the inspection times) are refused with the endpoint or tool that holds them. Every write changes the environment: the next calculation in it is re-priced and billed as usual. recalculate=true additionally starts a new calculation of this part on the changed environment (billable) — asked what this calculation was asked, its stock format included — and returns its id and what running it answered (recalculation_status). Needs parts:write.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNo
adjustmentsYes
recalculateNo
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
writesYes
appliedYesFalse: nothing was written — the writes are a plan. True: each write's status says what happened.
refusedYes
guidanceYes
calculation_idYes
environment_idYes
recalculation_idNoThe calculation created on the changed environment, when recalculate=true. `recalculation_status` says whether it runs.
recalculation_statusNoWhat running the recalculation answered: `queued` (started), `succeeded` (served from an identical earlier run, not billed again), `blocked` (saved, not started — its coverage says why) or `failed` (the environment cannot price the part). Null when it was refused — the `recalculate` refusal says why.
arcnm_check_quotaARCNM Check Quota
Read-onlyIdempotent
Inspect

Check this organization's remaining calculation quota for the current billing window BEFORE committing a run — how many calculations are included, used, and remaining, whether the plan hard-caps (over-quota parks as 'blocked') or bills overage, how overage settles ('wallet' = prepaid, so the balance is the ceiling — 'wallet_funded_calculations' is how many more fit), how much of the monthly overage cap is left, and whether billing is suspended. Use it to top up, upgrade or raise the cap up front instead of discovering the wall when a calc parks. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
planNo
usedNo
windowNo'month' or 'year'.
guidanceYes
includedNoCalculations included per window.
effectiveNoCeiling this window (included + rollover).
remainingNoCalculations still available this window.
over_quotaNo
hard_cappedNoTrue: over-quota runs park as blocked. False: they bill as overage.
overage_centsNoPrice of one calculation beyond the included volume, in cents.
payment_blockedNoTrue when billing is suspended and nothing will run.
wallet_overdrawnNoTrue when the prepaid balance has reached its hard floor — calculations are paused and further runs park as 'blocked' until the balance is topped up. Check this before a bulk run.
overage_cap_centsNoMonthly overage spend cap in cents, or null when uncapped. Bounds what over-quota runs may cost.
spend_cap_blockedNoTrue when the overage cap is reached and set to pause — further over-quota runs park as blocked.
has_payment_methodNoWhether a card is on file. Required before any calculation beyond the included volume on a 'wallet' plan.
overage_settlementNoHow overage is paid: 'wallet' (prepaid — the balance is the ceiling, top up to continue) or 'invoice' (contracted, billed in arrears).
overage_spend_centsNoOverage already billed this calendar month, in cents.
wallet_balance_centsNoPrepaid balance in cents ('wallet' settlement only).
wallet_overdraft_centsNoHow far the prepaid balance is below zero, in cents.
activation_runs_remainingNoCalculations this account may still run before a person reviews it, or null when no review is pending. Separate from 'remaining': a new account can have its whole included volume and still be limited to a handful of runs. Size a batch by the SMALLER of the two — anything past it is saved, not run, and there is nothing to pay or retry to change that.
wallet_funded_calculationsNoHow many more overage calculations the balance covers. Check this before a bulk run — past it, calculations park as 'blocked'.
wallet_overdraft_floor_centsNoHard floor on the prepaid balance, in cents; the balance can never go below its negation.
overage_budget_remaining_centsNoOverage spend still inside the cap, in cents; null when uncapped.
arcnm_compare_calculationsARCNM Compare Calculations
Read-onlyIdempotent
Inspect

Compare two calculations and explain the offer-price delta (the price each calculation headlines), with the unit-cost delta before surcharges beside it. Compares like with like: flags when the two used different lot sizes or costing environments, and states no delta across currencies. For the same part(s) across several rate environments use arcnm_compare_environments instead. Read-only — does not re-price.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_id_aYes
calculation_id_bYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
aYes
bYes
noteYes
guidanceNoWhat the delta means and what to do next (alias of note for naming consistency with the other tools).
comparableYesFalse if the two used different lot sizes, costing environments or currencies, or either is an assembly priced only in part — see incomparable_reasons for which.
unit_cost_deltaNob − a unit cost before the cost-sheet surcharges, per unit, in the shared currency; null across currencies and when either side is an assembly priced only in part. Secondary: it can point the other way from offer_price_delta when the two environments state different surcharges.
offer_price_deltaNob − a offer price, per unit, in the shared currency — the delta that says which option is cheaper. Null when the two are quoted in different currencies — there is no FX rail, so a cross-currency difference would be an invented number — and when either side is an assembly priced only in part.
unit_time_delta_sNob − a, production seconds per unit — time beside cost, so a cheaper option that is slower (capacity impact) is visible. Null when either side is an assembly priced only in part.
unit_cost_delta_pctNounit_cost_delta as % of a; null wherever it is.
incomparable_reasonsNoWhy comparable is false: lot_size_mismatch, environment_mismatch, currency_mismatch and/or assembly_partial (the same vocabulary the REST comparison matrix uses). Empty when comparable.
offer_price_delta_pctNooffer_price_delta as % of a; null wherever it is.
arcnm_compare_environmentsARCNM Compare Environments
Read-onlyIdempotent
Inspect

Compare the same part(s) priced across several rate environments — the parts × environments matrix of a multi-environment run. Pass the batch_id returned by a multi-environment quote/batch, OR an explicit list of calculation_ids (e.g. runs of the same part from different days). Returns, per part, the offer price (and the unit cost before surcharges) in every environment and the environment with the lowest offer price (ties included), and per environment the win count, basket total and median delta vs the baseline — all server-computed, identical to what the API and UI report. Read-only — does not re-price. To START a multi-environment run, create a batch with costing_environment_ids first. Up to 200 calculation_ids, and the pivoted grid may not exceed 500 cells (parts x environments) — compare fewer runs, or fewer distinct environments, if it does.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idNo
calculation_idsNo
baseline_environment_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
partsNo
batch_idNo
completeYesFalse while any cell is still computing — don't call a winner yet.
guidanceNoWhat the comparison shows and what to do next.
not_foundNo
environmentsNo
mixed_currencyNoTrue when environments quote in different currencies; deltas and totals are then restricted to same-currency cells.
mixed_calibrationNoTrue when the compared environments were not all priced under the same calibration — at least one is aligned to the tenant's reported costs and another is the unaligned estimate. The deltas are real, but part of the gap may be alignment rather than the environments. Say so before recommending a winner.
ignored_duplicatesNoCalculation ids dropped from the grid because a newer run of the same part in the same environment was also supplied — newest per (part, environment) wins. Non-empty means the matrix shows fewer cells than ids passed; compare older-vs-newer runs of one part with arcnm_compare_calculations instead.
baseline_environment_idNo
arcnm_cost_breakdownARCNM Cost Breakdown
Read-onlyIdempotent
Inspect

Get one calculation as a single rough-to-detailed hierarchy — headline → cost category → operation → feature, with time and cost side by side — so you can stop at the depth you need. The cost tier is the itemised cost sheet: every category with the tiers beneath it (per machine, per clamping, per work element), each line carrying its time, its rate and the factors that would move it — the same tree the app renders, node for node. Pass a persona to slice it: 'procurement' (headline + band, shareable without a CAD seat), 'workprep' (the routing / operations tier as a work plan), 'operations' (routing + machines for shop balancing), 'design' (the cost sheet + per-feature drivers for DfM), or 'full' (every tier). Every persona also gets material_stock: the stock the part is bought as (format, size, parts per stock), its mass balance, and the material line's purchase and scrap and remnant credits. Pass quantity (1 to 1,000,000,000) to read the headline, the times and the cost tier at another lot size, with quantity and basis stating which lot and where the figures come from: a quantity on the calculation's lot-size curve is served as recorded, any other is restated from the calculation's own closed form; a calculation that records no closed form (or one that cannot be read) refuses the quantity by name. The headline at any lot is the manufacturing cost per part, the same figure the ordered lot's unit_cost means. The operations, feature and material_stock tiers describe the lot the calculation was priced for. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
personaNofull
quantityNoLot size to read the headline, the times and the cost tier at; omit for the lot the calculation was priced for. The operations, feature and material_stock tiers describe the priced lot either way.
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNoWhere the figures at `quantity` come from: 'priced' (the ordered lot, exact), 'curve_point' (recorded on the calculation's lot-size curve while pricing) or 'restated' (priced from the same closed form the curve was built from). Null when the calculation records no lot-size curve.
errorNoWhy this calculation produced no price, in one sentence, when its status is terminal (failed / cancelled).
statusYes
personaYesThe persona view this result is sliced for.
currencyNoThe calculation's currency; every money figure here is in it.
featuresNo
guidanceYes
machinesNo
quantityNoThe lot size this result is stated at: the calculation's own ordered lot unless `quantity` was passed, in which case the headline, the times and the cost tier are all at that lot size.
cost_bandNo[low, high] prediction band for the unit cost. Stated at the lot the calculation was priced at only: the band is fitted to that run and does not carry to another quantity.
unit_costNoUnit cost per part at `quantity`, BEFORE the cost-sheet surcharges the costing environment states. The price to quote is offer_price.
confidenceNoQuote-trust signal — the headline the procurement / supplier persona reads with the band before trusting the should-cost.
cost_linesNoThe itemised cost sheet as a tree — every category with the tiers beneath it, each carrying its time, its rate and the factors that move it.
operationsNo
setup_costNoSetup cost for the whole lot at `quantity`, in `currency` — the sheet's setup line times the lot.
total_costNounit_cost for the whole lot at `quantity`, before the cost-sheet surcharges.
offer_priceNoThe offer price per unit — unit_cost plus the cost-sheet surcharges the costing environment states; equal to unit_cost when no sheet is stated. The SAME figure arcnm_explain_cost states, so the shareable procurement headline is the price, not the bare manufacturing cost. Absent on older calculations.
unit_time_sNoTime per unit at `quantity`, in seconds, across every activity: machine time plus the bench work plus the per-part programming and inspection shares. One meaning at every lot size, and never smaller than `machine_time_s`. Null at a lot size a calculation priced before the two were told apart.
needs_reviewNoTrue when this cost needs a human check before it is trusted. Reported for EVERY persona — a trust flag must never be sliced away, or a persona that doesn't get the review tier reads a flagged cost as clean.
setup_time_sNoSetup time for the whole lot at `quantity`, in seconds.
material_noteNo
calculation_idYes
machine_time_sNoMachine time per unit at `quantity`, in seconds: the billable run plus the finishing pass under the allowance.
material_stockNoThe stock the part is bought as — format, size, parts per stock — its mass balance, and the material line's purchase and credits, at the lot the calculation was priced for whichever quantity was asked. Null on a bought-in part and on a calculation priced before 2026-08-28, which recorded no material detail; one priced before the 2026-09-26 release states no scrap or remnant mass and no bar length.
cost_categoriesNoPer-unit cost by category, keyed by the cost sheet's own bucket slugs (material, setup, machine, labour, programming, tooling, inspection, finishing, subcontract, then the surcharge ladder). The top level of ``cost_lines`` flattened: same numbers, in the calculation's currency, adding up to the price per part.
currency_factorNoWhat every money figure here was multiplied by to carry it from the environment's rate currency into `currency`; 1.0 when the two are the same. The prices and per-lot charges in a cost line's `label_params` are in the rate currency, so a line's amount is that arithmetic (mass x price per kilogram, time x rate) times this factor — and times the calibration it was charged at on a calibrated environment. Absent where the calculation does not state it.
machine_name_at_nNoThe machine the figures at `quantity` were priced on, where it differs from or restates the calculation's own route.
material_resolvedNo
selection_failureNoThe same refusal as data when no machine in the costing environment could make the part.
cost_sheet_rebuiltNoTrue when the sheet was reconstructed from the rates, times and cost lines this calculation stored rather than recorded while it was priced. A reconstructed sheet carries the cost categories and the surcharge ladder but not the per-machine, per-clamping or per-operation tiers — those are recorded only while pricing and cannot be derived afterwards. Every amount is the amount charged either way. Null when no sheet was read for this persona.
costing_environment_idNoThe costing environment this was priced in — pass it to arcnm_cost_factors to read the factors named in each line's ``factors``, their range and where each one is saved.
inputs_changed_since_runNoNull when this price reflects every input on its part revision. Otherwise {roles, corrections, latest_at}: files attached and corrections applied to the part after the run read its inputs, which a new calculation reads and this one did not.
environment_changed_since_runNoNull when this price was computed on its costing environment as it stands. Otherwise {latest_at}: the environment was edited after the run read it, and a new calculation prices with the current setup while this result does not.
arcnm_cost_driversARCNM Cost Drivers
Read-onlyIdempotent
Inspect

Rank the top cost drivers of a calculation (largest first) so you can target a redesign or re-quote — each with its cost, its share of the unit cost, and why it is costly. This is the FEATURE axis: which pocket, hole or slot the money goes into, the view you act on to change the PART. For the CATEGORY axis — which cost line (material, setup, machine, labour, …) it sits in, and the per-machine, per-clamping, per-work-element tiers beneath it — use arcnm_cost_breakdown, which serves the itemised cost sheet. Neither derives the other: one feature's cost is spread across several cost lines, and one cost line covers many features. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNo
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
driversNo
currencyNoThe calculation's currency; unit_cost and every driver's cost are stated in it.
guidanceYes
unit_costNoUnit cost per part BEFORE the cost-sheet surcharges — the cost the drivers are shares of. The price to quote is arcnm_explain_cost's offer_price.
needs_reviewNoTrue when this calculation is flagged for human review — its unit cost is not a quote yet.
calculation_idYes
inputs_changed_since_runNoNull when this price reflects every input on its part revision. Otherwise {roles, corrections, latest_at}: files attached and corrections applied to the part after the run read its inputs, which a new calculation reads and this one did not.
attributed_cost_share_pctNoShare of unit cost (0–100) the named drivers actually explain — so you don't over-trust the top-N as the whole story. The rest is shared/overhead cost not attributable to one feature.
environment_changed_since_runNoNull when this price was computed on its costing environment as it stands. Otherwise {latest_at}: the environment was edited after the run read it, and a new calculation prices with the current setup while this result does not.
arcnm_cost_factorsARCNM Cost Factors
Read-onlyIdempotent
Inspect

List every number a costing environment lets you change, resolved: what each factor is worth here, whether that is your own statement, one inherited from a parent environment, learned from your reported outcomes or the platform's default, the range a what-if may explore, which cost-sheet lines it moves, and the endpoint that saves it. Read this BEFORE proposing a change — a value outside a factor's band is refused, and a factor that drives no line of this part changes nothing. The environment id is on any calculation as costing_environment_id (also returned by arcnm_explain_cost and arcnm_cost_breakdown). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
environment_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNo
totalNoHow many factors are listed.
currencyNoCurrency every money unit in ``rows`` is stated in.
guidanceYes
environment_idNo
config_revisionNoRevision of the environment's configuration these values were read at — it moves whenever a factor is saved.
arcnm_explain_costARCNM Explain Cost
Read-onlyIdempotent
Inspect

Explain what a manufacturing calculation costs and why, as a concise structured summary: headline unit/total/setup cost, the prediction band, the cost breakdown, the machine used, and the top cost drivers. Pass detail='detailed' for more drivers. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNoconcise
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
errorNoWhy this calculation produced no price, in one sentence, when its status is terminal (failed / cancelled). Absent while it is still running and on a priced calculation.
routeNoEvery machine / work centre the priced route runs on, in order — the same chain arcnm_process_plan lists. One entry on a single-machine quote; e.g. [bandsaw, lathe] when the blank is sawn first. Empty when the calculation carries no process plan.
timesNoTime per category behind the cost lines — programming, inspection, finishing, deburring, packaging, and the machine-side phases. Every line except material, tooling and outsourced work is time x rate, so this is the basis the money is struck on. Absent on a calculation that recorded no time breakdown.
statusYes
machineNoMachine the part was priced on.
coverageNoPresent only when status is 'blocked': the calc was created but NOT run because the organization is out of included calculations, has reached a monthly overage cap, or is payment-blocked. Carries {reason, message, remaining, used, included, upgrade_url} — 'reason' says which, and 'message' says how to unblock it. Resolve that, then re-run the saved part. Never a 402; the part is not lost.
currencyNoThe calculation's currency. EVERY money figure on this result is stated in it — unit_cost, offer_price, total_cost, setup_cost, the band, every cost_breakdown line and every driver.
guidanceYesWhat to do next to act on or reduce the cost.
lot_sizeNo
materialNoMaterial, when known.
cost_bandNo[low, high] prediction band for the unit cost.
unit_costNoUnit cost per part BEFORE the cost-sheet surcharges the costing environment states (overheads, administration and selling, margin, ...). Not the price to quote: that is offer_price, equal to unit_cost only where no surcharges are stated.
confidenceNoQuote-trust signal (calibrated vs model estimate) — read it with the band before trusting the number.
setup_costNoOne-time setup cost of the lot. Like unit_cost it is stated before the cost-sheet surcharges.
total_costNounit_cost for the whole lot (unit_cost x lot_size), before the cost-sheet surcharges; the lot at the offer price is offer_price x lot_size.
offer_priceNoThe offer price per unit — unit_cost plus the cost-sheet surcharges the costing environment states (scrap, overheads, administration and selling, freight, duty, mark-up). Equal to unit_cost when no sheet is stated; this is the figure the tenant's cost sheet and the calculation's own analytics headline as the price. This is the authoritative price: quote from it, not from cost_breakdown.angebotspreis, which is the cost sheet's own total and can differ from it. Absent on older calculations.
top_driversNo
unit_time_sNoTotal time per unit in seconds, every work system: the machine run, the finishing pass and the bench work (deburring, packaging) under the allowance, plus the per-unit shares of programming and inspection. Excludes the lot setup (setup_time_s).
cycle_time_sNoMachining cycle time per unit, in seconds.
needs_reviewNo
setup_time_sNoOne-time setup time for the whole lot, in seconds (NOT per unit; divide by the lot size for the per-unit share). Time and cost side by side, for quoting / scheduling / capacity planning.
material_noteNoPlain-language material assumption (which grade was priced, or that a default was used).
calculation_idYes
cost_breakdownNoCost figures per unit, keyed by line, all in `currency` (the calculation's currency — the same basis as unit_cost and offer_price, so the lines add up to the headline). The LINES that sum to unit_cost are material_cost, machine_cost, labour_cost, programming_cost, tooling_cost, finishing_cost, inspection_cost, subcontract_cost, overhead_var and overhead_fixed. Six keys RESTATE money already inside those lines and must not be added again: machine_setup_cost and labour_setup_cost are the setup shares machine_cost and labour_cost already include (the tenant's cost sheet shows the same money as a separate 'setup' row and correspondingly smaller machine and labour rows); transfer_cost is the inter-machine hand-off charge on a composed route, which is priced inside overhead_fixed; and material_purchased_cost and remnant_credit derive material_cost, which is material_purchased_cost minus remnant_credit — the stock bought, less what its reusable remnant is worth back in stock (0 unless the costing environment credits remnants). scrap_credit is what the scrap fetches (0 unless the environment credits scrap): a cost-sheet rung SUBTRACTED inside herstellkosten, before scrap_cost and material_overhead are struck on the net material. direct_unit_cost, herstellkosten, selbstkosten, barverkaufspreis and zielverkaufspreis are SUBTOTALS; angebotspreis is the cost sheet's own offer-price total — offer_price is the authoritative price and the one to quote from, and the two can differ; scrap_cost, material_overhead, production_overhead, sga_cost, packaging_cost, freight_cost, duty_cost, margin (the profit mark-up on selbstkosten), cash_discount, sales_commission and customer_discount are the cost-sheet rungs between unit_cost and offer_price. cost_categories holds the sheet's buckets as the page shows them (setup separate); for the itemised sheet with the tiers beneath each line use arcnm_cost_breakdown.
machine_time_sNoMachine time per unit in seconds: the billed run plus the finishing pass, under the allowance — the time one piece occupies the machine, and the t_e the product's cost sheet states.
review_reasonsNo
cost_categoriesNoThe cost sheet's own buckets per unit (material, setup, machine, labour, programming, tooling, finishing, overheads …) in the quote's currency — exactly the lines the product shows, setup as its own line. Absent on calculations priced before the sheet existed.
material_resolvedNoFalse when no material grade resolved and the part was priced on the environment's default — set material_ref and re-run to correct.
selection_failureNoThe same refusal as data when no machine in the costing environment could make the part: the requirement that stopped it, the machine that came closest with its measured values, and how much of the fleet shares the blocker. Absent unless that is why it failed.
assembly_completenessNoASSEMBLIES ONLY. Whether `unit_cost` is a price or a LOWER BOUND. Carries {n_unique, n_priced, n_pending, n_unpriced, total_is_lower_bound, priced_complete, unpriced[]}, where each unpriced entry has a closed-enum `reason_code`, a `by_design` flag and, where one exists, a `remedy`. **When `total_is_lower_bound` is true the cost is incomplete: qualify it, never quote it as the price.** A `by_design` reason (a part budget, a plan quota, a cancellation) is the platform working as intended, not a defect — report it as a limit the user can lift, not as a failure.
costing_environment_idNoThe costing environment this was priced in — pass it to arcnm_cost_factors to read the adjustable factors behind these numbers, their range and where each one is saved.
inputs_changed_since_runNoNull when this price reflects every input on its part revision. Otherwise {roles, corrections, latest_at}: files attached and corrections applied to the part after the run read its inputs, which a new calculation reads and this one did not.
environment_changed_since_runNoNull when this price was computed on its costing environment as it stands. Otherwise {latest_at}: the environment was edited after the run read it, and a new calculation prices with the current setup while this result does not.
arcnm_nesting_readARCNM Nesting Read
Read-onlyIdempotent
Inspect

What nesting the organization's sheet quotes of the last 90 days together on shared sheets would save, and how many nesting runs are used and how many remain in the current window. The figure is a lower bound against each part on its own sheet as its quote priced it — never one quote's price or a layout. Without the Nesting add-on it is floored. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
addonYes
countYes
currencyYes
runs_leftYesNesting runs still available in the current window. 0 without the Nesting add-on.
runs_usedYesNesting runs already used in the current window.
window_endYes
window_daysYes
window_startYes
runs_reset_onNoUTC date the next window starts and the runs are available again. Windows are monthly, also on an annual plan.
runs_per_monthYesNesting runs included in the current window. 0 without the Nesting add-on: no run starts without it.
saving_eur_minYesA lower bound on nesting the quotes' leftover copies together on shared sheets, against each part on its own sheet. Floored without the Nesting add-on.
combining_basisYes
combining_boundYes
arcnm_nest_run_cancelARCNM Nest Run Cancel
DestructiveIdempotent
Inspect

Stop a job nest that has not ended — queued, running, or kept as a draft. By default (apply=false) this only reads the job nest and says whether it can be cancelled and what cancelling does. apply=true (needs parts:write) cancels it: the materials and thicknesses already nested keep their result, the others are cancelled, and every remnant it holds goes back to stock. Cancelled before any material and thickness is nested, it gives its run back to this month's allowance; once one is nested, it counts as a run. A draft is discarded. A job nest that has ended (solved, failed or cancelled) is not cancelled again.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNo
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
run_idYes
statusNoIts status now: draft, queued or running (cancellable), or solved, failed or cancelled (ended).
appliedYesTrue when this call cancelled the job nest; false when it only read it.
guidanceYes
cancellableYesWhether it has not ended, so a cancel would stop it.
groups_doneNo
groups_totalNo
environment_idNo
arcnm_nest_run_createARCNM Nest Run Create
Destructive
Inspect

Nest a backlog of sheet-metal parts together — several orders, materials and thicknesses at once — to learn what each order and each part costs on the sheets they share. Name the calculations (items: calculation_id, and optionally quantity — the lot size when omitted — order_ref, due, priority), OR a batch_id, OR a folder_id; each calculation must be of a sheet-metal part priced in environment_id. By default (apply=false) this PLANS only: it returns what the job nest would take — the lines and copies of each material and thickness, the remnant pieces of it in stock, and what a batch or folder leaves out and why — and starts nothing. Call again with apply=true to start it (needs parts:write); it runs in the background: poll arcnm_nest_run_status, then read arcnm_nest_run_result. When this month's runs are used, apply=true keeps the job nest as a draft instead — stored, not queued, spending no run — and arcnm_nest_run_start starts it later; the plan says so first (kept_as_draft). A job nest takes every remnant it cuts from out of stock and puts its reusable rests in, so each one started uses stock; the same call within 24 hours answers the job nest it already started. It never changes a calculation's own price.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNo
itemsNo
batch_idNo
folder_idNo
environment_idYes
allocation_ruleNoarea_proportional

Output Schema

ParametersJSON Schema
NameRequiredDescription
linesNo
copiesNo
groupsNoThe plan: each material and thickness it would nest.
run_idNoThe job nest started or kept as a draft; null for a plan of a new selection.
statusNoqueued once started; draft when kept, not queued, because this month's runs are used.
appliedYesTrue when the call wrote: the job nest was started, or kept as a draft (status 'draft'); false for a plan, which stores nothing.
guidanceYes
left_outNoThe plan: calculations of the batch or folder it would not take, each with why.
kept_as_draftNoThis month's runs are used: the job nest is (or, for a plan, would be) kept as a draft — stored, not queued, spending no run — until arcnm_nest_run_start starts it.
environment_idYes
arcnm_nest_run_exportARCNM Nest Run Export
Read-onlyIdempotent
Inspect

The cutting files of a job nest's sheets — every solved material and thickness, each distinct layout once with how many identical sheets it stands for. sheet='all' (the default) covers every sheet (the DXF/SVG download link is a zip with plan.json and manifest.csv); sheet=':' one sheet, as the plan names them. format='json' (the default) answers the nest plan inline — every part's contour and holes in millimetres, every sheet with its container, material, thickness, allowances and placements (x, y, rotation, mirror) — and its download link. format='dxf' or 'svg' answers nothing inline: each sheet's download link, to GET with your API key. The DXF is R2010 in millimetres, one block per part and one insert per copy, on the layers SHEET, MARGIN, REMNANT, CUT_OUTER, CUT_INNER and LABEL; exploded=true writes plain closed polylines in place instead of blocks, for a cutting system that reads no block references. Contours are within 0.2 mm of the unfolded flat pattern; arcs are polylines. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
sheetNoall
formatNojson
run_idYes
explodedNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
planNoThe JSON nest plan (schema v1), for format='json'.
partsYesCopies the plan places. A line is not a part: one line places as many copies as its sheets hold.
formatYesjson, dxf or svg.
run_idNo
sheetsNo
statusNoready, or preparing: the files are still being built and nothing else is answered — call the tool again after retry_after_s.
explodedYesDXF written as plain polylines in place, no blocks.
guidanceYes
content_typeYes
download_urlNoThe whole export: the zip of every sheet (dxf, svg) or the plan (json). GET it with your API key.
sheets_totalYesSheets of the plan (distinct layouts).
retry_after_sNoWhile preparing: seconds to wait.
sheets_to_cutYesSheets to cut, repeats counted.
calculation_idNo
plan_outlines_includedYesFalse when the inline plan left the contours out for size; the plan's download link carries them.
arcnm_nest_run_resultARCNM Nest Run Result
Read-onlyIdempotent
Inspect

What a job nest came to: the sheets of each material and thickness with their utilisation; each order's and each line's share of the sheets — what they cost bought, less what the skeleton sells for as scrap and the reusable rests are worth back in stock, in total and per copy (a line's per copy is what a calculation priced on it pays, which is less where the part's own sheet holds it more densely); what a batch or folder left out; and the remnants it used from stock and created. Each line carries its line_id: create a calculation of the part with nest_item_id set to it to price the part's material on its line. Its savings: the sheet bought with each part nested alone against the parts nested together, and what nesting them together saved, in kg and money, per order too — and whether the job nest was released (counts toward the total) or is a simulation (potential). detail='concise' lists the first 50 lines, detail='full' every line. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNoconcise
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
linesNo
copiesNo
groupsNo
ordersNo
run_idYes
sheetsNo
statusNo
savingsNoWhat it saves — rectangular blanks against the parts nested together, split into each part's true shape and the orders nested together — and whether that counts toward the total or is potential.
completeYesTrue once every material and thickness is nested; until then the figures cover the ones nested so far.
guidanceYes
left_outNo
lines_totalYesLines of the job nest; `lines` lists them all at detail='full'.
remnants_usedNo
allocation_ruleNoHow each sheet's cost is shared by the parts on it: area_proportional or equal_per_sheet.
remnants_createdNo
arcnm_nest_run_startARCNM Nest Run Start
Destructive
Inspect

Start a job nest that was kept as a draft — one created with arcnm_nest_run_create while this month's runs were used, which is stored, not queued, and never starts by itself. By default (apply=false) this only reads the job nest and says whether it is a draft and what starting it would nest. apply=true (needs parts:write) queues it: it spends one of this month's runs and is nested at today's stock and prices in the background — poll arcnm_nest_run_status, then read arcnm_nest_run_result. While the month's runs are still used, the start is refused and the job nest stays a draft. Only a draft starts, and only once; the same call within 24 hours answers the start it already made.

ParametersJSON Schema
NameRequiredDescriptionDefault
applyNo
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
linesNo
copiesNo
groupsNoThe plan: each material and thickness it would nest.
run_idNoThe job nest started or kept as a draft; null for a plan of a new selection.
statusNoqueued once started; draft when kept, not queued, because this month's runs are used.
appliedYesTrue when the call wrote: the job nest was started, or kept as a draft (status 'draft'); false for a plan, which stores nothing.
guidanceYes
left_outNoThe plan: calculations of the batch or folder it would not take, each with why.
kept_as_draftNoThis month's runs are used: the job nest is (or, for a plan, would be) kept as a draft — stored, not queued, spending no run — until arcnm_nest_run_start starts it.
environment_idYes
arcnm_nest_run_statusARCNM Nest Run Status
Read-onlyIdempotent
Inspect

How far a job nest has got: its status (queued, running, solved, failed or cancelled), how many of its materials and thicknesses are done, and each one's status, sheets and utilisation so far. Poll it after arcnm_nest_run_create with apply=true; once it is solved, read arcnm_nest_run_result. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
run_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNo
linesNo
copiesNo
groupsNo
run_idYes
sheetsNo
statusNodraft (kept, not queued, until arcnm_nest_run_start starts it), queued, running, solved, failed or cancelled.
savingsNoWhat it saves, once it ends.
guidanceYes
created_atNo
started_atNo
finished_atNo
groups_doneNo
groups_totalNo
environment_idNo
arcnm_nest_savingsARCNM Nest Savings
Read-onlyIdempotent
Inspect

The organization's total saved by nesting: the released job nests' savings summed — the sheet their lines buy cut from rectangular blanks, with each part nested alone and nested together, what nesting saved against rectangular blanks and its split into each part's true shape and the orders nested together, money per currency and kg — and, apart from the total, the potential of the job nests that ended as simulations (not released). A job nest counts once the shop releases it in the app; nothing here releases one. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesThe released job nests' savings, summed: the money per currency, the metal over all.
guidanceYes
potentialYesThe simulations' savings, summed the same way — what releasing them would add. Never part of the total.
runs_countedNo
runs_simulatedNo
arcnm_optimization_directionsARCNM Optimization Directions
Read-onlyIdempotent
Inspect

Get every research-grounded cost-optimization direction for a calculation: lot sizing and setup reduction, tolerance-cost review, material utilization (buy-to-fly), external-process benchmarking, inspection/programming cost shares, volume-bundling elasticity from the part's own cost curve, DFM issues, and the live supplier-quote gap where a quote exists. Each finding is tagged with its lever family, whether the figures are exact engine math or directional, and the industry method it implements — designed for multi-criteria optimization by an agent. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes
currencyNo
findingsNo
guidanceYes
calculation_idYes
human_finding_countNoHow many findings are headline (human-audience) ones.
inputs_changed_since_runNoNull when this price reflects every input on its part revision. Otherwise {roles, corrections, latest_at}: files attached and corrections applied to the part after the run read its inputs, which a new calculation reads and this one did not.
environment_changed_since_runNoNull when this price was computed on its costing environment as it stands. Otherwise {latest_at}: the environment was edited after the run read it, and a new calculation prices with the current setup while this result does not.
arcnm_optimize_lot_sizeARCNM Optimize Lot Size
Read-onlyIdempotent
Inspect

Get the total-cost optimal lot size for a calculation — the quantity that minimises production cost PLUS inventory holding (capital tie-up + storage), capped at one year of demand — with the net saving per year of moving there, the Andler/EOQ cross-check, the cost-vs-quantity curve, and at most two solid optimization directions (adjust the lot size / reduce setup time). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
curveNoCompact curve points: {quantity, unit_cost, direct_unit_cost (before overhead, setup amortised over that lot), offer_price (the per-unit figure a quote shows), setup_time_s, unit_time_s} — cost AND time vs quantity in one read, when present; money in currency. Exact at exact_at_quantity, indicative elsewhere (see accuracy).
statusYes
accuracyNoHow far a curve point may sit from a real run at that quantity, as the API publishes it: {basis, max_deviation_pct, note}. Null on older calculations.
currencyNoCurrency every money figure on this result is stated in (the calculation's), the optimum and the curve alike.
guidanceYes
scenarioNoThe scenario recommended_lot_size states — buyer_stock: the buyer orders in lots and holds the stock. Absent on older calculations.
scenariosNoEvery lot-size scenario's answer on the same curve: buyer_stock, supplier_stock (the supplier produces ahead of a steady call-off and holds the stock, economic production quantity), make_to_order (shipped complete, consumed on delivery — only the supplier's work in progress is held), joint (a frame contract with call-offs, both parties' costs minimised together: the call-off and the supplier's production lot) and consignment (the frame contract with supplier-owned stock at the buyer's site until use — capital at the supplier's production cost on every unit, storage where it sits). Pick the one that is your situation. Empty on older calculations.
annual_volumeNoAnnual demand the optimum weighs holding against.
calculation_idYes
andler_lot_sizeNoClassic Andler/EOQ closed-form cross-check quantity.
recommendationsNoAt most two solid optimization directions; empty when nothing material or the calculation predates the optimum.
valuation_basisNoHow the scenarios value a piece. purchase_price: the buyer pays and holds at the purchase price after the supplier's customer and cash discounts; the supplier holds at production cost including material and production overheads. offer_price: a calculation made before that basis — the buyer at the offer price, the supplier's stock at manufacturing cost; recalculate to restate it. Absent on older calculations.
current_lot_sizeNo
current_unit_costNoProduction cost per piece at the ordered lot, in currency.
exact_at_quantityNoThe lot this calculation was run for: the curve reproduces its price exactly here and is indicative at every other quantity. Null on older calculations.
net_annual_savingNoNet saving per year of moving to the recommended lot, production plus inventory holding, in currency.
single_lot_demandNoTrue when one lot already covers the whole annual demand (annual_volume ≤ current_lot_size). There is then no lot-size trade-off to optimise: the recommendation equals the current lot by construction, not because the lot is economically optimal. annual_volume defaults to 1 when a request omits it — pass the real annual demand to get a recommendation.
recommended_lot_sizeNoTotal-cost optimal lot (≤ one year of demand).
recommended_unit_costNoProduction cost per piece at the recommended lot, in currency.
ordering_cost_per_orderNoThe buyer's fixed cost per order or delivery (order handling and inbound freight) the buyer-side scenarios weigh against the price breaks (0 where the environment states none), in currency.
inputs_changed_since_runNoNull when this price reflects every input on its part revision. Otherwise {roles, corrections, latest_at}: files attached and corrections applied to the part after the run read its inputs, which a new calculation reads and this one did not.
production_rate_per_yearNoPieces the route can make in a year of its machines' run hours — the finite production rate behind the supplier and joint scenarios. Absent where no machine states annual hours.
current_effective_unit_costNoThe buyer's effective cost per piece at the ordered lot (buyer_stock): the price per piece on the basis valuation_basis names, plus the per-piece ordering and inventory holding cost, in currency.
environment_changed_since_runNoNull when this price was computed on its costing environment as it stands. Otherwise {latest_at}: the environment was edited after the run read it, and a new calculation prices with the current setup while this result does not.
recommended_effective_unit_costNoThe buyer's effective cost per piece at the recommended lot (buyer_stock), on the same basis as current_effective_unit_cost, in currency.
arcnm_preview_costARCNM Preview Cost
Read-onlyIdempotent
Inspect

Answer 'what would this part cost if …' on a calculation that is already priced: name the factors to move, and optionally a different lot size, and read back the whole itemised cost sheet plus the change per cost category. It is FREE — it consumes none of the organization's included calculations — and it WRITES NOTHING: no new calculation, no change to this one, no change to the costing environment. The part is genuinely re-priced through the same engine, so the answer is a price and not an estimate. Use it to search the factor space: read the bands with arcnm_cost_factors, move one factor at a time to learn what each is worth, then combine the ones that pay. Adjustments are checked against each factor's band first, and a request that cannot be answered exactly is refused by name rather than answered approximately. To make a change stick, save it afterwards through the endpoint the factor's edit_path names. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
lot_sizeNo
adjustmentsNo
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
deltaNoChange per top-level cost category, new minus current. A category on only one side carries its whole amount, so a line that appears or disappears is visible rather than skipped.
currencyNo
guidanceYes
lot_sizeNoLot size this preview was priced at.
unit_costNoCost per part under the adjustments — the manufacturing cost, on the same basis as the calculation's own unit cost, so the two are directly comparable. The offer price with your surcharges and mark-up on top is the sum of every top-level line in ``cost_lines``.
cost_linesNoThe previewed cost sheet as a tree, same shape as arcnm_cost_breakdown's.
reconciledNoWhether every tier of the previewed sheet added up to the line above it. False means a tier was dropped rather than shown not adding up — read the amounts, not the missing tier.
adjustmentsNoThe factor values this preview was priced at, echoed back.
total_deltaNoChange in the cost per part against the priced calculation: new minus current, in the currency above.
calculation_idYes
arcnm_process_planARCNM Process Plan
Read-onlyIdempotent
Inspect

Get the ordered process plan (routing) for a calculation: the sequence of operations that make the part — machining (turning, drilling, sawing …) with each step's work center and cycle time, then the post-machining chain (welding, heat treatment, surface finishing, coating) in the order it is performed — plus the plan-level setup, cycle, and total time and the machine(s) it runs on. Use it to generate a work plan, visualise the sequence, or find the slowest step. Post-machining steps carry no cycle time — bought per order — but do report what each is charged per part, which adds up to the subcontract cost line. Setup is amortised over the lot and reported once at the plan level; a machining step reports no cost of its own (machining cost attributes to features — use arcnm_cost_drivers). Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoWhy this calculation produced no plan, in one sentence, when its status is terminal (failed / cancelled).
stepsNo
statusYes
currencyNoThe calculation's currency — the basis of every subcontract_per_part figure on the steps.
guidanceYes
machinesNoMachine(s) / work center(s), in route order.
unit_time_sNoTotal time per unit, seconds.
cycle_time_sNoTotal machining cycle time per unit, seconds.
setup_time_sNoOne-time setup time for the whole lot, in seconds (NOT per unit; divide by the lot size for the per-unit share).
calculation_idYes
machine_time_sNoMachine time per unit in seconds: the billed run plus the finishing pass, under the allowance. Absent on older calculations.
operation_countNoNumber of process steps in the plan.
selection_failureNoThe same refusal as data when no machine in the costing environment could make the part.
arcnm_rank_calculationsARCNM Rank Calculations
Read-onlyIdempotent
Inspect

Rank 2–20 calculations by offer price (the price each calculation headlines, cost-sheet surcharges included), lowest first, and explain the spread — the N-way generalization of arcnm_compare_calculations. Shows each option's premium over the cheapest with time beside cost, flags when they are not like-with-like (different lot size or costing environment; different currencies are not ranked at all), and lists blocked / unpriced calcs last. Use it to pick between several quotes at once; for the same part(s) across rate environments use arcnm_compare_environments. Read-only — does not re-price.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idsYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteYes
rankedYesPriced options by offer price, lowest first (rank 1…k), then any blocked / unpriced calcs and any assembly priced only in part (rank null) in the order given.
guidanceNoWhat the ranking means and what to do next.
comparableYesTrue only when there are at least two priced options AND they share a lot size, costing environment and currency. False either because the options are not like-with-like (the spread is then not purely the part) or because fewer than two are priced and there is nothing to compare — read `note` / `incomparable_reasons` for which.
total_countYesHow many distinct calculations were ranked.
priced_countYesHow many of the inputs carry a price.
best_calculation_idNoThe cheapest priced option's id (the ranking winner), or null if none are priced yet.
incomparable_reasonsNoWhy comparable is false: lot_size_mismatch, environment_mismatch and/or currency_mismatch. On currency_mismatch the options are NOT ranked at all (no rank, no deltas, no winner): there is no FX rail, so a cross-currency order would be invented.
arcnm_sheet_nest_exportARCNM Sheet Nest Export
Read-onlyIdempotent
Inspect

The cutting file of the sheet a calculation's own price laid its part out on — the part alone, as many copies as its price put on one sheet. A calculation that stored no sheet layout, or that is not cut from sheet, has nothing to export. format='json' (the default) answers the nest plan inline — every part's contour and holes in millimetres, every sheet with its container, material, thickness, allowances and placements (x, y, rotation, mirror) — and its download link. format='dxf' or 'svg' answers nothing inline: each sheet's download link, to GET with your API key. The DXF is R2010 in millimetres, one block per part and one insert per copy, on the layers SHEET, MARGIN, REMNANT, CUT_OUTER, CUT_INNER and LABEL; exploded=true writes plain closed polylines in place instead of blocks, for a cutting system that reads no block references. Contours are within 0.2 mm of the unfolded flat pattern; arcs are polylines. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
formatNojson
explodedNo
calculation_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
planNoThe JSON nest plan (schema v1), for format='json'.
partsYesCopies the plan places. A line is not a part: one line places as many copies as its sheets hold.
formatYesjson, dxf or svg.
run_idNo
sheetsNo
statusNoready, or preparing: the files are still being built and nothing else is answered — call the tool again after retry_after_s.
explodedYesDXF written as plain polylines in place, no blocks.
guidanceYes
content_typeYes
download_urlNoThe whole export: the zip of every sheet (dxf, svg) or the plan (json). GET it with your API key.
sheets_totalYesSheets of the plan (distinct layouts).
retry_after_sNoWhile preparing: seconds to wait.
sheets_to_cutYesSheets to cut, repeats counted.
calculation_idNo
plan_outlines_includedYesFalse when the inline plan left the contours out for size; the plan's download link carries them.
calculations_assign_assembly_drawingCalculations Assign Assembly Drawing
Destructive
Inspect

Attach one pack file to a component (component_key from the bill of materials), make it the assembly drawing, or discard it. A component whose drawing changes is priced again; the assembly total re-settles when it finishes.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes`component` attaches the file to `component_key`; `assembly` makes it the assembly's own drawing; `discard` detaches it and drops it from the pack.
component_keyNoRequired for `component`.
calculation_idYes
data_source_idYes
calculations_batch_calculateCalculations Batch Calculate
Destructive
Inspect

Create + enqueue one calculation per revision in a single request, grouped under a CalculationBatch — the path an agent triggers when a market signal (a material price move) makes a batch re-cost worth running. Each run is metered on success against the org's subscription (v5/v6 quota + flat overage), exactly like a single /run — there is no separate per-call wallet draw. Free orgs over their included quota are rejected up front (HTTP 402).

Selection is explicit (part_revision_ids) for now; richer criteria (by material category, above-should-cost, …) layer on top of this path later.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNoarcnm
regionNo
enginesNoEngines to run per revision. Today a single engine is honoured and any other value is coerced to it. The list shape is preserved for forward-compat with future engines.
currencyNo
languageNode
lot_sizeNo
batch_nameNo
material_refNoFree-form material reference (URN, Werkstoffnummer, AISI/SAE code, trade name, or your SKU); resolved to a material grade for every calculation in the batch. Unresolvable values are rejected with 422 material_unresolved plus ranked candidates. Omit to price the material read from each part's drawing (or the environment default).
nest_item_idNoPrice this calculation's material on its part's line of a job nest — the `id` of a line (`items[].id`) of a job nest that has solved it. The material is then the line's share of the sheets the job nest cut it from together with other parts, less its share of what their skeleton and reusable rests earn back; everything else is priced as usual. The line must be of your organization, of this costing environment and of this part revision, and its job nest must have solved it; otherwise the request is rejected with 422 `nest_item_unresolved`, `details.reason` saying why. It cannot be combined with `stock_format_id` or with customer-supplied material. An upload creates a new part revision, so the upload forms reject every line. A line of the sheets an assembly shares among its own components prices that assembly only: naming one is rejected as `not_found`, and a re-run of such a component prices it on its own sheet. Omit it to price the part on its own sheet.
annual_volumeNo
stock_format_idNoPrice this calculation on one stock format — the `id` of a format from `GET /stock-formats`. An id names the format, not only the version it came from: when the format has been changed since, the version current on the day the calculation is created is used. An id your organization cannot price with today (unknown, retired or hidden) is rejected with 422 `stock_format_unresolved`. When the part cannot be cut from that format — too small, not bought in the part's thickness or material, or one the machine cannot load — or is not cut from sheet at all (milled, turned or bought finished), the calculation is priced as if none had been chosen, and `analytics.pipeline_notes` says why (`stock_format_pin_unavailable`). Omit it to price on the format that uses the least material per part.
material_grade_idNo
part_revision_idsYes
surface_treatmentsNoDeprecated. Surface treatments (e.g. anodizing, zinc plating) do not set the priced cost — treatments are read from the part's drawing and priced on cost_decomposition.subcontract_cost — but this field is part of a calculation's cache identity, so two otherwise-identical batch runs that differ only here are priced as distinct calculations instead of one reusing the other's result. Prefer specifying treatments on the drawing.
provided_stock_kindNonone
material_is_providedNo
raw_material_strategyNoDeprecated. The raw-material strategy does not set the priced cost — the material comes from material_ref or the part's own drawing, and its price per kilogram from the costing environment's material rate — but this block is part of a calculation's cache identity, so two otherwise-identical batch runs that differ only here are priced as distinct calculations instead of one reusing the other's result. Set material_ref and the environment's material rate instead. It stays accepted on this endpoint; retiring it would be a breaking change and would ship under a new dated API version with advance notice.
costing_environment_idNoSingle environment to cost against. Omit together with ``costing_environment_ids`` to use the organization's baseline environment.
costing_environment_idsNoEnvironments to cost each revision against, in comparison order. Every (revision, environment) pair becomes one calculation and counts as one against the plan quota. Mutually exclusive with ``costing_environment_id``. Duplicates are collapsed preserving first occurrence; ``revisions x environments`` may not exceed 500.
calculations_batch_comparisonCalculations Batch Comparison
Read-onlyIdempotent
Inspect

Pivot one batch into a parts × environments matrix: per-cell costs and times, best environment per part (ties included), deltas vs the cheapest and vs the baseline environment, and per-environment aggregates (wins, median delta, basket total). All figures are computed server-side, so every consumer sees the same comparison. Poll while complete is false — cells fill in as their runs finish.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYes
calculations_batch_comparison_componentsCalculations Batch Comparison Components
Read-onlyIdempotent
Inspect

For an assembly priced across environments, break one row of the comparison matrix down to its components: each unique component of the assembly becomes a row, each environment a column, every cell that component's own calculation in that environment — cost, live status and drill-down id. Components join across environments by their stable prototype key, so 'which part drives the difference between plants' is answerable at a glance. Empty components when the revision is not a decomposed assembly.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYes
part_revision_idYes
calculations_bulk_cancel_calculationsCalculations Bulk Cancel Calculations
Destructive
Inspect

Cancel several queued or running calculations at once, together with the component calculations of an assembly. Each id is reported as succeeded or skipped, for example when it had already finished.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesCalculation IDs to act on (1–200). Duplicates collapse silently.
calculations_bulk_delete_calculationsCalculations Bulk Delete Calculations
Destructive
Inspect

Delete several calculations at once, together with the component calculations of an assembly. This cannot be undone. Each id is reported as succeeded or skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesCalculation IDs to act on (1–200). Duplicates collapse silently.
calculations_bulk_retry_calculationsCalculations Bulk Retry Calculations
Destructive
Inspect

Re-enqueue eligible failed/cancelled/timed_out rows.

Each row goes through the same quota-gate + enqueue path as a direct POST /run so subscription semantics and attempt budgets are enforced identically. A row that's already running, succeeded, out of attempt budget, or over a Free org's included quota lands in skipped. A row whose environment can make nothing lands in unquotable, failed immediately rather than enqueued to fail slowly.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesCalculation IDs to act on (1–200). Duplicates collapse silently.
calculations_cancel_batchCalculations Cancel Batch
Destructive
Inspect

Convenience for a whole comparison grid: cancels the batch's queued/running members in one call — the per-id equivalent of /bulk-cancel without a round-trip to collect the ids first. Terminal members are reported skipped, exactly as the id-list route would.

ParametersJSON Schema
NameRequiredDescriptionDefault
batch_idYes
calculations_cancel_calculationCalculations Cancel Calculation
Destructive
Inspect

Cancel a queued / running / polling calculation.

Idempotent: a terminal row is returned untouched. The wallet hold is released as part of the transition so a cancelled calc never debits the org's balance.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes
calculations_compare_environment_runsCalculations Compare Environment Runs
Read-onlyIdempotent
Inspect

The same parts × environments matrix as the batch comparison, for any set of your calculation ids — e.g. re-runs of the same parts from different days or batches. A read expressed as POST only because id lists don't fit in a query string; nothing is created or modified. Cells whose configuration diverges from their row's anchor are flagged incomparable_reasons instead of being silently compared.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idsYesCalculations to compare (duplicates collapse). Ids that do not exist in your organization are reported in ``not_found``, never guessed at.
baseline_environment_idNoDelta anchor. Omit to anchor on your organization's baseline environment when the compared calculations include it, else on the first calculation's environment. Supplying an environment none of the calculations used anchors on the first calculation's environment.
calculations_create_calculationCalculations Create Calculation
Destructive
Inspect

Create a calculation for a part revision in a costing environment. Does NOT enqueue — call POST /calculations/{id}/run to price it.

One endpoint covers every part. An attached 2D drawing is read automatically — there is nothing to configure.

Creates exactly one calculation: costing_environment_ids with more than one entry is rejected here — fan a comparison out via POST /calculations/batch, /quote or /upload-and-quote.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional human-readable label; defaults to a timestamped name when omitted.
engineNoPricing engine selector; retained for back-compat and always normalized to the sole engine.arcnm
regionNoPricing region override; defaults to the costing environment's region when omitted.
currencyNoISO 4217 currency code for the quote; defaults to the costing environment's currency when omitted.
languageNoBCP 47 language for the calculation's captured context (e.g. 'de', 'en'). Part of the calculation's cache identity.de
lot_sizeNoNumber of identical parts produced per batch (1 to 1,000,000,000).
material_refNoFree-form material reference (URN, Werkstoffnummer, AISI/SAE code, trade name, or your SKU); resolved to a material grade. Unresolvable values are rejected with 422 material_unresolved plus ranked candidates. Omit to price the material read from the part's drawing (or the environment default).
nest_item_idNoPrice this calculation's material on its part's line of a job nest — the `id` of a line (`items[].id`) of a job nest that has solved it. The material is then the line's share of the sheets the job nest cut it from together with other parts, less its share of what their skeleton and reusable rests earn back; everything else is priced as usual. The line must be of your organization, of this costing environment and of this part revision, and its job nest must have solved it; otherwise the request is rejected with 422 `nest_item_unresolved`, `details.reason` saying why. It cannot be combined with `stock_format_id` or with customer-supplied material. An upload creates a new part revision, so the upload forms reject every line. A line of the sheets an assembly shares among its own components prices that assembly only: naming one is rejected as `not_found`, and a re-run of such a component prices it on its own sheet. Omit it to price the part on its own sheet. On a re-run (`derived_from_calculation_id`), omitting it keeps the line of the calculation re-run; send `null` to price the part on its own sheet.
annual_volumeNoExpected yearly quantity, used for amortizing setup over the run (1 to 1,000,000,000).
dataset_link_idNoUUID of a specific dataset link to use; omit to use the revision's active primary CAD.
stock_format_idNoPrice this calculation on one stock format — the `id` of a format from `GET /stock-formats`. An id names the format, not only the version it came from: when the format has been changed since, the version current on the day the calculation is created is used. An id your organization cannot price with today (unknown, retired or hidden) is rejected with 422 `stock_format_unresolved`. When the part cannot be cut from that format — too small, not bought in the part's thickness or material, or one the machine cannot load — or is not cut from sheet at all (milled, turned or bought finished), the calculation is priced as if none had been chosen, and `analytics.pipeline_notes` says why (`stock_format_pin_unavailable`). Omit it to price on the format that uses the least material per part. On a re-run (`derived_from_calculation_id`), omitting it keeps the format of the calculation re-run; send `null` to price without one.
stock_format_mmNoPrice this calculation on a sheet of this size — length and width in mm — instead of a stock format from `GET /stock-formats`: the part is laid out on that one sheet, cut to size by your supplier, and the purchased stock says `format_source` `custom`. It cannot be combined with `stock_format_id` or `nest_item_id`. When the part does not fit the sheet, or is not cut from sheet stock at all, the calculation is priced as if none had been stated and `analytics.pipeline_notes` says why. On a re-run (`derived_from_calculation_id`), omitting both it and `stock_format_id` keeps the size or format of the calculation re-run; send `null` to price without one.
part_revision_idYesUUID of the part revision to price.
full_stock_chargeNoHow the started sheet or bar of the lot is charged: `auto` applies the environment's `full_stock_threshold` (the lot pays the whole piece once its parts fill that share of it, the unused cells credited as scrap where scrap is credited); `full` charges the whole piece at any lot; `full_no_credit` charges it whole with no scrap credit on the unused cells; `share` charges only the lot's share at any lot. A lot of whole pieces, or a piece holding one part, is charged the same under every word. On a re-run (`derived_from_calculation_id`), omitting it keeps the word of the calculation re-run.auto
material_grade_idNoUUID of a resolved material grade; takes precedence over material_ref when both are supplied.
provided_stock_kindNoShape of the provided stock. 'near_net_profile' (extruded profile) additionally scopes the process plan to the features the profile does not already provide.none
material_is_providedNoTrue when the customer supplies the raw material (beigestellt) — the material cost line is set to zero; machining, setup and overheads are billed normally.
costing_environment_idNoUUID of the costing environment (machine rates, region) to price against. Omit to use your organization's default environment (the auto-provisioned default baseline).
costing_environment_idsNoPrice this part in several environments at once, in comparison order. Each environment becomes one calculation and counts as one against the plan quota. Mutually exclusive with ``costing_environment_id``; duplicates are collapsed preserving first occurrence. The response then carries ``batch_id`` and ``environment_runs``.
derived_from_calculation_idNoThe calculation this one is re-run from — pass it when pricing again after a drawing was attached or from a result's own page, so the new calculation records what it supersedes. Must name a calculation of your organization; the new calculation is its own row and counts as one.
calculations_create_cost_scenarioCalculations Create Cost Scenario
Destructive
Inspect

Saves a set of factor adjustments under a name so the same question can be asked again later. It stores the inputs, not a price: every name is checked against the factor list and every value against its band, and nothing is priced until you preview it.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesLabel to find this what-if by later.
adjustmentsNoThe factors this what-if moves and the value each is moved to — the same names and the same bands the preview endpoint takes.
calculation_idYes
calculations_delete_calculationCalculations Delete Calculation
DestructiveIdempotent
Inspect

Hard-delete a calculation row.

A non-terminal row is first cancelled (which releases the wallet hold) so the worker can no longer transition it; the row itself is then removed. Use Cancel if you want the audit trail to persist.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes
calculations_delete_cost_scenarioCalculations Delete Cost Scenario
DestructiveIdempotent
Inspect

Removes one saved adjustment set. The calculation it varied is untouched.

ParametersJSON Schema
NameRequiredDescriptionDefault
scenario_idYes
calculation_idYes
calculations_get_calculationCalculations Get Calculation
Read-onlyIdempotent
Inspect

Read one calculation in full: its status, the part, revision and costing environment it prices, its inputs such as lot size and material, and its costed result.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes
calculations_get_calculation_assembly_routeCalculations Get Calculation Assembly Route
Read-onlyIdempotent
Inspect

The precedence-ordered assembly operations with cost + evidence.

Steps that exist but are unpriced are included with their disclosures — never omitted. Empty (pending: true) until the aggregation has run. 404 for a non-assembly calculation.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes
calculations_get_calculation_bomCalculations Get Calculation Bom
Read-onlyIdempotent
Inspect

The assembly's component table, the polling surface while parts price in.

Rows come from the dispatch-time BOM (position, name, quantity, effective lot) overlaid with each component calculation's LIVE status and cost — so the table renders progressively as children complete, without one request per row. 404 for a calculation that is not an assembly.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes
calculations_get_calculation_capacityCalculations Get Calculation Capacity
Read-onlyIdempotent
Inspect

Introspect this organization's calculation capacity and queue state.

Read-only snapshot for bulk submitters: how many calculations may run in parallel (inflight_cap), the plan's pending bound and how much of it is used, and the organization's own queue. Poll it to pace a bulk submission instead of discovering limits through 429 responses.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

calculations_get_calculation_optimizationCalculations Get Calculation Optimization
Read-onlyIdempotent
Inspect

Research-grounded cost-optimization directions for one priced calculation: lot sizing, setup reduction, tolerance-cost review, material utilization, external-process benchmarking, plus agent-grade signals (inspection/programming shares, volume-bundling elasticity, DFM issues) and the live supplier-quote gap where a quote exists. Every figure derives from this calculation's own engine results.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes
calculations_get_cost_sheetCalculations Get Cost Sheet
Read-onlyIdempotent
Inspect

The cost breakdown as the tree it was built as: one line per cost category, the tiers beneath it, and the time and rate each one is made of. Pass quantity for any lot size a calculation accepts: a quantity on the calculation's lot-size curve is answered from the figures recorded while pricing, any other from the same closed form the curve was built from — see basis. Omit it for the lot the calculation was priced at. Calculations priced before the sheet existed are answered from the figures they stored — see rebuilt.

ParametersJSON Schema
NameRequiredDescriptionDefault
quantityNoLot size to read the sheet at, from 1 up to the largest lot a calculation accepts. A quantity on the lot-size curve (`analytics.lot_size_curve.points`) is answered from what was recorded while pricing; any other is restated from the calculation's own closed form. A calculation that records no closed form (priced before it existed, or a bought-in part) answers only the quantities on its curve. Defaults to the lot the calculation was priced for.
calculation_idYes
calculations_get_entitlementCalculations Get Entitlement
Read-onlyIdempotent
Inspect

This organization's remaining included-calculation quota for the current window, plus its monthly overage budget. Check it before a bulk run so you can upgrade the plan (or raise the overage cap) up front instead of discovering the wall when a calc parks as blocked.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

calculations_list_calculationsCalculations List Calculations
Read-onlyIdempotent
Inspect

List calculations for the tenant.

Paged newest-first by default with a slim projection — no analytics blob, to keep the list response cheap. Walk the whole collection by following next_cursor (or the Link header) until has_more is false; count is this page's size, never the total.

To reconcile a bulk run against your own records, page with order=asc and a created_after bound: rows come oldest-first, so calculations submitted while you are still walking land after your position instead of shifting rows under it.

Optional part_id narrows the result to a single part. Optional ids turns this into the bulk polling surface: poll one request per sweep, not one per calculation.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoComma-separated calculation IDs (max 500). THE polling surface for bulk clients: one weight-1 sweep returns the status of every listed calculation, instead of N weight-1 detail requests that exhaust the per-org rate budget (self-DoS). When set, `limit` and ordering are ignored and every matching row is returned.
sortNoOrdering key. Rows with no value yet (an in-flight run has no unit cost) sort last in both directions. Ignored when `ids` is set. `offer_price` orders on the price each calculation headlines and the comparison ranks on (the item's `offer_price`; an assembly priced only in part states none and sorts last); `unit_cost` on the cost before the cost-sheet surcharges. `created_at`, `lot_size` and `annual_volume` support `cursor`; `unit_cost`, `offer_price` and `finished_at` are null until a run settles, so a cursor over them cannot reach every row and is rejected — those three return the first page only.created_at
limitNoMaximum rows to return in one page.
orderNoSort direction over the collection's ordering key. Use `asc` to reconcile a batch: rows come oldest-first, so work created while you page lands after your position instead of shifting rows under it.desc
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
part_idNo
batch_idNoNarrow to one batch's calculations — e.g. every cell of a multi-environment comparison grid. Pair with the batch comparison endpoint, which returns the pivoted matrix.
created_afterNoOnly rows created at or after this instant (RFC 3339, e.g. `2026-07-20T09:00:00Z`). Inclusive.
include_totalNoAlso return the total number of rows matching the query, across all pages. Off by default because it costs an extra scan; `has_more` is the cheap way to know whether to keep paging.
status_filterNoFilter by lifecycle status (e.g. queued, running, succeeded, failed, cancelled). Repeatable; several values are OR-ed.
created_beforeNoOnly rows created strictly before this instant (RFC 3339). Exclusive, so an `after`/`before` pair tiles a range without overlap.
include_facetsNoAlso return `facets`: status and material values with counts, each computed over everything the OTHER active filters allow.
material_grade_idNoOnly runs priced against one of these material grades. Repeatable; several values are OR-ed, so passing every value is the same as passing none.
include_componentsNoWith `part_id`: also list the calculations this part received as a component of an assembly (each at the lot the assembly implied). Ignored without `part_id`.
parent_calculation_idNoOnly the component calculations of this assembly. By default the list contains top-level calculations only — assembly components are reachable through their parent.
calculations_list_cost_scenariosCalculations List Cost Scenarios
Read-onlyIdempotent
Inspect

The named adjustment sets saved against this calculation. Each one stores the factors it moves and never a price: re-run the preview to see what it costs today, because a rate or a factor changed since it was saved changes the answer without changing the scenario.

ParametersJSON Schema
NameRequiredDescriptionDefault
lineageNoAlso return the scenarios kept on the calculations this one was re-run from (its `derived_from_calculation_id` chain), each row naming the calculation it belongs to — so a what-if kept before a re-run is still in reach on the re-run's page.
calculation_idYes
calculations_patch_assembly_componentCalculations Patch Assembly Component
Destructive
Inspect

Per-component specifiability (§9).

Overridable: material, provided (beigestellt) stock, qty_per, scrap_pct, and purchased (a bought-in standard part priced from its catalogue price — the highest-value override in practice). Extracted geometry and recognised features are NOT overridable here; disagreement goes through the correction/labeling surface.

A quantity/material change re-runs exactly that component and then the roll-up; a purchased flag re-runs the roll-up only. The override is keyed by the component's stable key, so it survives re-upload of the same assembly.

ParametersJSON Schema
NameRequiredDescriptionDefault
clearNoRemove the override.
dry_runNoPreview the invalidation set only.
qty_perNoCorrected occurrences per assembly (1 … 10 000).
purchasedNoBought-in standard part: price from the catalogue price below instead of manufacturing.
scrap_pctNoScrap fraction added to this component's lot.
component_keyYes
calculation_idYes
material_grade_idNoOverride this component's material grade.
provided_stock_kindNoKind of the provided stock.
material_is_providedNoCustomer-supplied (beigestellt) stock.
purchased_unit_priceNoCatalogue price per piece.
calculations_patch_calculation_materialCalculations Patch Calculation Material
Destructive
Inspect

Override the material on an existing calculation.

The new material_grade_id is resolved exactly the same way POST /calculations resolves it on create, so the result is consistent with the create-time logic.

The calculation isn't re-priced here — follow up with POST /run if a re-quote is desired. The explicit two-step flow lets you review the override before paying for another pipeline pass.

ParametersJSON Schema
NameRequiredDescriptionDefault
material_refNoMaterial reference (URN, Werkstoffnummer, or trade name) to resolve and link. Provide this or ``material_grade_id``.
calculation_idYes
material_grade_idNoUUID of the material grade to link. Provide this or ``material_ref``.
calculations_preview_costCalculations Preview Cost
Read-onlyIdempotent
Inspect

Answers 'what would this part cost if …' over a calculation that is already priced: name the factors to move and read back the whole cost sheet plus the change per category. It reuses this calculation's own inputs and produces nothing you keep — no new calculation, no change to this one, no change to your environment — and it consumes none of your included calculations. Adjustments are checked against each factor's band before anything is priced, and a request that cannot be answered exactly is refused by name rather than answered approximately.

ParametersJSON Schema
NameRequiredDescriptionDefault
lot_sizeNoQuantity to price at. Omit to keep the quantity the calculation was priced for.
adjustmentsNoFactors to move, by name, each to the value given. The names are the ones a cost-sheet line lists in `factors` and the environment's factor endpoint publishes: a factor stated per process carries its process (`time.setup_efficiency.milling`), a shop-wide one does not. Every value is checked against that factor's own band before anything is priced. Leave empty to price the same factors at a different lot size.
calculation_idYes
calculations_quoteCalculations Quote
Destructive
Inspect

Convenience: create + enqueue in one round-trip.

Equivalent to POST / + POST /{id}/run. With costing_environment_ids the part is priced in every requested environment at once (one calculation per environment, grouped under batch_id for comparison).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional human-readable label; defaults to a timestamped name when omitted.
engineNoPricing engine selector; retained for back-compat and always normalized to the sole engine.arcnm
regionNoPricing region override; defaults to the costing environment's region when omitted.
currencyNoISO 4217 currency code for the quote; defaults to the costing environment's currency when omitted.
languageNoBCP 47 language for the calculation's captured context (e.g. 'de', 'en'). Part of the calculation's cache identity.de
lot_sizeNoNumber of identical parts produced per batch (1 to 1,000,000,000).
material_refNoFree-form material reference (URN, Werkstoffnummer, AISI/SAE code, trade name, or your SKU); resolved to a material grade. Unresolvable values are rejected with 422 material_unresolved plus ranked candidates. Omit to price the material read from the part's drawing (or the environment default).
nest_item_idNoPrice this calculation's material on its part's line of a job nest — the `id` of a line (`items[].id`) of a job nest that has solved it. The material is then the line's share of the sheets the job nest cut it from together with other parts, less its share of what their skeleton and reusable rests earn back; everything else is priced as usual. The line must be of your organization, of this costing environment and of this part revision, and its job nest must have solved it; otherwise the request is rejected with 422 `nest_item_unresolved`, `details.reason` saying why. It cannot be combined with `stock_format_id` or with customer-supplied material. An upload creates a new part revision, so the upload forms reject every line. A line of the sheets an assembly shares among its own components prices that assembly only: naming one is rejected as `not_found`, and a re-run of such a component prices it on its own sheet. Omit it to price the part on its own sheet. On a re-run (`derived_from_calculation_id`), omitting it keeps the line of the calculation re-run; send `null` to price the part on its own sheet.
annual_volumeNoExpected yearly quantity, used for amortizing setup over the run (1 to 1,000,000,000).
dataset_link_idNoUUID of a specific dataset link to use; omit to use the revision's active primary CAD.
stock_format_idNoPrice this calculation on one stock format — the `id` of a format from `GET /stock-formats`. An id names the format, not only the version it came from: when the format has been changed since, the version current on the day the calculation is created is used. An id your organization cannot price with today (unknown, retired or hidden) is rejected with 422 `stock_format_unresolved`. When the part cannot be cut from that format — too small, not bought in the part's thickness or material, or one the machine cannot load — or is not cut from sheet at all (milled, turned or bought finished), the calculation is priced as if none had been chosen, and `analytics.pipeline_notes` says why (`stock_format_pin_unavailable`). Omit it to price on the format that uses the least material per part. On a re-run (`derived_from_calculation_id`), omitting it keeps the format of the calculation re-run; send `null` to price without one.
stock_format_mmNoPrice this calculation on a sheet of this size — length and width in mm — instead of a stock format from `GET /stock-formats`: the part is laid out on that one sheet, cut to size by your supplier, and the purchased stock says `format_source` `custom`. It cannot be combined with `stock_format_id` or `nest_item_id`. When the part does not fit the sheet, or is not cut from sheet stock at all, the calculation is priced as if none had been stated and `analytics.pipeline_notes` says why. On a re-run (`derived_from_calculation_id`), omitting both it and `stock_format_id` keeps the size or format of the calculation re-run; send `null` to price without one.
part_revision_idYesUUID of the part revision to price.
full_stock_chargeNoHow the started sheet or bar of the lot is charged: `auto` applies the environment's `full_stock_threshold` (the lot pays the whole piece once its parts fill that share of it, the unused cells credited as scrap where scrap is credited); `full` charges the whole piece at any lot; `full_no_credit` charges it whole with no scrap credit on the unused cells; `share` charges only the lot's share at any lot. A lot of whole pieces, or a piece holding one part, is charged the same under every word. On a re-run (`derived_from_calculation_id`), omitting it keeps the word of the calculation re-run.auto
material_grade_idNoUUID of a resolved material grade; takes precedence over material_ref when both are supplied.
provided_stock_kindNoShape of the provided stock. 'near_net_profile' (extruded profile) additionally scopes the process plan to the features the profile does not already provide.none
material_is_providedNoTrue when the customer supplies the raw material (beigestellt) — the material cost line is set to zero; machining, setup and overheads are billed normally.
costing_environment_idNoUUID of the costing environment (machine rates, region) to price against. Omit to use your organization's default environment (the auto-provisioned default baseline).
costing_environment_idsNoPrice this part in several environments at once, in comparison order. Each environment becomes one calculation and counts as one against the plan quota. Mutually exclusive with ``costing_environment_id``; duplicates are collapsed preserving first occurrence. The response then carries ``batch_id`` and ``environment_runs``.
derived_from_calculation_idNoThe calculation this one is re-run from — pass it when pricing again after a drawing was attached or from a result's own page, so the new calculation records what it supersedes. Must name a calculation of your organization; the new calculation is its own row and counts as one.
calculations_run_calculationCalculations Run Calculation
Destructive
Inspect

Enqueue the calculation onto the worker queue — subject to coverage.

Idempotent: a row in a non-terminal state (queued/running/polling) is not re-enqueued; a row in succeeded is returned untouched — a finished result is a record of one run, so re-pricing the part after its inputs changed (inputs_changed_since_run) means creating a new calculation on the same revision and running that; a row in failed/cancelled/timed_out is reset to queued and re-enqueued so the user can retry.

Coverage: before enqueueing, the org's included-calculation quota is checked. A hard-capped org with no included extraction left FAILS FAST: the calc is parked as blocked (never a queued orphan) and the request raises 402 quota_exceeded with the upgrade path (F-2) — except when the dedup cache can serve an identical prior run, which stays free even over quota. A payment-blocked (dunning) org or an over-spend-cap API key still parks with a coverage payload on a 2xx. A blocked row resumes through this same path once unblocked, without spending a retry attempt.

ParametersJSON Schema
NameRequiredDescriptionDefault
calculation_idYes
calculations_update_cost_scenarioCalculations Update Cost Scenario
Destructive
Inspect

Changes the label and/or the adjustment set of one saved what-if. A new adjustment set is checked against the factor list and every band exactly as on save, and the scenario's cached result is worked out again.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew label.
adjustmentsNoThe factors this what-if moves, replacing the set it had — the same names and bands the preview endpoint takes.
scenario_idYes
calculation_idYes
calculations_upload_and_quote_jsonCalculations Upload And Quote Json
Destructive
Inspect

JSON-body twin of /upload-and-quote for clients that can only pass strings (MCP): the CAD file — and optional drawing / RFQ — ride as base64 (or data: URI) strings. Best for small single-part STEP files; base64 inflates ~33% and rides inside the call, so use the presign flow for large assemblies. Same find-or-create-by-part_number idempotency, billing, and enqueue semantics as the multipart route.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNoPricing engine selector; retained for back-compat and always normalized to the sole engine.arcnm
regionNoPricing region override; defaults to the costing environment's region when omitted.
currencyNoISO 4217 currency code for the quote; defaults to the costing environment's currency when omitted.
languageNoBCP 47 language for the calculation's captured context (e.g. 'de', 'en'). Part of the calculation's cache identity.de
lot_sizeNoNumber of identical parts produced per batch (1 to 1,000,000,000).
folder_idNoOptional workspace folder to file the created part into.
on_conflictNoHow to resolve a part_number that already exists: keep_folder (add a revision, leave the part where it is — the historical behaviour), move (add a revision and re-file into folder_id), new_part (create a separate part under a distinct number), or skip (upload nothing, create no calculation, meter nothing). The outcome is always reported in ``filing``.keep_folder
part_numberYesNatural-key part number; reused to attach a new revision if the part already exists.
cad_file_b64YesBase64 (or a data: URI) of the 3D CAD file (e.g. STEP). Required.
cad_filenameYesCAD filename including extension, e.g. bracket.step — used for format detection.
material_refNoFree-form material reference (URN, Werkstoffnummer, AISI/SAE code, trade name, or your SKU). Unresolvable values are rejected with 422 material_unresolved plus ranked candidates. Omit to price the material read from the part's drawing (or the environment default).
nest_item_idNoPrice this calculation's material on its part's line of a job nest — the `id` of a line (`items[].id`) of a job nest that has solved it. The material is then the line's share of the sheets the job nest cut it from together with other parts, less its share of what their skeleton and reusable rests earn back; everything else is priced as usual. The line must be of your organization, of this costing environment and of this part revision, and its job nest must have solved it; otherwise the request is rejected with 422 `nest_item_unresolved`, `details.reason` saying why. It cannot be combined with `stock_format_id` or with customer-supplied material. An upload creates a new part revision, so the upload forms reject every line. A line of the sheets an assembly shares among its own components prices that assembly only: naming one is rejected as `not_found`, and a re-run of such a component prices it on its own sheet. Omit it to price the part on its own sheet.
rfq_file_b64NoOptional base64 (or data: URI) of an RFQ text file.
rfq_filenameNoRFQ filename including extension.
annual_volumeNoExpected yearly quantity used to amortize setup cost (1 to 1,000,000,000).
sheet_gauge_mmNoSheet thickness in millimetres — required when the CAD file is a DXF flat pattern (a 2D cutting file carries no thickness); ignored for STEP.
stock_format_idNoPrice this calculation on one stock format — the `id` of a format from `GET /stock-formats`. An id names the format, not only the version it came from: when the format has been changed since, the version current on the day the calculation is created is used. An id your organization cannot price with today (unknown, retired or hidden) is rejected with 422 `stock_format_unresolved`. When the part cannot be cut from that format — too small, not bought in the part's thickness or material, or one the machine cannot load — or is not cut from sheet at all (milled, turned or bought finished), the calculation is priced as if none had been chosen, and `analytics.pipeline_notes` says why (`stock_format_pin_unavailable`). Omit it to price on the format that uses the least material per part.
cad_content_typeNoMIME type of the CAD file, when known.
drawing_file_b64NoOptional base64 (or data: URI) of a 2D drawing (PDF/PNG/JPEG).
drawing_filenameNoDrawing filename including extension.
rfq_content_typeNoMIME type of the RFQ file, when known.
material_grade_idNoUUID of a resolved material grade; takes precedence over material_ref when both are supplied.
provided_stock_kindNoShape of the provided stock; 'near_net_profile' scopes the plan.none
drawing_content_typeNoMIME type of the drawing file, when known.
material_is_providedNoTrue when the customer supplies the raw material (beigestellt).
costing_environment_idNoUUID of the costing environment to price against. Omit to use your organization's default environment.
costing_environment_idsNoPrice the part in several environments at once, in comparison order. The file is uploaded once; each environment becomes one calculation and counts as one against the plan quota. The response then carries ``batch_id`` and ``environment_runs``. Mutually exclusive with ``costing_environment_id``.
calibration_auto_calibrate_environmentCalibration Auto Calibrate Environment
Destructive
Inspect

The headline customer-facing endpoint — turn a list of ERP actual unit costs into a calibrated environment in one call. Each actual is paired with the most recent successful quote for its part at its lot size in this environment, priced by the current version of the costing model, and the calibration is fitted to the difference; nothing is re-quoted. Parts with no such quote — none at all, or only one priced before the costing model last changed — are returned in unmatched_part_ids so you can quote them and retry. Safe for AI-agent use over MCP and idempotent: the same set of actuals yields the same result.

ParametersJSON Schema
NameRequiredDescriptionDefault
basisNoWhich rung of the cost sheet these actuals are measured at: 'herstellkosten' (manufacturing cost per unit — what a work order books), 'selbstkosten' (total cost per unit, including administration, selling, freight and duty) or 'angebotspreis' (the quoted price per unit, including the profit mark-up). Each is compared against the model's own figure at the same rung. Omit it only if you genuinely do not know: an unstated basis is read as manufacturing cost and the environment's calibration report flags how many rows were unstated.
env_idYes
actualsYesUp to 20,000 (part_revision_id, actual_unit_cost) rows. Designed for ERP exports: an AI agent or a CSV uploader can stream a tenant's history in one call.
holdout_pctNoFraction of rows held out to size the prediction interval.
target_alphaNoTarget miss rate for the prediction interval (default 0.10 → a 90% interval).
calibration_auto_calibrate_from_erpCalibration Auto Calibrate From Erp
Destructive
Inspect

ERP-native variant of auto-calibrate: accepts the raw columns most ERPs export (part_number, work_order_id, quantity, total_cost) and handles part-number resolution + unit-cost derivation server-side. Idempotent on work_order_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
holdout_pctNoFraction of rows held out to size the prediction interval.
work_ordersYesUp to 20 000 raw ERP work-order lines. Designed for the AI-agent ERP-import use case: pull tenant's last 12 months of WIP_DISCRETE_JOBS rows, POST them once, and the service resolves part numbers, decomposes setup vs variable cost from the lot-size diversity, and returns a calibrated env.
target_alphaNoTarget miss rate for the prediction interval (0.10 → a 90% interval).
calibration_calibrate_selection_policyCalibration Calibrate Selection Policy
Destructive
Inspect

Calibrate how this environment chooses a machine, using a list of historical 'the shop actually picked machine X' decisions. Once calibrated, the environment's machine recommendations better match your shop's real choices.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
regionNoRegion whose seed policy to start from (e.g. DE-BY); null for the default.
historyYesPast machine-choice records, each with candidates and the chosen_machine_id.
calibration_deactivate_environmentCalibration Deactivate Environment
Destructive
Inspect

Retire the environment's active calibration without replacing it: quotes priced after this call use the uncalibrated defaults. The run history is kept, so any earlier run can be restored with the revert endpoint. Fails when no calibration is active.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
calibration_environment_reportCalibration Environment Report
Read-onlyIdempotent
Inspect

Calibration status for an environment: whether it has been calibrated to your actuals and, for the first-party app, the per-driver adjustments (machine / labour / overhead) with their confidence intervals. Public integrations receive the status only.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
calibration_environment_run_historyCalibration Environment Run History
Read-onlyIdempotent
Inspect

Reverse-chronological list of this environment's calibration runs: when each ran, how many observations it used, and whether its result is the currently active calibration. Use it to pick the run to revert to. Read-only; safe for AI agent use.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoRuns per page.
env_idYes
offsetNoRuns to skip.
calibration_environment_statusCalibration Environment Status
Read-onlyIdempotent
Inspect

Read view of an environment's calibration health: whether it is calibrated, when it was last calibrated, and how many submitted observations are waiting to be applied. Designed as the AI agent's discovery endpoint — call this first to decide whether to submit fresh observations or recalibrate.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
calibration_erp_preflightCalibration Erp Preflight
Read-onlyIdempotent
Inspect

Resolves the part_number column of an ERP export against the parts you hold and returns how many match. Reads only — it needs no environment and it writes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_numbersYesThe `part_number` column of the work orders you are about to send, in any order. Duplicates are fine.
calibration_finalize_environmentCalibration Finalize Environment
Destructive
Inspect

Recalibrate this environment for the selected target metric using every observation submitted for it so far, then activate the result. Use after submitting observations. Only an observation whose predicted value comes from the current version of the costing model is fitted: one submitted before the model last changed, or naming a calculation priced before it, is left out and counted in message, and a run with none left is refused. To start from raw ERP actuals without submitting observations first, use the one-click auto-calibrate endpoint instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional free-text note recorded with the run.
env_idYes
target_alphaNoTarget miss rate for the prediction interval (0.10 → a 90% interval).
target_metricNoMetric to calibrate the environment for.cycle_time_s
calibration_fit_learning_curveCalibration Fit Learning Curve
Destructive
Inspect

Calibrate how this environment's per-unit cost falls as cumulative production grows, using a sequence of production-lot actuals for one part. Choose the cumulative model (the safer default, observed directly) or the per-unit model. Submit at least three lots.

ParametersJSON Schema
NameRequiredDescriptionDefault
lotsYesSequence of production-lot actuals to fit; at least three.
modelNoLearning-curve model to fit (per-unit or cumulative).wright_cumulative
env_idYes
part_revision_idYesIdentifier of the part revision the lots belong to.
calibration_import_calibrateCalibration Import Calibrate
Destructive
Inspect

Calibrates the environment on every now-matching row, exactly as the one-click auto-calibrate endpoint would, and returns the same result shape (mape_before → mape_after). Refused (409) while priced pairs are still running. Metered as one calibration run. Idempotent: a completed import replays its stored result without metering a second run.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
import_idYes
calibration_import_createCalibration Import Create
Destructive
Inspect

Upload historical actuals as rows. Every row is resolved against your part library and bucketed: already priced (free), servable from cache (free), needs a new calculation (billable), or unusable (with the fix named). Only a quote priced by the current version of the costing model counts as already priced; a part quoted only before the model last changed needs a new calculation. NOTHING is priced or spent by this call — the disclosed calculations_required is committed explicitly via POST /calibration/imports/{id}/price. Re-posting the same rows returns the same import until the costing model changes; after that, the same rows start a new import.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsYesUp to 20,000 historical actuals.
basisNoWhich rung of the cost sheet the whole file is measured at: 'herstellkosten' (manufacturing cost per unit — what a work order books), 'selbstkosten' (total cost per unit, including administration, selling, freight and duty) or 'angebotspreis' (the price per unit, including the profit mark-up). One basis per file, like one currency per file. Each row is compared against the model's own figure at the same rung. A column header cannot answer this — 'unit cost' and 'unit price' are used interchangeably in exports — so it is asked rather than guessed. Omit it only if you genuinely do not know: an unstated basis is read as manufacturing cost and the environment's calibration report flags how many rows were unstated. Fixed when the import is created; re-posting the same rows returns the existing import unchanged.
env_idYesThe costing environment to calibrate.
currencyNoCurrency the actuals are denominated in. Must match the environment's currency; defaults to it.
calibration_import_statusCalibration Import Status
Read-onlyIdempotent
Inspect

Joins every priced row to its calculation and folds terminal outcomes back onto the rows (succeeded → priced, failed → pricing_failed, verbatim reason attached). settled is the green light for POST /calibrate. Rows are capped at 1000 in the response; the counts never are.

ParametersJSON Schema
NameRequiredDescriptionDefault
import_idYes
calibration_ingest_environment_outcomesCalibration Ingest Environment Outcomes
Destructive
Inspect

Submit a batch of observations (predicted vs. actual outcomes) for an environment so it can be calibrated. Tenant-bound; scope='environment' only. Safe for AI agent use: idempotent on each observation's natural key and rate-limited by the global tenant policy. Recalibrate the environment afterwards to apply the accumulated observations. Take each predicted value from a current quote: an observation is recorded with the version of the costing model current when it is submitted, and once the model changes, recalibration leaves it out until it is submitted again with a predicted value from the new model.

ParametersJSON Schema
NameRequiredDescriptionDefault
basisNoWhich rung of the cost sheet these numbers are measured at: 'herstellkosten' (manufacturing cost per unit — what a work order books), 'selbstkosten' (total cost per unit, including administration, selling, freight and duty) or 'angebotspreis' (the quoted price per unit, including the profit mark-up). Each is compared against the model's own figure at the same rung. Omit it only if you genuinely do not know: an unstated basis is read as manufacturing cost and the environment's calibration report flags how many rows were unstated.
scopeYesScope of the observations; tenant tokens may submit 'environment' only.
env_idNoTarget environment; required when scope is 'environment'.
oracleYesSource of the observations (e.g. operator report, MES, supplier quote).
observationsNoUp to 20,000 observations; each carries target_metric, observation_type, predicted, and actual.
calibration_next_best_evidenceCalibration Next Best Evidence
Read-onlyIdempotent
Inspect

Ranks the missing evidence for an environment: which parts or lot sizes to submit actuals for next, and where the model is capped and needs a configuration review instead of more data. Safe for AI agent use: read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
calibration_revert_environment_runCalibration Revert Environment Run
Destructive
Inspect

Make an earlier run's calibration the active one again: the current result is retired and the selected run's is restored, exactly as it was fitted — except an adjustment calibration no longer makes (retired_drivers on the calibration report), which is not restored. Nothing is refit and no history is lost — every run stays in the history and can be restored again. Quotes priced after this call use the restored calibration.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
run_idYes
calibration_teach_environmentCalibration Teach Environment
Destructive
Inspect

Calibrate an environment from caller-supplied (predicted, actual) rows. Each predicted value must come from a current quote for the part: a part this environment priced only before the costing model last changed has none, and a request naming one is refused until the part is priced again. If you only have actuals, use the one-click auto-calibrate endpoint, which pairs each actual with the part's current quote server-side.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsYesBetween 1 and 20,000 (predicted, actual) rows to calibrate from.
env_idYes
holdout_pctNoFraction (0.05–0.5) of rows held out to size the prediction interval.
target_alphaNoTarget miss rate for the prediction interval (0.10 → a 90% interval).
datasets_attach_datasetDatasets Attach Dataset
Destructive
Inspect

Attach an existing DataSource row to a revision.

For a fresh file upload, POST .../datasets/upload creates the DataSource + link in one shot. A client that can only send JSON — every MCP client — uploads with POST /uploads/presign, sends the file the way its method says, calls POST /uploads/confirm and attaches the result here, with the file's role. The upload is checked after confirm answers: until it is confirmed this answers 409 with details.reason upload_pending and Retry-After (also as details.retry_after_s) — ask again then. An upload that was refused, could not be checked or was cancelled answers 409 upload_rejected, upload_failed or upload_cancelled, which waiting does not change.

ParametersJSON Schema
NameRequiredDescriptionDefault
roleNoRole of the file on the revision (e.g. cad_3d for a 3D CAD model, drawing_2d for a 2D drawing).other
part_idYes
attributesNoFree-form metadata for the attachment, as a JSON object.
is_primaryNoWhether this dataset is the primary one for the revision.
revision_idYes
data_source_idYesIdentifier of the uploaded data source to attach to the revision.
datasets_detach_datasetDatasets Detach Dataset
DestructiveIdempotent
Inspect

Detach a file from a part revision. Only the link is removed; the uploaded file itself is not deleted.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
revision_idYes
dataset_link_idYes
datasets_list_datasetsDatasets List Datasets
Read-onlyIdempotent
Inspect

List the files attached to a part revision, such as its STEP model and drawings, with each file's name, type, role and whether it is the primary file.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
revision_idYes
datasets_update_datasetDatasets Update Dataset
Destructive
Inspect

Edit a dataset link.

Currently supports two fields:

  • filename: rename the underlying DataSource.

  • is_primary: promote/demote within the parent revision. The "exactly one primary" invariant is maintained server-side: when promoting, every other link on the same revision is demoted in the same transaction so concurrent primaries can't co-exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
filenameNoNew original filename for the uploaded file.
is_primaryNoSet true to make this the primary CAD file for analysis on the revision.
revision_idYes
dataset_link_idYes
environments_attach_env_subcontractorEnvironments Attach Env Subcontractor
Destructive
Inspect

Attach one of your subcontractors to this environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
is_enabledNo
subcontractor_idYes
environments_attach_env_toolEnvironments Attach Env Tool
Destructive
Inspect

Attach one of your crib tools to this environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
tool_idYesCrib tool to attach.
is_enabledNo
environments_attach_machineEnvironments Attach Machine
Destructive
Inspect

Add a machine to a costing environment so calculations in it can plan on it: one of your machines, a machine-library entry, or a new machine defined inline, with optional rate and capability overrides.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
valid_toNoISO date (YYYY-MM-DD) the membership ends; defaults to the machine's own valid_to.
is_enabledNoWhether the machine is active in the environment's fleet on attach.
machine_idNoIdentifier of an existing machine to attach; mutually exclusive with new_machine.
valid_fromNoISO date (YYYY-MM-DD) the membership starts; defaults to the machine's own valid_from.
new_machineNoInline definition of a new machine to create and attach; mutually exclusive with machine_id.
name_overrideNoOptional name for the instantiated machine; defaults to the library entry's name.
fleet_priorityNoOrders machines within the environment; lower values are tried first.
library_entry_idNoInstantiate a machine from this shared/tenant library entry; mutually exclusive with machine_id / new_machine.
capability_overridesNoSparse per-environment capability overrides merged over the library defaults.
hourly_rate_override_eurNoOptional flat machine-hour rate; defaults to the library entry's nominal rate.
rate_operator_eur_per_h_overrideNoOperator wage already contained in hourly_rate_override_eur, in EUR per hour. Only meaningful with a rate override; without one the library entry's own declaration is inherited along with its rate. 0 means the rate is machine-only.
environments_clone_environmentEnvironments Clone Environment
Destructive
Inspect

Duplicate one of the tenant's OWN environments (env + rates + fleet) into a fresh, non-baseline, uncalibrated copy — "start from this environment, then tune or calibrate the duplicate". Only the tenant's own envs can be cloned (any other id, including a platform preset or another tenant's env, → 404).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional name for the duplicate; defaults to '<source> (copy)'.
env_idYes
environments_clone_presetEnvironments Clone Preset
Destructive
Inspect

Deep-copy a platform region preset (env + rates + fleet) into the tenant.

The clone is immediately runnable and priceable for every discipline. Only a genuine platform preset can be cloned — any other id (including another tenant's env) reads as 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoOptional name for the cloned environment; defaults to '<preset> (copy)'.
preset_idYesIdentifier of the platform region preset to clone.
environments_create_environmentEnvironments Create Environment
Destructive
Inspect

Create a costing environment, a named set of machines, tools, rates and overrides that calculations are priced in. By default it starts as a copy of your default environment; source can start it blank (tools only) or empty. Counts against your plan's environment limit.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name for the new environment.
emptyNoSkip the documented default of attaching every tool in your crib to the new environment. With explicit tool membership (each environment prices only the tools attached to it), an empty environment unambiguously means 'deliberately empty'.
regionNoGeographic region this environment prices for (e.g. DE, US).
sourceNoWhat the new environment starts from. ``baseline_copy`` (the default): a copy of your default environment — its machines, tools, rates and overrides. ``blank``: a new environment with every tool of your crib attached and no machines. ``empty``: nothing attached. Omitted → ``baseline_copy`` (or ``empty`` when the legacy ``empty: true`` is sent).
currencyNoISO 4217 currency code the environment's rates are denominated in.EUR
valid_toNoISO date (YYYY-MM-DD) the environment stops being effective; null = open-ended.
valid_fromYesISO date (YYYY-MM-DD) from which the environment is effective.
descriptionNoOptional longer description of the environment.
environments_delete_environmentEnvironments Delete Environment
DestructiveIdempotent
Inspect

Delete an environment. ON DELETE CASCADE on the rate + machine- membership tables means the rates + memberships disappear with it; the underlying MachineDefinition rows survive (they're org- scoped, not env-scoped, and may be reused by sibling envs).

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_delete_rateEnvironments Delete Rate
DestructiveIdempotent
Inspect

Delete one rate from a costing environment: a labour, overhead, material, FX or subcontract rate. This cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesRate kind to delete (labour, overhead, material, fx, or subcontract; a scrap price is cleared on its own path).
env_idYes
rate_idYes
environments_detach_env_subcontractorEnvironments Detach Env Subcontractor
DestructiveIdempotent
Inspect

Detach a subcontractor (SCD2: the membership closes its window; a same-day attach+detach hard-deletes the zero-length row).

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
membership_idYes
environments_detach_env_toolEnvironments Detach Env Tool
DestructiveIdempotent
Inspect

Detach a tool from this environment (SCD2 retire; a same-day attach is hard-deleted). The heal-forward record means a detached tool is never silently re-attached by provisioning.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
membership_idYes
environments_detach_machineEnvironments Detach Machine
DestructiveIdempotent
Inspect

Remove a machine from a costing environment, so calculations run afterwards no longer plan on it. The machine definition itself is kept.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
membership_idYes
environments_economics_updateEnvironments Economics Update
Destructive
Inspect

Set the typed regional economics this environment states itself: energy price, floor-space cost, default material family, the cost-sheet surcharges (material overhead, residual production overhead, administration and selling, profit mark-up) with packaging, freight and duty, the price terms priced in 'im Hundert' (cash discount, sales commission, customer discount), and the inspection / holding scalars. Omit a field to keep it; send null to clear it, which stores nothing on this environment so the value inherits from the parent environment again and ends at the platform default. Takes effect on the next calculation.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
sga_pctNoAdministration and selling surcharge on manufacturing cost (0.12 = 12 %); null clears back to inherit / platform default.
fai_costNoFlat first-article-inspection cost per lot, in the environment's currency; null clears back to inherit / platform default.
margin_pctNoProfit mark-up on total cost (0.10 = 10 %); null clears back to inherit / platform default, which adds none.
margin_baseNoThe base of the profit mark-up. 'selbstkosten' charges margin_pct on the total cost. 'netto_selbstkosten' charges it on the total cost without packaging, freight and duty — the base German public-contract pricing names. Null clears back to inherit / platform default, 'selbstkosten'.
reject_rate_pctNoShare of the parts this shop STARTS that it rejects, as a fraction (0.03 = 3 %, not 3). It is a yield, not a surcharge: to ship 100 good parts at 0.03 the shop starts 104, and the stock drawn for the four that never shipped is charged to the ones that did. Charged on the base reject_rate_base names: the material draw by default, or the whole part when the shop finds its rejects at final inspection. Must be below 0.5 — half a shop's output failing is a process problem, not a costing input. Null clears back to inherit / platform default, which rejects nothing.
factor_first_offNoFirst-article-inspection factor: scales a full inspection into the per-lot first-off time (0 = none, and an explicit 0 is a statement that survives). Null clears back to inherit / platform default.
reject_rate_baseNoWhat a reject costs. 'material' charges the reject rate on the stock drawn for the parts that fail — the lower bound, right when rejects are found at the first operation. 'herstellkosten' charges it on the whole part before scrap (material, manufacturing and their overheads), the industry convention for end-item scrap found at final inspection. One method, never both. Null clears back to inherit / platform default, 'material'.
cash_discount_pctNoCustomer cash discount (Kundenskonto) priced into the offer 'im Hundert' (0.02 = 2 %): it is a share of the target price that already contains it, so a customer who deducts it still pays the cash price. Null clears back to inherit / platform default, which prices none.
duty_eur_per_partNoCustoms duty per unit, in the environment's currency; null clears back to inherit / platform default.
energy_eur_per_kwhNoStated energy price per kWh, in the environment's currency; null clears back to inherit / platform default.
sample_pct_defaultNoIn-process inspection sampling fraction (0..1). An explicit 0 switches sampling off and is a statement that survives; null clears back to inherit / platform default.
space_eur_per_m2_yNoStated floor-space cost per m² and year, in the environment's currency; null clears back to inherit / platform default.
freight_eur_per_partNoOutbound freight per unit, in the environment's currency; null clears back to inherit / platform default.
sales_commission_pctNoSales commission (Vertreterprovision) priced into the offer 'im Hundert', as a share of the target price. Null clears back to inherit / platform default, which prices none.
customer_discount_pctNoCustomer discount (Kundenrabatt) priced into the offer 'im Hundert', as a share of the list price (the offer price). Null clears back to inherit / platform default, which prices none.
material_overhead_pctNoProcurement / storage surcharge on material cost (0.07 = 7 %); null clears back to inherit / platform default.
packaging_eur_per_partNoPackaging material per unit (Sondereinzelkosten des Vertriebs), in the environment's currency; the packing labour is priced on the labour line, not here. Null clears back to inherit / platform default.
default_material_familyNoDefault material family for calculations that name no grade (steel, stainless, aluminum, titanium, nickel, other); null clears back to inherit / platform default.
production_overhead_pctNoSurcharge on production wages (0.80 = 80 %); null clears back to inherit / platform default.
scrap_credit_eur_per_kgNoScrap credit (Reststoffgutschrift): the flat return per kg of scrap, in the environment's currency — what the dealer pays less what sorting, containers and haulage cost you. Paid on the scrap a dealer buys (sheet skeleton, chips, cut-offs) wherever no scrap price is stated for that kind of scrap; never on a reusable remnant or on the part itself. The credit is never more than the material cost; it reduces the material before the material overhead and a material scrap allowance are charged. Null clears back to inherit / platform default, which credits nothing.
subcontract_overhead_pctNoProcurement overhead on subcontract work, as a fraction of the subcontract cost (0.05 = 5 %), charged inside the manufacturing cost. Null clears back to inherit / platform default, which adds none.
holding_cost_rate_per_yearNoImputed yearly interest rate on capital tied up in finished stock (0.08 = 8 %); null clears back to inherit / platform default.
ordering_cost_eur_per_orderNoThe buyer's fixed cost of placing and receiving one order, in the environment's currency; null clears back to inherit / platform default (0).
eoq_holding_cost_per_kg_per_yearNoStorage charge for finished stock per kg and year; null clears back to inherit / platform default.
environments_get_calculation_tuningEnvironments Get Calculation Tuning
Read-onlyIdempotent
Inspect

Read the environment's calculation-tuning knobs with provenance: stated on this environment, inherited from a parent environment, or the platform default — the order calculations read them in.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_get_environmentEnvironments Get Environment
Read-onlyIdempotent
Inspect

Read one costing environment in full: its currency, region, validity dates and the rates, overheads and surcharges that calculations in it are priced with.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_get_environment_auditEnvironments Get Environment Audit
Read-onlyIdempotent
Inspect

Audit the data a price in this environment depends on: unsourced or out-of-range cutting data and overrides, tools priced without a life, unresolvable machines, spindle classes with no power stated, members that source nothing, rate rows in another currency, and — while the environment credits sold scrap — published scrap prices more than 90 days old. Read-only; every finding names the panel that fixes it.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_get_environment_factorsEnvironments Get Environment Factors
Read-onlyIdempotent
Inspect

Every number the cost sheet lets you change, resolved for this environment: what it is worth here, where that came from, the range a what-if may explore, which cost lines it moves, and the endpoint that saves it.

Values are read through the same resolvers a calculation uses, so a factor shown here is the factor that was charged.

Integration credentials receive your own statements; the platform's own defaults are shown in the app.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_get_individualizationEnvironments Get Individualization
Read-onlyIdempotent
Inspect

What this environment states differently from the platform defaults, per lever — the honest zero-setup meter. Counts only; every line maps to a Setup panel and, on the default environment, to its restore.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_get_shop_practiceEnvironments Get Shop Practice
Read-onlyIdempotent
Inspect

How this environment answers the shop-practice questions — packaging, deburring, and whether sold scrap and reusable remnants (sheet remnants, bar and tube ends) are credited against the material bought. Each answer says where it comes from: stated here, inherited from a parent environment, or the platform default.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_list_environmentsEnvironments List Environments
Read-onlyIdempotent
Inspect

List the organization's costing environments, newest first.

The response is a plain array, so the page position travels in the Link (RFC 8288) and X-Next-Cursor / X-Has-More response headers.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return in one page.
orderNoSort direction over the collection's ordering key. Use `asc` to reconcile a batch: rows come oldest-first, so work created while you page lands after your position instead of shifting rows under it.desc
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
offsetNoRows to skip. Superseded by `cursor`, which is stable under concurrent writes; kept for existing integrations. Bounded — past the cap, page with `cursor`.
created_afterNoOnly rows created at or after this instant (RFC 3339, e.g. `2026-07-20T09:00:00Z`). Inclusive.
created_beforeNoOnly rows created strictly before this instant (RFC 3339). Exclusive, so an `after`/`before` pair tiles a range without overlap.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThis page's rows, in the order and shape the REST list returns them.
has_moreYesFalse on the last page. Stop on this, never on a short page.
next_cursorYesPass as `cursor` to read the next page. Null on the last page.
environments_list_env_machinesEnvironments List Env Machines
Read-onlyIdempotent
Inspect

Machines wired to this env, ordered by fleet_priority (lower = earlier candidate). The same fleet feeds every pricing run for the environment. at answers "what does the fleet look like on date X" — the same active_as_of window pricing resolves on that date (rates already take ?at); it defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoAs-of date for the fleet window; defaults to today. Answers "what does the fleet look like on date X" — a scheduled addition appears once `at` reaches its valid_from, a scheduled removal disappears from its valid_to on.
env_idYes
environments_list_env_subcontractorsEnvironments List Env Subcontractors
Read-onlyIdempotent
Inspect

The subcontractors THIS environment orders from (active memberships). An external operation priced here that no member offers carries a subcontract_unsourced note on the result — a note, never a veto.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_list_env_toolsEnvironments List Env Tools
Read-onlyIdempotent
Inspect

The crib tools THIS environment runs (active memberships). What the engine prices with — an empty list means the environment deliberately runs no crib tool and every handler keeps its own constants. at answers "what does the crib look like on date X" — the same active_as_of window pricing resolves on that date (rates already take ?at); it defaults to today.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoAs-of date for the crib window; defaults to today. Answers "what does the crib look like on date X" — a scheduled addition appears once `at` reaches its valid_from, a scheduled removal disappears from its valid_to on.
env_idYes
environments_list_presetsEnvironments List Presets
Read-onlyIdempotent
Inspect

The 6 platform region presets a tenant can clone into a runnable env.

Read-only and platform-scoped: only platform rows (org_id IS NULL) are returned (bypass-read inside the service), so no tenant data is exposed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

environments_list_ratesEnvironments List Rates
Read-onlyIdempotent
Inspect

List all rates for an env, uniformly shaped so the rate editor can render every kind side by side. Optional ?kind= filter.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoFilter to a single rate kind (labour, overhead, material, fx, subcontract, or scrap).
env_idYes
environments_list_surcharge_presetsEnvironments List Surcharge Presets
Read-onlyIdempotent
Inspect

Benchmark Zuschlagskalkulation rates from primary sources (automotive supplier mark-ups on total manufacturing cost; the usual profit mark-up of German public price law), each with its citation and the equivalent environment economics. Nothing here prices on its own: applying a preset means sending its economics to PATCH /environments/{env_id}/economics, which records the rates as that environment's own statement.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

environments_material_price_clearEnvironments Material Price Clear
DestructiveIdempotent
Inspect

Removes the environment's own price rows for this material, so it prices at the platform figure for its category again. Takes effect immediately.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
grade_idYes
environments_material_price_setEnvironments Material Price Set
DestructiveIdempotent
Inspect

Your number becomes the price per kilogram this environment calculates with, from valid_from onwards. The price it replaces is closed the same day rather than deleted, so past quotes keep the figure they were costed at.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
grade_idYes
valid_fromNoDay the price starts applying. Defaults to today. The price you replace is closed on the same day, so the two never overlap.
price_per_kgYesPrice per kilogram, in the environment's currency. Takes effect on the next calculation.
environments_restore_env_machinesEnvironments Restore Env Machines
Destructive
Inspect

Restore the platform machine set in the default environment: removed machines are re-attached (new SCD2 rows), switched-off ones switch on, platform classes the environment never had are added. Capability overrides and machine rates are untouched. 409 on any other environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_restore_env_ratesEnvironments Restore Env Rates
Destructive
Inspect

Drops every rate this environment states, so it prices at the platform defaults again with honest "platform default" provenance. A scrap price that applied on an earlier day stays on record, ending yesterday, so quotes already made keep it. Your assumptions, tuning and calibration are untouched. Takes effect immediately. Only the default environment can be restored.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_restore_env_subcontractorsEnvironments Restore Env Subcontractors
Destructive
Inspect

Restore the platform subcontractor presets in the default environment: hidden presets return, removed ones re-attach, switched-off ones switch on and are active again. Your own subcontractors and every other environment are untouched. 409 on any other environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_restore_env_toolsEnvironments Restore Env Tools
Destructive
Inspect

Restore the platform tool set in the default environment: hidden platform tools return, removed ones are re-attached, switched-off ones switch on. Edited values, custom tools and every other environment are untouched. 409 on any other environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_scrap_price_clearEnvironments Scrap Price Clear
DestructiveIdempotent
Inspect

The environment's own price for this material and kind of scrap stops applying today. One that started on an earlier day stays on record, so quotes already made keep it; one set today, or for a later day, is withdrawn. Calculations then use the price a parent environment states, or the platform's reference figure.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
grade_idNoThe grade the price is for. Leave it out to price every grade of the category that states no price of its own.
scrap_classYes
material_categoryYesTop-level material family. Drives ISO machining group defaults and UI filtering. Values are stable identifiers — adding a new category is additive; renaming is a breaking change.
environments_scrap_pricesEnvironments Scrap Prices
Read-onlyIdempotent
Inspect

Every scrap price a calculation in this environment would use today, one row per material, grade and kind of scrap, with whose price it is — this environment's, a parent environment's or the platform's published reference figure — and whether a platform figure is stale. credit_scrap_stated says whether any of them changes a quote yet.

Integration credentials receive your own prices; the platform's reference figures are shown in the app.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
environments_scrap_price_setEnvironments Scrap Price Set
DestructiveIdempotent
Inspect

Your price per kilogram for the scrap parts of this material leave behind — sheet skeletons and offcuts, chips, or bar ends and cut-offs — from valid_from onwards. Name a grade with grade_id to price it apart from the rest of its category. A price it replaces that started on an earlier day stops the day before rather than being deleted, so quotes already made keep the figure they were costed at; one set earlier the same day is simply replaced.

A scrap price is credited only in an environment that credits sold scrap: the shop-practice question scrap_credit.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
grade_idNoThe grade the price is for. Leave it out to price every grade of the category that states no price of its own.
valid_fromNoDay the price starts applying: today, which is the default, or later — never earlier, so quotes already made keep the price they were costed at. The price it replaces stops the day before.
scrap_classYes
price_per_kgYesWhat you get back per kilogram, in the environment's currency: what the dealer pays less what sorting, containers and haulage cost you. Zero is allowed: a shop that sells nothing back states 0.
material_categoryYesTop-level material family. Drives ISO machining group defaults and UI filtering. Values are stable identifiers — adding a new category is additive; renaming is a breaking change.
environments_subcontract_price_setEnvironments Subcontract Price Set
DestructiveIdempotent
Inspect

Your number becomes the price this environment uses for this operation, from valid_from onwards. Prices you were holding open for the same operation are closed the same day rather than deleted, so quotes you have already sent keep the figure they were costed at.

This one replaces: afterwards there is a single open price for the operation. To put a second subcontractor's quote on file alongside the one you already hold, use POST /environments/{env_id}/rates, which adds a price and closes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
valid_fromNoDay the price starts applying. Defaults to today. The price you replace is closed on the same day, so the two never overlap.
pricing_unitYesThe cost basis your price is quoted per: kg, m2 or part for any heat-treatment, coating or marking operation (the part's mass, surface area or one piece is what the rate multiplies), m for a weld (metres of deposited seam). Each shop states its own; the answer names the accepted bases and stores nothing otherwise.
order_fee_eurNoFee the shop charges on every order regardless of its value, in the environment's currency, on top of the work or the minimum. Spread over the lot. Zero for a shop that charges none.
unit_rate_eurYesWhat the subcontractor charges per pricing unit, in the environment's currency. Zero is allowed — a shop that charges a minimum and nothing per unit.
operation_kindYesThe operation this price is for — `heat_treatment:<kind>`, `coating:<kind>`, `marking:<kind>` or `weld`.
lot_minimum_eurNoMinimum order value, in the environment's currency: the shop invoices one order at max(its work, this). The difference is the small-lot surcharge, spread over the lot — it dominates small batches and is zero once the lot's own work is worth the minimum.
subcontractor_idNoWhich of your subcontractors this price is from. Optional — leave it out for a figure you carry without naming a shop.
environments_update_calculation_tuningEnvironments Update Calculation Tuning
DestructiveIdempotent
Inspect

Write env-tier tuning overrides (audited).

setup_factor / programming_factor / cycle_factor write the per-bin setup_efficiency / programming_efficiency / cycle_efficiency resolver overrides for every routable process bin at ENV tier; 1.0, their identity, clears the override. processes writes the same three cells for only the processes it names, applied after the flat fields.

The four REFA allowances (verteilzeit_pct, erholzeit_pct, ruestverteilzeit_pct, ruesterholzeit_pct) write the same per-bin overrides, over every bin that reads them.

The six sheet-nesting settings (edge_margin_mm, skeleton_web_mm, the three remnant thresholds and cut_to_size_increment_mm) each write their one cell of the sheet-nesting settings, which is where a sheet part's purchase reads them, and remnant_value_factor its cell of the material valuation policy, beside the remnant-credit answer that switches it on. The three bar stock settings (bar_length_mm, bar_clamp_remnant_mm and the shortest end that counts as a remnant, bar_remnant_min_l_mm) write theirs, which is where a turned part's bar is bought. Like the allowances, 0 is a statement and reset is the way back.

The four inspection_* fields write the platform-wide inspection constants in the global bin — the cells the cost sheet's Prüfung line lets a reader move. They read back on GET /environments/{env_id}/factors with their provenance and the platform value beside them, which is where every resolved factor is published; this endpoint's own read model stays the tuning knobs.

learning_rate writes the env's Wright rate. Every change lands an audit row.

null means "no statement" on every field of this body, and never a write: a client that serialises its whole model sends nulls for the knobs it is silent about, and that must leave them alone. Clearing a knob, so that it reads a parent environment's statement where one exists and else the platform default, is the named reset list — the allowances need it (0 is a statable allowance, so they have no identity value to send), and the multipliers accept it as the spelled-out equivalent of sending 1.0. The inspection cells are the one exception: an explicit null there clears the override, the contract the cost sheet's save dialog was built against.

ParametersJSON Schema
NameRequiredDescriptionDefault
resetNoKnobs to clear on this environment, by name — learning_rate, setup_factor, programming_factor, cycle_factor, verteilzeit_pct, erholzeit_pct, ruestverteilzeit_pct, ruesterholzeit_pct, edge_margin_mm, skeleton_web_mm, remnant_min_l_mm, remnant_min_w_mm, remnant_min_area_share, remnant_value_factor, full_stock_threshold, cut_to_size_increment_mm, custom_format_surcharge_pct, bar_length_mm, bar_clamp_remnant_mm, bar_remnant_min_l_mm, min_web_mm_to_3mm, min_web_mm_to_6mm, min_web_mm_to_12mm, min_web_mm_over_12mm, micro_joint_width_mm, micro_joints_to_300mm, micro_joints_to_1000mm, micro_joints_over_1000mm. A cleared knob reads what a parent environment states, else the platform default; learning_rate is this environment's own and returns to the platform default. Clearing is a named gesture because a null in a knob's own field means 'no statement' and must never delete one. An unknown name is rejected.
env_idYes
processesNoPer-process factors, keyed by process (milling, turning, sawing, ...). Applied after the flat fields, so a flat value sets every process and a named one overrides it.
cycle_factorNoMultiplier on the whole per-unit run time — cutting, air moves, peck retract, tool changes and load/unload; omit or send null to keep, 1.0 (its identity) or "reset" to clear it back to inherit / platform default.
setup_factorNoSetup-time multiplier; omit or send null to keep, 1.0 (its identity) or "reset" to clear it back to inherit / platform default.
bar_length_mmNoLength the round bar a turned part is cut from is bought in, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
erholzeit_pctNoRecovery allowance on the RUN base time, as a fraction (0.045 = 4.5 %); omit or send null to keep, "reset" to clear it back to inherit / platform default.
learning_rateNoWright rate in [0.5, 1.0]; 1.0 disables learning. Omit or send null to keep it; name it in "reset" to return it to the platform default.
edge_margin_mmNoEdge margin kept to every side of a purchased sheet, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default. 0 is a statement, not a reset.
skeleton_web_mmNoWeb between two nested parts WITHOUT the cutting gap, mm — the cutter's kerf is added to it; omit or send null to keep, "reset" to clear it back to inherit / platform default.
verteilzeit_pctNoDistribution allowance as a fraction of the run base time (0.10 = 10 %); omit or send null to keep, "reset" to clear it back to inherit / platform default. 0 is a statable allowance, not a reset.
remnant_min_l_mmNoLonger side a reusable remnant needs, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
remnant_min_w_mmNoShorter side a reusable remnant needs, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
min_web_mm_to_3mmNoMinimum web for sheet up to 3 mm, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
min_web_mm_to_6mmNoMinimum web for sheet over 3 up to 6 mm, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
min_web_mm_to_12mmNoMinimum web for plate over 6 up to 12 mm, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
programming_factorNoProgramming-time multiplier; omit or send null to keep, 1.0 (its identity) or "reset" to clear it back to inherit / platform default.
ruesterholzeit_pctNoRecovery allowance on the SETUP base time, as a fraction (0.045 = 4.5 %); omit or send null to keep, "reset" to clear it back to inherit / platform default.
bar_clamp_remnant_mmNoEnd of each bar the clamp holds and no part is cut from, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
bar_remnant_min_l_mmNoShortest bar or tube end that counts as a reusable remnant, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
full_stock_thresholdNoThe fill of a started stock piece from which a lot pays it whole, as a fraction of the parts it holds (0.85 = 85 %; 1.0 turns the rule off); omit or send null to keep, "reset" to clear it back to inherit / platform default.
micro_joint_width_mmNoMicro-joint width, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
min_web_mm_over_12mmNoMinimum web for plate over 12 mm, mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
remnant_value_factorNoWhat a reusable remnant is worth against new stock of its kind, as a fraction of its price per kg (0.8 = 80 %); omit or send null to keep, "reset" to clear it back to inherit / platform default.
ruestverteilzeit_pctNoDistribution allowance on setup as a fraction of the setup base time (0.10 = 10 %); omit or send null to keep, "reset" to clear it back to inherit / platform default.
inspection_weight_gdtNoEffort weight of a geometric-tolerance characteristic; omit to keep, null to clear.
inspection_weight_ndtNoEffort weight of a non-destructive-testing callout; omit to keep, null to clear.
micro_joints_to_300mmNoMicro-joints per part with an outline up to 300 mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
micro_joints_to_1000mmNoMicro-joints per part with an outline over 300 up to 1000 mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
remnant_min_area_shareNoArea a reusable remnant needs, as a fraction of the purchased sheet's (0.05 = 5 %); omit or send null to keep, "reset" to clear it back to inherit / platform default.
inspection_weight_datumNoEffort weight of a datum characteristic; omit to keep, null to clear.
cut_to_size_increment_mmNoStep a plate ordered cut to size is bought in, mm — each side rounds up to a multiple of it, 0 buys the exact size; omit or send null to keep, "reset" to clear it back to inherit / platform default.
micro_joints_over_1000mmNoMicro-joints per part with an outline over 1000 mm; omit or send null to keep, "reset" to clear it back to inherit / platform default.
custom_format_surcharge_pctNoPremium a sheet cut to an ordered size carries on its metal, as a fraction of the metal's price (0.15 = 15 %); omit or send null to keep, "reset" to clear it back to inherit / platform default.
inspection_tau_s_per_elementNoSeconds to measure one characteristic; omit to keep, send null to clear your override.
environments_update_environment_identityEnvironments Update Environment Identity
DestructiveIdempotent
Inspect

Change a costing environment's name, description, region, currency, validity dates or parent environment. Its machines, tools and rates are changed with their own tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew name for the environment; omit to leave unchanged.
env_idYes
regionNoNew region for the environment; omit to leave unchanged.
currencyNoNew ISO 4217 currency code; omit to leave unchanged.
valid_toNoNew effective-to ISO date (YYYY-MM-DD); omit to leave unchanged.
valid_fromNoNew effective-from ISO date (YYYY-MM-DD); omit to leave unchanged.
descriptionNoNew description for the environment; omit to leave unchanged.
parent_environment_idNoEnvironment this one inherits from. Anything this environment does not state itself — a machine rate, a labour rate, a subcontract price, a physics override — resolves from the parent, and from ITS parent above that, so a region can be priced once and a quarter or a customer programme can restate only what differs. Send null to detach. Omit to leave unchanged.
environments_update_env_subcontractor_membershipEnvironments Update Env Subcontractor Membership
Destructive
Inspect

Enable/disable a subcontractor here without detaching it.

The engine has always gated on this flag — pipeline_context_cache filters is_enabled.is_(True) when it collects the sourced operation kinds — but no route set it, so it could never be anything but the True it defaults to on attach. A shop wanting to stop sourcing one operation from one subcontractor in one environment had to detach and re-attach, discarding the SCD2 history the membership exists to keep. Same shape as the tool sibling above.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
is_enabledYesEnable/disable without detaching.
membership_idYes
environments_update_env_tool_membershipEnvironments Update Env Tool Membership
Destructive
Inspect

Enable/disable a tool here without detaching it.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
is_enabledYesEnable/disable without detaching.
membership_idYes
environments_update_membershipEnvironments Update Membership
Destructive
Inspect

Change how a machine is used in one costing environment: its priority among machines that can do the same work, whether it is enabled, and its validity dates.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
valid_toNoNew membership end ISO date (YYYY-MM-DD); omit to leave unchanged.
is_enabledNoWhether the machine is active in the fleet; omit to leave unchanged.
valid_fromNoNew membership start ISO date (YYYY-MM-DD); omit to leave unchanged.
membership_idYes
fleet_priorityNoNew ordering within the environment (lower tried first); omit to leave unchanged.
environments_update_shop_practiceEnvironments Update Shop Practice
DestructiveIdempotent
Inspect

Answer the shop-practice questions (packaging, deburring, scrap credit, remnant credit, and how sheet is cut: grain direction, mirroring, the web by thickness, micro-joints, common-line cutting, the job nest's rotation step). Each answer sets this environment's time allowances, credit policy or cutting practice from a closed set of choices and is recorded in the audit log; a question you leave out keeps its answer. 'standard' removes this environment's own answer: where a parent environment states one, that answer applies and is returned with source 'parent_environment'; otherwise the platform behaviour does.

ParametersJSON Schema
NameRequiredDescriptionDefault
env_idYes
answersYesQuestion key → answer. Only catalogued questions and answers are accepted. 'standard' removes this environment's own answer: where a parent environment states one, that answer applies (source 'parent_environment'); otherwise the platform behaviour does.
environments_upsert_rateEnvironments Upsert Rate
Destructive
Inspect

Adds a rate and leaves every price you already hold open, so you can keep more than one on file — a second subcontractor's quote for the same operation, for instance. Which of them a part is costed at is decided per order.

This one adds. To state the single price this environment should use — closing the price it replaces — use the PUT for the thing itself: .../rates/subcontract/{operation_kind} for bought-in work, .../rates/material/{grade_id} for a material. A scrap price has only its own PUT .../rates/scrap/{material_category}/{scrap_class}.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYeslabour|overhead|material|fx|subcontract
env_idYes
fieldsNoKind-specific columns (category, machine_ref, …).
currencyNoISO 4217 currency code for the rate; null to inherit.
valid_toNoDate after which the rate is no longer effective; null if open-ended (ISO 8601).
valid_fromYesDate from which the rate is effective (ISO 8601).
folders_create_folderFolders Create Folder
Destructive
Inspect

Create a folder for organising parts, at the top level or inside a parent folder. Folders that share a parent need distinct names.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFolder name, shown in the workspace tree. Unique among its siblings.
parent_idNoID of the parent folder; null creates a top-level folder.
folders_delete_folderFolders Delete Folder
DestructiveIdempotent
Inspect

Delete a folder and its subfolders. The parts inside are not deleted; they are left without a folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idYes
folders_folder_summaryFolders Folder Summary
Read-onlyIdempotent
Inspect

Rollup scoped to a folder and all of its subfolders.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idYes
folders_get_folderFolders Get Folder
Read-onlyIdempotent
Inspect

Fetch a single folder.

Parts carry a folder_id, so a client holding one previously had to list the whole tree to resolve it to a name.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idYes
folders_list_foldersFolders List Folders
Read-onlyIdempotent
Inspect

All folders for the org, each with its direct (non-recursive) part count.

The tree is small enough to ship flat — the client assembles parent/child structure from parent_id.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

folders_move_partsFolders Move Parts
Destructive
Inspect

Move parts into a folder, or out of every folder when folder_id is null. Ids that are not found are listed in the result.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idsYesParts to (re-)file.
folder_idNoDestination folder; null unfiles the parts (moves them to the root).
folders_update_folderFolders Update Folder
Destructive
Inspect

Rename a folder or move it under another parent folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew folder name.
folder_idYes
parent_idNoNew parent folder; null moves the folder to the workspace root.
folders_workspace_summaryFolders Workspace Summary
Read-onlyIdempotent
Inspect

Rollup over the entire workspace (all parts, filed or not).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

geometry_part_revision_drawing_urlGeometry Part Revision Drawing Url
Read-onlyIdempotent
Inspect

Short-lived URL for the revision's active 2D drawing, plus its content_type so the overlay viewer knows whether to render it as an image or a PDF. {url, status, content_type}; status no_dataset when no drawing is attached.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_revision_idYes
geometry_part_revision_faces_urlGeometry Part Revision Faces Url
Read-onlyIdempotent
Inspect

Short-lived URL for the revision's per-face GLB.

The model is prepared once per CAD upload and served from cache here, so this call is cheap and safe to poll. Every B-rep face is its own glTF primitive carrying its stable face_uuid in primitive.extras — a picked primitive maps straight onto the face a cost driver refers to.

Only STEP carries B-rep faces; a mesh upload answers unsupported. See FacesUrl for the full status set.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_revision_idYes
import_preview_machine_importImport Preview Machine Import
Read-onlyIdempotent
Inspect

Preview a machine-park import: per row, the values as read, any errors, and what the import would do — create the machine and attach it, attach a machine you already have under that name, or skip one already in the environment. Nothing is written.

ParametersJSON Schema
NameRequiredDescriptionDefault
csvYesThe machine list as CSV text (headered; comma, semicolon or tab separated). Columns: name, class, hourly_rate_eur — plus optional operator_eur_per_h, envelope_x_mm / envelope_y_mm / envelope_z_mm, spindle_power_kw and priority. Header spellings are matched tolerantly; at most 500 data rows.
env_idNoCosting environment the machines join; omit for your default environment.
import_preview_tool_importImport Preview Tool Import
Read-onlyIdempotent
Inspect

Preview a tool-crib import: per row, the values as read (including the kind-specific properties), any errors, and what the import would do. Nothing is written.

ParametersJSON Schema
NameRequiredDescriptionDefault
csvYesThe tool list as CSV text (headered). Columns: name, kind — plus optional diameter_mm, teeth, cutting_material, price_eur, tool_life_min, vendor, item_no, coating, notes, and any kind-specific property as its own column (e.g. kerf_mm, blade_type and format for a saw blade, life_quantity for non-rotating tools). At most 1000 data rows.
machine_library_create_library_entryMachine Library Create Library Entry
Destructive
Inspect

Add a tenant-private machine to the library. Platform-catalog entries are curated out-of-band (seed), never via this endpoint — the row is always stamped with the caller's org_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable catalog name (e.g. '3-axis VMC — generic' or 'DMG MORI CMX 800 V').
klassYesMachine class (process family), e.g. milling.5axis_full.
vendorYesMachine manufacturer / vendor (or 'generic').
model_noYesVendor model number, or a generic-type slug.
subclassNoSize tier of the machine within its class (small/medium/large).medium
valid_toNoDate after which this entry is superseded; null if open-ended (ISO 8601).
is_genericNoTrue for a class-default *type* template; False for a representative named machine.
valid_fromYesDate from which this library entry is effective (ISO 8601).
default_vdi_3258NoOptional VDI 3258 cost-structure defaults enabling (machine, region) hour-rate resolution.
default_capabilitiesYesDefault capability matrix for the type; instances override individual fields.
nominal_hourly_rate_eurNoType-default machine-hour rate in EUR/h; copied into an instance on instantiation.
nominal_rate_operator_shareNoOperator attendance the nominal rate was built at (0-1), and the type's run-attendance default. NULL falls back to the class default.
nominal_rate_operator_eur_per_hNoOperator wage already contained in nominal_hourly_rate_eur, in EUR per hour; copied into an instance alongside the rate. 0 means the rate is machine-only and operator labour is billed separately.
machine_library_delete_library_entryMachine Library Delete Library Entry
DestructiveIdempotent
Inspect

Delete a tenant-private entry. Refused (409) while any environment machine still references it — a library-derived instance resolves its capabilities from the entry, so detach those machines first.

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYes
machine_library_get_library_entryMachine Library Get Library Entry
Read-onlyIdempotent
Inspect

Fetch one machine-library entry.

Environments instantiate machines by library_entry_id, so a caller holding one previously had to page the whole catalog to resolve it.

Redaction is identical to the list: platform-catalog rows lose our cost structure for integration / MCP callers, tenant-private rows pass through.

ParametersJSON Schema
NameRequiredDescriptionDefault
entry_idYes
machine_library_library_usageMachine Library Library Usage
Read-onlyIdempotent
Inspect

Which environment fleets actually use each machine-library entry.

A library entry is a type — a template. It takes part in calculations only after a machine has been instantiated from it into an environment's fleet. This endpoint reports, per entry, the environments of YOUR organization whose active fleet contains such a machine, so a type that no calculation will ever use is visible as exactly that.

Entries with no usage are omitted — treat absence as "not in any fleet".

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

machine_library_list_libraryMachine Library List Library
Read-onlyIdempotent
Inspect

The browsable machine park: the shared platform catalog plus your organization's own entries, in one list.

The response is a plain array, so the page position travels in the Link (RFC 8288) and X-Next-Cursor / X-Has-More response headers.

ParametersJSON Schema
NameRequiredDescriptionDefault
klassNoFilter to a single machine class (e.g. milling.5axis_full).
limitNoMaximum rows to return in one page.
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
offsetNoRows to skip. Superseded by `cursor`, which is stable under concurrent writes; kept for existing integrations. Bounded — past the cap, page with `cursor`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThis page's rows, in the order and shape the REST list returns them.
has_moreYesFalse on the last page. Stop on this, never on a short page.
next_cursorYesPass as `cursor` to read the next page. Null on the last page.
machine_library_rate_calculatorMachine Library Rate Calculator
Read-onlyIdempotent
Inspect

Compute a VDI 3258 machine-hour rate from cost-structure inputs.

Pure computation — nothing is persisted. Use the returned total_per_h as a library entry's nominal rate, or store the inputs as default_vdi_3258 for region-aware resolution.

ParametersJSON Schema
NameRequiredDescriptionDefault
energy_kwYesAverage electrical power draw while running, in kilowatts.
shift_modelNoShift calendar the annual hours derive from (shifts/day × hours/shift × days/week × weeks/year × availability). Mutually exclusive with an explicit annual_hours_T_G.
floor_space_m2YesFloor space occupied by the machine, in square metres.
operator_shareYesFraction of an operator's time allocated to this machine (0–1).
annual_hours_T_GNoVDI 3258 total annual attendance hours (T_G), in hours per year. Omit it and state shift_model instead to derive T_G from your shift calendar; exactly one of the two is required.
annual_hours_T_IHYesVDI 3258 annual maintenance/repair hours (T_IH), in hours per year.
annual_hours_T_STYesAnnual standstill (idle) hours (T_ST), in hours per year — EXCLUDING setup: the platform bills setup hours explicitly at the setup rate, so they are run hours here. Counting them as standstill (as VDI 3258 does) would recover them twice.
energy_eur_per_kwhYesElectricity price, in EUR per kilowatt-hour.
space_eur_per_m2_yYesAnnual floor-space cost rate, in EUR per square metre per year.
depreciation_life_hYesDepreciation life of the machine, in operating hours.
operator_hourly_eurYesFully-loaded operator labour cost, in EUR per hour.
acquisition_cost_eurYesMachine acquisition cost (Anschaffungskosten), in EUR. The basis of the imputed interest, and of the depreciation where no replacement_value_eur is stated.
tooling_eur_per_yearYesAnnual spend on general tooling and fixtures for the machine that no single part is charged for (Gemeinkostenwerkzeuge, Vorrichtungen), in EUR per year. Never perishable cutting tools: their wear is charged per part on the cost sheet's own tooling row, so stating them here would recover them twice.
capital_interest_rateYesImputed annual interest rate on tied-up capital (0–1, e.g. 0.06 = 6%).
replacement_value_eurNoReplacement value of the machine (Wiederbeschaffungswert), in EUR — what an equivalent machine costs today. Depreciation is computed on it; interest stays on the acquisition cost. Omit it to depreciate the acquisition cost.
maintenance_eur_per_yearYesAnnual maintenance spend for the machine, in EUR per year.
machine_library_update_library_entryMachine Library Update Library Entry
Destructive
Inspect

Change one of your organisation's machine-library entries: name, vendor, model, nominal rates, default capabilities, or the date it stops being valid. Platform entries are read-only and answer 403.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
vendorNo
entry_idYes
model_noNo
valid_toNo
default_vdi_3258No
default_capabilitiesNo
nominal_hourly_rate_eurNo
nominal_rate_operator_shareNo
nominal_rate_operator_eur_per_hNo
machines_get_machineMachines Get Machine
Read-onlyIdempotent
Inspect

The machine as its record states it — rates, class, capabilities — plus environment_count: how many of your costing environments hold it in their fleet today, which is how far an edit to its rates reaches.

ParametersJSON Schema
NameRequiredDescriptionDefault
machine_idYes
machines_get_machine_usageMachines Get Machine Usage
Read-onlyIdempotent
Inspect

A machine record is shared by every environment whose fleet holds it, so a change to its hourly rate moves every part priced on it in each of them. This says how many, and which, so a save from one calculation's cost sheet can state its scope before it writes.

ParametersJSON Schema
NameRequiredDescriptionDefault
machine_idYes
machines_update_machineMachines Update Machine
Destructive
Inspect

Change one of your machines: its name, machine class, hourly rates (machine, burden, programming, setup, operator) and capability overrides. Calculations run afterwards use the new values.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew machine name; omit to leave.
klassNoCorrect the machine's process class (e.g. a lathe entered from a milling template). The machine is re-based on the new class's standard capability matrix and detached from its catalogue entry, because that entry describes a different kind of machine; name, rates and fleet memberships are kept. Omit to leave.
machine_idYes
setup_rate_eurNoSetup rate in EUR/h; -1 clears it (fall back to the machine hourly rate); omit to leave.
burden_rate_eurNoCapital/overhead burden charged alongside the machine-hour rate in EUR/h, on run time and setup time alike; 0 = none. Omit to leave.
hourly_rate_eurNoNew flat machine-hour rate in EUR/h; omit to leave.
rate_operator_shareNoShare of an operator this machine consumes while it runs (0-1); omit to leave. Setup is always fully attended. Unset falls back to the machine class default.
capability_overridesNoCapability fields to change. For a library-derived machine these merge over the library default (sparse override); for a bespoke machine they merge into its own capability matrix.
programming_rate_eurNoProgramming rate in EUR/h; -1 clears it (fall back to the environment labour rate); omit to leave.
rate_operator_eur_per_hNoOperator wage already contained in hourly_rate_eur — and in setup_rate_eur, which is the same rate on the setup envelope — in EUR/h; omit to leave. 0 means the rate covers the machine only and operator labour is billed separately — the default. Set it when the rate is all-in, so the operator is not charged twice. It cannot exceed either rate it is declared inside.
materials_create_grade_designationMaterials Create Grade Designation
Destructive
Inspect

Teach the catalogue one of your own spellings for this grade.

Register WS-42 against 1.4301 and every drawing whose title block says WS-42 is priced as 1.4301 from the next calculation on — density, cutting data and €/kg all follow the grade. Works for catalogue grades and for grades your organization registered itself.

Only your organization sees it. A spelling that already resolves for you — a catalogue code, a standard alias, another of your own designations — is refused.

ParametersJSON Schema
NameRequiredDescriptionDefault
grade_idYes
designationYesThe spelling your drawings use (e.g. 'WS-42', 'Hausblech 77'). Rendered as entered, stored in a lookup-normalised form. One that already resolves for you is refused.
materials_create_org_gradeMaterials Create Org Grade
Destructive
Inspect

Register a material grade private to your organization.

For a material the standards catalogue does not carry — a house designation, an internal blank, a supplier-specific grade. Only your organization can see or resolve it, and it prices exactly like a catalogue grade: give it a €/kg rate on an environment, or let the category default stand until you do.

The designation is fixed once registered, and one that already resolves for you — a catalogue code, a standard alias, or another of your own grades — is refused.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesHuman-readable name of the material.
categoryYesBroad material family the grade belongs to (e.g. carbon_steel, aluminium).
attributesNoThe material statement for this grade: mechanical and physical figures (`yield_mpa`, `tensile_mpa`, `hardness_hb`, …) and the categorical route gates (`laser_cuttable`, `weldability_class`, `heat_treatable`, …). A closed vocabulary, not free-form: an unknown key or a verdict outside a gate's set is refused (422) rather than stored, because a key nothing reads and a misspelled one are indistinguishable on the quote. `GET /materials/attribute-vocabulary` lists every accepted key, its unit or its verdicts, and what the costing engine does with it.
designationYesYour designation for the grade (e.g. 'WS-42-Blank'). Letters, digits, dots and hyphens; rendered as entered, stored URN-safe. Must not collide with a catalogue code.
density_kg_per_m3YesMaterial density in kilograms per cubic metre — steel is about 7850, aluminium about 2700. Mind the unit: a value in g/cm³ is 1000x too small and is rejected.
iso_machining_groupYesISO 513 machining group (P/M/K/N/S/H). Shown on the grade; the cutting data itself comes from `workpiece_group_code` when set, and from the category's default bin otherwise.
workpiece_group_codeNoLeaf of the workpiece material tree this grade machines as — `P2.2` for a hardened-and-tempered low-alloy steel, `M3.1` for a duplex stainless, `N1.2` for an age-hardened aluminium. Pick it from `GET /materials/workpiece-groups`. This is what selects the grade's cutting speeds and forces; leave it unset to price on the category's default cutting data.
materials_create_overrideMaterials Create Override
Destructive
Inspect

Add your organisation's own data to a material grade: an internal code, a trade name, notes and attributes. A grade carries one override; a second answers 409. Calculations run afterwards use it.

ParametersJSON Schema
NameRequiredDescriptionDefault
urnNoCanonical or org-private URN (urn:arc:mat:…:…).
notesNoFree-text notes attached to this material by the organization.
attributesNoYour organization's material statement for this grade: mechanical and physical figures (`yield_mpa`, `tensile_mpa`, `hardness_hb`, …) and the categorical route gates (`laser_cuttable`, `weldability_class`, `heat_treatable`, …). A closed vocabulary, not free-form: an unknown key or a verdict outside a gate's set is refused (422) rather than stored, because a key nothing reads and a misspelled one are indistinguishable on the quote. `GET /materials/attribute-vocabulary` lists every accepted key, its unit or its verdicts, and what the costing engine does with it.
trade_nameNoVendor trade name (e.g. 'Inconel 718').
internal_codeNoOrg-internal SKU / part code for this material.
material_grade_idNoCanonical grade this override extends. NULL → fully org-private material not in the global catalogue (requires ``urn`` populated).
materials_create_stock_formatMaterials Create Stock Format
Destructive
Inspect

Add a format your shop buys ("GF 3000 × 1500", or a 6 m bar).

Calculations price with it from today on, beside the standard formats of its kind you have not hidden. Each kind states its own dimensions — see kind.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyYesA short identifier of lowercase letters, digits, `-` and `_`, starting with a letter or digit — unique among your current formats, and kept by every later version of this one.
kindNoWhich purchased stock form this is. A sheet states length_mm and width_mm; a plate adds thickness_mm to its largest size; a bar states length_mm and, optionally, diameter_mm; a tube states length_mm, diameter_mm and wall_mm.sheet
labelYesThe format's name, e.g. `GF 3000 × 1500`, as calculations and quotes show it. Invisible formatting is removed — direction controls and zero-width characters — and a name with nothing left to read is refused.
wall_mmNo
width_mmNo
length_mmYes
diameter_mmNo
gauge_max_mmNo
gauge_min_mmNo
thickness_mmNo
material_categoryNo
materials_delete_designationMaterials Delete Designation
DestructiveIdempotent
Inspect

Remove one of your designations. Calculations already priced through it keep the grade they were priced on; the next calculation of a part whose drawing carries the spelling no longer binds it.

ParametersJSON Schema
NameRequiredDescriptionDefault
designation_idYes
materials_delete_org_gradeMaterials Delete Org Grade
DestructiveIdempotent
Inspect

Delete an org-private grade. Refused (409) while environment material or scrap prices or calculations still reference it — deactivate it instead (PATCH {is_active: false}) to keep history intact.

ParametersJSON Schema
NameRequiredDescriptionDefault
grade_idYes
materials_delete_overrideMaterials Delete Override
DestructiveIdempotent
Inspect

Delete one of your organisation's material overrides; the grade goes back to its standard data. This cannot be undone.

ParametersJSON Schema
NameRequiredDescriptionDefault
override_idYes
materials_get_gradeMaterials Get Grade
Read-onlyIdempotent
Inspect

Read one material grade by id, including its designations and aliases.

ParametersJSON Schema
NameRequiredDescriptionDefault
grade_idYes
materials_get_grade_by_urnMaterials Get Grade By Urn
Read-onlyIdempotent
Inspect

Read a material grade by its URN, for example urn:material:cen:1.4301. Use it when you have a standard designation rather than an id.

ParametersJSON Schema
NameRequiredDescriptionDefault
urnYesMaterial grade URN to resolve (e.g. urn:material:cen:1.4301).
materials_get_grade_masterMaterials Get Grade Master
Read-onlyIdempotent
Inspect

The material master record for one grade.

SAP-style split: the grade row is the client-level basic data (canonical catalogue, or your org-private grade), the override is your organization's layer (SKU, trade name, property overrides), and pricing is the plant-level costing view — the €/kg each of your costing environments would actually use today, each entry labelled env_rate (that environment's own material rate wins) or platform_default (the seed fallback applies). Reuses the calc path's own resolver, so display and pricing cannot disagree.

group is what the grade's workpiece-material group states — thermal figures, sheet-forming parameters, and the route gates that decide which processes the material may take at all. A grade inherits every key it does not state itself, so most materials' laser, weld and treatment verdicts are here rather than on the grade. Each key names the node of the tree that states it, and is marked where the grade's own figure or your override overrides it.

ParametersJSON Schema
NameRequiredDescriptionDefault
grade_idYes
materials_get_stock_formatMaterials Get Stock Format
Read-onlyIdempotent
Inspect

One stock format by id, in any version — including one retired or replaced since.

The format a calculation was priced on stays readable here after it leaves the list. resolution says what calculations dated today do with it.

ParametersJSON Schema
NameRequiredDescriptionDefault
format_idYes
materials_ignore_unmapped_designationMaterials Ignore Unmapped Designation
Destructive
Inspect

Dismiss a designation that is not a material — a note, a specification reference, a surface-finish callout the title block happened to carry. It stops appearing in the queue; the parts that carry it keep pricing on the environment default, which is what the review banner on those calculations already says.

ParametersJSON Schema
NameRequiredDescriptionDefault
observation_idYes
materials_list_grade_designationsMaterials List Grade Designations
Read-onlyIdempotent
Inspect

Your organization's own designations for this material grade.

The spellings your drawings use — a house code, an old works standard, a supplier's name for the same material. A designation resolves to this grade wherever a material is named: on a drawing title block, in a quote request, in the picker.

ParametersJSON Schema
NameRequiredDescriptionDefault
grade_idYes
materials_list_gradesMaterials List Grades
Read-onlyIdempotent
Inspect

List the material grades available to you.

That is the standards catalogue plus any grade your organization has registered for itself.

q searches across primary_code, display_code, name, urn AND every alias's code/display_code. A user typing "AISI 304", "SUS304" or "S30400" therefore finds 1.4301 from this single endpoint — no need to fall back to POST /lookup.

Returns the total matching row count (not page size) so the frontend can paginate properly.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoFree-text search across grade codes, names, URNs, and aliases.
limitNoMaximum rows to return in one page.
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
offsetNoRows to skip. Superseded by `cursor`, which is stable under concurrent writes; kept for existing integrations. Bounded — past the cap, page with `cursor`.
categoryNoFilter by material category (e.g. stainless_steel, aluminium).
iso_groupNoFilter by ISO 513 machining group (P, M, K, N, S, H).
include_inactiveNoInclude grades your organization has deactivated. They stay out of the list by default; set this to find one again and reactivate it.
materials_list_material_attribute_vocabularyMaterials List Material Attribute Vocabulary
Read-onlyIdempotent
Inspect

Every material attribute the platform carries, and what it drives.

A material master sheet is only worth filling in if the figures reach something. This endpoint states, per key, which part of the costing engine reads it — or, where nothing does, says so in those words and gives the reason. There is no third state: a key that reached the engine and was never read would price your part identically whether you set it or not, and nothing on the quote would tell you.

Two scopes appear together because they are indistinguishable by the time pricing sees them: grade keys are the ones you can state on your own materials and override on catalogue ones, and group keys are stated by the workpiece-material group and inherited by every grade on it that does not state its own.

The grade set is exactly what the write paths accept, and they accept nothing else: attributes on a grade or an override is a closed vocabulary, and an unknown key or an out-of-set verdict is refused rather than stored. A key that carries a closed set of verdicts — the route gates like laser_cuttable or weldability_class — lists them in values; a numeric key carries a unit instead and leaves values null.

Ordered: the wired attributes first, then the display-only ones, alphabetically within each.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

materials_list_overridesMaterials List Overrides
Read-onlyIdempotent
Inspect

List your organisation's material overrides, newest first: your own internal codes, trade names, notes and attributes on material grades.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

materials_list_standardsMaterials List Standards
Read-onlyIdempotent
Inspect

List the material standards that grade designations come from, with each standard's issuing body and region.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

materials_list_stock_formatsMaterials List Stock Formats
Read-onlyIdempotent
Inspect

The stock formats your organization prices with, its own first.

That is every format of your own plus each standard format you have not hidden. Every row says in resolution what calculations do with it.

The response is a plain array, so the page position travels in the Link (RFC 8288) and X-Next-Cursor / X-Has-More response headers.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoRead the list as it stood on this date (`YYYY-MM-DD`): the formats a calculation dated then prices with. Defaults to today (UTC).
kindNoWhich purchased stock form to list: `sheet`, `plate`, `bar` or `tube`. One kind per list.sheet
limitNoMaximum rows to return in one page.
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
offsetNoRows to skip. Superseded by `cursor`, which is stable under concurrent writes; kept for existing integrations. Bounded — past the cap, page with `cursor`.
include_suppressedNoAlso list the standard formats your organization has hidden, marked `suppressed`. Off by default, so the list is exactly the formats calculations price with.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThis page's rows, in the order and shape the REST list returns them.
has_moreYesFalse on the last page. Stop on this, never on a short page.
next_cursorYesPass as `cursor` to read the next page. Null on the last page.
materials_list_unmapped_designationsMaterials List Unmapped Designations
Read-onlyIdempotent
Inspect

Material designations your drawings carry that match no grade.

Every calculation that reads a material and cannot bind it records the designation here, with how often it has been seen and which parts carry it — so the gap is a short list to work through rather than a warning that reappears on every quote. Each entry brings ranked suggestions from the catalogue; map it and the designation resolves from the next calculation on.

Most-seen first.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
statusNoWhere an observed designation stands in the mapping queue.
materials_list_workpiece_groupsMaterials List Workpiece Groups
Read-onlyIdempotent
Inspect

List the workpiece material groups — the tree every grade's cutting data is keyed on.

Three levels: the ISO 513 application letter (P, M, K, N, S, H), a composition or structure subgroup beneath it, and a hardness-band leaf. A grade points at a leaf; when you register your own grade, pick the leaf that describes how it machines in the condition you buy it in — that choice, not the category alone, is what sets its cutting speeds and forces. Ordered by code, parents before children.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

materials_lookupMaterials Lookup
Read-onlyIdempotent
Inspect

Exact resolve of a material reference to a single canonical grade.

On a near-miss this still 404s (back-compat), but the error now carries up to five ranked candidates in its details so a caller can pick and retry without a second call. For a fuzzy 'did you mean' list that never dead-ends, use POST /materials/suggest instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesURN, EN/UNS/AISI/JIS code, trade name, or org internal code.
standardNoOptional hint — restrict alias search to this standard.
materials_lookup_batchMaterials Lookup Batch
Read-onlyIdempotent
Inspect

Bulk-resolve up to 100 queries in one round-trip.

Drawing analysis emits N candidate strings per part; the worker and the frontend typeahead both call this endpoint instead of N individual /lookup requests. Misses are returned in-band with result=null so callers can correlate hits/misses by position.

ParametersJSON Schema
NameRequiredDescriptionDefault
queriesYesMaterial query strings to resolve in one round-trip (1–100).
standardNoOptional hint applied to every query in the batch.
materials_map_unmapped_designationMaterials Map Unmapped Designation
Destructive
Inspect

Teach the catalogue what this designation means.

Give grade_id to point it at a grade you already have, or create_grade to register a new organization-private grade and map it in one step. Either way the designation is registered for your organization and binds from the next calculation on. When the text as it was read is not a designation the catalogue can register — it carries brackets, commas or other punctuation — give designation with the spelling to register instead.

Existing calculations are left exactly as they were priced — a quote you have already sent does not change under you. The parts that carry the designation come back in affected_part_ids; re-calculate the ones you want priced on the mapped grade.

ParametersJSON Schema
NameRequiredDescriptionDefault
grade_idNoIdentifier of the grade this designation means.
designationNoThe spelling to register, when the text as it was read cannot be one: letters, digits, dots and hyphens (spaces fold to hyphens). A queue entry like 'PVC (hart), grau' is mapped by giving the designation you want it to bind under, for example PVC-hart. Defaults to the text as read.
create_gradeNoDetails of a new organization-private grade to register and map the designation to.
observation_idYes
materials_pricing_coverageMaterials Pricing Coverage
Read-onlyIdempotent
Inspect

What every grade costs, and which environments set that price.

One round-trip for the master-data list: entries carries the €/kg of each grade an environment has its own rate for, and defaults carries the platform price per category that every other grade is charged at. Uses the same effective-dating / currency predicates as the calculation path, so the prices shown can never disagree with the price actually charged.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

materials_retire_stock_formatMaterials Retire Stock Format
DestructiveIdempotent
Inspect

Stop buying this format.

It closes today and stays readable by id, so calculations priced on it keep their numbers when they are run again. A format added today that no calculation has used yet is removed instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
format_idYes
materials_suggestMaterials Suggest
Read-onlyIdempotent
Inspect

Fuzzy material lookup that never dead-ends on a 404.

Resolves an exact canonical grade when the query is unambiguous, and ALWAYS returns ranked candidates — so a partial code ('S3040'), a trade name, or a generic term ('Stahl', 'stainless') gets a 'did you mean' list to pick from. Pass a candidate's urn back as material_ref to price against it.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum ranked candidates to return.
queryYesFree-form material text: a code, partial code, trade name, or generic term.
categoryNoOptional category filter for the candidates.
standardNoOptional standard hint applied to the exact-match pass.
materials_suppress_stock_formatMaterials Suppress Stock Format
Destructive
Inspect

Hide a standard format your shop doesn't buy, for your organization only.

Calculations stop pricing with it from today on; earlier calculations keep the formats they were priced with. The hide holds for the format, so it stays hidden when a newer version of it replaces this one. A format of your own is retired instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
format_idYes
materials_unsuppress_stock_formatMaterials Unsuppress Stock Format
Idempotent
Inspect

Show a standard format you had hidden.

Calculations price with it again from today on.

ParametersJSON Schema
NameRequiredDescriptionDefault
format_idYes
materials_update_org_gradeMaterials Update Org Grade
Destructive
Inspect

Partial update of an org-private grade. designation and category are immutable (both are baked into the URN); use is_active: false to retire a grade from pickers without deleting history.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoHuman-readable name of the material.
grade_idYes
is_activeNoSet false to retire the grade from pickers without deleting history.
attributesNoThe material statement for this grade: mechanical and physical figures (`yield_mpa`, `tensile_mpa`, `hardness_hb`, …) and the categorical route gates (`laser_cuttable`, `weldability_class`, `heat_treatable`, …). A closed vocabulary, not free-form: an unknown key or a verdict outside a gate's set is refused (422) rather than stored, because a key nothing reads and a misspelled one are indistinguishable on the quote. `GET /materials/attribute-vocabulary` lists every accepted key, its unit or its verdicts, and what the costing engine does with it.
density_kg_per_m3NoMaterial density in kilograms per cubic metre. Mind the unit: a value in g/cm³ is 1000x too small and is rejected.
iso_machining_groupNoISO 513 machining group (P/M/K/N/S/H).
workpiece_group_codeNoLeaf of the workpiece material tree the grade machines as (see `GET /materials/workpiece-groups`); an empty string clears it so the grade prices on its category's default cutting data again.
materials_update_overrideMaterials Update Override
Destructive
Inspect

Partial update. Only fields explicitly present in the body are applied — pass null to clear a field, omit to leave unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
urnNoCanonical or org-private URN identifying the material.
notesNoFree-text notes attached to this material by the organization.
attributesNoYour organization's material statement for this grade: mechanical and physical figures (`yield_mpa`, `tensile_mpa`, `hardness_hb`, …) and the categorical route gates (`laser_cuttable`, `weldability_class`, `heat_treatable`, …). A closed vocabulary, not free-form: an unknown key or a verdict outside a gate's set is refused (422) rather than stored, because a key nothing reads and a misspelled one are indistinguishable on the quote. `GET /materials/attribute-vocabulary` lists every accepted key, its unit or its verdicts, and what the costing engine does with it.
trade_nameNoVendor trade name for this material (e.g. 'Inconel 718').
override_idYes
internal_codeNoOrg-internal SKU or part code for this material.
material_grade_idNoIdentifier of the canonical grade this override extends; null when fully org-private.
materials_update_stock_formatMaterials Update Stock Format
Destructive
Inspect

Edit one of your own formats. Standard formats are not editable.

Changing the size, gauge band or material starts a new version: this one closes today, so calculations priced on it keep their numbers, and the response is the new version — a new id under the same key. A version that took effect today changes in place instead, unless a calculation has already been pinned to it or priced on it; a new label always changes in place. A value sent unchanged changes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
labelNoThe format's name, e.g. `GF 3000 × 1500`, as calculations and quotes show it. Invisible formatting is removed — direction controls and zero-width characters — and a name with nothing left to read is refused.
wall_mmNo
width_mmNo
format_idYes
length_mmNo
diameter_mmNo
gauge_max_mmNo
gauge_min_mmNo
thickness_mmNo
material_categoryNo
materials_upsert_grade_overrideMaterials Upsert Grade Override
DestructiveIdempotent
Inspect

Upsert your organization's master-data layer for a grade.

Creates the org's override row for the grade when none exists, otherwise updates it in place. Identification fields (internal_code, trade_name, notes) follow patch semantics — only keys present in the body are touched, null clears. properties is validated against the closed vocabulary (strength, hardness, elongation, Charpy toughness per test temperature, stiffness, thermal conductivity, melting point, carbon equivalent — every key sanity-ranged in its own unit); a numeric value overrides the catalogue figure, null clears your override so the catalogue figure applies again.

Property overrides are quoting/display master data — they do NOT change the physics inputs (density, ISO 513 group stay canonical) and they do NOT change €/kg (that lives in the environment rates).

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoFree-text notes attached to this material by the organization; null clears them.
grade_idYes
propertiesNoProperty overrides keyed by the closed vocabulary — strength (yield_mpa, tensile_mpa), hardness (hardness_hb, hardness_hrc), ductility (elongation_pct), toughness (charpy_j_20c … charpy_j_m50c), stiffness and thermal (elastic_modulus_gpa, thermal_conductivity_w_mk, melting_point_c) and weldability (carbon_equivalent_ceq). A numeric value overrides the catalogue figure; null clears your override so the catalogue figure applies again. Keys not mentioned are left unchanged.
trade_nameNoVendor trade name (e.g. 'Inconel 718'); null clears it.
internal_codeNoOrg-internal SKU / part code for this material; null clears it.
parts_create_partParts Create Part
Destructive
Inspect

Create a part, identified by its part number. Every new part starts with revision "A". A part number that is already taken answers 409 with the existing part's id, so you can use that part instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
base_uomNoBase unit of measure for the part (ISO unit code, e.g. EA, KG, M).EA
folder_idNoID of the workspace folder this part is filed in; null is unfiled.
attributesNoFree-form key/value metadata for the part.
descriptionNoHuman-readable description of the part.
make_or_buyNoWhether the part is manufactured in-house or purchased.make
part_numberYesStable identifier (≈ SAP MATNR). Unique per org.
lead_time_daysNoExpected lead time to obtain the part, in days.
purchase_priceNoPurchase price per piece for a bought part, in the part's default currency. Used as the quote for parts marked 'buy'; leave empty to receive a material-floor estimate flagged for review.
default_currencyNoDefault currency for the part's pricing (ISO 4217 code, e.g. EUR, USD).EUR
procurement_typeNoHow the part is sourced (e.g. in-house production or external supplier) — a label to filter the parts list by and to sync with your ERP. It does not change a price: whether a part is priced as bought or made follows make_or_buy.in_house
classification_idNoID of the classification category this part belongs to, if any.
parts_create_revisionParts Create Revision
Destructive
Inspect

Add a revision to a part under a new revision code, for a design change that should be priced on its own. A code the part already has answers 409 with that revision's id.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
attributesNoFree-form key/value metadata for the revision.
revision_codeYesCustomer-facing revision label (A, B, 01, 02, …).
change_request_idNoID of the change request that triggered this revision, if any.
parent_revision_idNoID of the revision this one was derived from, recording its lineage.
parts_delete_partParts Delete Part
DestructiveIdempotent
Inspect

Delete a part together with its revisions and the calculations priced from it. This cannot be undone. To remove a single version, delete that revision instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
parts_delete_revisionParts Delete Revision
DestructiveIdempotent
Inspect

Delete one revision of a part. This cannot be undone; the part and its other revisions remain.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
revision_idYes
parts_get_partParts Get Part
Read-onlyIdempotent
Inspect

Read one part by id: its part number, description, make-or-buy and procurement fields, folder, classification and attributes.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
parts_get_revisionParts Get Revision
Read-onlyIdempotent
Inspect

Read one revision of a part: its revision code, the revision it derives from, and its attributes.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
revision_idYes
parts_list_partsParts List Parts
Read-onlyIdempotent
Inspect

List the organization's parts, newest first.

count is the total across all pages. Page with cursor rather than offset when parts may be created while you walk — offset counts from the start of the result set, so a concurrent insert shifts every later page and rows get skipped or repeated.

ParametersJSON Schema
NameRequiredDescriptionDefault
qNoSubstring match
sortNoOrdering key. `unit_cost` and `annual_spend` rank by the newest succeeded calculation per part; parts with no successful calculation always sort last, whatever the direction. `created_at`, `updated_at` and `part_number` support `cursor`; the other three page by `offset` only, because their column is nullable or joined and a cursor over it cannot reach every row.created_at
limitNoMaximum rows to return in one page.
orderNoSort direction over the collection's ordering key. Use `asc` to reconcile a batch: rows come oldest-first, so work created while you page lands after your position instead of shifting rows under it.desc
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
offsetNoRows to skip. Superseded by `cursor`, which is stable under concurrent writes; kept for existing integrations. Bounded — past the cap, page with `cursor`.
quotedNotrue → only parts with at least one succeeded calculation; false → only parts that have never been priced.
unfiledNoOnly parts not filed in any folder (folder_id IS NULL).
folder_idNoOnly parts filed directly in this folder (excludes subfolders).
make_or_buyNoOnly parts sourced this way. Repeatable — several values are OR-ed, so passing every value is the same as passing none.
created_afterNoOnly rows created at or after this instant (RFC 3339, e.g. `2026-07-20T09:00:00Z`). Inclusive.
created_beforeNoOnly rows created strictly before this instant (RFC 3339). Exclusive, so an `after`/`before` pair tiles a range without overlap.
include_facetsNoAlso return `facets`: the values available for each filter with their counts, computed over everything the OTHER active filters allow. Lets a client show counts and grey out choices that would return nothing.
procurement_typeNoOnly parts with one of these procurement types.
classification_idNo
material_grade_idNoOnly parts whose NEWEST succeeded calculation used one of these material grades. A part carries no material of its own — the material is chosen per calculation — so this filters on the last run. Repeatable; several values are OR-ed.
include_assembly_componentsNoAlso list the piece-parts that an assembly decomposition created. They are catalogue entries like any other and stay reachable by id, but nobody uploaded them — by default this list shows the parts a person actually put there, so a 29-body weldment adds one row, not thirty. Asking for the Assembly components folder lists them anyway: that folder's rows are those parts, and its count includes them.
parts_list_revisionsParts List Revisions
Read-onlyIdempotent
Inspect

List a part's revisions, newest first.

count is the total across all pages; data is one page of it.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return in one page.
orderNoSort direction over the collection's ordering key. Use `asc` to reconcile a batch: rows come oldest-first, so work created while you page lands after your position instead of shifting rows under it.desc
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
part_idYes
created_afterNoOnly rows created at or after this instant (RFC 3339, e.g. `2026-07-20T09:00:00Z`). Inclusive.
created_beforeNoOnly rows created strictly before this instant (RFC 3339). Exclusive, so an `after`/`before` pair tiles a range without overlap.
parts_part_faces_urlParts Part Faces Url
Read-onlyIdempotent
Inspect

Per-face-tagged glTF (cost-driver heatmap model) for a Part.

Same dataset-resolution + {url, status} contract as /parts/{id}/preview-url but serves faces_glb_storage_key — the model where every B-rep face is its own primitive tagged with face_uuid. Only produced for STEP inputs; the frontend falls back to the opaque preview when url is None.

part_revision_id (optional query param) pins resolution to a specific revision so the heatmap's face_uuids line up with the cost drivers from a calc on THAT revision. Without it, the newest revision's dataset is served (a re-upload after the calc would otherwise blank the heatmap — the GLB's face_uuids would derive from different STEP bytes than the drivers).

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
part_revision_idNo
parts_part_preview_urlParts Part Preview Url
Read-onlyIdempotent
Inspect

Engine-agnostic GLB preview for a Part.

Resolves the part's most-recent revision's primary CAD dataset and hands back a presigned URL for its glTF/GLB. The frontend uses this on the parts overview and part detail pages so the 3D model is surfaced before any calculation has run.

Returns {url, status} (status semantics match /datasets/{ds_id}/preview-url). The frontend treats the same payload identically across all surfaces — that is the "globally unified" 3D preview contract.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
parts_part_preview_urls_batchParts Part Preview Urls Batch
Read-onlyIdempotent
Inspect

Presign the previews for many parts in ONE request.

A list view needs a thumbnail per row, and the per-part endpoint made that one HTTP call per row: a 50-row page fired 35 of them, which on the Free tier (60 weighted calls/minute) exhausted the whole budget on a single page load — the tail 429'd, the thumbnails broke, and the client's expired-URL retry turned that into a loop. Measured on production 2026-07-28.

Same payload per part as GET /{part_id}/preview-url, keyed by part id. An id the caller cannot see is simply absent from the response rather than 404-ing the batch, so one stale row in a list never blanks the rest.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idsYesParts to resolve preview URLs for. Ask only for the rows you are about to render.
parts_resolve_part_numbersParts Resolve Part Numbers
Read-onlyIdempotent
Inspect

Read-only pre-flight for a bulk upload: given the part numbers you are about to send, says which already exist in this workspace, where each one currently lives, and what it last cost — so a conflict can be resolved by the user BEFORE the first byte is uploaded and before anything is metered. No side effects.

ParametersJSON Schema
NameRequiredDescriptionDefault
folder_idNoThe folder you intend to upload into, if any.
part_numbersYesCandidate part numbers, exactly as they will be sent to ``/calculations/upload-and-quote``. They are matched verbatim — see the endpoint description for why nothing is normalised here.
parts_update_partParts Update Part
Destructive
Inspect

Change a part's description, make-or-buy and procurement fields, folder, classification or attributes. Only the fields you send change; the part number stays fixed.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
base_uomNoBase unit of measure for the part (ISO unit code, e.g. EA, KG, M).
folder_idNoID of the workspace folder this part is filed in; null is unfiled.
attributesNoFree-form key/value metadata for the part.
descriptionNoHuman-readable description of the part.
make_or_buyNoWhether the part is manufactured in-house or purchased.
lead_time_daysNoExpected lead time to obtain the part, in days.
purchase_priceNoPurchase price per piece for a bought part, in the part's default currency.
default_currencyNoDefault currency for the part's pricing (ISO 4217 code, e.g. EUR, USD).
procurement_typeNoHow the part is sourced (e.g. in-house production or external supplier).
classification_idNoID of the classification category this part belongs to, if any.
parts_update_revisionParts Update Revision
Destructive
Inspect

Change a revision's attributes. The revision code stays fixed.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_idYes
attributesNoFree-form metadata to merge onto the revision, as a JSON object.
revision_idYes
subcontractors_create_subcontractorSubcontractors Create Subcontractor
Destructive
Inspect

Add a subcontractor to your organization.

lead_time_days is stored for planning surfaces; prices are unaffected. Capabilities say which external operations this shop offers — a costing environment that prices an operation none of its member subcontractors offer carries a subcontract_unsourced note on the result (never a veto).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe shop you order from.
notesNo
regionNoRegion / city, free text.
is_activeNoInactive subcontractors keep their history but stop counting as a source.
capabilitiesNo
lead_time_daysNoTypical door-to-door lead time. Stored for planning surfaces; prices are unaffected.
subcontractors_delete_subcontractorSubcontractors Delete Subcontractor
DestructiveIdempotent
Inspect

Remove a subcontractor. Its environment memberships go with it; rate rows that named it keep their price and lose only the name (provenance FK is SET NULL — a price you entered stays a price).

ParametersJSON Schema
NameRequiredDescriptionDefault
sub_idYes
subcontractors_list_subcontractorsSubcontractors List Subcontractors
Read-onlyIdempotent
Inspect

Your organization's subcontractors, name order — the platform presets (hardening, plating, galvanizing, anodizing, painting, marking; preset_key set) and your own.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

subcontractors_suppress_subcontractor_presetSubcontractors Suppress Subcontractor Preset
Destructive
Inspect

Hide a platform subcontractor preset ("I don't buy this in"): it leaves the default environment (SCD2) and stays out of it until shown again or the platform set is restored. Your own subcontractors are deleted, not hidden.

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
preset_keyYes
subcontractors_unsuppress_subcontractor_presetSubcontractors Unsuppress Subcontractor Preset
Idempotent
Inspect

Show a hidden preset again — it rejoins the default environment (a new membership row; the closed one keeps its window).

ParametersJSON Schema
NameRequiredDescriptionDefault
preset_keyYes
subcontractors_update_subcontractorSubcontractors Update Subcontractor
Destructive
Inspect

Edit a subcontractor's identity, lead time, or capabilities.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo
notesNo
regionNo
sub_idYes
is_activeNo
capabilitiesNo
lead_time_daysNo
tools_adopt_catalogue_itemTools Adopt Catalogue Item
Destructive
Inspect

Adopt an article into your crib — the machine-library instantiate move: the instance is yours to rename, re-spec and price; the article stays untouched and catalogue_item_id records the lineage.

Adopting an article you already have returns the tool you have — never a second copy, and never renamed — and still attaches it to the environments you name.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName for your instance, used only when this call creates it; defaults to the article's. If you already own this article, adopting returns the tool you have and leaves its name alone — a name you chose is never overwritten. Rename it with PATCH /tools/{tool_id}.
item_idYes
attach_to_environment_idsNoCosting environments the adopted tool joins. Omit to let a newly created instance join every current environment; [] to attach nowhere. An environment you do not own is not found. If you already own this article, the environments you name here are joined and every other one is left as it is — adopting again never puts a tool back into an environment you took it out of.
tools_copy_toolTools Copy Tool
Destructive
Inspect

Duplicate one of your own tools into a new tool of your own.

The copy takes the source's geometry, economics, kind-specific properties and cutting data, under a name of its own — " (copy)". The source is untouched.

The copy is your tool, not a platform one: you can delete it, and it is not part of the platform set, so hiding a platform article or restoring the platform set never touches it. It also joins no costing environment on its own — attach it where you want it to price with POST /environments/{env_id}/tools. To install a platform article instead, use POST /tools/catalogue-items/{item_id}/adopt: an adopted tool keeps its link to the article, and this one does not.

ParametersJSON Schema
NameRequiredDescriptionDefault
tool_idYes
tools_create_toolTools Create Tool
Destructive
Inspect

Add a tool to your organization's library, optionally with its per-material cutting data.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindYesTool kind (VDI 2852 class), e.g. end_mill or drill.
nameYesHuman-readable name of the tool.
specNoKind-specific properties — e.g. a press-brake die's V opening and load rating, a saw blade's kerf and pitch, a plasma consumable set's amperage. Validated per kind; empty for rotating cutters, whose geometry uses the fields above.
notesNoFree-form shop notes.
teethNoNumber of cutting edges / flutes / blade teeth.
vendorNoTool manufacturer / vendor.
coatingNoCoating designation (e.g. TiAlN), if any.
item_noNoVendor item / order number.
price_eurNoReplacement price, in EUR.
parametersNoOptional cutting-data rows to create with the tool — one row per parameter, keyed (material, operation, size, quality).
diameter_mmNoCutting diameter, in millimetres (null for turning inserts).
tool_life_minNoExpected tool life in cutting minutes (per edge set).
cutting_materialNoCutting-material class (HSS, carbide, coated carbide, ...).carbide
attach_to_environment_idsNoCosting environments the new tool joins (D7 — membership is always explicit). Omit for the documented default: every current environment of your organization. Send [] to attach nowhere (the tool exists in the crib but prices nothing until attached).
tools_delete_toolTools Delete Tool
DestructiveIdempotent
Inspect

Retire a tool (SCD2, 0141): the row closes its validity window so a replay of an old calculation still sees it, and its active environment memberships close with it. A tool created and retired the same day is hard-deleted (a zero-length window would still read as active today). Environment cutting-data overrides already applied from it are independent statements of shop practice and stay in force.

ParametersJSON Schema
NameRequiredDescriptionDefault
tool_idYes
tools_get_toolTools Get Tool
Read-onlyIdempotent
Inspect

Fetch one tool with its per-material cutting data.

ParametersJSON Schema
NameRequiredDescriptionDefault
tool_idYes
tools_list_catalogue_itemsTools List Catalogue Items
Read-onlyIdempotent
Inspect

The tool catalogue — platform articles plus your own type definitions (0141 split; the machine-library sibling).

Every article stays visible after adoption: adopted_tool_id names your crib instance so the UI can show "in your crib" and a diff-vs-article, instead of silently hiding adopted presets. suppressed marks articles you chose to hide (a per-org preference, never a delete — platform rows are read-only at the database).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

tools_list_toolsTools List Tools
Read-onlyIdempotent
Inspect

Your organization's tool library, name-ordered, with each tool's per-material cutting data inlined.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return in one page.
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
offsetNoRows to skip. Superseded by `cursor`, which is stable under concurrent writes; kept for existing integrations. Bounded — past the cap, page with `cursor`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThis page's rows, in the order and shape the REST list returns them.
has_moreYesFalse on the last page. Stop on this, never on a short page.
next_cursorYesPass as `cursor` to read the next page. Null on the last page.
tools_reset_tool_to_articleTools Reset Tool To Article
Destructive
Inspect

Reset a platform-lineage tool to its article's values ("Reset to platform values"): geometry, economics, cutting material, spec, name and notes come back from the article; the tool's own cutting-data rows and its environment memberships are untouched. A custom tool (no article) has nothing to reset to → 409.

ParametersJSON Schema
NameRequiredDescriptionDefault
tool_idYes
tools_suppress_catalogue_itemTools Suppress Catalogue Item
Destructive
Inspect

Hide a platform article from your catalogue view — a per-org preference, not a delete (M5).

ParametersJSON Schema
NameRequiredDescriptionDefault
reasonNo
item_idYes
tools_tool_catalogueTools Tool Catalogue
Read-onlyIdempotent
Inspect

The closed vocabulary for tools and cutting data — tool kinds, cutting materials, canonical material bins and parameter windows.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

tools_unsuppress_catalogue_itemTools Unsuppress Catalogue Item
Idempotent
Inspect

Show a platform tool-catalogue article again that you had hidden, so it is offered for selection once more.

ParametersJSON Schema
NameRequiredDescriptionDefault
item_idYes
tools_update_toolTools Update Tool
Destructive
Inspect

Edit a tool's identity / geometry / economics fields.

Every field but the bookkeeping ones (vendor, item number, coating, notes) can change what this tool costs you, so editing one takes effect immediately in every costing environment the tool is attached to.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
nameNo
specNoKind-specific properties; validated against the (possibly changed) kind. When you change a tool's kind, send the spec for the NEW kind in the same request — the old kind's spec does not carry over.
notesNo
teethNo
vendorNo
coatingNo
item_noNo
tool_idYes
price_eurNo
diameter_mmNo
tool_life_minNo
cutting_materialNo
if_unmodified_sinceNoOptimistic concurrency. Send the `updated_at` you last read; the write is refused with 409 if the tool changed since. Omit to write unconditionally (last write wins).
uploads_bulk_cancel_uploadsUploads Bulk Cancel Uploads
Destructive
Inspect

Cancel many pending uploads at once.

Per-row failures are reported in skipped so the UI can render a summary toast — the whole batch isn't rolled back if a single id is already confirmed. The batch size is capped on BulkUploadIds.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesUpload (data source) IDs to cancel or retry in bulk (1–200).
uploads_bulk_delete_uploadsUploads Bulk Delete Uploads
Destructive
Inspect

Delete many uploads at once.

Mirrors bulk-cancel: per-row failures land in skipped instead of rolling back the batch; the batch size is capped on BulkUploadIds.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesUpload (data source) IDs to cancel or retry in bulk (1–200).
uploads_bulk_retry_uploadsUploads Bulk Retry Uploads
Destructive
Inspect

Re-queue processing for several uploads at once, for example after a failure. Uploads that cannot be retried or are busy are listed in skipped with the reason.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesUpload (data source) IDs to cancel or retry in bulk (1–200).
uploads_cancel_uploadUploads Cancel Upload
Destructive
Inspect

Mark a pending upload as cancelled.

Idempotent for already-cancelled rows; rejects rows that have moved past pending since cancelling a confirmed file would silently delete a valid artefact.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_source_idYes
uploads_confirmUploads Confirm
Destructive
Inspect

Finish a direct upload once the file is sent: checks and keeps it.

Answers the upload's id and its status. The file is checked after this call answers, so a first confirm answers pending; the upload can be attached to a part revision (POST /parts/{part_id}/revisions/{revision_id}/datasets) once it is confirmed. Confirming again is safe and answers the current status. A confirm before the file has arrived answers 409 upload_not_received (send the file the way presign's method says, then confirm again); an upload that was refused, could not be checked or was cancelled answers 409 upload_rejected, upload_failed or upload_cancelled.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_source_idYesUUID of the presigned upload to validate and ingest.
uploads_delete_uploadUploads Delete Upload
DestructiveIdempotent
Inspect

Delete an upload: storage object (best-effort) plus the row.

part_revision_dataset.data_source_id carries ondelete=CASCADE, so any part/revision attachments of this file are removed with it — the UI warns about exactly that before calling here. An upload URL cannot be revoked: a file still sent through it after the delete is removed once the URL has expired.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_source_idYes
uploads_download_urlUploads Download Url
Read-onlyIdempotent
Inspect

Get a short-lived link to download the original file of a processed upload. An upload that is still processing or failed answers 404.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_source_idYes
uploads_list_uploadsUploads List Uploads
Read-onlyIdempotent
Inspect

List the org's uploads, newest first, hiding cancelled rows by default.

Cancelled uploads are useless — the file may have been written to storage but the download endpoint refuses to serve it (status gate is confirmed only). They just clutter the picker, so the UI gets them filtered out unless an admin explicitly opts in via ?include_cancelled=true (e.g. for an audit view).

The response is a plain array, so the page position travels in the Link (RFC 8288) and X-Next-Cursor / X-Has-More response headers: follow Link rel="next" until it stops being sent.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return in one page.
orderNoSort direction over the collection's ordering key. Use `asc` to reconcile a batch: rows come oldest-first, so work created while you page lands after your position instead of shifting rows under it.desc
cursorNoOpaque position token from the previous page's `next_cursor` (or the `Link` / `X-Next-Cursor` response header). Omit it for the first page. Keep every other query parameter identical for the whole walk — a cursor replayed against different filters is rejected.
created_afterNoOnly rows created at or after this instant (RFC 3339, e.g. `2026-07-20T09:00:00Z`). Inclusive.
created_beforeNoOnly rows created strictly before this instant (RFC 3339). Exclusive, so an `after`/`before` pair tiles a range without overlap.
include_cancelledNoInclude cancelled uploads in the list (hidden by default).

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThis page's rows, in the order and shape the REST list returns them.
has_moreYesFalse on the last page. Stop on this, never on a short page.
next_cursorYesPass as `cursor` to read the next page. Null on the last page.
uploads_presignUploads Presign
Destructive
Inspect

Start a direct file upload: answers where and how to send the file.

Send the file to url the way method says — PUT: the raw bytes as the body, with the headers named; POST: a multipart form with every fields entry, then the file as the last field, named file — and then call POST /uploads/confirm. Until it is confirmed, the upload reserves its declared size_bytes (the most its file type allows, when none is declared) of the plan's storage; if url expires with no file sent, the reservation is released. This is the upload path for a file of any size, and the one a client that can only send JSON (every MCP client) uses: the multipart upload routes cannot carry a file in a JSON argument.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesOriginal filename of the file to upload.
size_bytesNoSize of the file in bytes, if known. Until the upload is confirmed it reserves this much of the plan's storage (the most its file type allows, when omitted), and a larger file is refused.
content_typeNoMIME type of the file (e.g. application/pdf).
uploads_retry_uploadUploads Retry Upload
Destructive
Inspect

Re-queue the confirm worker for a non-confirmed upload.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_source_idYes
uploads_update_uploadUploads Update Upload
Destructive
Inspect

Rename an upload and/or move it to a folder.

The folder lives in metadata_json["folder"] — sending folder: null clears it, omitting the field leaves it untouched (model_fields_set distinguishes the two). Renaming changes the display name only; the storage key is immutable once presigned.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoNew filename for the upload; omit to keep the current name.
folderNoFolder name to file this upload under; null clears the folder.
data_source_idYes

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 212 tool updates
    • First observedarcnm_apply_adjustment
    • First observedarcnm_check_quota
    • First observedarcnm_compare_calculations
    • First observedarcnm_compare_environments
    • First observedarcnm_cost_breakdown
    • First observedarcnm_cost_drivers
    • First observedarcnm_cost_factors
    • First observedarcnm_explain_cost
    • First observedarcnm_nest_run_cancel
    • First observedarcnm_nest_run_create
    • First observedarcnm_nest_run_export
    • First observedarcnm_nest_run_result
    • First observedarcnm_nest_run_start
    • First observedarcnm_nest_run_status
    • First observedarcnm_nest_savings
    • First observedarcnm_nesting_read
    • First observedarcnm_optimization_directions
    • First observedarcnm_optimize_lot_size
    • First observedarcnm_preview_cost
    • First observedarcnm_process_plan
    • First observedarcnm_rank_calculations
    • First observedarcnm_sheet_nest_export
    • First observedcalculations_assign_assembly_drawing
    • First observedcalculations_batch_calculate
    • First observedcalculations_batch_comparison
    • First observedcalculations_batch_comparison_components
    • First observedcalculations_bulk_cancel_calculations
    • First observedcalculations_bulk_delete_calculations
    • First observedcalculations_bulk_retry_calculations
    • First observedcalculations_cancel_batch
    • First observedcalculations_cancel_calculation
    • First observedcalculations_compare_environment_runs
    • First observedcalculations_create_calculation
    • First observedcalculations_create_cost_scenario
    • First observedcalculations_delete_calculation
    • First observedcalculations_delete_cost_scenario
    • First observedcalculations_get_calculation
    • First observedcalculations_get_calculation_assembly_route
    • First observedcalculations_get_calculation_bom
    • First observedcalculations_get_calculation_capacity
    • First observedcalculations_get_calculation_optimization
    • First observedcalculations_get_cost_sheet
    • First observedcalculations_get_entitlement
    • First observedcalculations_list_calculations
    • First observedcalculations_list_cost_scenarios
    • First observedcalculations_patch_assembly_component
    • First observedcalculations_patch_calculation_material
    • First observedcalculations_preview_cost
    • First observedcalculations_quote
    • First observedcalculations_run_calculation
    • First observedcalculations_update_cost_scenario
    • First observedcalculations_upload_and_quote_json
    • First observedcalibration_auto_calibrate_environment
    • First observedcalibration_auto_calibrate_from_erp
    • First observedcalibration_calibrate_selection_policy
    • First observedcalibration_deactivate_environment
    • First observedcalibration_environment_report
    • First observedcalibration_environment_run_history
    • First observedcalibration_environment_status
    • First observedcalibration_erp_preflight
    • First observedcalibration_finalize_environment
    • First observedcalibration_fit_learning_curve
    • First observedcalibration_import_calibrate
    • First observedcalibration_import_create
    • First observedcalibration_import_status
    • First observedcalibration_ingest_environment_outcomes
    • First observedcalibration_next_best_evidence
    • First observedcalibration_revert_environment_run
    • First observedcalibration_teach_environment
    • First observeddatasets_attach_dataset
    • First observeddatasets_detach_dataset
    • First observeddatasets_list_datasets
    • First observeddatasets_update_dataset
    • First observedenvironments_attach_env_subcontractor
    • First observedenvironments_attach_env_tool
    • First observedenvironments_attach_machine
    • First observedenvironments_clone_environment
    • First observedenvironments_clone_preset
    • First observedenvironments_create_environment
    • First observedenvironments_delete_environment
    • First observedenvironments_delete_rate
    • First observedenvironments_detach_env_subcontractor
    • First observedenvironments_detach_env_tool
    • First observedenvironments_detach_machine
    • First observedenvironments_economics_update
    • First observedenvironments_get_calculation_tuning
    • First observedenvironments_get_environment
    • First observedenvironments_get_environment_audit
    • First observedenvironments_get_environment_factors
    • First observedenvironments_get_individualization
    • First observedenvironments_get_shop_practice
    • First observedenvironments_list_env_machines
    • First observedenvironments_list_env_subcontractors
    • First observedenvironments_list_env_tools
    • First observedenvironments_list_environments
    • First observedenvironments_list_presets
    • First observedenvironments_list_rates
    • First observedenvironments_list_surcharge_presets
    • First observedenvironments_material_price_clear
    • First observedenvironments_material_price_set
    • First observedenvironments_restore_env_machines
    • First observedenvironments_restore_env_rates
    • First observedenvironments_restore_env_subcontractors
    • First observedenvironments_restore_env_tools
    • First observedenvironments_scrap_price_clear
    • First observedenvironments_scrap_price_set
    • First observedenvironments_scrap_prices
    • First observedenvironments_subcontract_price_set
    • First observedenvironments_update_calculation_tuning
    • First observedenvironments_update_env_subcontractor_membership
    • First observedenvironments_update_env_tool_membership
    • First observedenvironments_update_environment_identity
    • First observedenvironments_update_membership
    • First observedenvironments_update_shop_practice
    • First observedenvironments_upsert_rate
    • First observedfolders_create_folder
    • First observedfolders_delete_folder
    • First observedfolders_folder_summary
    • First observedfolders_get_folder
    • First observedfolders_list_folders
    • First observedfolders_move_parts
    • First observedfolders_update_folder
    • First observedfolders_workspace_summary
    • First observedgeometry_part_revision_drawing_url
    • First observedgeometry_part_revision_faces_url
    • First observedimport_preview_machine_import
    • First observedimport_preview_tool_import
    • First observedmachine_library_create_library_entry
    • First observedmachine_library_delete_library_entry
    • First observedmachine_library_get_library_entry
    • First observedmachine_library_library_usage
    • First observedmachine_library_list_library
    • First observedmachine_library_rate_calculator
    • First observedmachine_library_update_library_entry
    • First observedmachines_get_machine
    • First observedmachines_get_machine_usage
    • First observedmachines_update_machine
    • First observedmaterials_create_grade_designation
    • First observedmaterials_create_org_grade
    • First observedmaterials_create_override
    • First observedmaterials_create_stock_format
    • First observedmaterials_delete_designation
    • First observedmaterials_delete_org_grade
    • First observedmaterials_delete_override
    • First observedmaterials_get_grade
    • First observedmaterials_get_grade_by_urn
    • First observedmaterials_get_grade_master
    • First observedmaterials_get_stock_format
    • First observedmaterials_ignore_unmapped_designation
    • First observedmaterials_list_grade_designations
    • First observedmaterials_list_grades
    • First observedmaterials_list_material_attribute_vocabulary
    • First observedmaterials_list_overrides
    • First observedmaterials_list_standards
    • First observedmaterials_list_stock_formats
    • First observedmaterials_list_unmapped_designations
    • First observedmaterials_list_workpiece_groups
    • First observedmaterials_lookup
    • First observedmaterials_lookup_batch
    • First observedmaterials_map_unmapped_designation
    • First observedmaterials_pricing_coverage
    • First observedmaterials_retire_stock_format
    • First observedmaterials_suggest
    • First observedmaterials_suppress_stock_format
    • First observedmaterials_unsuppress_stock_format
    • First observedmaterials_update_org_grade
    • First observedmaterials_update_override
    • First observedmaterials_update_stock_format
    • First observedmaterials_upsert_grade_override
    • First observedparts_create_part
    • First observedparts_create_revision
    • First observedparts_delete_part
    • First observedparts_delete_revision
    • First observedparts_get_part
    • First observedparts_get_revision
    • First observedparts_list_parts
    • First observedparts_list_revisions
    • First observedparts_part_faces_url
    • First observedparts_part_preview_url
    • First observedparts_part_preview_urls_batch
    • First observedparts_resolve_part_numbers
    • First observedparts_update_part
    • First observedparts_update_revision
    • First observedsubcontractors_create_subcontractor
    • First observedsubcontractors_delete_subcontractor
    • First observedsubcontractors_list_subcontractors
    • First observedsubcontractors_suppress_subcontractor_preset
    • First observedsubcontractors_unsuppress_subcontractor_preset
    • First observedsubcontractors_update_subcontractor
    • First observedtools_adopt_catalogue_item
    • First observedtools_copy_tool
    • First observedtools_create_tool
    • First observedtools_delete_tool
    • First observedtools_get_tool
    • First observedtools_list_catalogue_items
    • First observedtools_list_tools
    • First observedtools_reset_tool_to_article
    • First observedtools_suppress_catalogue_item
    • First observedtools_tool_catalogue
    • First observedtools_unsuppress_catalogue_item
    • First observedtools_update_tool
    • First observeduploads_bulk_cancel_uploads
    • First observeduploads_bulk_delete_uploads
    • First observeduploads_bulk_retry_uploads
    • First observeduploads_cancel_upload
    • First observeduploads_confirm
    • First observeduploads_delete_upload
    • First observeduploads_download_url
    • First observeduploads_list_uploads
    • First observeduploads_presign
    • First observeduploads_retry_upload
    • First observeduploads_update_upload

Publisher details

Operator
rattle mng GmbH (ARCNM), Überlingen, Germany · Publisher source
Vendor relationship
First-party · Publisher source
Trust center
Not available
Restrictions
Requires an ARCNM account; the Free plan works (10 calculations a month, no card). Starting a calculation uses the plan's calculation quota. The nesting tools need the Nesting add-on. · Publisher source

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Intelligently generates cost estimates and lead times for manufacturing RFPs by parsing requests, matching against historical quotes, and calculating activity-based costs with confidence scoring and human approval workflows.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    An MCP server designed to automate tender and RFQ pricing by extracting requirements from documents and building structured pricing models. It enables users to calculate final costs, compare market rates, and generate styled HTML pricing reports for PDF export.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables real finite element analysis from natural language: accepts STEP geometry and plain-English questions, validates setups deterministically, meshes and solves with CalculiX on Modal, and returns engineering verdicts (stress, safety factor, deflection, modal frequencies) with rendered plots and an interactive 3D viewer.
    1
    Apache 2.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources