# Surplus Record Scraper — Used Machinery & Dealer Contacts (`crawloop/surplusrecord-scraper`) Actor

Scrape Surplus Record used industrial machinery and electrical surplus: asking prices, manufacturer, model, year, specs, dealer phone/email, images. Category, search, dealer, or listing URLs. Listings or full details.

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

## Pricing

from $1.99 / 1,000 scraped surplus record 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

## Surplus Record Scraper — Used Machinery & Dealer Contacts

> **Crawloop Used Equipment / Machinery Suite** — North American surplus machine tools, electrical & power equipment, and dealer contacts.

| Exapro | Machineryline | Surplex | PressCity | Surplus Record |
| :--- | :--- | :--- | :--- | :--- |
| [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) | [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) | [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) | [PressCity Scraper](https://apify.com/crawloop/presscity-scraper) | Surplus Record Scraper ◄── you are here |

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

**Surplus Record scraper** for used industrial machinery and electrical surplus — engine lathes, CNC, presses, motors, transformers, generators, and 2,000+ categories across ~190k live listings. Extract asking prices, manufacturer, model, year, specs, dealer name / phone / email, and image galleries. Run category crawls, keyword or SR ID search, dealer inventory pages, or direct listing URLs — a practical **Surplus Record API alternative** for Python, Node.js, cURL, and MCP on Apify.

Built for **machinery dealers**, **electrical surplus buyers**, **appraisers**, and **procurement teams** tracking North American secondary-market inventory. Choose `listings` for fast card-level catalogs or `details` for full product pages with JSON-LD enrichment and dealer contacts.

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

### When to use this Actor

Use the **Surplus Record Scraper** when you need:

- **US machine-tool & electrical surplus inventory** from the long-standing Surplus Record directory
- **Asking prices** when sellers publish them (or `request_price` / `make_offer` status)
- **Dealer intelligence** — name, phone, email, address, dealer profile URL
- **Technical fields** — manufacturer, model, year, category-specific specs (swing, centers, HP, KVA, …)
- **Media** — thumbnail plus full gallery URLs for valuation and catalogs
- **Discovery** — category crawl, keyword / SR ID search, or dealer inventory pages

Ideal for used-machinery dealers, transformer/motor buyers, and data teams building NA comps.

#### When not to use

- You need **EU dealer stock** → [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) or [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper)
- You need **industrial auction lots** → [Surplex Scraper](https://apify.com/crawloop/surplex-scraper)
- You need **print/packaging presses** → [PressCity Scraper](https://apify.com/crawloop/presscity-scraper)
- You need **European farm machinery** → [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper)

### Data pipeline

```
Input                              Mode                         Output
─────────────────────────         ────────────────────         ──────────────────────────

  Category / search / dealer ──►   listings (fast cards)  ──►  title, price, seller, IDs
  Keyword / SR ID            ──►   details  (full PDP)   ──►  specs, email, phone, gallery
  Direct listing URLs        ──►                           ──►  manufacturer, model, year

  Join by brand + model      ──►   comps with Exapro / Machineryline
```

### Key Features

- **Two extraction modes** — `listings` for card-level stubs; `details` for JSON-LD Product + dealer box
- **Category shortcuts** — popular machinery and electrical roots when you do not paste URLs
- **Search** — `searchKeyword` maps to Surplus Record top search (keyword or SR ID)
- **Dealer pages** — crawl dealer inventory the same way as categories
- **Rich contacts on details** — email and phone often present in Product JSON-LD
- **Cloudflare-ready** — curl\_cffi TLS fingerprint + US residential proxy defaults
- **Export-ready JSON** — push to Apify dataset for CSV / Excel / API / MCP

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `startUrls` | Array | Engine Lathes category | Category, search, dealer, or listing URLs. |
| `searchKeyword` | String | — | Keyword or SR ID search. |
| `categories` | Array | `[]` | Built-in category shortcuts. |
| `runMode` | String | `"listings"` | `"listings"` or `"details"`. |
| `maxItems` | Integer | `10` | Cap on emitted records (`0` = unlimited). |
| `maxPagesPerUrl` | Integer | `1` | Pagination depth (50 listings/page). |
| `concurrencyLimit` | Integer | `4` | Parallel detail workers. |
| `proxyConfiguration` | Object | Residential US | **Apify Residential + US** strongly recommended. |

#### Example input

```json
{
  "startUrls": [
    {"url": "https://surplusrecord.com/machinery-equipment/engine-lathes/"}
  ],
  "runMode": "listings",
  "maxItems": 50,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Output

| Field | Description |
| :--- | :--- |
| `listingId` | Numeric SR listing ID |
| `title` | Listing title |
| `url` | Canonical listing URL |
| `category` | Category leaf |
| `manufacturer` / `model` / `year` | Identity fields |
| `price` / `priceCurrency` / `priceStatus` | Asking price or request/make-offer status |
| `location` | City, state |
| `sellerName` / `sellerPhone` / `sellerEmail` | Dealer contacts (details mode) |
| `dealerUrl` | Dealer profile URL |
| `specs` | Category-specific attributes (Swing, Centers, …) |
| `images` / `imageUrl` | Photo gallery |
| `scrapedAt` | ISO timestamp |

#### Example output (details)

```json
{
  "listingId": "1094027",
  "title": "12-1/2\" x 20\" Monarch #10EE, toolroom",
  "url": "https://surplusrecord.com/listing/monarch-toolroom-10-ee-10-x-20-12-1-2-swing-1094027/",
  "category": "Engine Lathes",
  "manufacturer": "Monarch",
  "model": "10EE",
  "year": 1977,
  "price": 8000.0,
  "priceCurrency": "USD",
  "priceStatus": "listed",
  "location": "New Boston, TX",
  "sellerName": "Kingdom Equipment & Consulting Inc",
  "sellerPhone": "903-244-9183",
  "sellerEmail": "Mark@kingdomequipment.com",
  "dealerUrl": "https://surplusrecord.com/dealer/kingdom-equipment-consulting-inc/",
  "specs": {"Swing": "12.5", "Centers": "20.0"},
  "images": ["https://files.surplusrecord.com/listphotos/920769.jpeg"]
}
```

### Use cases

- Build **price comps** for engine lathes, CNC, and transformers across US dealers
- Enrich CRM with **dealer phones and emails** from public listing pages
- Monitor a category for **new inventory** on an Apify schedule
- Source electrical surplus (motors, generators, switchgear) for project quotes
- Export Surplus Record datasets to JSON / CSV for valuation or buying workflows

### 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/surplusrecord-scraper').call({
  startUrls: [{ url: 'https://surplusrecord.com/machinery-equipment/engine-lathes/' }],
  runMode: 'details',
  maxItems: 20,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 3));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token)
run = client.actor("crawloop/surplusrecord-scraper").call(
    run_input={
        "startUrls": [{"url": "https://surplusrecord.com/machinery-equipment/cnc-lathes/"}],
        "runMode": "listings",
        "maxItems": 50,
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item.get("title"), item.get("price"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~surplusrecord-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://surplusrecord.com/machinery-equipment/engine-lathes/"}],"runMode":"listings","maxItems":10}'
```

### 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 this Actor by its Store ID / name.

Example prompts:

- "Run Surplus Record Scraper for engine lathes and return the top 20 rows as JSON"
- "Scrape Surplus Record CNC lathes in details mode and summarize dealer phones and emails"
- "Chain Surplus Record Scraper then Exapro Scraper for Monarch lathe comps across NA and EU"

### Suite next step

After NA Surplus Record inventory, pull European machine-tool stock with [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) or heavy-equipment contacts with [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper).

### FAQ

**Do I need a login?**\
No. Public category and listing pages are scraped. Account-only portal features are out of scope.

**Why residential proxy?**\
Surplus Record sits behind Cloudflare. Datacenter IPs often get challenged; US residential works best.

**Are prices always present?**\
No. Many dealers use Request Price or Make Offer. The Actor sets `priceStatus` accordingly.

**Can I scrape by SR ID?**\
Yes — put the ID in `searchKeyword` or paste a direct listing URL into `startUrls`.

**Listings vs details?**\
Use `listings` for fast catalog scans; use `details` when you need specs, full galleries, and dealer email/phone.

### Related Actors

- [Exapro Scraper](https://apify.com/crawloop/exapro-scraper) — European used machinery
- [Machineryline Scraper](https://apify.com/crawloop/machineryline-scraper) — EU heavy equipment + dealers
- [Surplex Scraper](https://apify.com/crawloop/surplex-scraper) — industrial auction lots
- [PressCity Scraper](https://apify.com/crawloop/presscity-scraper) — used printing equipment
- [Agriaffaires Scraper](https://apify.com/crawloop/agriaffaires-scraper) — European farm machinery

# Actor input Schema

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

Surplus Record category, search, dealer inventory, or listing detail URLs (e.g. /machinery-equipment/engine-lathes/, /listing/...-1094027/, /dealer/.../).

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

Optional keyword / SR ID search (builds /search?q=…\&top-search=1).

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

Optional built-in category roots when startUrls is empty.

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

listings = fast card-level data from category/search pages. details = visit each listing for JSON-LD specs, dealer email/phone, and full image gallery.

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

Maximum listings to return. 0 = unlimited. Keep small for Store auto-tests (under 5 minutes).

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

Pagination depth per category/search/dealer URL (50 listings per page). 0 = until exhausted.

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

Parallel detail-page workers (1–20). Keep low against Cloudflare.

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

Apify Proxy. RESIDENTIAL + US strongly recommended — Surplus Record sits behind Cloudflare.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://surplusrecord.com/machinery-equipment/engine-lathes/"
    }
  ],
  "categories": [],
  "runMode": "listings",
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 4,
  "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://surplusrecord.com/machinery-equipment/engine-lathes/"
        }
    ],
    "runMode": "listings",
    "maxItems": 10,
    "maxPagesPerUrl": 1,
    "concurrencyLimit": 4
};

// Run the Actor and wait for it to finish
const run = await client.actor("crawloop/surplusrecord-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://surplusrecord.com/machinery-equipment/engine-lathes/" }],
    "runMode": "listings",
    "maxItems": 10,
    "maxPagesPerUrl": 1,
    "concurrencyLimit": 4,
}

# Run the Actor and wait for it to finish
run = client.actor("crawloop/surplusrecord-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://surplusrecord.com/machinery-equipment/engine-lathes/"
    }
  ],
  "runMode": "listings",
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 4
}' |
apify call crawloop/surplusrecord-scraper --silent --output-dataset

```

## MCP server setup

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