API Documentation
Integrate your LIMS, ERP, or procurement system with Labcritics to access product catalogs, real-time vendor pricing by country, and place orders programmatically.
Contents
Getting Started
The Labcritics API provides RESTful endpoints under /api/v1/. All responses return JSON.
To start using the API:
- Contact us or request an API key through your account
- Store your API key securely — it is shown only once at creation
- Include the key in every request via the
Authorizationheader - Start querying products and pricing
https://your-domain.com/api/v1Authentication
All API requests must include your API key. We support two methods:
Option 1: Authorization Header (Recommended)
curl -H "Authorization: Bearer lc_your_api_key_here" \
https://your-domain.com/api/v1/productsOption 2: X-API-Key Header
curl -H "X-API-Key: lc_your_api_key_here" \
https://your-domain.com/api/v1/productsTest Your Key
Use the /api/v1/me endpoint to verify your key is working:
curl -H "Authorization: Bearer lc_your_api_key_here" \
https://your-domain.com/api/v1/me{
"id": "abc-123",
"name": "Lab LIMS Production",
"organization": "Acme Labs",
"email": "lab@acme.com",
"permissions": ["products:read", "pricing:read", "orders:create"],
"rateLimit": 60,
"createdAt": "2026-04-01T10:00:00.000Z"
}Rate Limiting
Each API key has a per-minute rate limit (default: 60 requests/min). When exceeded, the API returns 429 Too Many Requests.
Rate limit info is included in response headers:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 42
Retry-After: 60Error Handling
All errors follow a consistent format:
{
"error": "Human-readable error message"
}| Status | Meaning |
|---|---|
| 400 | Invalid request body or parameters |
| 401 | Missing or invalid API key |
| 403 | Insufficient permissions or revoked key |
| 404 | Resource not found |
| 429 | Rate limit exceeded |
Products
/api/v1/productsproducts:readSearch and list products with optional filters and pagination. Pass a country parameter to include vendor pricing inline.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Full-text search query (name, manufacturer, SKU) |
category | string | Filter by category slug |
manufacturer | string | Filter by manufacturer slug |
country | string | Include vendor pricing for this country (requires pricing:read) |
page | integer | Page number (default: 1) |
limit | integer | Items per page (default: 25, max: 100) |
curl -H "Authorization: Bearer lc_your_key" \
"https://your-domain.com/api/v1/products?q=pipette+tips&country=USA&limit=10"{
"data": [
{
"slug": "pipette-tips-960-pieces-10-racks",
"name": "Pipette Tips 960 Pieces 10 Racks",
"manufacturer": "Eppendorf",
"model": "EP-960",
"sku": "022491504",
"category": "Pipette Tips",
"categorySlug": "pipette-tips",
"imageUrl": "https://...",
"rating": 4.5,
"reviewCount": 12,
"specs": { "Volume": "0.1-10 µL", "Material": "Polypropylene" },
"pricing": [
{
"vendorSlug": "fisher-scientific",
"vendorName": "Fisher Scientific",
"price": "149.99",
"currency": "USD",
"url": "https://fishersci.com/..."
}
]
}
],
"pagination": { "page": 1, "limit": 10, "total": 42, "totalPages": 5 }
}/api/v1/products/:slugproducts:readGet full details for a single product including specifications, documents, and vendor pricing.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
country | string | Filter vendor pricing to a specific country |
curl -H "Authorization: Bearer lc_your_key" \
"https://your-domain.com/api/v1/products/pipette-tips-960-pieces-10-racks?country=UK"Pricing
/api/v1/products/:slug/pricingpricing:readGet all vendor pricing for a product. Returns every vendor who supplies this product, with price, currency, and country.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
country | string | Filter to vendors serving this country |
curl -H "Authorization: Bearer lc_your_key" \
"https://your-domain.com/api/v1/products/pipette-tips-960-pieces-10-racks/pricing?country=Germany"{
"productSlug": "pipette-tips-960-pieces-10-racks",
"productName": "Pipette Tips 960 Pieces 10 Racks",
"country": "Germany",
"pricing": [
{
"vendorSlug": "vwr-international",
"vendorName": "VWR International",
"country": "Germany",
"price": "139.50",
"currency": "EUR",
"url": "https://vwr.com/..."
},
{
"vendorSlug": "fisher-scientific-de",
"vendorName": "Fisher Scientific DE",
"country": "Germany",
"price": "142.00",
"currency": "EUR",
"url": ""
}
]
}Categories
/api/v1/categoriesproducts:readGet the full category tree including subcategories and product counts. Useful for building navigation in your LIMS.
{
"data": [
{
"name": "Pipettes & Tips",
"slug": "pipettes-tips",
"productCount": 340,
"subcategories": [
{ "name": "Pipette Tips", "slug": "pipette-tips", "productCount": 120 },
{ "name": "Micropipettes", "slug": "micropipettes", "productCount": 85 }
]
}
]
}Orders
/api/v1/ordersorders:createPlace an order for a product from a specific vendor. The order is created with status 'pending' and the vendor will be notified.
Request Body (JSON)
| Parameter | Type | Description |
|---|---|---|
productSlug* | string | Product to order |
vendorSlug* | string | Vendor to order from |
quantity* | integer | Quantity (min: 1) |
country* | string | Delivery country (used for pricing lookup) |
shippingAddress | string | Full shipping address |
notes | string | Special instructions or notes |
referenceNumber | string | Your internal PO or reference number |
curl -X POST -H "Authorization: Bearer lc_your_key" \
-H "Content-Type: application/json" \
-d '{
"productSlug": "pipette-tips-960-pieces-10-racks",
"vendorSlug": "fisher-scientific",
"quantity": 5,
"country": "USA",
"shippingAddress": "123 Lab Street, Boston, MA 02101",
"referenceNumber": "PO-2026-0042"
}' \
https://your-domain.com/api/v1/orders{
"message": "Order placed successfully. The vendor will be notified.",
"order": {
"id": "a1b2c3d4-...",
"productSlug": "pipette-tips-960-pieces-10-racks",
"vendorSlug": "fisher-scientific",
"quantity": 5,
"country": "USA",
"currency": "USD",
"unitPrice": "149.99",
"totalPrice": "749.95",
"status": "pending",
"referenceNumber": "PO-2026-0042",
"createdAt": "2026-04-06T14:30:00.000Z"
}
}/api/v1/ordersorders:readList all orders placed by your API key, newest first.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number (default: 1) |
limit | integer | Items per page (default: 25, max: 100) |
/api/v1/orders/:idorders:readGet details for a single order. Only returns orders belonging to your API key.
Order statuses: pending → confirmed → processing → shipped → delivered
LIMS Integration Guide
Here is a typical integration workflow for connecting your Laboratory Information Management System (LIMS) or procurement platform with the Labcritics API.
1. Sync Product Catalog
Periodically fetch the product catalog to keep your LIMS in sync. Use pagination to handle large datasets.
import requests
API_KEY = "lc_your_key_here"
BASE_URL = "https://your-domain.com/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Fetch all products page by page
page = 1
all_products = []
while True:
resp = requests.get(
f"{BASE_URL}/products",
headers=headers,
params={"page": page, "limit": 100, "country": "USA"}
)
data = resp.json()
all_products.extend(data["data"])
if page >= data["pagination"]["totalPages"]:
break
page += 1
print(f"Synced {len(all_products)} products")2. Look Up Pricing Before Ordering
When a lab user selects a product in your LIMS, fetch the latest pricing from all vendors in their country.
# Get pricing for a specific product in Germany
resp = requests.get(
f"{BASE_URL}/products/pipette-tips-960-pieces-10-racks/pricing",
headers=headers,
params={"country": "Germany"}
)
pricing = resp.json()["pricing"]
# Find the cheapest vendor
best = min(pricing, key=lambda p: float(p["price"] or "9999"))
print(f"Best price: {best['currency']} {best['price']} from {best['vendorName']}")3. Place Orders
Submit orders programmatically with your internal reference numbers for tracking.
# Place an order
order_resp = requests.post(
f"{BASE_URL}/orders",
headers={**headers, "Content-Type": "application/json"},
json={
"productSlug": "pipette-tips-960-pieces-10-racks",
"vendorSlug": best["vendorSlug"],
"quantity": 10,
"country": "Germany",
"shippingAddress": "Universitätsstr. 1, 69120 Heidelberg",
"referenceNumber": "LIMS-REQ-2026-0815"
}
)
order = order_resp.json()["order"]
print(f"Order {order['id']} placed: {order['totalPrice']} {order['currency']}")4. Track Order Status
Poll order status to update your LIMS when orders are confirmed, shipped, or delivered.
# Check order status
resp = requests.get(
f"{BASE_URL}/orders/{order['id']}",
headers=headers
)
status = resp.json()["status"]
print(f"Order status: {status}") # pending → confirmed → processing → shipped → deliveredPermissions Reference
Each API key is assigned specific permissions that control which endpoints it can access.
| Permission | Grants Access To |
|---|---|
products:read | List/search products, product details, categories |
pricing:read | Vendor pricing endpoints and inline pricing on product queries |
orders:create | Place new orders via POST /api/v1/orders |
orders:read | List and view order details and status |
* | Full access to all endpoints |
Need Help?
If you need an API key, have questions about integration, or need higher rate limits, please contact us.