Skip to main content
Aniva prices one thing: the position. A position is a commercial offer — a curated set of biomarkers that bills once, at a flat price, and is always delivered whole. A biomarker you can buy on its own is simply a position of one. Everything you see in pricing follows from that. Read this page once and the four states below stop looking like special cases.

What the numbers mean

Every price_cents is what you pay, at the rate card on your API key. Beside it, retail_cents is the same item at the recommended retail card, so you can show a saving without a second request. Both are integer cents, and both are net: VAT is added on your monthly invoice at the rate your VAT treatment carries, and an exempt treatment adds none. A panel that sells at Aniva’s consumer catalog price is quoted at that price stripped of its 19 % German VAT.
retail_cents is always present. When your key is already on the retail card it simply equals price_cents.
Prices need the prices_view scope. Without it, pricing is null on the listings and the preview, and the Pricing endpoints return 403.

Your rate card

Your rate card sets your prices. Read it from Get Rate Card.
  • Each analysis has a tier: routine or specialty. Its price is the Aniva catalog price times the multiplier of that tier.
  • The fees are per appointment, and the logistics fee is per courier pickup. Your appointments at the same location on the same day share one pickup. Aniva bills the fees on your monthly invoice.

The four states

price_cents, plus which optional block sits beside it, is the state. There is no separate type field.

Positive — orderable alone

The marker has a price of its own. It may still appear in positions, and positions then lists them cheapest first — buying the position is often cheaper than buying its members one by one.
biomarker_ids is the position’s full member set; includes is that set minus the marker you queried — what rides along.

Zero with requires — a ratio

A ratio is computed from measured markers. Most ratios cost 0. A ratio with a positive price_cents bills that price in addition to its components. Order it and Aniva puts its components in the cart at their own prices. A component is paid once per cart however many ratios lean on it.
A ratio composes with positions rather than competing with one. If its components are members of a position you are already buying, the position pays for them and the ratio rides along for free.
A ratio whose components are not all priced is absent from the catalog — it does not appear with price_cents: null. It comes back once Aniva prices the missing component.

Zero with positions — sold only inside a position

The marker has no price of its own, but it is a member of one or more positions. Buy one of those positions and you get it.
Adding one of these to an appointment on its own is refused — see Add Individual Biomarkers. Add every biomarker of one of the listed positions instead.

Null — uncurated

Aniva has not decided what this marker costs, so it is not for sale. null is not zero and not “ask us”: treat it as unavailable.
Aniva refuses a null marker at order time. Two conditions make a biomarker orderable. A lab Aniva can route to must deliver the biomarker. The Aniva catalog must price it. If you attach a null marker to an appointment, the API returns 400 with error: "biomarker_not_priced". See Add Individual Biomarkers. A lab can deliver a null marker, but delivery alone does not make the marker available. Treat null as unavailable.
Some markers are null by design. Aniva sells microbiome and genetics tests as kits. A kit has one price, so its member markers have no price of their own. To buy these markers, order the panel that is the kit. The members come with the panel. The API also accepts a member that you add to an appointment that already carries its panel. A marker also reads null when Aniva sells it only inside a position that you cannot see. The result is the same: you have no price to buy the marker at. The marker gets a price when Aniva makes that position partner-facing.

Finding the cheapest way to buy a set

Because every position a marker belongs to travels with the marker, you can solve this locally, without extra requests:
  1. Collect the markers you want from List Biomarkers.
  2. For each one, compare its own price_cents against the price_cents of the positions in its positions block.
  3. A position bills once and delivers its whole biomarker_ids set, so a position covering several of your markers is charged a single time. Extra markers you did not ask for come along at no additional cost.
Nothing overlaps twice: two positions that share a member each deliver their set, the member is listed once, and they never discount each other.

The bill

Preview Appointment returns the bill of an appointment. Quote Cart returns the same bill without an appointment. The bill has:
  • positions[] — every position that fired, billed once at its flat price.
  • panels[] — every attached panel.
  • biomarkers[] — one row per delivered marker. A row a position pays for costs 0 and names it in via_position. A component pulled in by a ratio carries required_by; the ratio itself carries requires.
  • total_cents — the priced positions plus the priced panels plus the priced biomarker rows, with retail_total_cents beside it.
  • fees and total_with_fees_cents — the fees of one appointment, and the total with them.
A row Aniva cannot price carries price_cents: null. The row adds nothing to the total. You cannot attach an unpriced marker on its own, so a position or a panel supplied this row. That position or panel already bills for it.
Aniva has not published every position yet. An unpublished position still bills. It appears in positions[] with id and name set to null, and its biomarker rows have via_position: null.