Home Kit Orders
Create Home Kit Order
Request a DIY mail-home test kit for a profile
POST
/
api
/
v1
/
home-kit-orders
curl --request POST \
--url https://anivahealth.com/api/v1/home-kit-orders \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"metadata": { "your_order_ref": "ORD-10482", "priority": true },
"delivery_address": {
"name": "Maria Schmidt",
"company_name": "c/o Weber",
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE",
"phone": "+4930123456789",
"email": "maria.schmidt@example.com"
}
}'
curl --request POST \
--url https://anivahealth.com/api/v1/home-kit-orders \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"replaces_home_kit_order_id": "d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
"replacement_reason": "Too little material, HbA1c could not be analysed",
"biomarker_ids": [103],
"metadata": { "your_order_ref": "ORD-10482-R1" },
"delivery_address": {
"name": "Maria Schmidt",
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE"
}
}'
{
"id": "d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"status": "pending",
"delivery_address": {
"name": "Maria Schmidt",
"company_name": "c/o Weber",
"address_line_2": null,
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE",
"phone": "+4930123456789",
"email": "maria.schmidt@example.com"
},
"created_at": "2026-04-01T09:45:00Z",
"updated_at": null,
"profile": {
"id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"handle": null,
"first_name": "Maria",
"last_name": "Schmidt",
"email": "maria.schmidt@example.com",
"phone": "+4930123456789",
"sex": 2,
"date_of_birth": "1985-03-22",
"height": 168,
"weight": 65,
"language": "de",
"transactional_emails_enabled": true,
"created_at": "2026-04-01T09:14:32Z",
"updated_at": null
},
"panels": [
{
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"added_at": "2026-04-01T09:45:00Z"
}
],
"individual_biomarkers": [],
"metadata": { "your_order_ref": "ORD-10482", "priority": true },
"replaces_home_kit_order_id": null,
"replacement_reason": null,
"results_ready_emails": [],
"lab_code": null,
"activated_at": null,
"shipments": []
}
{
"error": "panel_id: panel_id must be a valid UUID"
}
{
"error": "Profile not found"
}
{
"error": "Idempotency-Key \"ORD-10482\" was already used with a different request body. Use a new key for a different request, or resend the original body to read back its result."
}
Request a home kit order for a patient profile. A home kit order sends a DIY mail-home test kit — Aniva ships the kit to the delivery address, the patient self-collects a sample at home and mails it back. This is distinct from an appointment, which is a venous draw at a test location.
Exactly one panel is required. A home kit maps 1:1 onto a physical kit product — the panel is the kit — and the order joins the packing queue as soon as it is created, so the composition must be final up front. You can still swap the panel via Update Home Kit Order while the order is
A
pending.
Replacement kits
When a kit cannot deliver its results — the patient could not fill the tube, the sample arrived with too little material, the laboratory could not analyse it — order a replacement by sendingreplaces_home_kit_order_id.
A replacement is a new order with a new lab code, also when the first kit was never activated: the laboratory needs a new requisition, and two samples under one code cannot be told apart. The order you replace is not touched — it keeps its own status, its own lab code and any results already filed under it.
Two things follow from that:
- The panel is inherited. Leave
panel_idout and the replacement carries the panel of the order it replaces, which is what the patient bought and how the box is branded. - You choose what is re-run. Send
biomarker_idswith the markers that failed and the laboratory re-runs only those, so the kit ships only the tubes they need. Leave it out to re-run the whole panel.
If you integrated before these fields existed, Aniva also reads
metadata.original_kit_id and
metadata.replacement_reason on a create and treats the order as a replacement. This is the one
place metadata is interpreted, it exists only to carry that earlier integration, and the fields
above always win. Send the fields.201 means the order is committed and will be handed to fulfilment — you don’t need to do anything else for the kit to be packed and shipped.
Requires the home_kit_orders_manage scope.
Send an optional Idempotency-Key header to make this create safe to retry — a repeat of the same key returns the original response instead of creating a second one. See Idempotency.
Request
Body parameters
string
required
UUID of the patient profile to create the home kit order for.
string
required
UUID of the catalog panel to order. Exactly one — a home kit maps 1:1 onto a physical kit product,
so the panel is the kit. Panel IDs are provided by Aniva for your partner account; see List
Panels. Optional on a replacement, where it defaults to the panel of the
order you replace.
string
UUID of the home kit order this one replaces. Sending it makes this a replacement kit — see
Replacement kits above. The order must belong to the same profile, and must
not already have a replacement on its way.
string
Why the replacement is needed, in one sentence (for example
Zu wenig Material, HbA1c nicht auswertbar). Required when you send replaces_home_kit_order_id, and ignored otherwise. At most
500 characters.integer[]
On a replacement, the markers the laboratory re-runs — normally the ones the first kit could not
deliver. Each must be part of what the order you replace asked for; cross-reference against List
Biomarkers with
home_kit=true. Leave it out to re-run the whole panel. Only
accepted together with replaces_home_kit_order_id, and not together with a different panel_id.
This needs no extra scope: re-running markers the patient already paid for is not an à-la-carte
selection.object
Your own key/value pairs, echoed back verbatim on every read and never interpreted by Aniva. Use
it to carry your order reference so you can correlate without storing our IDs. At most 20 keys;
keys match
[A-Za-z0-9_-] and are at most 40 characters; values are a string, number, or boolean,
with strings at most 500 characters; 16384 bytes serialized overall. Keys beginning aniva_ are
reserved. Never put personal or clinical data in metadata — it is not treated as patient data.string[]
Up to 5 addresses that each get one email once every lab result is final. The email links to the
result page in the Aniva admin panel. Your key needs
results_view access to the patient, else
403. See Results-ready emails.object
required
The address to mail the kit to — one of two shapes: either
{ location_id } referencing a known test location, or the inline address fields (name, street, city, postal_code, country_code; company_name / house_number / address_line_2 / state / phone / email optional — the same vocabulary as the locations API). Provide exactly one — a location reference or an inline address, not both.Show delivery address
Show delivery address
- Reference a location
- Inline address
string
required
UUID of a known test location to ship the kit to. Correlate with List
Locations.
string
required
Recipient, company, or location name.
string
Company holding the parcel for the recipient — a
c/o party or a department.string
required
Street name, without the house number (e.g.
Wilhelmstraße).string
House number (e.g.
118 or 12a).string
Building, entrance, or floor.
string
required
string
State or province. Optional.
string
required
string
required
ISO 3166-1 alpha-2 code (two letters, e.g.
DE).string
Recipient’s phone number, with country code (e.g.
+4791234567). The carrier uses it to
tell the recipient about the parcel, for example that it waits at a pickup point. Leave
it out and the carrier gets no phone number.string
Recipient’s email. The carrier uses it like
phone. Leave it out and the carrier gets no
email.Packstation or Postfiliale (Germany only): set
street to Packstation or Postfiliale,
house_number to the three-digit station number, and address_line_2 to the recipient’s DHL
Postnummer (6–10 digits, spaces allowed). Without the Postnummer, the parcel cannot be booked.
A Postfach is not supported.Response
On success, the API returns201 Created with the new home kit order.
string
required
Unique home kit order identifier (UUID).
string
required
UUID of the profile this home kit order belongs to.
string
required
Current home kit order status. One of
pending, dispatched, activated, or cancelled. A
newly created order starts in pending.object
required
The address to mail the kit to — one of two shapes: either
{ location_id } referencing a known test location, or the inline address fields (name, street, city, postal_code, country_code; company_name / house_number / address_line_2 / state / phone / email optional — the same vocabulary as the locations API). Provide exactly one — a location reference or an inline address, not both.Show delivery address
Show delivery address
- Location reference
- Inline address
string
required
UUID of the test location the kit ships to.
string
required
Recipient, company, or location name.
string
Company holding the parcel for the recipient — a
c/o party or a department.string
required
Street name, without the house number (e.g.
Wilhelmstraße).string
House number (e.g.
118 or 12a).string
Building, entrance, or floor.
string
required
string
State or province. Optional.
string
required
string
required
ISO 3166-1 alpha-2 code (two letters, e.g.
DE).string
string
object
required
The key/value pairs you supplied. Always present —
{} when you set none.string
The home kit order this one replaces.
null on a normal order.string
The reason you supplied.
null on a normal order.string[]
required
Addresses that each get one email once every lab result is final, lowercased. Empty when off. See
Results-ready emails.
string
Laboratory sample code the results report under — printed on the physical kit, and what the
patient reads off the box as the activation code.
null until the kit is packed.
Read-only.string
required
ISO 8601 timestamp of when the home kit order was created.
string
ISO 8601 timestamp of the last update. May be
null.object
required
The patient profile associated with this home kit order.
Show profile
Show profile
string
Unique profile identifier (UUID).
string
Profile handle or username. May be
null.string
First name. May be
null.string
Last name. May be
null.string
Email address. May be
null.string
Phone number in E.164 format. May be
null.integer
Biological sex per ISO/IEC 5218. May be
null.string
Date of birth in
YYYY-MM-DD format. May be null.number
Height in centimeters. May be
null.number
Weight in kilograms. May be
null.string
Preferred language (
en, de, or fi).boolean
Whether this profile receives transactional (programmatic) emails. May be
null.string
ISO 8601 timestamp of when the profile was created.
string
ISO 8601 timestamp of the last profile update. May be
null.HomeKitOrderPanel[]
required
The panel attached to this home kit order — the one you supplied as
panel_id, stamped with the
order’s creation time. Always exactly one. Look up panel details (name, biomarkers) via
List Panels.Show Panel attachment fields
Show Panel attachment fields
string
Panel UUID — cross-reference against List Panels.
string
ISO 8601 timestamp the panel was first attached to this home kit order.
HomeKitOrderIndividualBiomarker[]
required
Biomarkers attached outside the panel. Empty on a normal creation — home kit orders are ordered by
panel, and modifying this list afterwards requires the
home_kit_orders_individual_biomarker_selection capability scope. On a replacement it holds the
biomarker_ids you sent, which are what the laboratory re-runs.Show Individual biomarker fields
Show Individual biomarker fields
integer
Biomarker identifier — cross-reference against
List Biomarkers with
home_kit=true.string
ISO 8601 timestamp the biomarker was first attached to this home kit order.
HomeKitOrderShipmentLink[]
required
Parcels linked to this home kit order, oldest-link first. Always empty on creation — read the
full parcels with List Shipments and
?home_kit_order_id=.Show Shipment link fields
Show Shipment link fields
string
Shipment reference — cross-reference against Get Shipment.
string
ISO 8601 timestamp the shipment was linked to this home kit order.
Error responses
| Status | Description |
|---|---|
400 | Validation error — e.g. delivery_address is missing a field, panel_id is not a valid UUID, or replacement_reason is missing on a replacement. |
403 | Forbidden — your API key does not have access to this operation, the profile is outside your permission scope, or you set results_ready_emails without results_view access to the patient. |
404 | Profile, panel, or the home kit order to replace not found. |
409 | Conflict — the Idempotency-Key was already used with a different body, its original request has not completed, or the kit you are replacing already has a replacement on its way. |
422 | The panel is not orderable as a home kit — no fulfilment kit product is configured for it. On a replacement: the order you replace belongs to another profile, a biomarker_ids entry is not part of what it asked for, or you sent markers together with a different panel_id. |
500 | Internal server error. |
curl --request POST \
--url https://anivahealth.com/api/v1/home-kit-orders \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"metadata": { "your_order_ref": "ORD-10482", "priority": true },
"delivery_address": {
"name": "Maria Schmidt",
"company_name": "c/o Weber",
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE",
"phone": "+4930123456789",
"email": "maria.schmidt@example.com"
}
}'
curl --request POST \
--url https://anivahealth.com/api/v1/home-kit-orders \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"replaces_home_kit_order_id": "d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
"replacement_reason": "Too little material, HbA1c could not be analysed",
"biomarker_ids": [103],
"metadata": { "your_order_ref": "ORD-10482-R1" },
"delivery_address": {
"name": "Maria Schmidt",
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE"
}
}'
{
"id": "d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"status": "pending",
"delivery_address": {
"name": "Maria Schmidt",
"company_name": "c/o Weber",
"address_line_2": null,
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE",
"phone": "+4930123456789",
"email": "maria.schmidt@example.com"
},
"created_at": "2026-04-01T09:45:00Z",
"updated_at": null,
"profile": {
"id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"handle": null,
"first_name": "Maria",
"last_name": "Schmidt",
"email": "maria.schmidt@example.com",
"phone": "+4930123456789",
"sex": 2,
"date_of_birth": "1985-03-22",
"height": 168,
"weight": 65,
"language": "de",
"transactional_emails_enabled": true,
"created_at": "2026-04-01T09:14:32Z",
"updated_at": null
},
"panels": [
{
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"added_at": "2026-04-01T09:45:00Z"
}
],
"individual_biomarkers": [],
"metadata": { "your_order_ref": "ORD-10482", "priority": true },
"replaces_home_kit_order_id": null,
"replacement_reason": null,
"results_ready_emails": [],
"lab_code": null,
"activated_at": null,
"shipments": []
}
{
"error": "panel_id: panel_id must be a valid UUID"
}
{
"error": "Profile not found"
}
{
"error": "Idempotency-Key \"ORD-10482\" was already used with a different request body. Use a new key for a different request, or resend the original body to read back its result."
}
⌘I
curl --request POST \
--url https://anivahealth.com/api/v1/home-kit-orders \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"metadata": { "your_order_ref": "ORD-10482", "priority": true },
"delivery_address": {
"name": "Maria Schmidt",
"company_name": "c/o Weber",
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE",
"phone": "+4930123456789",
"email": "maria.schmidt@example.com"
}
}'
curl --request POST \
--url https://anivahealth.com/api/v1/home-kit-orders \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"replaces_home_kit_order_id": "d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
"replacement_reason": "Too little material, HbA1c could not be analysed",
"biomarker_ids": [103],
"metadata": { "your_order_ref": "ORD-10482-R1" },
"delivery_address": {
"name": "Maria Schmidt",
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE"
}
}'
{
"id": "d1e2f3a4-5b6c-4d7e-8f9a-0b1c2d3e4f5a",
"profile_id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"status": "pending",
"delivery_address": {
"name": "Maria Schmidt",
"company_name": "c/o Weber",
"address_line_2": null,
"street": "Friedrichstraße",
"house_number": "123",
"postal_code": "10117",
"city": "Berlin",
"country_code": "DE",
"phone": "+4930123456789",
"email": "maria.schmidt@example.com"
},
"created_at": "2026-04-01T09:45:00Z",
"updated_at": null,
"profile": {
"id": "a3f1c2d4-8b7e-4f2a-9c1d-2e3f4a5b6c7d",
"handle": null,
"first_name": "Maria",
"last_name": "Schmidt",
"email": "maria.schmidt@example.com",
"phone": "+4930123456789",
"sex": 2,
"date_of_birth": "1985-03-22",
"height": 168,
"weight": 65,
"language": "de",
"transactional_emails_enabled": true,
"created_at": "2026-04-01T09:14:32Z",
"updated_at": null
},
"panels": [
{
"panel_id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
"added_at": "2026-04-01T09:45:00Z"
}
],
"individual_biomarkers": [],
"metadata": { "your_order_ref": "ORD-10482", "priority": true },
"replaces_home_kit_order_id": null,
"replacement_reason": null,
"results_ready_emails": [],
"lab_code": null,
"activated_at": null,
"shipments": []
}
{
"error": "panel_id: panel_id must be a valid UUID"
}
{
"error": "Profile not found"
}
{
"error": "Idempotency-Key \"ORD-10482\" was already used with a different request body. Use a new key for a different request, or resend the original body to read back its result."
}