# Proxibid API — live US online auctions from proxibid.com: heavy construction and farm equipment, commercial trucks, vehicles, real estate, coins, art, collectibles and estates from hundreds of auction houses. Search open lots and the closed-lot archive, find auctions and auction houses, read an auction's catalogue, and read any lot in full: current bid, opening and minimum bid, the hammer price after the sale (floor or internet), reserve status, seconds left, internet buyer's premium, location, terms, description and photos. No login, no API key.

> Search OPEN and upcoming lots by keyword and/or category, with auction type, state, auction house and order. Give query or category (one of them is required; state and seller_name only narrow). Returns the source's own match count (capped at 10,000 by the source, flagged) and facet counts for the next filter.
> ReefAPI engine `proxibid` · 7 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/proxibid/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/proxibid/v1/search — 2 credits
Search OPEN and upcoming lots by keyword and/or category, with auction type, state, auction house and order. Give query or category (one of them is required; state and seller_name only narrow). Returns the source's own match count (capped at 10,000 by the source, flagged) and facet counts for the next filter.

**Parameters:**
- `query` (string, optional) — Keywords, as typed into the site's search box. Matches title and description. Measured: 'excavator' 2,721 open lots, 'tractor' 3,490.
- `category` (string, optional) — Category path as the source writes it: a top-level code (HEAVYEQUIPMENT, FARMMACHINERY, COMMERCIALTRUCK, VEHICLE, ARTCOLLECT, ESTATE …) or a sub-category path 'HEAVYEQUIPMENT/EXCAVATOR'. Every response lists the valid next-level paths with their counts in data.facets.categories. A sub-category code on its own ('EXCAVATOR') matches nothing — use the full path. Measured: 'tractor' 3,490 -> 1,760 with FARMMACHINERY (25/25 rows in that category).
- `auction_type` (enum, optional) — Live webcast sales or timed online sales. Measured: 'tractor' 2,898 live + 592 timed = 3,490. [one of: live, timed]
- `state` (string, optional) — US state or Canadian province, two-letter code (where the sale is held). Needs query or category. Measured: 'tractor' 3,490 -> PA 441, TX 415.
- `seller_name` (string, optional) — Auction house name, EXACTLY as the source writes it (seller.name of a row, or data.facets.sellers). The match is exact and case-sensitive: 'DeMott' or a lower-cased name return 0. Needs query or category. Measured: 'tractor' 3,490 -> 73.
- `sort` (enum, optional, default "relevance") — Result order, the source's own orders only (an unknown order is refused by the source, so it is refused here first). [one of: relevance, ending_soon, price_desc, price_asc]
- `page` (integer, optional, default 1) — Result page. The source serves at most the first 10,000 matches of any query, so page × page_size cannot pass 10,000 (refused before any request).
- `page_size` (integer, optional, default 25) — Rows per page, 1-100 (default 25).

**Returns:** data.lots[]: lot_id, title, url, description, current_bid, opening_bid, price_is (current_bid|opening_bid|none), bid_count, quantity, currency, category, categories[], image_url, country, sale_starts_at, ends_at (timed lots; null for live webcast lots), status, internal_status, seller{seller_id, name}, auction{auction_id, type, status, starts_at, timezone, url}. data.total, total_capped, total_from_facets, pagination, facets.

**Example request body:**
```json
{
  "query": "excavator"
}
```

### POST https://api.reefapi.com/proxibid/v1/sold — 2 credits
Search the CLOSED-lot archive (back to 2010) by keyword and/or category with the same filters. Each row carries the last ONLINE bid; on live webcast sales that is not the hammer price (measured different on 19/19 live lots, equal on 6/6 timed lots) — read the hammer price with lot_status or detail.

**Parameters:**
- `query` (string, optional) — Keywords, as typed into the site's search box. Matches title and description. Measured: 'excavator' 2,721 open lots, 'tractor' 3,490.
- `category` (string, optional) — Category path as the source writes it: a top-level code (HEAVYEQUIPMENT, FARMMACHINERY, COMMERCIALTRUCK, VEHICLE, ARTCOLLECT, ESTATE …) or a sub-category path 'HEAVYEQUIPMENT/EXCAVATOR'. Every response lists the valid next-level paths with their counts in data.facets.categories. A sub-category code on its own ('EXCAVATOR') matches nothing — use the full path. Measured: 'tractor' 3,490 -> 1,760 with FARMMACHINERY (25/25 rows in that category).
- `auction_type` (enum, optional) — Live webcast sales or timed online sales. Measured: 'tractor' 2,898 live + 592 timed = 3,490. [one of: live, timed]
- `state` (string, optional) — US state or Canadian province, two-letter code (where the sale is held). Needs query or category. Measured: 'tractor' 3,490 -> PA 441, TX 415.
- `seller_name` (string, optional) — Auction house name, EXACTLY as the source writes it (seller.name of a row, or data.facets.sellers). The match is exact and case-sensitive: 'DeMott' or a lower-cased name return 0. Needs query or category. Measured: 'tractor' 3,490 -> 73.
- `sort` (enum, optional, default "relevance") — Result order, the source's own orders only (an unknown order is refused by the source, so it is refused here first). [one of: relevance, oldest, price_desc, price_asc]
- `page` (integer, optional, default 1) — Result page. The source serves at most the first 10,000 matches of any query, so page × page_size cannot pass 10,000 (refused before any request).
- `page_size` (integer, optional, default 25) — Rows per page, 1-100 (default 25).

**Returns:** data.lots[]: lot_id, title, url, last_online_bid, source_price, hammer_price (always null here), price_is, archive_status (the archive says SOLD for every row), bid_count, sale_starts_at, ends_at, category, seller, auction. data.total, total_capped, pagination, facets.

