# Used-Line Scraper — Used Test Equipment & Dealers (`crawloop/used-line-scraper`) Actor

Scrape Used-Line used test equipment and lab/semi listings: asking prices, manufacturer, model, condition, dealer, location, and images. Category, search, manufacturer, dealer, or listing URLs — listings or full details.

- **URL**: https://apify.com/crawloop/used-line-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.89 / 1,000 scraped used-line 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

## Used-Line Scraper — Used Test Equipment & Dealers

> **Crawloop Medical & Lab Suite** — used test & measurement, laboratory, and semiconductor secondary-market inventory.

| Labexchange | Used-Line | Exapro | Surplex |
| :--- | :--- | :--- | :--- |
| [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper) | Used-Line 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 Used-Line.com pages. Not affiliated with, sponsored by, or endorsed by Used-Line. 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.

**Used-Line scraper** (Used-Line API alternative) for used and new **test & measurement**, laboratory, semiconductor, and industrial equipment — spectrum analyzers, oscilloscopes, network analyzers, power supplies, OTDR, and related gear from Keysight, Anritsu, Rohde & Schwarz, Tektronix, and more. Extract asking prices (or Ask for price status), manufacturer, model, condition, dealer name / location, serial and options when published, and image galleries. Run category crawls, keyword search, manufacturer or dealer inventory pages, or direct listing URLs from **Python**, **Node.js**, **cURL**, or **MCP** on Apify and export JSON / CSV / Excel.

Built for **T\&M dealers**, **rental houses**, **procurement teams**, and **valuation comps**. Choose `listings` for fast card-level catalogs or `details` for full product pages with JSON-LD enrichment and dealer context.

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

### When to use this Actor

Use the **Used-Line Scraper** when you need:

- **Global T\&M / lab / semi inventory** from Used-Line’s dealer marketplace (~200k marketing listings; deep spectrum / Keysight / Anritsu / R\&S coverage)
- **Asking prices** when sellers publish them (or `request_price` / Ask for price status)
- **Dealer intelligence** — name, location, dealer profile URL, member-since year, inventory count
- **Identity fields** — listing ID, manufacturer, model, condition, serial number, options text
- **Discovery** — category crawl, keyword search, manufacturer pages, dealer inventory, special offers / auctions

Ideal for used-test-equipment dealers, lab buyers, and data teams building secondary-market comps.

#### When not to use

