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_hereBase URL:
https://labquotes.co/api/v1Rate 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/ping | Verify your key and see your plan. |
| POST | /v1/requests | Submit a new testing request. |
| GET | /v1/requests | List 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." } }401missing/invalid key ·403key not active ·404not found ·422validation ·429rate limited
Ready to integrate? Apply for a key and start in minutes.
Apply for an API key