**Example request body:**
```json
{
  "query": "john deere 4020",
  "sort": "price_desc"
}
```

### POST https://api.reefapi.com/proxibid/v1/auctions — 2 credits
Search auctions (sale events) by keyword, with auction type, state, auction house and a category label filter. query is required.

**Parameters:**
- `query` (string, required) — Keywords, as typed into the site's search box. Matches title and description. Measured: 'excavator' 2,721 open lots, 'tractor' 3,490.
- `auction_type` (enum, optional) — Live webcast sales or timed online sales. Measured: 'tractor' 2,898 live + 592 timed = 3,490. [one of: live, timed]
- `state` (string, optional) — US state or Canadian province, two-letter code (where the sale is held). Needs query or category. Measured: 'tractor' 3,490 -> PA 441, TX 415.
- `seller_name` (string, optional) — Auction house name, EXACTLY as the source writes it (seller.name of a row, or data.facets.sellers). The match is exact and case-sensitive: 'DeMott' or a lower-cased name return 0. Needs query or category. Measured: 'tractor' 3,490 -> 73.
- `category_label` (string, optional) — Category LABEL exactly as data.facets.categories[].label shows it (this search filters on labels, not codes: a code returns 0). Measured: 'excavator' 61 -> 46 with 'Farm Equipment & Machinery'.
- `sort` (enum, optional, default "relevance") — Result order, the source's own orders only (an unknown order is refused by the source, so it is refused here first). [one of: relevance, ending_soon]
- `page` (integer, optional, default 1) — Result page. The source serves at most the first 10,000 matches of any query, so page × page_size cannot pass 10,000 (refused before any request).
- `page_size` (integer, optional, default 25) — Rows per page, 1-100 (default 25).

**Returns:** data.auctions[]: auction_id, title, description, url, type, status, starts_at, ends_at, first_lot_ends_at, timezone, currency, address{street, city, state, postal_code, country}, latitude, longitude, categories[], image_url, seller, deposit_required, has_multiple_buyer_premiums, has_instant_financing, allow_prebidding, bidding_extended. data.total, pagination, facets.

**Example request body:**
```json
{
  "query": "farm"
}
```

### POST https://api.reefapi.com/proxibid/v1/sellers — 1 credit
Find auction houses by name.

**Parameters:**
- `query` (string, required) — Auction-house name or part of it.
- `page` (integer, optional, default 1) — Result page. The source serves at most the first 10,000 matches of any query, so page × page_size cannot pass 10,000 (refused before any request).
- `page_size` (integer, optional, default 25) — Rows per page, 1-100 (default 25).

**Returns:** data.sellers[]: seller_id, name, short_name, logo_url, city, state, country, url. data.total, pagination, suggestion.

**Example request body:**
```json
{
  "query": "auction"
}
```

### POST https://api.reefapi.com/proxibid/v1/catalog — 3 credits
One auction's catalogue: its lots with current bid, minimum bid, status, seconds left (timed sales) and the lot's attribute table.

**Parameters:**
- `auction_id` (string, required) — The auction (event) id, the `auction_id` of an auctions row or of a lot's auction block.
- `sort` (enum, optional, default "ending_soon") — Catalogue order, the source's own options. [one of: ending_soon, popular, price_desc, price_asc]
- `page` (integer, optional, default 1) — Catalogue page.
- `page_size` (enum, optional, default "25") — Lots per page, the source's own choices. [one of: 10, 25, 50, 100]

**Returns:** data.lots[]: lot_id, url, title, lot_number, status, current_bid, minimum_bid, bid_count, high_bidder (masked by the source), seconds_remaining, image_url, attributes[]. data.auction, pagination.

**Example request body:**
```json
{
  "auction_id": "300855"
}
```

### POST https://api.reefapi.com/proxibid/v1/detail — 3 credits
One lot in full. Open lots: current bid, minimum next bid, masked high bidder, seconds left, reserve status, internet premium, sale order, location, attribute table, description, photos, payment/pickup terms. Closed lots: the sale outcome (sold / passed), the hammer price and whether a floor or an internet bidder won, plus the lot record.

**Parameters:**
- `lot_id` (string, required) — The lot id, the `lot_id` of a search / sold / catalog row (the number at the end of a proxibid.com lot URL).

**Returns:** data.lot: lot_id, url, title, lot_number, status (open|sold|passed), auction_type, currency, current_bid, minimum_bid, hammer_price, sold_to (floor|internet), high_bidder / winning_bidder (masked by the source), reserve_met, seconds_remaining, bidding_extended, buyers_premium_pct, location, category, attributes[], description, images[], seller, auction, terms. Closed lots add page_price (the figure the archive shows) and price_mismatch.

**Example request body:**
```json
{
  "lot_id": "102551528"
}
```

### POST https://api.reefapi.com/proxibid/v1/lot_status — 1 credit
The live bid status of one lot from the source's own bid-widget feed — about 0.5 KB: status, high bid, next bid, seconds left, reserve met, extended bidding; after the sale the hammer price and whether a floor or an internet bidder won.

**Parameters:**
- `lot_id` (string, required) — The lot id, the `lot_id` of a search / sold / catalog row (the number at the end of a proxibid.com lot URL).

**Returns:** data.status: lot_id, status (open|sold|passed), status_code, high_bid, next_bid, hammer_price, sold_to, winning_bidder, high_bidder, has_bids, seconds_remaining, reserve_met, bidding_extended, instant_purchase, auction_id, seller_id, lot_number.

**Example request body:**
```json
{
  "lot_id": "102551528"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=proxibid
- Human docs page: https://reefapi.com/docs/proxibid
- Overview page: https://reefapi.com/proxibid-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
