# Propertyroom Law Enforcement Seized Property Auction Scraper (`jungle_synthesizer/propertyroom-law-enforcement-seized-property-auction-scraper`) Actor

This closes the government-asset-disposal set. We already earn on GovDeals; PublicSurplus and Municibid

- **URL**: https://apify.com/jungle\_synthesizer/propertyroom-law-enforcement-seized-property-auction-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 93.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## PropertyRoom Seized Property Auction Scraper

Scrapes law-enforcement and general-liquidation auction lots from PropertyRoom.com. Returns bid state, condition, shipping terms, and images for every lot — plus a flag for whether the consignor is a police department or sheriff's office.

***

### PropertyRoom Scraper Features

- Crawls all 14 top-level PropertyRoom categories, or just the ones you pick
- Flags each lot as law-enforcement consigned (`is_police_item`) using the site's own police-only filter, not a guess
- Captures both active and ended lots, with the winning price recorded once a lot closes
- Extracts condition, quantity, and pickup-facility location when the seller provides them
- Returns every listing photo as a direct image URL
- Resumes a stopped crawl without re-billing records you already received

***

### Who Uses a PropertyRoom Scraper?

- **Resellers** — sourcing bulk lots of jewelry, watches, coins, and electronics at seized-property prices for eBay or Amazon
- **Pawn and coin dealers** — scanning bulk lots for inventory instead of browsing the site by hand
- **Asset-recovery and insurance-salvage desks** — tracking recovered property as it moves through law-enforcement disposal channels
- **Market researchers** — comparing realized prices on closed lots against active listings

***

### How PropertyRoom Scraper Works

1. Give it a list of categories (or leave it blank for all 14) and a `maxItems` cap.
2. It walks each category's listing pages, following PropertyRoom's own pagination.
3. Each lot's detail page is fetched for the fields the listing card doesn't carry — condition, shipping, seller location, and photos.
4. Records are returned as they're collected, up to your `maxItems` cap.

***

### Input

```json
{
  "maxItems": 10,
  "categories": ["coins", "jewelry"],
  "includePoliceItemsIndex": true
}
```

| Field                      | Type    | Default | Description                                                                                     |
|-----------------------------|---------|---------|---------------------------------------------------------------------------------------------------|
| `maxItems`                   | integer | 10      | Maximum number of lots to return.                                                                 |
| `categories`                 | array   | all 14  | Which top-level categories to crawl (`bikes`, `coins`, `collectibles`, `computers`, `electronics`, `fashion`, `fine-art`, `jewelry`, `musical-instruments`, `sunglasses-and-eyewear`, `tools-and-equipment`, `vehicles`, `watches`, `everything-else`). Leave empty for all of them. |
| `includePoliceItemsIndex`    | boolean | `true`  | Also crawls PropertyRoom's law-enforcement consignment index so lots from that view are flagged `is_police_item: true`. |
| `resumeCursor`               | string  | —       | Cursor from a previous run's Output. Leave empty for a fresh crawl.                               |

#### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### PropertyRoom Scraper Output Fields

```json
{
  "lot_id": "18495079",
  "slug": "kobalt-cordless-hand-tools-kdd-524b03-",
  "title": "Kobalt Cordless Hand Tools KDD 524B-03",
  "category": "Tools & Equipment",
  "subcategory": "Power Tools",
  "current_bid_usd": null,
  "starting_bid_usd": null,
  "bid_count": 0,
  "buy_now_price_usd": 59.00,
  "ends_at": "Aug 27, 2026 at 02:00 AM (Eastern)",
  "time_left_raw": "5 days",
  "condition": "Used",
  "seller_agency": "GC Pawn",
  "seller_state": "FL",
  "is_police_item": true,
  "lot_type": "single",
  "quantity": 2,
  "description": "Kobalt cordless hand tools, brushless motor...",
  "shipping_terms": "$11.95 (5-7 business days)",
  "image_urls": ["https://content.propertyroom.com/listings/sellers/seller888888994/images/origimgs/..."],
  "detail_url": "https://www.propertyroom.com/l/kobalt-cordless-hand-tools-kdd-524b03-/18495079",
  "status": "active",
  "sold_price_usd": null,
  "scraped_at": "2026-08-21T14:45:33.603Z"
}
```

