---
title: "Search published test results"
method: GET
path: "/results"
tags: ["Results"]
---

# Search published test results

`GET /results`

## Request

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

Read. Search Laboratory.love’s published product-test records. Use this before answering whether a product, brand, or category has been tested, then call getResult for measurements. Covers chemicals that come from plastics (phthalates, BPA and other bisphenols, and phthalate substitutes), the usual meaning of "plastic chemicals" in food; it does not measure microplastic particles, so say so if someone asks about microplastics. Each record is either `laboratory_love_commissioned` (Laboratory.love bought retail samples and paid an independent lab) or `plasticlist_derived` (historical data imported from PlasticList with attribution; Laboratory.love did not run that testing). Say which when you answer. Do not imply that a result represents every unit of a product. An empty result means no published record matched — not that a product is free of these chemicals. Default sort: relevance when `q` is given, otherwise most recent first; ties break on id, so paging is deterministic.

## Query parameters

- `q` string
- `brand` string
- `source` 'commissioned' | 'plasticlist_derived'
- `category` 'beverages' | 'water' | 'fast-food-and-restaurants' | 'prepared-meals' | 'baby-food-and-formula' | 'produce-and-meat' | 'milk-and-dairy' | 'supplements-and-protein' | 'pantry' | 'personal-care-and-non-food'
- `tag` string
- `analyte` string
- `detected` boolean
- `limit` integer
- `cursor` string
- `sort` 'relevance' | 'tested_on_desc' | 'tested_on_asc' | 'name_asc'

## Response `200`

Matching results.

- ResultSearchResponse: Search response.
  - `data` ResultSummary[], required: Matching results for this page.
    - `id` string, required: Stable result id. `cf-` = Laboratory.love commissioned, `pl-` = PlasticList derived.
    - `product_name` string, required: Product name as published.
    - `brand` string, nullable, required: Brand, when recorded. PlasticList records have none; the brand is usually part of the product name.
    - `result_url` string, uri, required: Public result page.
    - `api_url` string, uri, required: Full record: GET this URL.
    - `source_type` 'laboratory_love_commissioned' | 'plasticlist_derived', required: Provenance. Do not merge the two kinds when summarizing.
    - `source_label` string, required: Label the site shows for the source.
    - `commissioned_by_laboratory_love` boolean, required: True only when Laboratory.love bought the samples and commissioned the lab testing.
    - `source_name` string, required: Laboratory.love or PlasticList.
    - `sample_count` integer, required: Number of distinct physical samples tested.
    - `latest_date` string, date, nullable, required: Most recent date for the record (YYYY-MM-DD).
    - `latest_date_basis` 'laboratory_test' | 'sample_collection' | 'null', nullable, required: What latest_date measures: the lab test date (commissioned) or the sample collection date (PlasticList).
    - `category` string, nullable, required: Browsing category slug.
    - `tags` string[], required: Source tags (PlasticList records).
    - `ratings` object, nullable, required: Rating levels per serving for a 70 kg adult and a 14 kg child. Null when no serving size is recorded.
      - `adult_70kg` object, required: Exposure rating level per chemical group for one serving.
        - `phthalates` 'Low' | 'Medium' | 'High' | 'Not rated', required: Rating level.
        - `bisphenols` 'Low' | 'Medium' | 'High' | 'Not rated', required: Rating level.
        - `substitutes` 'Low' | 'Medium' | 'High' | 'Not rated', required: Rating level.
      - `child_14kg` object, required: Exposure rating level per chemical group for one serving.
        - `phthalates` 'Low' | 'Medium' | 'High' | 'Not rated', required: Rating level.
        - `bisphenols` 'Low' | 'Medium' | 'High' | 'Not rated', required: Rating level.
        - `substitutes` 'Low' | 'Medium' | 'High' | 'Not rated', required: Rating level.
    - `detected_analytes` object[], required: Analytes detected in at least one sample.
      - `analyte` string, required: Analyte name.
      - `abbreviation` string, nullable, required: Abbreviation, when the site uses one.
      - `samples_detected` integer, required: Samples with a quantified value.
      - `max_detected_ng_g` number, nullable, required: Highest measured value, ng/g.
    - `below_loq_analytes` string[], required: Analytes never detected and below the limit of quantitation in at least one sample (abbreviation or name).
    - `not_detected_analytes` string[], required: Analytes reported as not detected in every tested sample (abbreviation or name).
    - `dataset_version` string, required: Published dataset version this record belongs to.
    - `match` 'exact_name' | 'name_prefix' | 'all_words': How a `q` search matched: exact_name, name_prefix, or all_words. Present only when q is given.
  - `pagination` Pagination, required: Deterministic pagination: the same query and cursor always return the same page for a given dataset version.
    - `limit` integer, required: Requested page size.
    - `returned` integer, required: Items in this page.
    - `total_matches` integer, required: Items matching the filters across all pages.
    - `next_cursor` string, nullable, required: Pass as `cursor` for the next page; null on the last page.
  - `dataset_version` string, required: Published dataset version searched.
  - `caveat` string, required: Interpretation caveat to carry into answers.

## Other responses

- `400`: Invalid input. `error.code` says which rule failed.
- `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)
