# LabX Scraper — Used Lab Equipment (`crawloop/labx-scraper`) Actor

Scrape LabX new, used and refurbished lab equipment into JSON: centrifuges, HPLC, microscopes, spectrometers. Prices, condition, manufacturer, model, seller, phone, images. Category, keyword or listing URLs — LabX API alternative.

- **URL**: https://apify.com/crawloop/labx-scraper.md
- **Developed by:** [Andrej Kiva](https://apify.com/crawloop) (community)
- **Categories:** E-commerce, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.25 / 1,000 scraped labx listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LabX Scraper — Used Lab Equipment

> **Crawloop Medical & Lab Suite** — scientific marketplace inventory (new / used / refurbished).

| Labexchange | LabX | Exapro | Surplex |
| :--- | :--- | :--- | :--- |
| [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper) | **LabX Scraper** ◄── you are here | [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) |

> **Disclaimer:** Unofficial tool for publicly accessible LabX marketplace pages. Not affiliated with, sponsored by, or endorsed by LabX or LabX Media Group. Trademarks belong to their respective owners.
>
> For informational and research use only (market research, dealer intelligence, procurement comps, inventory monitoring). You are responsible for compliance with applicable laws, site terms, and your organization policies.
>
> No warranty as to accuracy, completeness, or continued availability of third-party data.

This **LabX scraper** (LabX API alternative) extracts **new, used, and refurbished laboratory equipment** listings into clean JSON on Apify — asking prices, condition, manufacturer, model, seller, phone, location, warranty, and images. Pull centrifuges, HPLC systems, microscopes, mass spectrometers, freezers, PCR cyclers, balances, and related categories via category browse, keyword search, manufacturer filter, seller pages, sitemap, or direct listing URLs. Run from **Python**, **Node.js**, **cURL**, or **MCP** / AI assistants and export the dataset to CSV / Excel.

Built for **lab equipment dealers**, **procurement teams**, **asset recovery**, and **valuation comps**. Choose `listings` for fast index-level catalogs or `details` for full product pages with seller phone, shipping location, and description.

Lightweight HTTP extraction with Chrome TLS fingerprinting plus the LabX listings search index — no headless browser.

### When to use this Actor

Use the **LabX Scraper** when you need:

- **Marketplace inventory** across LabX categories, manufacturers, and sellers
- **Asking prices** in USD when sellers publish Buy Now amounts (many high-ticket rows are Request a Quote)
- **Identity fields** — listing ID, SKU, manufacturer, model, condition
- **Seller context** — name, profile URL, phone, member since, active listing count (details mode)
- **Discovery** — category shortcuts, keyword search, manufacturer filter, condition / listing-type filters, optional sitemap harvest, or direct listing URLs

Ideal for used-lab-equipment dealers, biopharma buyers, and data teams tracking North American secondary-market instrumentation.

#### When not to use

- You only need **EU dealer stock** → prefer [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper)
- You need **broad industrial machinery** across many countries → [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) or [Surplex Scraper](https://apify.com/crawloop/surplex-scraper)

### Data pipeline

```
Input                              Mode                         Output
─────────────────────────         ────────────────────         ──────────────────────────

  Category / manufacturer    ──►   listings (index)     ──►  title, price, condition, IDs
  Keyword / filters          ──►   details (PDP JSON)   ──►  seller, phone, images, desc
  Sitemap / direct item URL  ──►                           ──►  location, warranty

  Join by brand + model      ──►   comps with Labexchange / Exapro
```

### Key Features

- **Two extraction modes** — `listings` for index-level fields; `details` for full PDP enrichment
- **Category shortcuts** — popular LabX roots when you do not paste URLs
- **Keyword search** — `searchKeyword` queries the listings index without the HTML `/search` path
- **Filters** — manufacturer, condition, listing type (Buy Now / RFQ / external), price min/max
- **Sitemap discovery** — optional harvest from LabX item sitemaps (~250k+ URLs)
- **Fast concurrent HTTP** — Chrome TLS impersonation; residential proxy recommended on Apify

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | sample Centrifuges category | Category, manufacturer, seller, or listing URLs. |
| `categories` | Array | `centrifuges` | Catalog roots when `startUrls` is empty. |
| `searchKeyword` | String | — | Brand/model search (e.g. Eppendorf, Agilent HPLC). |
| `manufacturer` | String | — | Exact LabX brand name filter. |
| `condition` | String | `any` | `any` / `new` / `used` / `refurbished` / `forPartsNotWorking` / `notSpecified`. |
| `listingType` | String | `any` | `any` / `buyNow` / `requestAQuote` / `externalLink`. |
| `priceMin` / `priceMax` | Integer | — | USD price bounds (rows without a numeric price are excluded by numeric filters). |
| `useSitemap` | Boolean | `false` | Discover listing URLs from item sitemaps. |
| `runMode` | String | `"details"` | `"listings"` or `"details"`. |
| `maxItems` | Integer | `50` | Maximum products (`0` = unlimited). |
| `maxPagesPerUrl` | Integer | `5` | Pagination depth (`0` = until exhausted). |
| `pageSize` | Integer | `50` | Hits per page (1–100). |
| `concurrencyLimit` | Integer | `5` | Parallel detail workers (1–20). |
| `proxyConfiguration` | Object | Apify Proxy | Use **RESIDENTIAL + US** on cloud runs if you hit 403s. |

#### Input example — category details

```json
{
  "startUrls": [
    { "url": "https://www.labx.com/categories/centrifuges" }
  ],
  "runMode": "details",
  "maxItems": 50,
  "maxPagesPerUrl": 3,
  "pageSize": 50,
  "concurrencyLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Input example — used Beckman under $10,000

```json
{
  "searchKeyword": "centrifuge",
  "manufacturer": "Beckman Coulter",
  "condition": "used",
  "priceMax": 10000,
  "runMode": "listings",
  "maxItems": 100
}
```

### Output Format

Each row is pushed to the default dataset. Empty fields are omitted.

#### Details mode (enriched)

| Field | Description |
| :--- | :--- |
| `listingId`, `sku` | LabX identifiers |
| `url`, `title`, `manufacturer`, `model` | Product identity |
| `condition`, `categories` | Taxonomy |
| `price`, `currency`, `listingType` | Commercial terms (`buyNow` / `requestAQuote` / `externalLink`) |
| `location`, `warranty` | Logistics / coverage |
| `sellerId`, `sellerName`, `sellerUrl`, `sellerPhone` | Seller |
| `imageUrl`, `images`, `description` | Media and text |
| `dateListed`, `dateUpdated`, `scrapedAt` | Timestamps |

#### Example record

```json
{
  "listingId": "5820601",
  "sku": "DIS-76406-beckman-coulter-allegra-6r-refrigerated-benchtop-centrifuge-with-gh-3-8-rotor",
  "title": "Beckman Coulter Allegra 6R Refrigerated Benchtop Centrifuge with GH-3.8 Rotor",
  "url": "https://www.labx.com/item/beckman-coulter-allegra-6r-refrigerated-benchtop-centrifuge/DIS-76406-beckman-coulter-allegra-6r-refrigerated-benchtop-centrifuge-with-gh-3-8-rotor",
  "manufacturer": "Beckman Coulter",
  "model": "Allegra 6R",
  "condition": "Used",
  "price": 3625.0,
  "currency": "USD",
  "listingType": "requestAQuote",
  "categories": ["Centrifuges"],
  "location": "Cridersville, Ohio, US",
  "sellerName": "New Life Scientific, Inc.",
  "sellerPhone": "567-221-0615",
  "images": [
    "https://cdn.labx.com/v2/images/catalog/product/5820601/5e24fd60-59d3-4458-a51b-0f19b0b58f23.webp"
  ],
  "scrapedAt": "2026-08-10T09:00:00Z"
}
```

Many high-value instruments are **Request a Quote** — `price` is omitted when LabX does not publish a number.

### Use cases

- **Procurement comps** — compare asking prices for a model (Allegra, Optima, Agilent HPLC) across sellers
- **Dealer monitoring** — track a competitor seller’s live inventory and contact fields
- **Market research** — sample category depth (centrifuges, freezers, spectrometers) for pricing bands
- **Asset recovery** — benchmark resale value before lab decommissioning
- **CRM enrichment** — append manufacturer, condition, and seller phone to sourcing spreadsheets

### Integration examples

#### Node.js

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('crawloop/labx-scraper').call({
  startUrls: [{ url: 'https://www.labx.com/categories/centrifuges' }],
  runMode: 'details',
  maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 5));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/labx-scraper").call(
    run_input={
        "startUrls": [{"url": "https://www.labx.com/categories/centrifuges"}],
        "runMode": "details",
        "maxItems": 20,
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("title"), item.get("manufacturer"), item.get("price"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~labx-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://www.labx.com/categories/centrifuges"}],"runMode":"details","maxItems":20}'
```

### MCP and AI assistants

Use this Actor from AI tools via [Apify MCP](https://docs.apify.com/platform/integrations/mcp). Connect your Apify account, then call `crawloop/labx-scraper`.

Example prompts:

- "Run LabX Scraper for centrifuges, details mode, max 20, return title, manufacturer, price, sellerName"
- "Scrape LabX used Beckman Coulter centrifuges under 10000 and summarize price ranges"
- "Chain LabX Scraper then Labexchange Scraper for NA vs EU lab equipment comps"

### Suite next step

For European dealer stock after LabX comps, run [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper). For broader industrial surplus, use [Exapro Scraper](https://apify.com/crawloop/exapro-scraper).

### FAQ

**What’s the difference between listings and details?**\
`listings` is fast card/index data (title, price, condition, manufacturer, seller name). `details` opens each listing page for phone, location, gallery, description, and warranty.

**Why is `price` missing on some rows?**\
Many instruments are Request a Quote. The Actor never invents a price — it omits the field.

**Can I search by brand without a category URL?**\
Yes — set `searchKeyword` and/or `manufacturer` (e.g. Eppendorf, Thermo Scientific).

**Do I need a proxy?**\
Local runs often work with Chrome TLS impersonation. On Apify cloud, **US residential** is recommended for stable access.

### Notes

- Listing discovery uses LabX’s public listings search index; detail enrichment uses SvelteKit `__data.json`.
- Prefer concurrency 3–8. Enable residential proxy for full-catalog or sitemap runs.
- Duplicate SKUs across overlapping categories are deduplicated by listing ID / SKU / URL.

# Actor input Schema

## `startUrls` (type: `array`):

Category, manufacturer, seller profile, or listing detail URLs on labx.com. If empty, categories / searchKeyword / useSitemap are used.

## `categories` (type: `array`):

LabX category URL keys when startUrls is empty and no searchKeyword is set.

## `searchKeyword` (type: `string`):

Brand/model keyword search via LabX listings index (e.g. Eppendorf 5430, Agilent HPLC). Does not hit the /search HTML path.

## `manufacturer` (type: `string`):

Optional manufacturer filter (exact LabX brand name, e.g. Beckman Coulter, Thermo Scientific, Eppendorf).

## `condition` (type: `string`):

Filter by equipment condition.

## `listingType` (type: `string`):

How the item is sold on LabX.

## `priceMin` (type: `integer`):

Drop listings priced below this amount. Quote-only listings without a public price still pass when using Algolia numeric filters only if they have a numeric price — RFQ rows are omitted by price filters.

## `priceMax` (type: `integer`):

Drop listings priced above this amount.

## `useSitemap` (type: `boolean`):

Pull listing URLs from LabX item\_pages sitemaps (large catalogs). Caps with maxItems.

## `runMode` (type: `string`):

listings = Algolia / category card fields. details = fetch each listing \_\_data.json for seller phone, shipping, gallery, description.

## `maxItems` (type: `integer`):

Maximum listings to return. 0 = unlimited.

## `maxPagesPerUrl` (type: `integer`):

Algolia / discovery pagination depth. 0 = until exhausted or maxItems.

## `pageSize` (type: `integer`):

Algolia hitsPerPage (1–100).

## `concurrencyLimit` (type: `integer`):

Parallel detail-page workers.

## `proxyConfiguration` (type: `object`):

Optional. Datacenter is often enough with Chrome TLS impersonation; use RESIDENTIAL if you hit 403s.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.labx.com/categories/centrifuges"
    }
  ],
  "categories": [
    "centrifuges"
  ],
  "condition": "any",
  "listingType": "any",
  "useSitemap": false,
  "runMode": "details",
  "maxItems": 50,
  "maxPagesPerUrl": 5,
  "pageSize": 50,
  "concurrencyLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Default dataset items.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://www.labx.com/categories/centrifuges"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/labx-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://www.labx.com/categories/centrifuges" }] }

# Run the Actor and wait for it to finish
run = client.actor("crawloop/labx-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.labx.com/categories/centrifuges"
    }
  ]
}' |
apify call crawloop/labx-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/labx-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/d5kBDd80uSpjoJqic/builds/NcLYnIh9ncfMlm5z9/openapi.json
