---
title: "Get one full test result"
method: GET
path: "/results/{id}"
tags: ["Results"]
---

# Get one full test result

`GET /results/{id}`

## Request

- Base URL: `https://www.laboratory.love/api/v1`
- URL: `https://www.laboratory.love/api/v1/results/{id}`
- Auth: none required

Read. Returns the complete public record for one result: product identity, provenance, each sample with lot and analysis dates/methods, every analyte measurement with its status and LOQ when known, per-analyte counts, and the per-serving exposure ratings shown on the result page with all assumptions. When answering: (1) say whether the testing was commissioned by Laboratory.love or derived from PlasticList; (2) keep sample-level context (how many samples, how many had a detection); (3) distinguish detected values, below-LOQ, and not-detected — never report below-LOQ or not-detected as 0; (4) do not call a product “safe” because a value is low or not detected; (5) do not extrapolate from these samples to the whole product line, brand, or category.

## Path parameters

- `id` string, required

## Response `200`

The record.

- ResultResponse: Single result.
  - `data` ResultRecord, required: Complete public record for one result.
    - `id` string, required: Stable result id.
    - `product` object, required: Product identity.
      - `name` string, nullable, required: Product name.
      - `brand` string, nullable, required: Brand, when recorded.
      - `laboratory_love_product_id` integer, nullable, required: Laboratory.love product id (commissioned results; same id as GET /crowdfund/{id}).
      - `plasticlist_product_id` string, nullable, required: Original PlasticList product id (PlasticList-derived results).
      - `image_url` string, uri, nullable, required: Product photo.
      - `retailer_url` string, uri, nullable, required: Where the product is sold (may be an affiliate link).
    - `result_url` string, uri, required: Public result page.
    - `api_url` string, uri, required: This record.
    - `provenance` object, required: Where the data comes from. Always report this.
      - `source_type` 'laboratory_love_commissioned' | 'plasticlist_derived', required: Provenance.
      - `source_label` string, required: Label the site shows.
      - `commissioned_by_laboratory_love` boolean, required: True only for Laboratory.love-commissioned testing.
      - `source_name` string, required: Laboratory.love or PlasticList.
      - `source_url` string, uri, nullable, required: Original source page.
      - `license_url` string, uri, required: License for reuse.
      - `attribution` string, nullable, required: Required attribution when reusing.
      - `laboratory` string, nullable, required: Testing laboratory, when known.
      - `description` string, required: Plain-language provenance statement to relay.
    - `dates` object, required: Record-level date. Per-sample purchase and test dates are in samples[].analyses.
      - `latest_date` string, date, nullable, required: YYYY-MM-DD
      - `latest_date_basis` 'laboratory_test' | 'sample_collection' | 'null', nullable, required: laboratory_test or sample_collection.
    - `category` object, nullable, required: Browsing category.
      - `slug` string, required: Slug.
      - `name` string, required: Name.
      - `url` string, uri, required: Category page.
    - `tags` string[], required: Source tags.
    - `collection_notes` string, nullable, required: Source notes about sample collection (PlasticList), which may mention location.
    - `sample_count` integer, required: Distinct physical samples.
    - `samples` Sample[], required: Sample-level data.
      - `sample_id` string, required: Sample identifier from the source (lab sample ids may be comma-joined when one physical sample had several lab rows).
      - `lot` string, nullable, required: Lot number, when recorded.
      - `analyses` Analysis[], required: Assays run on this sample. Empty when the source did not publish them.
        - `assay` string, nullable, required: Assay/panel name.
        - `method` string, nullable, required: Analytical method, e.g. GC-MS/MS.
        - `purchase_date` string, date, nullable, required: Date the sample was bought/ordered.
        - `test_date` string, date, nullable, required: Date the lab tested it.
      - `measurements` Measurement[], required: Every analyte result for this sample.
        - `analyte` string, required: Analyte name.
        - `abbreviation` string, nullable, required: Abbreviation (DEHP, BPA, …) when the site uses one.
        - `category` string, required: Phthalates, Bisphenols, Phthalate Substitutes, or Other.
        - `status` 'detected' | 'below_limit_of_quantitation' | 'not_detected' | 'not_tested', required: detected = quantified value in value_ng_g; below_limit_of_quantitation = present below the lab’s LOQ or not quantifiable (value is null, LOQ given when known); not_detected = reported as not detected (or as 0 by PlasticList); not_tested = not part of this sample’s analysis. Never treat these as interchangeable or as zero.
        - `value_ng_g` number, nullable, required: Measured concentration in ng/g (ppb). Only set when status is detected.
        - `qualifier` 'greater_than' | 'null', nullable, required: greater_than when the lab reported the value as a lower bound (above its quantification range).
        - `limit_of_quantitation_ng_g` number, nullable, required: LOQ in ng/g, when the source reported one for a below-LOQ result.
        - `unit` 'ng/g', required: Always ng/g.
    - `analyte_summary` AnalyteSummary[], required: Per-analyte counts across samples.
      - `abbreviation` string, nullable, required: Abbreviation, when the site uses one.
      - `analyte` string, required: Analyte name.
      - `category` string, required: Chemical category.
      - `samples_detected` integer, required: Samples with a quantified value.
      - `samples_below_loq` integer, required: Samples below the limit of quantitation.
      - `samples_not_detected` integer, required: Samples reported as not detected.
      - `samples_not_tested` integer, required: Samples where the analyte was not part of the analysis.
      - `min_detected_ng_g` number, nullable, required: Lowest quantified value, ng/g.
      - `max_detected_ng_g` number, nullable, required: Highest quantified value, ng/g.
      - `max_is_lower_bound` boolean, required: True when the highest value was reported as “greater than”.
    - `summary_text` string, required: The factual summary paragraph shown on the result page.
    - `exposure` Exposure, required: Laboratory.love’s per-serving exposure context, the same numbers the result page shows. Not medical advice or a safety verdict.
      - `ratings` object, nullable, required: Ratings by assumed body weight.
        - `adult_70kg` RatingSet, required: Ratings for one body weight.
          - `phthalates` Rating, required: One group’s rating.
            - `level` 'Low' | 'Medium' | 'High' | 'Not rated', required: Low (<2.5% of the TDI per serving), Medium (2.5–7.5%), High (≥7.5%), or Not rated.
            - `percent_of_tdi_per_serving` number, nullable, required: Estimated share of the tolerable daily intake from one serving, in percent. Can exceed 100.
            - `not_rated_reason` string: Why a rating is withheld, when it is.
          - `bisphenols` Rating, required: One group’s rating.
            - `level` 'Low' | 'Medium' | 'High' | 'Not rated', required: Low (<2.5% of the TDI per serving), Medium (2.5–7.5%), High (≥7.5%), or Not rated.
            - `percent_of_tdi_per_serving` number, nullable, required: Estimated share of the tolerable daily intake from one serving, in percent. Can exceed 100.
            - `not_rated_reason` string: Why a rating is withheld, when it is.
          - `substitutes` Rating, required: One group’s rating.
            - `level` 'Low' | 'Medium' | 'High' | 'Not rated', required: Low (<2.5% of the TDI per serving), Medium (2.5–7.5%), High (≥7.5%), or Not rated.
            - `percent_of_tdi_per_serving` number, nullable, required: Estimated share of the tolerable daily intake from one serving, in percent. Can exceed 100.
            - `not_rated_reason` string: Why a rating is withheld, when it is.
        - `child_14kg` RatingSet, required: Ratings for one body weight.
          - `phthalates` Rating, required: One group’s rating.
            - `level` 'Low' | 'Medium' | 'High' | 'Not rated', required: Low (<2.5% of the TDI per serving), Medium (2.5–7.5%), High (≥7.5%), or Not rated.
            - `percent_of_tdi_per_serving` number, nullable, required: Estimated share of the tolerable daily intake from one serving, in percent. Can exceed 100.
            - `not_rated_reason` string: Why a rating is withheld, when it is.
          - `bisphenols` Rating, required: One group’s rating.
            - `level` 'Low' | 'Medium' | 'High' | 'Not rated', required: Low (<2.5% of the TDI per serving), Medium (2.5–7.5%), High (≥7.5%), or Not rated.
            - `percent_of_tdi_per_serving` number, nullable, required: Estimated share of the tolerable daily intake from one serving, in percent. Can exceed 100.
            - `not_rated_reason` string: Why a rating is withheld, when it is.
          - `substitutes` Rating, required: One group’s rating.
            - `level` 'Low' | 'Medium' | 'High' | 'Not rated', required: Low (<2.5% of the TDI per serving), Medium (2.5–7.5%), High (≥7.5%), or Not rated.
            - `percent_of_tdi_per_serving` number, nullable, required: Estimated share of the tolerable daily intake from one serving, in percent. Can exceed 100.
            - `not_rated_reason` string: Why a rating is withheld, when it is.
      - `serving_size_g` number, nullable, required: Serving size used, grams.
      - `serving_size_label` string, nullable, required: Serving size as labeled.
      - `assumptions` object, required: Inputs of the exposure calculation.
        - `basis` string, required: What one rating represents.
        - `body_weights_kg` object, required: Assumed body weights.
          - `adult` number, required: kg
          - `child` number, required: kg
        - `tolerable_daily_intake_ng_per_kg_bw` object, required: TDIs used.
          - `phthalates_dehp_equivalents` number, required: ng/kg bw/day
          - `bisphenols_sum` number, required: ng/kg bw/day
          - `substitutes_deht_equivalents` number, required: ng/kg bw/day
        - `phthalate_equivalency_factors` object, required: DEHP-equivalent potency factors.
        - `substitute_equivalency_factors` object, required: DEHT-equivalent potency factors.
        - `rating_thresholds_percent_of_tdi` object, required: Rating cut-offs.
          - `low_below` number, required: %
          - `medium_below` number, required: %
        - `below_loq_handling` string, required: How below-LOQ values enter the calculation for this record.
      - `methodology_url` string, uri, required: Methodology page.
      - `caveat` string, required: How to present ratings.
    - `dataset` object, required: Dataset this record belongs to.
      - `version` string, required: Dataset version.
      - `license_url` string, uri, required: License.
      - `citation` string, required: Preferred citation.
      - `catalog_url` string, uri, required: Dataset downloads (CSV/JSON).
    - `caveat` string, required: Interpretation caveat to carry into answers.
  - `dataset_version` string, required: Dataset version.

## Other responses

- `400`: Invalid input. `error.code` says which rule failed.
- `404`: No such record.
- `429`: Rate limited. Wait `Retry-After` seconds.
- `503`: Data source temporarily unavailable. Retry shortly.

---

[API](https://skmtc.dev/laboratory/apis/laboratory-love-api.md) · [All operations](https://skmtc.dev/laboratory/apis/laboratory-love-api/llms.txt) · [OpenAPI document](https://skmtc.dev/laboratory/apis/laboratory-love-api/revisions/ca2b4c069ad5?raw)
