65,000+ global labs and counting
LabQuotes API · v1

Developer documentation

Submit testing requests and retrieve quotes programmatically. A clean REST API over HTTPS with key-based authentication — built for QA tools, PIM systems, and internal workflows.

Key-based auth

Apply once, generate a secret key, send it as a Bearer token.

Rate limited

Per-key limits keep the platform fast and fair for everyone.

No bulk lab data

The lab network is never exposed via API — by design.

Getting access

The API is a paid, application-reviewed product. Create a free account, then apply for a key from your dashboard. Once approved, you generate your secret key (shown once) and start making requests. Need a plan first? Talk to us.

Authentication

Send your key in the Authorization header. Keep it server-side; never expose it in a browser or mobile app.

Authorization: Bearer lq_live_your_key_here
# or
X-API-Key: lq_live_your_key_here

Base URL:

https://labquotes.co/api/v1

Rate limits & fair use

Each key has a per-minute limit (set by your plan). Exceeding it returns 429 rate_limited with a Retry-After header. The API exposes only your own data — you can submit requests and read the quotes you receive, but the lab directory cannot be enumerated through the API.

Endpoints

GET/v1/pingVerify your key and see your plan.
POST/v1/requestsSubmit a new testing request.
GET/v1/requestsList your testing requests.
GET/v1/requests/{id}Get one request and the quotes it received.

Submit a request

POST /v1/requests — the only required field is description. Returns the created request with its publicId and status.

cURL

curl -X POST https://labquotes.co/api/v1/requests \
  -H "Authorization: Bearer lq_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Heavy metals on greens powder",
    "description": "Need ICP-MS heavy metals (Pb, As, Cd, Hg) + microbial panel on a finished greens powder for Amazon.",
    "productType": "Greens powder",
    "purposes": ["amazon", "compliance"],
    "country": "US"
  }'

JavaScript (fetch)

const res = await fetch("https://labquotes.co/api/v1/requests", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${process.env.LABQUOTES_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    description: "Heavy metals + microbial on a finished greens powder.",
    productType: "Greens powder",
    purposes: ["amazon"],
  }),
});
const { data } = await res.json();
console.log(data.publicId, data.status);

Python (requests)

import os, requests

r = requests.post(
    "https://labquotes.co/api/v1/requests",
    headers={"Authorization": f"Bearer {os.environ['LABQUOTES_API_KEY']}"},
    json={
        "description": "Heavy metals + microbial on a finished greens powder.",
        "productType": "Greens powder",
        "purposes": ["amazon"],
    },
)
print(r.json()["data"]["publicId"])

Example response

{
  "data": {
    "id": "clx…",
    "publicId": "REQ-7Q2K9F",
    "title": "Heavy metals on greens powder",
    "status": "SUBMITTED",
    "productType": "Greens powder",
    "country": "US",
    "createdAt": "2026-06-14T13:00:00.000Z"
  }
}

Errors

Errors use standard HTTP status codes and a consistent shape:

{ "error": { "code": "rate_limited", "message": "Rate limit of 60 requests/minute exceeded." } }
  • 401 missing/invalid key · 403 key not active · 404 not found · 422 validation · 429 rate limited

Ready to integrate? Apply for a key and start in minutes.

Apply for an API key