Labcritics
Home/API Documentation

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.

Getting Started

The Labcritics API provides RESTful endpoints under /api/v1/. All responses return JSON.

To start using the API:

  1. Contact us or request an API key through your account
  2. Store your API key securely — it is shown only once at creation
  3. Include the key in every request via the Authorization header
  4. Start querying products and pricing
Base URL
https://your-domain.com/api/v1

Authentication

All API requests must include your API key. We support two methods:

Option 1: Authorization Header (Recommended)

curl
curl -H "Authorization: Bearer lc_your_api_key_here" \
  https://your-domain.com/api/v1/products

Option 2: X-API-Key Header

curl
curl -H "X-API-Key: lc_your_api_key_here" \
  https://your-domain.com/api/v1/products

Test Your Key

Use the /api/v1/me endpoint to verify your key is working:

curl
curl -H "Authorization: Bearer lc_your_api_key_here" \
  https://your-domain.com/api/v1/me
Response
{
  "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: 60

Error Handling

All errors follow a consistent format:

Error Response
{
  "error": "Human-readable error message"
}
StatusMeaning
400Invalid request body or parameters
401Missing or invalid API key
403Insufficient permissions or revoked key
404Resource not found
429Rate limit exceeded

Products

GET/api/v1/productsproducts:read

Search and list products with optional filters and pagination. Pass a country parameter to include vendor pricing inline.

Query Parameters

ParameterTypeDescription
qstringFull-text search query (name, manufacturer, SKU)
categorystringFilter by category slug
manufacturerstringFilter by manufacturer slug
countrystringInclude vendor pricing for this country (requires pricing:read)
pageintegerPage number (default: 1)
limitintegerItems per page (default: 25, max: 100)
Example: Search for pipette tips with US pricing
curl -H "Authorization: Bearer lc_your_key" \
  "https://your-domain.com/api/v1/products?q=pipette+tips&country=USA&limit=10"
Response
{
  "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 }
}
GET/api/v1/products/:slugproducts:read

Get full details for a single product including specifications, documents, and vendor pricing.

Query Parameters

ParameterTypeDescription
countrystringFilter vendor pricing to a specific country
Example
curl -H "Authorization: Bearer lc_your_key" \
  "https://your-domain.com/api/v1/products/pipette-tips-960-pieces-10-racks?country=UK"

Pricing

GET/api/v1/products/:slug/pricingpricing:read

Get all vendor pricing for a product. Returns every vendor who supplies this product, with price, currency, and country.

Query Parameters

ParameterTypeDescription
countrystringFilter to vendors serving this country
Example
curl -H "Authorization: Bearer lc_your_key" \
  "https://your-domain.com/api/v1/products/pipette-tips-960-pieces-10-racks/pricing?country=Germany"
Response
{
  "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

GET/api/v1/categoriesproducts:read

Get the full category tree including subcategories and product counts. Useful for building navigation in your LIMS.

Response
{
  "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

POST/api/v1/ordersorders:create

Place 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)

ParameterTypeDescription
productSlug*stringProduct to order
vendorSlug*stringVendor to order from
quantity*integerQuantity (min: 1)
country*stringDelivery country (used for pricing lookup)
shippingAddressstringFull shipping address
notesstringSpecial instructions or notes
referenceNumberstringYour internal PO or reference number
Example
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
Response (201 Created)
{
  "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"
  }
}
GET/api/v1/ordersorders:read

List all orders placed by your API key, newest first.

Query Parameters

ParameterTypeDescription
pageintegerPage number (default: 1)
limitintegerItems per page (default: 25, max: 100)
GET/api/v1/orders/:idorders:read

Get details for a single order. Only returns orders belonging to your API key.

Order statuses: pendingconfirmedprocessingshippeddelivered

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.

Python
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.

Python
# 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.

Python
# 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.

Python
# 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 → delivered

Permissions Reference

Each API key is assigned specific permissions that control which endpoints it can access.

PermissionGrants Access To
products:readList/search products, product details, categories
pricing:readVendor pricing endpoints and inline pricing on product queries
orders:createPlace new orders via POST /api/v1/orders
orders:readList 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.