# SimpleLab > SimpleLab (gosimplelab.com) sells laboratory testing for water, soil, air, food, surfaces and other materials to individuals and organizations. Customers pick a test, receive a sampling kit with instructions and prepaid shipping, send samples to a partner lab, and get an easy-to-understand digital report. Last updated: 2026-10-19 The product endpoints below are public, read-only JSON APIs for finding the right SimpleLab test. They need no authentication. Link people to a product page at `https://gosimplelab.com/shop/products/{handle}`, or to a prefilled cart (see Cart Links). ## Product Endpoints - [OpenAPI spec](https://gosimplelab.com/openapi.json): Parameters and response shapes for the three endpoints below. - [Search products](https://api.gosimplelab.com/api/ai/products/search?contaminants[]=Lead&matrices[]=1): Use when the person knows what they want. Returns products that test for ALL of the requested contaminants (AND logic), ordered by relevance. - [Browse products](https://api.gosimplelab.com/api/ai/products/browse?contaminants[]=Lead&contaminants[]=Arsenic&matrices[]=1): Use for vague or exploratory requests. Returns products that test for ANY of the requested contaminants (OR logic). Each product lists `matching_analytes` (which requested contaminants it covers) and `match_strength` (how many), and results are sorted by `match_strength`, highest first. - [Compare products](https://api.gosimplelab.com/api/ai/products/compare?handles[]=drinking-water-test-level-1-bacteria&handles[]=drinking-water-test-level-2-bacteria): Use for product-page detail on up to 5 products by handle, such as test methods, self-test analytes and the pay-later activation price. Unknown handles are listed in `not_found`. ## Parameters Array parameters repeat the key with brackets, e.g. `?contaminants[]=Lead&contaminants[]=Arsenic`. - Search and browse: - `search_term`: Optional free text, up to 255 characters. Also matches SKUs. - `contaminants[]`: Optional analyte names or numeric analyte IDs. Names must match exactly, including case (`Lead`, not `lead`). Analyte names as returned in `analytes_by_category` are valid inputs. `Legionella` and `Total PFAS` are accepted as group terms covering their member analytes. - `matrices[]`: Optional matrix IDs to restrict results by sample type: - `1`: Drinking Water - `2`: Wastewater - `3`: Non-Potable Water - `4`: Soil - `8`: Food - `9`: Solid - `12`: Surface (wipe, swab, tape and dust tests of surfaces, not surface water) - `13`: Air - `14`: Sediment - `15`: Surface Water - `page`: Page number, default 1. - `page_size`: Search default 10, max 20. Browse default 25, max 50. Larger values are capped at the max. - Compare: - `handles[]`: Required, 1 to 5 product handles from search or browse results. ## Responses - Search and browse return `summary` (`total`, `page`, `page_size`, `total_pages`, `applied_filters`) and `products`. - Every product includes `name`, `handle`, `sku`, `matrix`, `price` and `msrp` (USD), `rush` and `paylater` (whether rush turnaround and pay-later options exist), `turnaround_time` (business days), `analytes_count`, `description`, `recommended_for` and `analytes_by_category`. - Invalid parameters return HTTP 422 with `result` (`ERROR`) and a `message`. Send an `Accept: application/json` header to also get per-field `errors`. ## Cart Links To help someone buy, give them a cart link. It replaces their current cart with the listed tests and opens it, and they review and pay themselves. - Format: `https://gosimplelab.com/cart/{item},{item}?ref=agent:{your-name}`. Each item is a product `sku` or `handle`, optionally followed by `:{quantity}` (default 1). - Example: `https://gosimplelab.com/cart/SL-SL-DW-E-S-QC2:2,radon-water-test?ref=agent:example` - A handle adds the product's standard option. - Up to 10 products per link and up to 20 of each. Items that can't be added are listed for the person on the cart page. - `ref` identifies your agent, up to 100 characters. Discount codes can't be applied by link. ## Rate Limit 30 requests per minute per IP address across the three endpoints. Over the limit, responses are HTTP 429 with a `Retry-After` header giving the seconds to wait.