ARCNM

Building blocks

Pricing & billing

Subscription tiers, the single extraction meter, flat overage, pay-on-200 and rollover — what counts as a billable extraction, and what never costs anything.

ARCNM is a subscription API with a single meter — extractions. You pick a tier, get a monthly (or annual) included quota, and any usage beyond it bills at a flat per-extraction overage rate. There are no credit packs and no per-call price to budget: one meter, one rate. The same meter and the same rate apply whichever side of the quote you are on — a buyer asking what a part should cost and a shop pricing the RFQ it answers make the identical engine call. The rules:

  1. One meter. 1 part in 1 environment = 1 extraction. A single-component file (3D CAD or 2D drawing, ≤ 10 MB) costs exactly one extraction. No multipliers, no file-size brackets. A multi-environment run meters one extraction per (part × environment) cell — 7 parts compared across 4 environments is 28 extractions, and the Run button / batch response tells you the cell count before anything is charged. A grid the remaining quota can't cover never runs in part: /calculations/batch rejects it whole (402 quota_exceeded with cells_requested/cells_available), while /quote and /upload-and-quote save the grid's cells parked blocked first — their 402's details also carry batch_id and parked_cells, so after a top-up you resume that batch (/calculations/bulk-retry or per-cell /run) instead of paying to submit it again.
  2. Billed on success. Failed runs, 4xx/5xx responses, and idempotent cache hits cost nothing — they never draw down your included quota or trigger overage.
  3. Flat overage, no surprise upgrades. Run past your included quota and the extras bill at your tier's flat per-extraction rate. You're never force-upgraded mid-cycle. That rate is drawn from your prepaid balance on every plan, so the balance is the ceiling and there is no surprise invoice. An Enterprise agreement can contract invoice terms in arrears instead.
  4. Rollover. Unused included extractions roll one month forward, then expire. Rollover applies only while the subscription is active — rolled extractions are forfeited on cancellation (and the cancel flow tells you so before you confirm).
  5. No double billing (dedup). Re-running the identical part in the same environment with the same configuration within the same billing month is served from the first succeeded result — instant, and never billed again — whichever upload route stored the file. A different environment, a changed configuration, a rate/fleet edit to the environment, or a correction saved to the part makes it a genuinely new (billable) calculation. This applies per cell in a multi-environment run: re-submitting an identical grid answers every unchanged, already-succeeded cell from cache for free (served_from_cache in the batch response), and a fully cached grid is served even when you're over quota — cached answers never need allowance. Cells still running aren't cached yet, so retry an in-flight grid with an Idempotency-Key, not by re-submitting it.

For current rates, see arcnm.io/pricing. The tiers below are the canonical summary (EUR).

Tier Base Included Overage / extraction Seats Environments / fleets Calibration runs Storage Rate limit Audience
Free €0/mo 10 / mo €1.49 (prepaid) 1 2 / 2 1 / mo 1 GB 60 / min evaluating, on your own parts
Pro €199/mo 300 / mo €0.99 unlimited 5 / 5 unlimited 50 GB 300 / min one buying or quoting team
Scale €1,199/mo 2,500 / mo €0.79 unlimited 30 / 30 unlimited 250 GB 600 / min procurement groups, quoting desks, platforms
Enterprise custom terms¹ custom¹ custom¹ unlimited custom¹ unlimited unlimited ~1,200 / min procurement organisations and their supply base

API keys are unlimited on every plan, so they are not a column: key count was never a cost driver — usage is, and the extraction meter and the rate limits already gate that.

¹ Enterprise is a per-tenant contract — volume, overage rate, base price, limits and payment terms are negotiated, annual and prepaid. There is no list price: talk to sales for a quote. Once your agreement is active, your in-app billing page and GET /billing/v3/overview (contract) always show your contracted numbers (volume, overage rate, base price, PO) — the public catalogue never carries them.

  • Free is pay-as-you-go. The 10 monthly extractions are free and need no card. Past them, extractions are saved but paused until you add a payment method and top up a balance; they then run at €1.49 each — each one only starts once its price is on the balance — and pause again when the balance is spent. Nothing is ever lost, and a Free balance never goes below zero: you are never billed beyond what you have paid in.
  • Overage is prepaid. Every plan draws overage from your prepaid balance, so there is no surprise invoice — a calculation past your included volume reserves its price before it starts and is charged only when it succeeds. An Enterprise agreement can contract invoice terms in arrears instead; your billing page shows which applies.
  • Annual billing saves ~10%. Pro is €2,149.20/yr and Scale is €12,949.20/yr on annual. Enterprise is annual/prepaid by default and sales-led.
  • Every paid plan has unlimited seats and unlimited calibration runs. A seat costs us nothing and every seat feeds the meter, so charging for one taxed the thing that makes the product work; and rationing the action that improves your accuracy worked against the whole point. Free keeps 1 seat and 1 calibration run a month as its evaluation scope.

