# GSA Auctions Scraper for Federal Surplus (`maximedupre/gsa-auctions`) Actor

Search the current public GSA Auctions inventory for federal surplus lots. Filter by keywords, states, statuses, agencies, ZIP codes, categories, dates, or current bid, then get normalized lot data and official detail links.

- **URL**: https://apify.com/maximedupre/gsa-auctions.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** E-commerce, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.25 / 1,000 auction lots

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

### 🏛️ GSA Auctions federal surplus lots

Fleet buyers, surplus resellers, procurement teams, and researchers can search the current public GSA Auctions inventory and get normalized lot rows with official detail links. Review published IDs, dates, locations, agencies, bid signals, and priority so you can decide which lots need a closer look. This Actor does not place bids or complete purchases.

- Search current public lots for vehicles with **[Military Vehicles For Sale](https://apify.com/maximedupre/gsa-auctions/examples/military-vehicles-for-sale)**.
- Review vehicle and equipment lots from the public source with **[Military Surplus Auctions](https://apify.com/maximedupre/gsa-auctions/examples/military-surplus-auctions)**.
- Browse lots that fit a public buyer search through **[Car Auctions Open To Public](https://apify.com/maximedupre/gsa-auctions/examples/car-auctions-open-to-public)**.
- Focus a run on vehicle inventory with **[GSA Fleet Auction](https://apify.com/maximedupre/gsa-auctions/examples/gsa-fleet-auction)**.
- Search vehicle auction lots with **[GSA Auto Auctions](https://apify.com/maximedupre/gsa-auctions/examples/gsa-auto-auctions)** and review their published details.

#### 📦 Current GSA Auctions lot data

**Dataset rows**

Each saved row is one normalized GSA Auctions lot. It includes the published sale and lot IDs, name, status, official detail link, auction dates, property location, selling agency, and bidding details when the source publishes them. The `priority` value is a source-derived signal based on closing urgency and published bidding context.

If the same source lot matches more than one submitted keyword, state, or other value, the first eligible match is saved and later matches are ignored. The saved row describes that first match.

#### ▶️ Search or watch current lots

**Run steps**

1. Choose `Search current inventory` or `Watch selected lots`.
2. For a search, add any keywords, states, statuses, agencies, ZIP codes, categories, dates, or current-bid ceiling you need.
3. For a watchlist, enter the published lot IDs you want to check.
4. Start the run and open the dataset to review the saved lots and their official detail links.

One run uses one search scope. You can submit lists of same-kind keywords or states, but the Actor does not combine several independent searches in one run.

#### ⚙️ Input

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `findLotsBy` | string | Choose `search` for current inventory or `watchlist` for selected lot IDs. |
| `keywords` | array of strings | Optional words to find in item or lot names. Leave empty to search all current public GSA Auctions lots. |
| `states` | array of strings | Optional property or sale states. Use state names or two-letter state codes. |
| `statuses` | array of strings | Optional auction status values used by GSA Auctions. |
| `agencies` | array of strings | Optional selling agency or bureau names. |
| `propertyZipCodes` | array of strings | Optional five-digit property ZIP codes. |
| `categories` | array of strings | Optional source categories or asset types. |
| `auctionStartDate` | string | Optional first date in the auction date range. |
| `auctionEndDate` | string | Optional last date in the auction date range. |
| `maximumCurrentBid` | number | Optional current-bid ceiling in US dollars. Lots with no published current bid are still included. |
| `lotIds` | array of strings | Published GSA sale or lot IDs to watch when `findLotsBy` is `watchlist`. |

The search option uses the search fields. The watchlist option uses `lotIds`; fields in the other section are ignored for the selected choice. This input has no actor-defined row-count limit. With optional search filters left empty, it searches all current public lots until the source is exhausted.

**Example input**

The following is the public input from a successful default search run:

```json
{
  "findLotsBy": "search",
  "keywords": [
    "vehicle"
  ]
}
```

#### 🧾 Output

**Dataset link**

The `dataset` output opens the matched GSA Auctions lots in the Apify dataset.

**Auction lot fields**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string URL | Link to the Apify dataset that contains the matched lot rows. |
| `lotId` | string | Published identifier for the auction lot. |
| `saleId` | string | Published identifier for the sale that contains the lot. |
| `name` | string | Published name of the item or lot. |
| `detailUrl` | string URL | Official GSA Auctions page for the lot. |
| `status` | string | Auction status published by the source. |
| `priority` | string | Source-derived priority based on closing urgency and published bidding context. |
| `auction` | object | Published auction dates, when available. |
| `auction.startDate` | string date-time | Date and time when the auction starts. |
| `auction.endDate` | string date-time | Date and time when the auction ends. |
| `propertyLocation` | object | Published property location, when available. |
| `propertyLocation.address` | string | Published street address. |
| `propertyLocation.city` | string | Published property city. |
| `propertyLocation.state` | string | Published property state. |
| `propertyLocation.zipCode` | string | Published property ZIP code. |
| `agency` | object | Published selling agency, when available. |
| `agency.name` | string | Published selling agency name. |
| `bidding` | object | Published bidding details, when available. |
| `bidding.currentBid` | number | Published current or high bid in US dollars, when available. |
| `bidding.bidderCount` | integer | Published number of bidders. |
| `bidding.reserveStatus` | string | Published reserve signal. |
| `bidding.bidIncrement` | number | Amount added for the next bid increment in US dollars. |

**Example auction lot**

This genuine row came from a successful search run using the `vehicle` keyword:

```json
{
  "lotId": "406381",
  "saleId": "31QSCI26590",
  "name": "2004 Ford F-350",
  "detailUrl": "https://gsaauctions.gov/auctions/preview/377270",
  "status": "Active",
  "priority": "high",
  "auction": {
    "startDate": "2026-09-24T11:00:00.000Z",
    "endDate": "2026-10-01T11:00:00.000Z"
  },
  "propertyLocation": {
    "address": "5020 Tuttle Creek Blvd",
    "city": "Manhattan",
    "state": "KS",
    "zipCode": "66502"
  },
  "agency": {
    "name": "PPMS"
  },
  "bidding": {
    "currentBid": 3677,
    "bidderCount": 8,
    "reserveStatus": "Reserve met",
    "bidIncrement": 100
  }
}
```

Optional values are included only when the source publishes them. A missing optional value means the source did not provide it for that lot.

#### 💳 Pricing

**Charge event**

The `gsa-auction-lot-returned` event charges $0.00225 for each normalized auction lot saved to your dataset. The final amount depends on the number of saved lots.

#### 🔌 Integrations

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

The output is an Apify dataset. Use its built-in exports or the Apify API to read the saved lot rows after a run.

#### ❓ FAQ

##### What happens if the source does not publish a current bid?

The lot can still be returned. The optional `bidding.currentBid` field is omitted when no current bid is published, while other published bidding fields may still be present.

##### Can I search with several keywords or states?

Yes. Add same-kind values to `keywords` or `states` to keep one search scope focused on the values you submit.

##### What does the watchlist choice do?

Set `findLotsBy` to `watchlist` and enter published values in `lotIds`. The Actor returns the selected lots and tracks current bid changes when the source publishes them.

##### How are duplicate matches handled?

The first eligible occurrence of a source lot is saved. If that lot matches another submitted value later, the later match is ignored.

##### Does this Actor place bids or buy lots?

No. It searches public GSA Auctions inventory and returns source-backed lot data. You review the official detail link and handle any auction action yourself.

##### How do I check a matched lot?

Open `detailUrl` in the dataset row. It points to the official GSA Auctions detail page for that lot.

##### What happens when search filters are empty?

Empty optional filters let the search cover all current public GSA Auctions lots until the source is exhausted. Narrow the search with keywords or other fields when you need a smaller set.

### 📝 Changelog

**v0.0** (26-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~gsa-auctions/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Carsales.com.au Scraper](https://apify.com/maximedupre/carsales-scraper) - Compare public Australian vehicle listings with prices, specs, sellers, and source URLs.
- [Zillow Foreclosure & Pre-Foreclosure Scraper](https://apify.com/maximedupre/zillow-foreclosure-pre-foreclosure-scraper) - Research public distressed-property and auction listings with prices, addresses, and property facts.
- [GSA Auctions Scraper — Federal Surplus Lots, Bids & Alerts](https://apify.com/scrapersdelight/gsa-auctions-scraper) - Review federal surplus lots with bid, location, agency, and closing-time fields.
- [GSA Auctions Listings Scraper](https://apify.com/neuton/gsa-auctions-listings-scraper) - Explore live GSA listings for surplus sourcing and government liquidation research.
- [Federal Surplus Auctions](https://apify.com/primeselectai/us-federal-surplus-industrial-auctions) - Search federal and industrial-equipment lots with official source links and bid signals.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findLotsBy` (type: `string`):

Choose a current inventory search with filters, or a selected-lot watchlist for current bid changes.

## `keywords` (type: `array`):

Optional words to find in item or lot names. Enter one or more values. Leave this empty to search all current public GSA Auctions lots.

## `states` (type: `array`):

Optional property or sale states. Enter state names or two-letter state codes, one per value.

## `statuses` (type: `array`):

Optional auction statuses. Enter one or more status values used by GSA Auctions.

## `agencies` (type: `array`):

Optional selling agency or bureau names. Enter one or more values.

## `propertyZipCodes` (type: `array`):

Optional property ZIP codes. Enter one or more five-digit ZIP codes.

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

Optional source categories or asset types. Enter one or more values.

## `auctionStartDate` (type: `string`):

Optional first date in the auction date range.

## `auctionEndDate` (type: `string`):

Optional last date in the auction date range.

## `maximumCurrentBid` (type: `number`):

Optional current-bid ceiling in USD. Lots with no published current bid are still included.

## `lotIds` (type: `array`):

Enter one or more published GSA sale or lot IDs to watch. This choice returns the selected lots and tracks current bid changes when the source publishes them.

## Actor input object example

```json
{
  "findLotsBy": "search",
  "keywords": [
    "vehicle"
  ]
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the matched GSA Auctions lots.

# 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 = {
    "findLotsBy": "search",
    "keywords": [
        "vehicle"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/gsa-auctions").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 = {
    "findLotsBy": "search",
    "keywords": ["vehicle"],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/gsa-auctions").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 '{
  "findLotsBy": "search",
  "keywords": [
    "vehicle"
  ]
}' |
apify call maximedupre/gsa-auctions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/gsa-auctions"
        }
    }
}
```

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/eyu5rImykRdlkBbUm/builds/Ix4li1WCCbh8jyT8N/openapi.json