| Field              | Type    | Description                                                                 |
|---------------------|---------|-------------------------------------------------------------------------------|
| `lot_id`             | string  | The trailing id in the lot's URL.                                             |
| `slug`               | string  | The lot's URL slug.                                                           |
| `title`              | string  | Listing title.                                                                |
| `category`           | string  | Top-level category from the lot's breadcrumb.                                 |
| `subcategory`        | string  | Subcategory from the lot's breadcrumb.                                        |
| `current_bid_usd`    | number  | Current bid, for lots priced by auction.                                      |
| `starting_bid_usd`   | number  | Starting bid, when the lot shows one.                                         |
| `bid_count`          | integer | Number of bids placed so far.                                                 |
| `buy_now_price_usd`  | number  | Fixed buy-now price, for lots that offer one.                                 |
| `ends_at`            | string  | Auction end time, as shown on the site (US Eastern).                          |
| `time_left_raw`      | string  | Time-remaining text from the listing card.                                    |
| `condition`          | string  | Seller-reported condition, when the listing includes a spec table.            |
| `seller_agency`      | string  | Pickup-facility name, when the lot offers local pickup.                       |
| `seller_state`       | string  | US state derived from the pickup facility's ZIP, when available.              |
| `is_police_item`     | boolean | `true` when the lot was confirmed through PropertyRoom's law-enforcement filter. |
| `lot_type`           | string  | `single` or `bulk-lot`.                                                       |
| `quantity`           | integer | Number of pieces in the lot, when the seller states it.                       |
| `description`        | string  | Listing description text.                                                     |
| `shipping_terms`     | string  | Standard shipping price and window.                                           |
| `image_urls`         | array   | Full-size photo URLs for the lot.                                             |
| `detail_url`         | string  | Direct link to the lot.                                                       |
| `status`             | string  | `active` or `ended`.                                                          |
| `sold_price_usd`     | number  | Final price, populated once a lot ends.                                       |
| `scraped_at`          | string  | Timestamp this record was collected.                                          |

***

### FAQ

#### How do I scrape PropertyRoom.com?

Point PropertyRoom Scraper at the categories you want, set `maxItems`, and run it. No account or login is needed — PropertyRoom's listings are public.

#### What data can I get from PropertyRoom?

Everything on a lot's page: current bid or buy-now price, bid count, condition, shipping cost, pickup location, photos, and end time. Ended lots also carry the final sold price, which is the comparable resellers price bulk lots against.

#### Can I filter by category?

Yes. Pass `categories` with any of the 14 top-level slugs — `coins`, `jewelry`, `watches`, and so on. Leave it empty and the scraper covers all of them.

#### How do I get only law-enforcement consigned lots?

Every record carries `is_police_item`. Filter your output on that field after the run, or narrow `categories` to a smaller set to keep the run focused on lots you're likely to want.

#### Do I need an account or API key for PropertyRoom?

No. PropertyRoom Scraper reads public auction pages — no PropertyRoom account, login, or API key required.

***

### Need More Features?

Have a request or found a bug? [Open an issue](https://apify.com/BowTiedRaccoon/propertyroom-law-enforcement-seized-property-auction-scraper/issues) and it'll get looked at.

### Why Use PropertyRoom Scraper?

- **Flags law-enforcement inventory directly** — `is_police_item` comes from PropertyRoom's own police-consignment filter, not a keyword guess.
- **Covers ended lots, not just live ones** — realized prices are the number resellers actually price against.
- **Bulk-lot aware** — `quantity` and `lot_type` separate single items from bulk lots, where the resale margin usually is.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

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

Maximum number of records to scrape

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

Which PropertyRoom top-level categories to crawl. Leave empty to crawl all categories.

## `includePoliceItemsIndex` (type: `boolean`):

Also crawl the cross-cutting law-enforcement consignment index (policeitems filter) and flag matching lots as isPoliceItem.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10,
  "includePoliceItemsIndex": 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/propertyroom-law-enforcement-seized-property-auction-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/propertyroom-law-enforcement-seized-property-auction-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "maxItems": 10
}' |
apify call jungle_synthesizer/propertyroom-law-enforcement-seized-property-auction-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/propertyroom-law-enforcement-seized-property-auction-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/uIkirWmg5ZffBTCRE/builds/lpbam1prP9SnUscIB/openapi.json
