# EquipNet Scraper — Used Lab & Industrial Equipment (`crawloop/equipnet-scraper`) Actor

Scrape EquipNet MarketPlace used lab, pharma, packaging and industrial surplus: asking prices, manufacturer, model, year, serial, location, specs, images. Category, search, browse, or sitemap. Listings or full details. Cloudflare-ready.

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

## Pricing

from $1.80 / 1,000 scraped equipnet listings

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## EquipNet Scraper — Used Lab & Industrial Equipment

> **Crawloop Used Equipment / Medical & Lab Suite** — North American surplus MarketPlace inventory.

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

> **Disclaimer:** Unofficial tool for publicly accessible EquipNet MarketPlace pages. Not affiliated with, sponsored by, or endorsed by EquipNet, Inc. 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.

**EquipNet scraper** for used laboratory, pharmaceutical, packaging, and industrial surplus — analyzers, HPLC, centrifuges, bioreactors, tanks, fillers, and more. Extract asking prices, manufacturer, model, year, serial number, location, removal level, technical specs, and image galleries when published. Use it as an **EquipNet API alternative** from Python, Node.js, cURL, or MCP.

Built for **lab / pharma dealers**, **procurement teams**, **asset recovery**, and **valuation comps**. Choose `listings` for fast card-level catalogs or `details` for full product pages.

Runs behind Cloudflare with **curl\_cffi** (Chrome TLS fingerprint) and **US residential** proxy — recommended for stable MarketPlace access.

### When to use this Actor

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

- **Surplus MarketPlace inventory** across lab, process, packaging, and facility categories
- **Asking prices** in USD/EUR when sellers publish them (high-ticket surplus comps)
- **Identity fields** — listing ID, manufacturer, model, year, serial number
- **Logistics context** — location and level of removal (e.g. still installed)
- **Media** — thumbnail plus largepic gallery URLs
- **Discovery** — category crawl, keyword search, manufacturer pages, New-to-site / Price drops, or sitemap `listid` discovery

Ideal for used-lab-equipment dealers, biopharma buyers, and data teams tracking North American and global 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)
- You need **login-gated auction lot catalogs** — public calendar metadata only; MarketPlace listings are the primary source

### Data pipeline

```
Input                              Mode                         Output
─────────────────────────         ────────────────────         ──────────────────────────

  Category / manufacturer    ──►   listings (fast cards)  ──►  title, price, location, IDs
  Keyword search             ──►   details  (full PDP)   ──►  specs, images, serial, year
  Sitemap / direct listid    ──►                           ──►  manufacturer, model, gallery
  Browse feeds / auctions*

  Join by brand + model      ──►   comps with Labexchange / Exapro

* Auction calendar metadata is public; lot catalogs often require EquipNet login.
```

### Key Features

- **Two extraction modes** — `listings` for card-level stubs; `details` for specs table, description, gallery, and asking price
- **Category shortcuts** — popular MarketPlace roots when you do not paste URLs
- **Search** — `searchKeyword` maps to EquipNet search (`/search/?q=`)
- **Browse feeds** — New to site, Price drops, Certified
- **Sitemap discovery** — pull thousands of `listid` URLs from the language sitemap (cap with `maxItems`)
- **Facet fallback** — when Cloudflare blocks POST pagination, expand via child category / manufacturer links
- **Cloudflare-ready** — curl\_cffi TLS fingerprint + US residential proxy defaults

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | sample Analyzers category | Category, manufacturer, search, browse, listing, auction calendar, or sitemap URLs. |
| `categories` | Array | `analyzers` | Catalog roots when `startUrls` is empty. |
| `searchKeyword` | String | — | Brand/model search (e.g. Agilent, HPLC). |
| `browse` | String | `none` | `new-to-site`, `price-drops`, or `certified`. |
| `useSitemap` | Boolean | `false` | Discover listing URLs from the EquipNet sitemap. |
| `language` | String | `"en"` | Sitemap locale: `en`, `es`, `pt`. |
| `runMode` | String | `"details"` | `"listings"` (cards) or `"details"` (full PDP). |
| `maxItems` | Integer | `5` | Maximum products (`0` = unlimited). Raise for production; default stays small for Store auto-tests. |
| `maxPagesPerUrl` | Integer | `5` | Pagination depth for category pages (POST may be blocked — facets/sitemap used instead). |
| `concurrencyLimit` | Integer | `5` | Parallel detail-page workers. |
| `proxyConfiguration` | Object | Residential US | **Apify Residential + US** strongly recommended. |