- You need **EU lab-only Magento catalogs** → [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper)
- You need **broad industrial machinery across many countries** → [Exapro Scraper](https://apify.com/crawloop/exapro-scraper)
- You need **industrial auction lots** → [Surplex Scraper](https://apify.com/crawloop/surplex-scraper)

### Data pipeline

```
Input                              Mode                         Output
─────────────────────────         ────────────────────         ──────────────────────────

  Category / search / dealer ──►   listings (fast cards)  ──►  title, price, seller, location
  Keyword / manufacturer     ──►   details  (full PDP)   ──►  mfr, model, serial, gallery
  Direct listing URLs        ──►                           ──►  condition, dealer since

  Join by brand + model      ──►   comps with Labexchange / Exapro
```

### Key Features

- **Two extraction modes** — `listings` for embedded `initialResults` cards; `details` for Product JSON-LD + labeled PDP fields
- **Category shortcuts** — spectrum analyzers, oscilloscopes, generators, power supplies, and more
- **Search** — `searchKeyword` maps to Used-Line category search (`?search=`)
- **Manufacturer & dealer pages** — crawl `/list-manufacturers/…` and `/list-dealers/…` the same way as categories
- **RFQ-aware pricing** — numeric prices with currency or `priceStatus: request_price`
- **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 | Spectrum Analyzers category | Category, search, manufacturer, dealer, or listing URLs. |
| `searchKeyword` | String | — | Brand / model 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 (~25 listings/page). |
| `concurrencyLimit` | Integer | `4` | Parallel detail workers. |
| `proxyConfiguration` | Object | Residential US | **Apify Residential + US** strongly recommended. |

#### Example input

```json
{
  "startUrls": [
    {"url": "https://www.used-line.com/list-spectrum-analyzer"}
  ],
  "runMode": "listings",
  "maxItems": 50,
  "maxPagesPerUrl": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

#### Example — details + keyword

```json
{
  "searchKeyword": "Keysight N9020A",
  "runMode": "details",
  "maxItems": 25,
  "maxPagesPerUrl": 1,
  "concurrencyLimit": 3,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"],
    "apifyProxyCountry": "US"
  }
}
```

### Output

| Field | Description |
| :--- | :--- |
| `listingId` | Numeric Used-Line item ID |
| `title` | Listing title |
| `url` | Absolute listing URL |
| `category` / `categories` / `breadcrumbs` | Taxonomy context |
| `manufacturer` / `model` / `condition` | Identity (details) |
| `serialNumber` / `options` | Parsed from description when present |
| `price` / `priceCurrency` / `priceFormatted` | Asking price |
| `priceStatus` | `listed` or `request_price` |
| `inStock` | True when In Stock badge / schema says so |
| `location` | Seller country / location text |
| `sellerName` / `dealerUrl` / `dealerSince` | Dealer context |
| `description` | Full description (details) |
| `imageUrl` / `images` | Thumbnail and gallery |
| `scrapedAt` | UTC scrape timestamp |

#### Example output (listings)

```json
{
  "listingId": "15507788",
  "title": "Agilent E4445A, PSA Series Spectrum Analyzer, 3Hz-13,2GHz",
  "url": "https://www.used-line.com/spectrum-analyzer/agilent/agilent-hp-e4445a/item-15507788",
  "category": "Analyzers Spectrum",
  "sellerName": "EQT-Solutions Oy",
  "location": "Finland",
  "price": 8690,
  "priceCurrency": "EUR",
  "priceFormatted": "€8,690",
  "priceStatus": "listed",
  "inStock": true,
  "imageUrl": "https://static.used-line.com/images/7788/15507788_a.jpg",
  "scrapedAt": "2026-08-12T12:00:00Z"
}
```

### Use cases

- Build **Keysight / Anritsu / R\&S comps** across hundreds of dealers without manual browsing
- Monitor **dealer inventory** (e.g. Electro Rent, Avalon, Alltest) for new stock and price changes
- Feed **procurement RFQ** workflows with structured Ask-for-price vs listed rows
- Enrich CRM / spreadsheets with manufacturer, model, serial, and location

### 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/used-line-scraper').call({
  startUrls: [{ url: 'https://www.used-line.com/list-spectrum-analyzer' }],
  runMode: 'listings',
  maxItems: 50,
  proxyConfiguration: {
    useApifyProxy: true,
    apifyProxyGroups: ['RESIDENTIAL'],
    apifyProxyCountry: 'US',
  },
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.slice(0, 3));
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor("crawloop/used-line-scraper").call(
    run_input={
        "startUrls": [{"url": "https://www.used-line.com/list-spectrum-analyzer"}],
        "runMode": "listings",
        "maxItems": 50,
        "proxyConfiguration": {
            "useApifyProxy": True,
            "apifyProxyGroups": ["RESIDENTIAL"],
            "apifyProxyCountry": "US",
        },
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["listingId"], item.get("title"), item.get("price"))
```

#### cURL

```bash
curl "https://api.apify.com/v2/acts/crawloop~used-line-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://www.used-line.com/list-spectrum-analyzer"}],"runMode":"listings","maxItems":25}'
```

### 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 Used-Line Scraper for spectrum analyzers, listings mode, max 40 rows, and return title, price, seller, location as JSON"
- "Scrape Used-Line dealer Electro Rent Europe details for 15 items and summarize manufacturers and Ask-for-price share"
- "Chain Used-Line Scraper then Labexchange Scraper for Agilent HPLC comps across NA and EU"

### Suite next step

After Used-Line T\&M / dealer comps, enrich EU lab stock with the [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper), or broaden industrial machinery coverage with the [Exapro Scraper](https://apify.com/crawloop/exapro-scraper).

### FAQ

**Does every listing have a price?**\
No. Many high-ticket rows are Ask for price — those emit `priceStatus: "request_price"` with null `price`.

**Do I need a browser?**\
No. Extraction is HTTP-based (`curl_cffi`) against SSR HTML and embedded `initialResults` JSON.

**Are dealer phones included?**\
Only when publicly exposed as `tel:` links on the detail page. Click-to-reveal phones often stay gated.

### Related Actors

- [Labexchange Scraper](https://apify.com/crawloop/labexchange-scraper)
- [Exapro Scraper](https://apify.com/crawloop/exapro-scraper)
- [Surplex Scraper](https://apify.com/crawloop/surplex-scraper)

# Actor input Schema

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

Used-Line category, search, manufacturer, dealer inventory, or listing detail URLs (e.g. /list-spectrum-analyzer, /list-manufacturers/keysight-technologies-agilent-hp, /list-dealers/electro-rent-europe, /.../item-15507788).

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

Optional brand/model search (builds /list-test-and-measurement?search=…).

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

Optional built-in category roots when startUrls is empty.

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

listings = fast card-level data from category/search pages (initialResults JSON). details = visit each listing for manufacturer, model, condition, description, serial/options, dealer context, 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 (25 listings per page by default). 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 — Used-Line sits behind Cloudflare.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.used-line.com/list-spectrum-analyzer"
    }
  ],
  "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://www.used-line.com/list-spectrum-analyzer"
        }
    ],
    "runMode": "listings",
    "maxItems": 10,
    "maxPagesPerUrl": 1,
    "concurrencyLimit": 4
};

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

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

```

## MCP server setup

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