> For the complete documentation index, see [llms.txt](https://docs.tryterra.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.tryterra.co/reference/vantage-api/products.md).

# Products

## List all product types

> Returns all available diagnostic test categories (e.g., Blood Tests, DNA Tests)

```json
{"openapi":"3.1.0","info":{"title":"Terra Vantage API","version":"2026.10.22"},"servers":[{"url":"https://vantage.tryterra.co"}],"security":[{"BasicAuth":[]},{"DataBearer":[],"DevIDHeader":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Authenticate with your Terra API credentials: username = your Terra\n`dev-id`, password = your Terra API key — the same credentials used for\nevery other Terra API. The header pair `dev-id` + `x-api-key` is also\naccepted. Suspended credentials receive 403; accounts without the\nVantage entitlement receive 403 once entitlement enforcement is\nenabled. Once the credential validator is configured, backfilled keys\nalso honor current token expiry, revocation, audience and Vantage scopes.\nInvalid tokens receive 401, insufficient scopes 403 and an unavailable\nvalidator 503. These checks remain active when product policy is off.\n"},"DataBearer":{"type":"http","scheme":"bearer","bearerFormat":"Terra data token","description":"A data-plane token with vantage:read for reads or vantage:write for writes. Requires dev-id. Write includes read; data:read alone does not grant Vantage. Available after the API credential validator is configured."}},"parameters":{"ApiVersion":{"name":"X-Terra-Version","in":"header","required":false,"description":"The API version to serve this request in. Defaults to your account's pinned version; an account is pinned to the latest version on its first request.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}}},"headers":{"ApiVersion":{"description":"The API version this response was rendered in.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}},"RequestId":{"description":"A UUID generated for this request, unique per request and never taken from the caller. Quote it to support to find the request.","schema":{"type":"string","format":"uuid"}}},"schemas":{"ProductType":{"type":"object","properties":{"description":{"type":"string"},"id":{"type":"string","description":"Decimal string."},"name":{"type":"string"}}},"ProblemDetail":{"description":"Standard error response format following RFC 7807 specification","type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}}},"AuthenticationError":{"description":"Authentication error response (401)","type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}},"required":["detail","status","title","type"]}},"responses":{"InvalidApiVersion":{"description":"Unsupported `X-Terra-Version`; the problem carries code `invalid_api_version` and lists the supported versions in `detail`.","headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}},"paths":{"/api/v1/products":{"get":{"operationId":"listProductTypes","summary":"List all product types","tags":["products"],"description":"Returns all available diagnostic test categories (e.g., Blood Tests, DNA Tests)","parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Successfully retrieved product types","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductType"}}}}},"400":{"$ref":"#/components/responses/InvalidApiVersion"},"401":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Unauthorized - invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthenticationError"}}}},"500":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"503":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Current authorization is unavailable; retry after the dependency recovers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}}}}
```

## Set catalog selection

> Curate which products your own catalog reads return. Full-set write: listed products become enabled, every other product disabled. With no selection saved, everything is enabled; products added to the global catalog after your last save default to enabled until you save again. Disabled products are excluded from catalog reads and cannot be ordered (403).

```json
{"openapi":"3.1.0","info":{"title":"Terra Vantage API","version":"2026.10.22"},"servers":[{"url":"https://vantage.tryterra.co"}],"security":[{"BasicAuth":[]},{"DataBearer":[],"DevIDHeader":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Authenticate with your Terra API credentials: username = your Terra\n`dev-id`, password = your Terra API key — the same credentials used for\nevery other Terra API. The header pair `dev-id` + `x-api-key` is also\naccepted. Suspended credentials receive 403; accounts without the\nVantage entitlement receive 403 once entitlement enforcement is\nenabled. Once the credential validator is configured, backfilled keys\nalso honor current token expiry, revocation, audience and Vantage scopes.\nInvalid tokens receive 401, insufficient scopes 403 and an unavailable\nvalidator 503. These checks remain active when product policy is off.\n"},"DataBearer":{"type":"http","scheme":"bearer","bearerFormat":"Terra data token","description":"A data-plane token with vantage:read for reads or vantage:write for writes. Requires dev-id. Write includes read; data:read alone does not grant Vantage. Available after the API credential validator is configured."}},"schemas":{"UpdateCatalogSelectionRequest":{"type":"object","required":["product_ids"],"properties":{"product_ids":{"type":"array","description":"Products to enable; everything else is disabled.","items":{"type":"string"}}}},"UpdateCatalogSelectionResponse":{"type":"object","required":["enabled_count"],"properties":{"enabled_count":{"type":"integer"}}},"ProblemDetail":{"description":"Standard error response format following RFC 7807 specification","type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}}}},"parameters":{"ApiVersion":{"name":"X-Terra-Version","in":"header","required":false,"description":"The API version to serve this request in. Defaults to your account's pinned version; an account is pinned to the latest version on its first request.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}}},"headers":{"ApiVersion":{"description":"The API version this response was rendered in.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}},"RequestId":{"description":"A UUID generated for this request, unique per request and never taken from the caller. Quote it to support to find the request.","schema":{"type":"string","format":"uuid"}}}},"paths":{"/api/v1/products/selection":{"put":{"operationId":"updateCatalogSelection","summary":"Set catalog selection","tags":["products"],"description":"Curate which products your own catalog reads return. Full-set write: listed products become enabled, every other product disabled. With no selection saved, everything is enabled; products added to the global catalog after your last save default to enabled until you save again. Disabled products are excluded from catalog reads and cannot be ordered (403).","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCatalogSelectionRequest"}}}},"parameters":[{"$ref":"#/components/parameters/ApiVersion"}],"responses":{"200":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Selection saved","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCatalogSelectionResponse"}}}},"400":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Invalid request body. An unsupported `X-Terra-Version` also returns 400 with code `invalid_api_version`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Missing or invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"500":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"503":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Current authorization is unavailable; retry after the dependency recovers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}}}}
```

## Get products by type ID

> Returns all products within a specific product type category

```json
{"openapi":"3.1.0","info":{"title":"Terra Vantage API","version":"2026.10.22"},"servers":[{"url":"https://vantage.tryterra.co"}],"security":[{"BasicAuth":[]},{"DataBearer":[],"DevIDHeader":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Authenticate with your Terra API credentials: username = your Terra\n`dev-id`, password = your Terra API key — the same credentials used for\nevery other Terra API. The header pair `dev-id` + `x-api-key` is also\naccepted. Suspended credentials receive 403; accounts without the\nVantage entitlement receive 403 once entitlement enforcement is\nenabled. Once the credential validator is configured, backfilled keys\nalso honor current token expiry, revocation, audience and Vantage scopes.\nInvalid tokens receive 401, insufficient scopes 403 and an unavailable\nvalidator 503. These checks remain active when product policy is off.\n"},"DataBearer":{"type":"http","scheme":"bearer","bearerFormat":"Terra data token","description":"A data-plane token with vantage:read for reads or vantage:write for writes. Requires dev-id. Write includes read; data:read alone does not grant Vantage. Available after the API credential validator is configured."}},"parameters":{"ApiVersion":{"name":"X-Terra-Version","in":"header","required":false,"description":"The API version to serve this request in. Defaults to your account's pinned version; an account is pinned to the latest version on its first request.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}}},"headers":{"ApiVersion":{"description":"The API version this response was rendered in.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}},"RequestId":{"description":"A UUID generated for this request, unique per request and never taken from the caller. Quote it to support to find the request.","schema":{"type":"string","format":"uuid"}}},"schemas":{"Product":{"type":"object","required":["variants","availability"],"properties":{"enabled":{"type":"boolean","description":"Present only on ?show_all=true — the caller's per-product curation flag."},"availability":{"$ref":"#/components/schemas/Availability"},"base_price_cents":{"type":"integer","format":"int32"},"currency":{"$ref":"#/components/schemas/Currency"},"description":{"type":"string"},"id":{"type":"string","description":"Decimal string."},"images":{"description":"Every image of the product's variants, in display order.","type":"array","items":{"$ref":"#/components/schemas/Image"}},"name":{"type":"string"},"product_type_id":{"type":"string","description":"Decimal string."},"variants":{"type":"array","description":"The product's variants, on the same curation rules as GET /products/{id}/variants. Empty when the product has none.","items":{"$ref":"#/components/schemas/ProductVariant"}}}},"Availability":{"type":"string","description":"Whether the item can be ordered right now. `unknown` is served when the supplier has not stated availability.","enum":["unknown","in_stock","out_of_stock"]},"Currency":{"type":"string","description":"ISO 4217 alphabetic currency code. Omitted when the stored currency is not one of these. Versions before 2026-10-15 serve the ISO 4217 numeric code (840, 978, 826) instead.","enum":["USD","EUR","GBP"]},"Image":{"type":"object","properties":{"alt_text":{"type":"string"},"display_order":{"type":"integer","format":"int32"},"height":{"type":"integer","format":"int32"},"id":{"type":"string","description":"Decimal string."},"product_id":{"type":"string","description":"Decimal string."},"url":{"type":"string"},"variant_id":{"type":"string","description":"Decimal string."},"width":{"type":"integer","format":"int32"}}},"ProductVariant":{"type":"object","required":["name","biomarkers","requires_activation","availability"],"properties":{"id":{"type":"string","description":"Decimal string."},"product_id":{"type":"string","description":"Decimal string."},"product_type_id":{"type":"string","description":"Decimal string."},"name":{"type":"string","description":"The variant's name, as the supplier states it."},"description":{"type":"string","description":"The supplier's blurb for this variant. Omitted when it states none."},"collection_method":{"$ref":"#/components/schemas/CollectionMethod"},"collection_visit":{"$ref":"#/components/schemas/CollectionVisit"},"turnaround_days":{"$ref":"#/components/schemas/TurnaroundDays"},"requires_activation":{"type":"boolean","description":"Whether the kit has to be activated before the lab will process its sample. When true, call the kit activation endpoint as part of your flow; the sample is not processed without it."},"availability":{"$ref":"#/components/schemas/Availability"},"biomarkers":{"type":"array","description":"Biomarkers measured by this variant. Empty when the panel is not catalogued or could not be read.","items":{"$ref":"#/components/schemas/Biomarker"}},"reports":{"type":"array","description":"DNA tests only: the reports this variant's bundle includes. A DNA product's variants are report bundles; pick one at order time by its variant id. Omitted for other product types.","items":{"$ref":"#/components/schemas/DNAReport"}},"required_dna_details":{"type":"array","description":"DNA tests only: what an order for this variant must tell Terra about the end user, as JSON paths into the create-order request (recipient.gender_at_birth, or a key of dna). Empty when the variant needs nothing; omitted for other product types. An order missing any of them is rejected with 400 before payment. Non-exhaustive: new values may be added without a new API version.","items":{"type":"string","enum":["recipient.gender_at_birth","dna.health_measurements.height_cm","dna.health_measurements.weight_kg","dna.health_measurements.total_cholesterol_mg_dl","dna.health_measurements.systolic_blood_pressure_mmhg","dna.health_measurements.diastolic_blood_pressure_mmhg","dna.health_measurements.fasting_glucose_mg_dl","dna.health_measurements.hba1c_percent","dna.ancestry","dna.lifestyle","dna.medical_history","dna.eligibility","dna.consent"]}},"available_collection_types":{"type":"array","items":{"type":"string"}},"supported_ship_to_countries":{"type":"array","description":"ISO-3166 alpha-2 codes this test can be ordered in (AT_HOME shipping destination; for GO_TO_LAB, the requested lab country). Gate your address form on it - orders outside these countries are rejected with an unsupported_ship_to_country field error.","items":{"type":"string"}},"price_cents":{"type":"integer","format":"int32"},"currency":{"$ref":"#/components/schemas/Currency"},"images":{"description":"This variant's images, in display order. Omitted when it has none.","type":"array","items":{"$ref":"#/components/schemas/Image"}}}},"CollectionMethod":{"type":"string","description":"How the sample is taken. Omitted when the supplier states a method outside this vocabulary. New methods may be added; treat an unknown value as unstated.","enum":["finger_prick","venous_draw","automatic_capillary","cheek_swab"]},"CollectionVisit":{"type":"string","description":"The clinician visit the sample is taken at. Omitted for a self-collected kit. New visits may be added; treat an unknown value as a visit you cannot offer.","enum":["home_phlebotomy","clinic"]},"TurnaroundDays":{"type":"object","description":"The supplier's stated lab turnaround in days, from sample received to results. A single stated figure has `min` == `max`.","required":["min","max"],"properties":{"min":{"type":"integer","format":"int32"},"max":{"type":"integer","format":"int32"}}},"Biomarker":{"type":"object","description":"One measurement a kit includes.","required":["name"],"properties":{"name":{"type":"string","description":"Human-readable biomarker name."},"code":{"type":"string","description":"The code the result bundle uses for this analyte."},"loinc":{"type":"string","description":"LOINC code for this analyte, when known."}}},"DNAReport":{"type":"string","description":"A report category a DNA test's bundle includes; the same vocabulary as the DNA result's finding categories. Non-exhaustive: new categories may be added without a new API version.","enum":["carrier","monogenic","disease_risk","pgx","trait","longevity","ancestry"]},"ProblemDetail":{"description":"Standard error response format following RFC 7807 specification","type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}}},"AuthenticationError":{"description":"Authentication error response (401)","type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}},"required":["detail","status","title","type"]}}},"paths":{"/api/v1/products/{id}":{"get":{"operationId":"getProductsByType","summary":"Get products by type ID","tags":["products"],"description":"Returns all products within a specific product type category","parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"show_all","in":"query","required":false,"description":"Return the full catalog with per-product enabled flags (curation view).","schema":{"type":"boolean","default":false}},{"name":"id","in":"path","description":"Product Type ID","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Successfully retrieved products. An existing product type with no available products returns an empty array.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Product"}}}}},"400":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Invalid product type ID format. An unsupported `X-Terra-Version` also returns 400 with code `invalid_api_version`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Unauthorized - invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthenticationError"}}}},"404":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Product type not found","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}},"required":["detail","instance","status","title","type"]}}}},"500":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"503":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Current authorization is unavailable; retry after the dependency recovers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}}}}
```

## Get product variants by product ID

> Returns all available variants/options for a specific diagnostic test product (e.g., different panel sizes, customizations)

```json
{"openapi":"3.1.0","info":{"title":"Terra Vantage API","version":"2026.10.22"},"servers":[{"url":"https://vantage.tryterra.co"}],"security":[{"BasicAuth":[]},{"DataBearer":[],"DevIDHeader":[]}],"components":{"securitySchemes":{"BasicAuth":{"type":"http","scheme":"basic","description":"Authenticate with your Terra API credentials: username = your Terra\n`dev-id`, password = your Terra API key — the same credentials used for\nevery other Terra API. The header pair `dev-id` + `x-api-key` is also\naccepted. Suspended credentials receive 403; accounts without the\nVantage entitlement receive 403 once entitlement enforcement is\nenabled. Once the credential validator is configured, backfilled keys\nalso honor current token expiry, revocation, audience and Vantage scopes.\nInvalid tokens receive 401, insufficient scopes 403 and an unavailable\nvalidator 503. These checks remain active when product policy is off.\n"},"DataBearer":{"type":"http","scheme":"bearer","bearerFormat":"Terra data token","description":"A data-plane token with vantage:read for reads or vantage:write for writes. Requires dev-id. Write includes read; data:read alone does not grant Vantage. Available after the API credential validator is configured."}},"parameters":{"ApiVersion":{"name":"X-Terra-Version","in":"header","required":false,"description":"The API version to serve this request in. Defaults to your account's pinned version; an account is pinned to the latest version on its first request.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}}},"headers":{"ApiVersion":{"description":"The API version this response was rendered in.","schema":{"type":"string","enum":["2026-09-27","2026-10-01","2026-10-15"]}},"RequestId":{"description":"A UUID generated for this request, unique per request and never taken from the caller. Quote it to support to find the request.","schema":{"type":"string","format":"uuid"}}},"schemas":{"ProductVariant":{"type":"object","required":["name","biomarkers","requires_activation","availability"],"properties":{"id":{"type":"string","description":"Decimal string."},"product_id":{"type":"string","description":"Decimal string."},"product_type_id":{"type":"string","description":"Decimal string."},"name":{"type":"string","description":"The variant's name, as the supplier states it."},"description":{"type":"string","description":"The supplier's blurb for this variant. Omitted when it states none."},"collection_method":{"$ref":"#/components/schemas/CollectionMethod"},"collection_visit":{"$ref":"#/components/schemas/CollectionVisit"},"turnaround_days":{"$ref":"#/components/schemas/TurnaroundDays"},"requires_activation":{"type":"boolean","description":"Whether the kit has to be activated before the lab will process its sample. When true, call the kit activation endpoint as part of your flow; the sample is not processed without it."},"availability":{"$ref":"#/components/schemas/Availability"},"biomarkers":{"type":"array","description":"Biomarkers measured by this variant. Empty when the panel is not catalogued or could not be read.","items":{"$ref":"#/components/schemas/Biomarker"}},"reports":{"type":"array","description":"DNA tests only: the reports this variant's bundle includes. A DNA product's variants are report bundles; pick one at order time by its variant id. Omitted for other product types.","items":{"$ref":"#/components/schemas/DNAReport"}},"required_dna_details":{"type":"array","description":"DNA tests only: what an order for this variant must tell Terra about the end user, as JSON paths into the create-order request (recipient.gender_at_birth, or a key of dna). Empty when the variant needs nothing; omitted for other product types. An order missing any of them is rejected with 400 before payment. Non-exhaustive: new values may be added without a new API version.","items":{"type":"string","enum":["recipient.gender_at_birth","dna.health_measurements.height_cm","dna.health_measurements.weight_kg","dna.health_measurements.total_cholesterol_mg_dl","dna.health_measurements.systolic_blood_pressure_mmhg","dna.health_measurements.diastolic_blood_pressure_mmhg","dna.health_measurements.fasting_glucose_mg_dl","dna.health_measurements.hba1c_percent","dna.ancestry","dna.lifestyle","dna.medical_history","dna.eligibility","dna.consent"]}},"available_collection_types":{"type":"array","items":{"type":"string"}},"supported_ship_to_countries":{"type":"array","description":"ISO-3166 alpha-2 codes this test can be ordered in (AT_HOME shipping destination; for GO_TO_LAB, the requested lab country). Gate your address form on it - orders outside these countries are rejected with an unsupported_ship_to_country field error.","items":{"type":"string"}},"price_cents":{"type":"integer","format":"int32"},"currency":{"$ref":"#/components/schemas/Currency"},"images":{"description":"This variant's images, in display order. Omitted when it has none.","type":"array","items":{"$ref":"#/components/schemas/Image"}}}},"CollectionMethod":{"type":"string","description":"How the sample is taken. Omitted when the supplier states a method outside this vocabulary. New methods may be added; treat an unknown value as unstated.","enum":["finger_prick","venous_draw","automatic_capillary","cheek_swab"]},"CollectionVisit":{"type":"string","description":"The clinician visit the sample is taken at. Omitted for a self-collected kit. New visits may be added; treat an unknown value as a visit you cannot offer.","enum":["home_phlebotomy","clinic"]},"TurnaroundDays":{"type":"object","description":"The supplier's stated lab turnaround in days, from sample received to results. A single stated figure has `min` == `max`.","required":["min","max"],"properties":{"min":{"type":"integer","format":"int32"},"max":{"type":"integer","format":"int32"}}},"Availability":{"type":"string","description":"Whether the item can be ordered right now. `unknown` is served when the supplier has not stated availability.","enum":["unknown","in_stock","out_of_stock"]},"Biomarker":{"type":"object","description":"One measurement a kit includes.","required":["name"],"properties":{"name":{"type":"string","description":"Human-readable biomarker name."},"code":{"type":"string","description":"The code the result bundle uses for this analyte."},"loinc":{"type":"string","description":"LOINC code for this analyte, when known."}}},"DNAReport":{"type":"string","description":"A report category a DNA test's bundle includes; the same vocabulary as the DNA result's finding categories. Non-exhaustive: new categories may be added without a new API version.","enum":["carrier","monogenic","disease_risk","pgx","trait","longevity","ancestry"]},"Currency":{"type":"string","description":"ISO 4217 alphabetic currency code. Omitted when the stored currency is not one of these. Versions before 2026-10-15 serve the ISO 4217 numeric code (840, 978, 826) instead.","enum":["USD","EUR","GBP"]},"Image":{"type":"object","properties":{"alt_text":{"type":"string"},"display_order":{"type":"integer","format":"int32"},"height":{"type":"integer","format":"int32"},"id":{"type":"string","description":"Decimal string."},"product_id":{"type":"string","description":"Decimal string."},"url":{"type":"string"},"variant_id":{"type":"string","description":"Decimal string."},"width":{"type":"integer","format":"int32"}}},"ProblemDetail":{"description":"Standard error response format following RFC 7807 specification","type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}}},"AuthenticationError":{"description":"Authentication error response (401)","type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}},"required":["detail","status","title","type"]}}},"paths":{"/api/v1/products/{id}/variants":{"get":{"operationId":"listProductVariants","summary":"Get product variants by product ID","tags":["products"],"description":"Returns all available variants/options for a specific diagnostic test product (e.g., different panel sizes, customizations)","parameters":[{"$ref":"#/components/parameters/ApiVersion"},{"name":"show_all","in":"query","required":false,"description":"Include variants of catalog-disabled products (curation view). Disabled products remain non-orderable regardless.","schema":{"type":"boolean","default":false}},{"name":"id","in":"path","description":"Product ID","required":true,"schema":{"type":"integer","minimum":1}}],"responses":{"200":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Successfully retrieved variants","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProductVariant"}}}}},"400":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Invalid product ID format. An unsupported `X-Terra-Version` also returns 400 with code `invalid_api_version`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"401":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Unauthorized - invalid credentials","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthenticationError"}}}},"404":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"No product variants were found","content":{"application/json":{"schema":{"type":"object","properties":{"detail":{"type":"string"},"instance":{"type":"string"},"status":{"type":"integer"},"title":{"type":"string"},"type":{"type":"string"}},"required":["detail","instance","status","title","type"]}}}},"500":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}},"503":{"headers":{"X-Terra-Version":{"$ref":"#/components/headers/ApiVersion"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"}},"description":"Current authorization is unavailable; retry after the dependency recovers.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProblemDetail"}}}}}}}}}
```
