# US Government Surplus Auctions (GSA Auctions) (`kubapi/us-government-surplus-auctions`) Actor

Search live federal surplus auction lots from GSAAuctions.gov: vehicles, trucks, machinery, aircraft, boats and equipment, with bids, closing dates and inspection details.

- **URL**: https://apify.com/kubapi/us-government-surplus-auctions.md
- **Developed by:** [Kuba Software](https://apify.com/kubapi) (community)
- **Categories:** E-commerce, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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

## US Government Surplus Auctions (GSA Auctions) API

Search **federal surplus auction lots from GSAAuctions.gov** and get clean JSON, CSV or Excel: trucks, vans, trailers, boats, aircraft, heavy machinery, tractors, computers and office equipment sold by U.S. federal agencies.

Every lot comes with the **current high bid, number of bidders, closing date, location, agency, full description and inspection instructions**, so you can find deals, monitor closing dates and feed your own tools without opening hundreds of listings by hand.

### What can I do with it?

- **Find bargains**: filter by keyword (`truck`, `excavator`, `aircraft`), state and bid range.
- **Closing-soon alerts**: run it daily with `closingWithinDays` and send the results to Slack, email or Google Sheets using Apify integrations.
- **Resellers and flippers**: track vehicles and equipment with no bids yet.
- **Fleet and equipment buyers**: compare lots across states.
- **Researchers and journalists**: analyze what federal agencies sell and at what prices.

### How to use it

1. Click **Try for free**.
2. Add optional filters (keywords, states, bid range, closing date).
3. Click **Start** and download the results as JSON, CSV, Excel or HTML, or call the API.

To get a daily alert, open **Schedules** and run it every morning with `closingWithinDays` set to 3.

### New-lot alerts (monitor mode)

Turn on **Monitor mode** and schedule the Actor (for example every hour). Each run returns **only what changed** since the previous run:

- `changeType: "new"`: a lot that now matches your filters and wasn't there before.
- `changeType: "bidChange"`: a lot whose current bid changed, with the `previousBid`.

The first run saves a baseline and returns nothing (enable `emitOnFirstRun` to get everything once). Add a **webhook URL** and the Actor POSTs the new and changed lots as JSON to Slack, Zapier, Make or your own server. Use a different **monitor name** for each saved search.

You are charged only for the lots returned, so a quiet hour costs nothing.

### Input

| Field | What it does |
|---|---|
| `keywords` | Lots whose title or description contains ANY of these words |
| `states` | Two-letter state codes, for example `TX`, `CA` |
| `status` | `active` (open for bidding), `preview` (opening soon) or `all` |
| `minBid` / `maxBid` | Range for the current high bid, in USD |
| `onlyWithBids` | Skip lots nobody has bid on |
| `closingWithinDays` | Only lots closing in the next N days |
| `sortBy` | `closingSoon`, `highestBid` or `mostBidders` |
| `maxItems` | Maximum results (you only pay for what is returned) |
| `monitorMode` | Return only new lots and bid changes since the last run |
| `monitorKey` | Name of this saved search (one per search you monitor) |
| `alertOnBidChange` | In monitor mode, also report bid changes (default on) |
| `emitOnFirstRun` | In monitor mode, report everything on the first run |
| `webhookUrl` | Optional address that receives the new and changed lots as JSON |

### Output example

```json
{
  "id": "3-1-QSC-I-26-591-049",
  "title": "Boat With Outboard Engine and Trailer",
  "description": "Alumaweld Xpress 1870D boat with Yamaha 90hp outboard engine and Magic Tilt trailer...",
  "status": "active",
  "currentBid": 1000,
  "biddersCount": 5,
  "hasReserve": true,
  "bidIncrement": 25,
  "startsOn": "2026-09-24",
  "closesOn": "2026-10-01",
  "daysUntilClose": 6,
  "city": "Galveston",
  "state": "TX",
  "zip": "77550",
  "agency": "Department of the Army",
  "url": "https://www.gsaauctions.gov/auctions/preview/377734",
  "imageUrl": "https://www.ppms.gov/gw/auction/ppms/api/v1/auction/image/31QSCI26591049.jpg",
  "inspectionInstructions": "Must call for appt to inspect and to remove. Pay by: 10/5, remove by: 10/20",
  "scrapedAt": "2026-09-25T16:59:48Z"
}
```

Fields with no value (for example `currentBid` when nobody has bid) come back as `null`.

### Pricing

You pay per lot returned. See the **Pricing** tab for the current rate. There is no charge for lots that don't match your filters.

### Data source and freshness

The data comes from the public [GSA Auctions API](https://gsa.github.io/auctions_api/), published by the U.S. General Services Administration. U.S. government works are in the public domain.

GSA publishes the data as a periodically refreshed snapshot, so bids shown here can be a little behind the live site. **Always check the lot page (`url`) before bidding.** Bidding and payment happen on GSAAuctions.gov, not here.

This Actor is not affiliated with, endorsed by, or sponsored by the U.S. General Services Administration.

### FAQ

**Do I need a GSA account or API key?** No. The Actor handles access.

**Can I buy items through this Actor?** No. It only reads public listings. To bid you need your own GSAAuctions.gov account.

**Does it include lots from other agencies (Marshals, Treasury)?** Only what GSA Auctions lists. Other government auction sites are separate sources.

**Can I schedule it and send results to my tools?** Yes. Use Apify Schedules and integrations (Slack, email, Google Sheets, webhooks, Zapier, Make).

Found a problem or need another field? Open an issue from the Actor page.

# Actor input Schema

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

Return lots whose title or description contains ANY of these words (for example: truck, trailer, excavator, aircraft). Leave empty for all lots.

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

Two-letter U.S. state codes where the item is located (for example: TX, CA, FL). Leave empty for all states.

## `status` (type: `string`):

Active auctions accept bids now. Preview auctions can be inspected but are not open for bidding yet.

## `minBid` (type: `integer`):

Only lots whose current high bid is at least this amount.

## `maxBid` (type: `integer`):

Only lots whose current high bid is at most this amount. Lots with no bid yet are excluded when this is set.

## `onlyWithBids` (type: `boolean`):

Skip lots that nobody has bid on yet.

## `closingWithinDays` (type: `integer`):

Only lots that close within this many days, starting today. Useful for daily 'closing soon' alerts.

## `sortBy` (type: `string`):

Order of the results.

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

The most lots to return. You are only charged for the lots returned.

## `monitorMode` (type: `boolean`):

Schedule the Actor and it returns only lots that are NEW since the previous run (and lots whose bid changed). The first run saves a baseline and returns nothing, unless you enable 'Report everything on the first run'.

## `monitorKey` (type: `string`):

Name of this saved search. Use a different name for each search you monitor, so they don't share memory.

## `alertOnBidChange` (type: `boolean`):

In monitor mode, also return lots whose current bid changed since the last run.

## `emitOnFirstRun` (type: `boolean`):

In monitor mode, return all matching lots on the first run instead of only saving a baseline.

## `webhookUrl` (type: `string`):

In monitor mode, the Actor sends a JSON POST with the new and changed lots to this address (Slack, Zapier, Make, your server). Must start with http:// or https://.

## Actor input object example

```json
{
  "keywords": [
    "truck",
    "trailer"
  ],
  "states": [],
  "status": "active",
  "onlyWithBids": false,
  "sortBy": "closingSoon",
  "maxItems": 100,
  "monitorMode": false,
  "monitorKey": "default",
  "alertOnBidChange": true,
  "emitOnFirstRun": false
}
```

# Actor output Schema

## `lots` (type: `string`):

Table of matching lots: title, current bid, bidders, closing date, location, agency and link to the lot page.

# 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 = {
    "keywords": [
        "truck",
        "trailer"
    ],
    "states": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("kubapi/us-government-surplus-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 = {
    "keywords": [
        "truck",
        "trailer",
    ],
    "states": [],
}

# Run the Actor and wait for it to finish
run = client.actor("kubapi/us-government-surplus-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 '{
  "keywords": [
    "truck",
    "trailer"
  ],
  "states": []
}' |
apify call kubapi/us-government-surplus-auctions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kubapi/us-government-surplus-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/vFDzNrSkFEV0Quclv/builds/POescenOOcnc1gBhH/openapi.json