New accounts start free. Every new organisation lands on the Free tier — 10 extractions per month, no card required. Free obeys the same rules below: a failed run never burns one. Once the included 10 are used, further extractions are saved and park as blocked until you add a card and top up; the coverage block on the response says which, and where to fix it.


The single meter, and what's free

Every extraction request hits one meter. What counts, and what's free:

Outcome Counts against quota / overage?
Extraction succeeds (200 OK, valid result) Yes — 1 extraction
Extraction fails / cancelled / timed out No
4xx (bad input, auth, rate-limit) No
5xx (our fault) No
Idempotent cache hit (identical content within the cache window) No

This is pay-on-200: you're only metered when we return a valid extraction. A leaked parts:read key can never spend — only parts:write runs an extraction. Behind the meter, the engine selects the right analysis for each input automatically; it never changes what you're charged.


Add-on packs

One pack, à-la-carte on any paid plan (Free is card-free by definition, so pack checkout points it at an upgrade instead):

Pack Price Adds
Environments+ €29/mo Unlimited costing environments and machine fleets, above your plan's included allowance

Every other capability a pack used to gate — seats, calibration runs, RBAC, the audit log, API keys — is now a plan default, so there is nothing else to buy.


Plan limits

Beyond the extraction meter, each tier carries resource limits — seats, costing environments, machine fleets, calibration runs per month, and total upload storage (see the tier table above). Limits gate creation only: hitting one blocks creating more of that resource; everything you already created keeps working, and nothing is ever deleted — including after a downgrade.

A creation request over the limit returns 402 Payment Required with the code entitlement_exceeded and a machine-readable payload:

{
  "error": {
    "code": "entitlement_exceeded",
    "message": "Seat limit reached (1/1). Upgrade your plan to invite more teammates — every paid plan has unlimited seats.",
    "details": {
      "feature": "seats",
      "used": 1,
      "limit": 1,
      "upgrade_url": "/settings/billing"
    }
  }
}

details.feature is one of seats, environments, fleets, calibration_runs, api_keys, storage. details.limit is your plan's effective ceiling (tier + Environments+ + any enterprise agreement); upgrade_url is a same-origin path to the billing page. The dashboard renders these as an upgrade prompt; API clients should surface the message and treat the condition as permanent until the plan changes (or, for calibration_runs, until the monthly window resets).

Current usage against every limit is available in the billing overview (GET /billing/v3/overview, limits[]) and on Settings → Billing.


Quota, overage, and rollover in practice

A Pro account includes 300 extractions/month at €199. Run 350 and the extra 50 bill at €0.99 each — €49.50 drawn from the prepaid balance as they run. No upgrade prompt, and no work blocked while the balance covers it.

Unused extractions roll one month forward. A Pro account that uses 240 of 300 in March carries 60 into April (on top of April's 300), then anything still unused after April expires. Cancel mid-cycle and any rolled balance is forfeited — the cancellation flow states this before you confirm.

Raw uploaded files are stored free — never metered — and count only against your plan's storage limit. They are kept until you delete the part or the organisation (deleting an organisation purges its stored objects); the small derived cost labels are kept for the life of the account. To have data removed sooner, delete it in the dashboard or through the API.


Reading your usage

Read your plan, included quota, current-window usage and overage budget with any parts:read key: GET /api/v1/calculations/entitlement. It also tells you whether your prepaid balance can fund more runs (wallet_funded_calculations, wallet_overdrawn). The balance itself, invoices and receipts are in the dashboard (Settings → Billing) only: billing data is not on the API.


Invoices, receipts, tax

Subscriptions, overage, invoices, and the Customer Portal are handled through our billing provider. The org owner sees invoices and receipts in the dashboard (Settings → Billing). Sales tax / VAT is collected per the customer's billing country where applicable.


See also

  • Errors — quota_exceeded, and the pay-on-200 status codes.
  • Calculations — where the extraction meter is incremented.
  • Rate limits — request limits (separate from billing).