#### Input example — category details

```json
{
  "startUrls": [
    { "url": "https://www.equipnet.com/category/analyzers-151286/" }
  ],
  "runMode": "details",
  "maxItems": 50,
  "maxPagesPerUrl": 3,
  "concurrencyLimit": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Input example — brand search

```json
{
  "searchKeyword": "Agilent",
  "runMode": "details",
  "maxItems": 40,
  "concurrencyLimit": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Input example — listings volume (cheaper / faster)

```json
{
  "useSitemap": true,
  "language": "en",
  "runMode": "listings",
  "maxItems": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Output Format

Each row is pushed to the default dataset.

| Field | Description |
| :--- | :--- |
| `listingId` | EquipNet listing / listid |
| `url`, `title` | Canonical listing URL and title |
| `manufacturer`, `model`, `year`, `serialNumber` | Identity (details mode) |
| `category`, `categories` | Category label / breadcrumbs |
| `price`, `priceFormatted`, `currency` | Asking price when published |
| `location`, `removalLevel` | Logistics context |
| `saleStatus` | Available, Sale Pending, Auction, … |
| `channel` | `marketplace` or `auction` |
| `description`, `technicalSpecs` | Text and specs table |
| `thumbnail`, `images` | Media URLs |
| `scrapedAt` | Scrape timestamp (UTC) |

#### Example record

```json
{
  "listingId": "1024361",
  "title": "Molecular Devices FLIPR TETRA Analyzer",
  "url": "https://www.equipnet.com/molecular-devices-flipr-tetra-analyzer-listid-1024361/",
  "manufacturer": "Molecular Devices",
  "model": "FLIPR TETRA",
  "year": 2015,
  "serialNumber": "FT0376",
  "category": "Analyzers",
  "price": 225000.0,
  "priceFormatted": "$225,000.00 USD",
  "currency": "USD",
  "location": "China",
  "removalLevel": "Still Installed",
  "saleStatus": "Available",
  "channel": "marketplace",
  "images": [
    "https://pics.equipnet.com/mp_data/images/largepic/Nov/2024116231822_966733_5.jpg"
  ],
  "scrapedAt": "2026-08-06T09:30:00Z"
}
```

### Use cases

| Use case | What you get |
| :--- | :--- |
| **HPLC / MS comps** | Asking prices, OEM, model, year, location |
| **Plant-closure monitoring** | New-to-site + category watches |
| **Dealer inventory alerts** | Manufacturer pages + scheduled runs |
| **Cross-market joins** | Brand + model joins with Labexchange / Exapro |
| **AI / MCP workflows** | Run via Apify API, clients, or MCP and summarize surplus stock |

### 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/equipnet-scraper').call({
  startUrls: [{ url: 'https://www.equipnet.com/category/analyzers-151286/' }],
  runMode: 'details',
  maxItems: 25,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'US',
  },
});
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/equipnet-scraper").call(
    run_input={
        "searchKeyword": "HPLC",
        "runMode": "details",
        "maxItems": 30,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "US",
        },
    }
)
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~equipnet-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls":[{"url":"https://www.equipnet.com/category/analyzers-151286/"}],
    "runMode":"details",
    "maxItems":25,
    "proxyConfiguration":{
      "useApifyProxy":true,
      "apifyProxyGroups":["RESIDENTIAL"],
      "apifyProxyCountry":"US"
    }
  }'
```

### 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/equipnet-scraper`.

Example prompts:

- "Run EquipNet Scraper for analyzers, details mode, max 25, return title, manufacturer, model, price, location"
- "Scrape EquipNet used lab equipment for Agilent and summarize asking price ranges"
- "Chain EquipNet Scraper then Labexchange Scraper for the same brands and compare surplus vs EU dealer inventory"

### Suite next step

For European used-lab dealer stock, run [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper) next. For broader industrial machinery comps, use [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) or [Surplex Scraper](https://apify.com/crawloop/surplex-scraper).

### FAQ

**Does every listing have a price?** No. Some sellers use Make an Offer without a public ask. The Actor never fabricates prices.

**Can I scrape auction lots?** The public auction calendar is supported. Detailed lot catalogs often redirect to login — MarketPlace listings are the primary source.

**Why did pagination stop early?** EquipNet paginates via POST; Cloudflare may block it. The Actor expands child category and manufacturer facets, and you can use `useSitemap` for broad coverage.

**Why is details slower than listings?** Each product page is fetched for full specs and galleries. Prefer `listings` for large inventory scans; use `details` for enrichment.

**Is there an official EquipNet API?** Not for public MarketPlace export. This Actor is an Apify-based EquipNet scraper / API alternative for structured JSON datasets.

### Notes

- Prefer **Apify Residential + country US**. Datacenter exits are often blocked.
- Raise the run **timeout** for large `details` jobs when scraping thousands of PDPs.
- Deduplicate by `listingId` across overlapping categories and facets.
- Keep `maxItems` bounded on first runs to control proxy and compute spend.

# Actor input Schema

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

Category, manufacturer, search, browse, auction calendar, listing detail, or sitemap URLs on equipnet.com. If empty, categories below are used.

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

Used when startUrls is empty and no searchKeyword / browse / sitemap is set.

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

Optional MarketPlace search (brand or model, e.g. Agilent, HPLC, Biacore).

## `browse` (type: `string`):

Optional curated browse feed when you do not paste a URL.

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

Pull listing URLs from EquipNet sitemap (thousands of listid pages). Best for broad inventory scans; combine with maxItems.

## `language` (type: `string`):

Language for sitemap discovery (en / es / pt).

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

listings = fast card-level data from category/search pages. details = visit each listing page for full specs, gallery, and prices.

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

Maximum products to return. 0 = unlimited. Keep small for Store auto-tests (5 min limit); raise for production runs.

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

Pagination depth for category pages. EquipNet POST paging is Cloudflare-blocked — Actor expands via child category / manufacturer facets. Keep small for Store auto-tests.

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

Parallel detail-page workers (curl\_cffi threads).

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

Apify Residential + US recommended — EquipNet sits behind Cloudflare; datacenter IPs often fail.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.equipnet.com/category/analyzers-151286/"
    }
  ],
  "categories": [
    "analyzers"
  ],
  "browse": "none",
  "useSitemap": false,
  "language": "en",
  "runMode": "details",
  "maxItems": 5,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# 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.equipnet.com/category/analyzers-151286/"
        }
    ],
    "runMode": "details",
    "maxItems": 5,
    "maxPagesPerUrl": 1,
    "concurrencyLimit": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/equipnet-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.equipnet.com/category/analyzers-151286/" }],
    "runMode": "details",
    "maxItems": 5,
    "maxPagesPerUrl": 1,
    "concurrencyLimit": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/equipnet-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.equipnet.com/category/analyzers-151286/"
    }
  ],
  "runMode": "details",
  "maxItems": 5,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 5
}' |
apify call crawloop/equipnet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,crawloop/equipnet-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/4SJxzADgqCLkWPKd1/builds/FrpE8cKqxsId2lifE/openapi.json
