# Exapro Used Industrial Machinery (`subrosa/exapro-used-industrial-machinery`) Actor

Returns used industrial machinery for sale on Exapro.com, a European B2B marketplace, with title, category, year, asking price, condition, country, and the seller's business type and account ID, and no seller names, emails or phone numbers.

- **URL**: https://apify.com/subrosa/exapro-used-industrial-machinery.md
- **Developed by:** [Sub Rosa](https://apify.com/subrosa) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Exapro Used Industrial Machinery

Returns structured listings of used industrial machinery for sale on
[Exapro.com](https://www.exapro.com), a European B2B marketplace covering
metalworking, plastics and rubber, packaging, food processing, textile,
printing, broadcast/AV, construction and dozens of other equipment
categories. Each item carries the machine's title, category, year (when the
seller stated one), asking price, condition, the seller's business
classification, and country — everything a buyer needs to shortlist and
compare used machinery without clicking through hundreds of listing pages
by hand.

### Who uses it

- **Equipment buyers and procurement teams** sourcing used machinery for a
  factory or workshop, who want to compare price, condition, and location
  across many listings at once instead of browsing category by category.
- **Machinery dealers and brokers** building a market picture — what a given
  make and model of press, welder, or extruder is actually asking on the
  open market right now, across multiple countries.
- **Appraisers and auctioneers** benchmarking resale values for used
  industrial equipment against real, current asking prices rather than list
  price or years-old sale records.

### Sample output

One real item from a real run (2026-09-27):

```json
{
  "id": "918673",
  "productUid": "P260902052",
  "url": "https://www.exapro.com/anchorpac-p911-a2498-p260902052/",
  "sourceUrl": "https://www.exapro.com/packaging-conditioning-baling-presses-waste-compactors-c77/",
  "title": "Cardboard Compactor - ANCHORPAC P911 A2498",
  "category": "Waste baling / compacting equipment",
  "year": null,
  "country": "France",
  "countryCode": "FR",
  "price": 5000,
  "currency": "EUR",
  "priceText": "5,000 €",
  "isNegotiable": false,
  "sellerId": "1189768",
  "sellerClientType": "Factory – small or medium company",
  "sellerActiveSince": "2026",
  "condition": "in working conditions",
  "description": "Stationary Baler. Compacts cardboard with direct storage into the attached Amplirol container...",
  "scrapedAt": "2026-09-27T15:45:52.250Z"
}
```

### Data dictionary

| Field | Type | Meaning | Example |
|---|---|---|---|
| `id` | string | Exapro's own internal numeric listing ID. | `"918673"` |
| `productUid` | string | Exapro's public product UID from the listing URL. | `"P260902052"` |
| `url` | string | Canonical URL of the listing's own page. | `"https://www.exapro.com/anchorpac-p911-a2498-p260902052/"` |
| `sourceUrl` | string | Category page this listing was discovered on. | `"https://www.exapro.com/packaging-conditioning-baling-presses-waste-compactors-c77/"` |
| `title` | string | Listing title as Exapro displays it. | `"Cardboard Compactor - ANCHORPAC P911 A2498"` |
| `category` | string | null | Exapro's own category name for the machine. | `"Waste baling / compacting equipment"` |
| `year` | number | null | Manufacturing year, only when the seller stated one in the title. | `2023` |
| `country` | string | null | Country where the machine is located. | `"France"` |
| `countryCode` | string | null | ISO 3166-1 alpha-2 code paired with `country`. | `"FR"` |
| `price` | number | null | Asking price. Null when the seller set "Price on request" instead of a number. | `5000` |
| `currency` | string | null | ISO 4217 code for `price` (always EUR on exapro.com). Null when `price` is null. | `"EUR"` |
| `priceText` | string | null | The price exactly as Exapro displays it. | `"5,000 €"` or `"Price on request"` |
| `isNegotiable` | boolean | True when Exapro marks the price negotiable. | `false` |
| `sellerId` | string | null | Exapro's internal account ID for the seller — an account identifier, never a person. | `"1189768"` |
| `sellerClientType` | string | null | Exapro's own business-type classification for the seller. Never a person's name. | `"Factory – small or medium company"`, `"Machinery dealer"`, `"Private person / Without company"` |
| `sellerActiveSince` | string | null | Year the seller's Exapro account was created. | `"2026"` |
| `condition` | string | null | Seller-stated condition. | `"good"`, `"like new"`, `"as-is, where-is"` |
| `description` | string | null | Seller's free-text description, with any email or phone-shaped text stripped. | `"Stationary Baler..."` |
| `scrapedAt` | string | ISO 8601 UTC timestamp of when this item was fetched. | `"2026-09-27T15:45:52.250Z"` |

### Input

| Field | Type | Description |
|---|---|---|
| `categoryUrls` | array of strings | Exapro category or subcategory page URLs to crawl. Find more by browsing exapro.com's category menu — any URL matching `exapro.com/<slug>-c<number>/` works. Leave empty for the default three categories (welding machines, metal machine tools, packaging balers/compactors), which cover metalworking, general machine tools, and packaging equipment respectively. |
| `maxItems` | integer | Maximum number of listings to return across all category URLs combined. Default 12. |
| `maxPagesPerCategory` | integer | How many pages of pagination to follow within each category URL (20 listings per page) before moving to the next category. Default 3. |
| `proxyConfiguration` | object | Standard Apify Proxy editor. Datacenter proxies are enough — see Limits below on why residential/premium proxies won't help here. |

### Pricing

Pay-per-event. Two events:

- **`actor-start`** — charged once when a run begins, covering fixed
  overhead (crawler startup, robots.txt fetch).
- **`result`** — charged once per machine listing delivered to the dataset.

The free plan's monthly platform credit covers a meaningful number of runs
at the default `maxItems`; exact pricing is set in the Apify Console and
shown there before you run.

### Limits and honesty

- **This covers exapro.com's own listings only.** Some category pages carry
  "auction" cards syndicated from a partner site (observed: netbid.com,
  linked with `rel="nofollow"`). Those are skipped outright — this Actor's
  robots.txt/terms review covers exapro.com, not a partner site with its
  own terms, so it never follows an off-site link regardless of how the
  card is marked up. A run's log states how many were skipped.
- **Rate limits are real and were measured, not assumed.** exapro.com's
  robots.txt states no `Crawl-delay`, but sustained or concurrent
  detail-page requests get answered with HTTP 429. This Actor's default
  concurrency and request rate were set from that measurement (see
  CHANGELOG), and a heavily-tested build session pushed the observed safe
  rate down further than initial testing suggested — a rate the source
  accepts beats a faster one it fights. If you raise `maxItems`
  substantially, expect the run to take proportionally longer, not to run
  faster by increasing concurrency yourself; the crawler's own rate limit
  is the ceiling regardless of Actor memory or proxy tier.
- **`year` is often null.** Exapro doesn't have a dedicated manufacturing-year
  field on every listing; this Actor parses a year only when the seller
  included one in the title. A null year means "not stated," not "unknown
  machine."
- **`price` is null for "Price on request" listings.** That's the seller's
  own choice on Exapro, not a scraping gap — `priceText` always carries
  what Exapro actually displayed.
- **`description` is passed through a contact-info filter, not verified
  contact-free.** Email addresses and phone-shaped strings are stripped by
  pattern matching before the field is ever written, but this is a filter,
  not a guarantee of every possible phrasing.
- **This does not use a browser.** All data comes from Exapro's own
  server-rendered HTML over plain HTTP requests; nothing here executes
  JavaScript or renders a page.

### Legal

Only public, logged-out pages are fetched — no login, no account, no
paywalled data. Requests carry a fixed, declared identity
(`SubRosaBot/1.0`) and honor `robots.txt` for every request, including its
disallowed paths (`/admin/`, `/backoffice/`, `/api/`, `/public-api/`,
`/public-ajax/`, and account-management paths).

Exapro's Terms of Service (Section 10.3) state that use of the Marketplace
"does not include permission or a license to redistribute, reproduce or
republish... access, copy, in any form" its content. That clause is
addressed to people who hold an Exapro user account and have agreed to the
Terms by using one. This tool never creates an account and never logs in,
so that contract has not been entered into; what governs an anonymous,
logged-out visitor is the site's `robots.txt`, which this Actor reads and
obeys exactly, on every request. If you hold an Exapro account yourself,
you remain bound by the Terms you agreed to — this tool's access does not
change that.

No personal data is collected. Sellers are identified only by Exapro's own
internal account ID and business-type classification (e.g. "Machinery
dealer," "Factory – small or medium company," "Private person / Without
company" — the last is Exapro's own label for an individual seller, not
that person's name or any other identifying detail about them). A real
person's name appears in some listing pages' embedded page data (most
likely an Exapro sales agent assigned to that listing); this Actor never
extracts it, under any field name. Free-text descriptions are passed
through a contact-info filter before being written to the dataset.

You are responsible for how you use the data this Actor returns.

### Changelog

See [CHANGELOG.md](./CHANGELOG.md).

### Support

Open an issue on this Actor's Issues tab. We reply within one day.

# Changelog

This Actor's version history is a separate document: https://apify.com/subrosa/exapro-used-industrial-machinery/changelog.md

# Actor input Schema

## `categoryUrls` (type: `array`):

Exapro category or subcategory page URLs to crawl (e.g. https://www.exapro.com/metal-sheetmetal-machines-welding-machines-c61/). Find more by browsing exapro.com's category menu. Leave empty to use the default three categories (welding machines, metal machine tools, packaging balers/compactors).

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

Maximum number of machine listings to return across all category URLs combined. Kept modest by default because the source rate-limits sustained crawling (see README Limits section) — a polite crawl of more items takes proportionally longer.

## `maxPagesPerCategory` (type: `integer`):

How many pages of pagination to follow within each category URL before moving to the next one (each page holds up to 20 listings).

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

Apify Proxy configuration. Datacenter proxies are sufficient — this source has no bot-management challenge to route around.

## Actor input object example

```json
{
  "categoryUrls": [
    "https://www.exapro.com/metal-sheetmetal-machines-welding-machines-c61/",
    "https://www.exapro.com/metal-machine-tools-c1/",
    "https://www.exapro.com/packaging-conditioning-baling-presses-waste-compactors-c77/"
  ],
  "maxItems": 12,
  "maxPagesPerCategory": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

# 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 = {
    "categoryUrls": [
        "https://www.exapro.com/metal-sheetmetal-machines-welding-machines-c61/",
        "https://www.exapro.com/metal-machine-tools-c1/",
        "https://www.exapro.com/packaging-conditioning-baling-presses-waste-compactors-c77/"
    ],
    "maxItems": 12,
    "maxPagesPerCategory": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("subrosa/exapro-used-industrial-machinery").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 = {
    "categoryUrls": [
        "https://www.exapro.com/metal-sheetmetal-machines-welding-machines-c61/",
        "https://www.exapro.com/metal-machine-tools-c1/",
        "https://www.exapro.com/packaging-conditioning-baling-presses-waste-compactors-c77/",
    ],
    "maxItems": 12,
    "maxPagesPerCategory": 3,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("subrosa/exapro-used-industrial-machinery").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 '{
  "categoryUrls": [
    "https://www.exapro.com/metal-sheetmetal-machines-welding-machines-c61/",
    "https://www.exapro.com/metal-machine-tools-c1/",
    "https://www.exapro.com/packaging-conditioning-baling-presses-waste-compactors-c77/"
  ],
  "maxItems": 12,
  "maxPagesPerCategory": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call subrosa/exapro-used-industrial-machinery --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,subrosa/exapro-used-industrial-machinery"
        }
    }
}
```

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/ahTuF5UBaza7kfvsN/builds/qVXtaQFY9WITUv6WG/openapi.json
