# GovPlanet Scraper - Government Surplus Equipment (`lulzasaur/govplanet-scraper`) Actor

Scrape government surplus equipment listings from GovPlanet.com. Extract equipment descriptions, prices, locations, auction types, and photos. Browse trucks, heavy equipment, military surplus, and more.

- **URL**: https://apify.com/lulzasaur/govplanet-scraper.md
- **Developed by:** [lulz bot](https://apify.com/lulzasaur) (community)
- **Categories:** E-commerce
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.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?

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

## GovPlanet Scraper

Scrape **government & military surplus auction listings** from
[GovPlanet.com](https://www.govplanet.com) — the Ritchie Bros / IronPlanet
network marketplace for surplus heavy equipment, trucks, vehicles, generators,
Humvees, and more.

Search by keyword and this Actor returns every matching auction lot with its
title, year / make / model, current bid or offer, location, auction end date,
category, images, and a direct link to the listing.

### What you get

Each result is one auction lot:

| Field | Description |
|-------|-------------|
| `itemId` | GovPlanet item ID |
| `title` | Full listing title (year make model) |
| `year` / `make` / `model` | Parsed from the title |
| `price` | Current bid / offer as shown (e.g. `US $3,000`) |
| `priceValue` | Numeric price |
| `priceLabel` / `saleType` | e.g. `Online Auction`, `Current High Offer`, `Buy Now` |
| `currency` | e.g. `USD` |
| `location` | US state / country |
| `distanceMiles` | Distance shown from the site's default location |
| `meter` | Hours or miles on the unit (e.g. `9,279 mi`, `0 hrs`) |
| `endDate` | Auction end date shown on the card (e.g. `Jul 22`) |
| `category` | GovPlanet category (Humvees, Excavators, Trucks…) |
| `url` | Direct link to the listing |
| `imageUrl` | Listing thumbnail |
| `searchQuery` | The query that returned this lot |
| `scrapedAt` | ISO 8601 timestamp |

When **Scrape Detail Pages** is enabled, records are also enriched with:
`brand`, `description`, `priceValidUntil` (the exact auction close date),
`availability`, and `imageUrlFull` (high-resolution image).

### Input

```json
{
  "searchQueries": ["humvee", "excavator"],
  "maxResults": 100,
  "scrapeDetails": false,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

| Option | Type | Default | Notes |
|--------|------|---------|-------|
| `searchQueries` | array of strings | `["truck"]` | One search per query. |
| `maxResults` | integer | `100` | Total lots across all queries (paginates at 60/page). |
| `scrapeDetails` | boolean | `false` | Open each listing for richer data. |
| `proxyConfiguration` | object | RESIDENTIAL | See below. |

### Anti-bot / proxies

GovPlanet's search is protected by an **AWS WAF** JavaScript challenge. This
Actor solves the challenge once with a headless browser, then reuses the
resulting session token for fast, cheap page fetches. If the token is ever
rejected mid-run, it is automatically re-solved. **RESIDENTIAL** proxies are
strongly recommended and set as the default for reliable access.

### Example output

```json
{
  "itemId": "14550728",
  "title": "1989 AM General M1097R1 HMMWV 4 Door Hard Top w/Helmet Top",
  "year": 1989,
  "make": "AM General",
  "model": "M1097R1 HMMWV",
  "price": "US $3,000",
  "priceValue": 3000,
  "saleType": "Online Auction",
  "currency": "USD",
  "location": "California",
  "distanceMiles": 330,
  "meter": "9,279 mi",
  "endDate": "Jul 22",
  "category": "Humvees",
  "url": "https://www.govplanet.com/for-sale/Humvees-1989-AM-General-.../14550728",
  "imageUrl": "https://cdn.ironpla.net/i/21596/663/....jpg",
  "searchQuery": "humvee",
  "scrapedAt": "2026-07-03T07:28:40.907Z"
}
```

### Use cases

- **Resale / flipping arbitrage** — surface underpriced surplus lots.
- **Fleet & equipment sourcing** — track available trucks and heavy equipment.
- **Market research** — monitor surplus pricing across categories over time.
- **Collectors** — track ex-military vehicles (Humvees, tactical trucks).

### Notes & limitations

- Search returns 60 lots per page; the Actor paginates automatically up to
  `maxResults`.
- Prices reflect the current bid / offer at scrape time and change during live
  auctions.
- Data is from public listing pages; this Actor does not log in or bid.

# Actor input Schema

## `searchQueries` (type: `array`):

Keywords or categories to search on GovPlanet (e.g. 'humvee', 'excavator', 'dump truck', 'generator', 'forklift'). Each query is searched separately.

## `maxResults` (type: `integer`):

Maximum total listings to scrape across all queries. GovPlanet returns 60 listings per page and paginates automatically.

## `scrapeDetails` (type: `boolean`):

Also open each listing's detail page to enrich records with brand, description, high-res image, availability, and the exact auction close date (priceValidUntil). Slower but richer.

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

Proxy settings. GovPlanet is protected by an AWS WAF challenge; RESIDENTIAL proxies are strongly recommended for reliable access.

## Actor input object example

```json
{
  "searchQueries": [
    "humvee",
    "excavator"
  ],
  "maxResults": 100,
  "scrapeDetails": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchQueries": [
        "humvee",
        "excavator"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lulzasaur/govplanet-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 = {
    "searchQueries": [
        "humvee",
        "excavator",
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("lulzasaur/govplanet-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 '{
  "searchQueries": [
    "humvee",
    "excavator"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call lulzasaur/govplanet-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lulzasaur/govplanet-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/hEuQwr9OmAQQn5I4R/builds/3MececQDIF3MNi5zM/openapi.json
