Skip to main content
PATCH
Add one or more individual biomarkers to an appointment as à-la-carte tests, outside any pre-built panel. Routing decisions are made downstream by the order-logistics pipeline based on each biomarker’s per-lab mappings. The resulting set is validated synchronously against each lab’s closure rules. Some biomarkers can only be obtained by ordering them together with others — an LDL/HDL ratio, for example, is delivered by an order that also returns LDL and HDL, so requesting the ratio on its own isn’t a coherent order. (Those same components are what the ratio is priced as — see the pricing breakdown on List Biomarkers.) When the set can’t be cleanly ordered, the call returns 400 with a validation payload and nothing is persisted, so you can trial-and-error your way to a valid set:
  1. PATCH … { "biomarker_ids": [45] } (LDL/HDL ratio alone) → 400; validation.failures[].fix_options[].add_biomarkers lists LDL and HDL.
  2. PATCH … { "biomarker_ids": [45, 43, 42] } (ratio + LDL + HDL) → 200.
The same loop covers biomarkers Aniva sells only inside a position: ask for one alone and the call returns 400 with error: "biomarker_requires_position" and the positions that sell it. See Pricing. List Biomarkers quotes some biomarkers as price_cents: null. These biomarkers are uncurated: Aniva has not priced them. If you add one, the call returns 400 with error: "biomarker_not_priced". No other biomarker fixes this failure, because null means that you have no price to buy the marker at. Kit markers are the exception. Attach the panel that is the kit, and its members come with the panel. The call also accepts a member that you add to an appointment that already carries that panel. At a pharmacy location (capillary draw), the draw is packed into microtainers. Panels go first, in booking order. Individual biomarkers then fill the free space of the panel microtainers. When they need more space, they open new microtainers. We spread them evenly. Each microtainer holds at most 150 µl of individual biomarkers. A biomarker that needs more than 150 µl in a microtainer of its own never fits, and neither does a biomarker without a curated volume. If the resulting set breaks this rule, the call returns 400 with an error message and nothing is persisted. This call is idempotent: biomarkers already on the appointment are kept. Requires the test_sessions_schedule and schedule_appointments_with_individual_biomarker_selection scopes.
Biomarkers cannot be added after you call Confirm Blood Draw. Attempting to modify a confirmed appointment returns 409 Conflict.

Request

Path parameters

string
required
Unique identifier (UUID) of the appointment.

Body parameters

number[]
required
Array of biomarker IDs to attach. Must contain at least one item. Use List Biomarkers to discover IDs.

Response

On success, the API returns 200 OK confirming the biomarkers have been attached.
boolean
true when the biomarkers have been successfully added to the appointment.

Reading a 400

Every closure-validation and catalog 400 carries a sentence in message. A body-validation or microtainer 400 carries error alone. Branch on error. On a closure-validation failure, error is a sentence. On a catalog failure, error is a machine code: biomarker_not_priced or biomarker_requires_position. Closure validation — the set can’t be cleanly ordered at any lab:
  • validation.failures[] — present only on closure-validation failures (absent on plain body-validation errors). One entry per biomarker group no lab can serve, carrying the biomarker_ids that failed and fix_options[], smallest option first. Each option’s add_biomarkers ({ id, name }) is a set you add ALL of — keep your originals, add those, and retry. An empty fix_options means adding nothing will help; remove the biomarker instead.
Unpriced biomarker — Aniva has not priced this biomarker. List Biomarkers quotes it as price_cents: null, or omits it when it is a ratio with an unpriced component. error is biomarker_not_priced, and biomarker_id names the marker. No other biomarker fixes this failure, so remove the biomarker. Two conditions make a biomarker orderable: a lab Aniva can route to must deliver it, and the Aniva catalog must price it. Gated biomarker — a biomarker sold only inside a position, with no covering position in the set. error is biomarker_requires_position, biomarker_id names the marker, and positions[] lists every position that sells it, cheapest first. Add every biomarker of one of them. See Pricing for the model, and pricing.positions on Get Biomarker for a position’s full member set.

Error responses