# Ascension Works Tax Sale Listings Scraper (`ascensionworks/ascension-works-current-listing-research-request`) Actor

Clean, filter, and organize authorized delinquent-property listings across up to 100 counties. Also try the U.S. County Research Scraper and Tax Sale Ranking Scraper.

- **URL**: https://apify.com/ascensionworks/ascension-works-current-listing-research-request.md
- **Developed by:** [Ascension Works](https://apify.com/ascensionworks) (community)
- **Categories:** Real estate
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.65 / 1,000 current listing normalizeds

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/platform/actors/running/actors-in-store#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

## Ascension Works Tax Sale Listings Scraper

Normalize and filter a bounded set of delinquent-property listing records that
you are authorized to use.

> Independent research utility. Not affiliated with or endorsed by any
> government agency, county, auction platform, or data provider.

### About Ascension Works

Learn more about the research suite at
[Ascension Works](https://ascensionworks.net/).

Ascension Works is a venture operated by Arete Praxis LLC. The original
software, documentation, configuration, and product presentation for this
Actor are proprietary intellectual property of Arete Praxis LLC under the
Ascension Works brand. Public records, official government materials, and
third-party materials remain subject to their respective rights and terms.

### Try the other Ascension Works scrapers

- [U.S. County Research Scraper](https://apify.com/ascensionworks/ascension-works-jurisdiction-research-request)
  checks customer-scoped research availability across up to 100 counties or
  county equivalents.
- [Tax Sale Ranking Scraper](https://apify.com/ascensionworks/ascension-works-opportunity-screening-request)
  compares counties and ranks authorized listings using your selected criteria.

### Early-release mode

The useful current mode is customer-supplied data. You can choose 1 to 100
counties or county equivalents across multiple states or territories, one or
two years, freshness and page limits, budget/value filters, property and
sale-method preferences, and a deterministic ordering profile. You must affirm
that you have the right to use the supplied records.

Accepted records use a strict factual schema. Unknown fields, source URLs,
credentials, raw page content, personal owner/contact fields, malformed dates,
stale or past records, duplicate events, and out-of-scope records fail closed or
are excluded. The result contains only the normalized, matching projection and
customer-specific identifiers.

`maxResults` is the listing page size, not a claim that a fixed cap represents
the complete result. The request summary reports the exact number evaluated,
excluded, qualifying, returned, and remaining. When another page exists, it
returns a signed, expiring continuation cursor bound to the same customer,
request, scope, criteria, page size, and supplied record set.

Known starting amounts are not predicted final acquisition prices. The Actor
does not establish title, lien priority, redemption rights, eligibility,
condition, value, or investment merit.

### What it does not provide

This Actor does not provide a bulk research-route directory, raw page captures,
or internal implementation data. Automated listing collection is used only
where a route has separate current access, automation, and customer-delivery
approval; otherwise the request uses customer-supplied records or returns a
truthful unavailable/manual-review result.

Customers select jurisdictions rather than supplying or receiving the compiled
research-route registry. For a separately approved automated route, an
authenticated service maps that jurisdiction to an owner-controlled route,
collects only allowlisted factual fields, and removes route addresses and
implementation details before any customer result is stored.

### Data handling

Your input and final output are stored in this Actor run's Apify default
storages and follow your Apify account's access and retention settings.
Customer-supplied mode is processed inside this run.

When an eligible service-side route is used, the bounded request is sent to a
restricted Ascension Works-owned Apify run. After its result is copied and
validated, this Actor deletes that temporary run's default input, output, and
queue storages. If it cannot confirm all three deletions, no research result is
delivered. Minimal service logs record only product type, output count, and
status; Apify may retain generic run metadata and logs under its platform
policies.

Do not submit owner or taxpayer names, mailing or contact details, credentials,
raw pages, or other unnecessary personal data. If you enable Apify developer
run sharing or attach a run to an Actor Issue, Apify may provide the creator
access to the shared run's input, output, and logs.

### Support and corrections

Use the Actor's Apify Issue or support control for a reproducible normalization
problem. Include only the run ID, affected factual field, and generic status;
never post credentials, private records, or personal data. Schema, freshness,
and permission rules are periodically rechecked, and affected processing may be
held unavailable while a correction is reviewed.

### Early-release status

This early release supports complete customer-supplied screening with
deterministic continuation. Automated collection is limited to separately
authorized routes and is not promised nationwide. The approved all-in price
for each eligible `current_listing_normalized` result that is actually stored
is $0.000770 FREE, $0.0007315 BRONZE, $0.000693 SILVER, or $0.0006545 GOLD,
plus the $0.00005 Actor-start event. Platform usage is included. Set at least
$0.00082 as the run charge authorization when one paid result is requested.
Summary, excluded, stale, duplicate, unauthorized, unavailable, and held rows
do not receive the custom paid-result event.

# Actor input Schema

## `requestReference` (type: `string`):

Use the reference assigned to this bounded request. This value does not authorize processing or delivery.

## `requestText` (type: `string`):

Describe the bounded research request in plain language without including credentials, payment details, or sensitive personal information.

## `years` (type: `array`):

List one or two calendar or sale years. Availability and permitted use remain subject to the displayed product limits.

## `businessPurpose` (type: `string`):

Explain the legitimate business purpose for the requested research and how any delivered results would be used.

## `customerType` (type: `string`):

Identify the requester category so reseller, competitor, and unusual-use requests can be routed to manual review.

## `expectedVolume` (type: `string`):

Estimate the expected record volume. Large, unknown, or entire-collection requests require manual owner review.

## `deliveryMode` (type: `string`):

Choose authenticated portal or API access unless a separately reviewed written license permits an export.

## `lawfulPurposeAccepted` (type: `boolean`):

Confirm that the request is for a lawful purpose and does not seek prohibited or unauthorized use.

## `restrictedUseAccepted` (type: `boolean`):

Confirm that bulk extraction, mirroring, resale, redistribution, model training, and competitive database construction are prohibited unless expressly licensed.

## `licenseAccepted` (type: `boolean`):

Confirm acceptance of the displayed draft license and policy terms, subject to final owner review. This does not create a paid order.

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

Maximum listing rows returned on each page. When more records qualify, the summary supplies a signed continuation cursor and exact remaining count.

## `maxSourceAgeDays` (type: `integer`):

Exclude records older than this many days.

## `maxTargetCost` (type: `number`):

Maximum known starting amount for screening. Auction amounts are not predicted final prices.

## `minAssessedValue` (type: `number`):

Optional minimum assessed value. Records without the required value are excluded.

## `minMarketValue` (type: `number`):

Optional minimum market value. Records without the required value are excluded.

## `minValueToCostRatio` (type: `number`):

Optional minimum available value divided by the known starting amount.

## `preferredPropertyTypes` (type: `array`):

Optional allowlist of property-type words, such as land or residential.

## `preferredSaleMethods` (type: `array`):

Optional allowlist of sale-method words, such as auction or non auction.

## `sortPreference` (type: `string`):

Choose the deterministic ordering profile for matching records.

## `customerDataRightsAccepted` (type: `boolean`):

Required when you supply records. Confirm that you are authorized to use those records for this screening request. Do not include source URLs, credentials, personal owner/contact data, or raw page content.

## `customerRecords` (type: `array`):

Optional bounded records that you are authorized to use. Only the listed factual fields are accepted; unknown and private fields fail closed.

## `jurisdictions` (type: `array`):

Add 1 to 100 counties, parishes, boroughs, independent cities, census areas, municipios, or equivalent local jurisdictions. Each item carries its own state or territory code, so one request may cross state lines.

## `continuationCursor` (type: `string`):

For page 2 or later, paste the signed cursor returned by the immediately preceding page and resubmit the same customer records, scope, and criteria.

## Actor input object example

```json
{
  "requestReference": "SAMPLE-LISTINGS-20260809",
  "requestText": "Normalize and screen my authorized Baldwin County listing record.",
  "years": [
    2026
  ],
  "businessPurpose": "Internal due-diligence research for a possible direct purchase.",
  "customerType": "direct_customer",
  "expectedVolume": "under_500",
  "deliveryMode": "portal_api",
  "lawfulPurposeAccepted": true,
  "restrictedUseAccepted": true,
  "licenseAccepted": true,
  "maxResults": 100,
  "maxSourceAgeDays": 3650,
  "maxTargetCost": 5000,
  "minAssessedValue": 0,
  "minMarketValue": 0,
  "minValueToCostRatio": 0,
  "preferredPropertyTypes": [
    "land"
  ],
  "preferredSaleMethods": [],
  "sortPreference": "lowest_cost",
  "customerDataRightsAccepted": true,
  "customerRecords": [
    {
      "recordReference": "CUSTOMER-SAMPLE-001",
      "stateCode": "AL",
      "county": "Baldwin County",
      "recordYear": 2026,
      "listingStatus": "ACTIVE",
      "dataAsOf": "2026-08-10",
      "parcelId": "SAMPLE-PARCEL-001",
      "propertyType": "land",
      "saleMethod": "non auction tax sale",
      "minimumBidUsd": 900,
      "assessedValueUsd": 12000,
      "marketValueUsd": 15000
    }
  ],
  "jurisdictions": [
    {
      "stateCode": "AL",
      "name": "Baldwin County",
      "jurisdictionId": "US-AL-01003"
    }
  ]
}
```

# Actor output Schema

## `datasetId` (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 = {
    "requestReference": "SAMPLE-LISTINGS-20260809",
    "requestText": "Normalize and screen my authorized Baldwin County listing record.",
    "years": [
        2026
    ],
    "businessPurpose": "Internal due-diligence research for a possible direct purchase.",
    "customerType": "direct_customer",
    "expectedVolume": "under_500",
    "deliveryMode": "portal_api",
    "lawfulPurposeAccepted": true,
    "restrictedUseAccepted": true,
    "licenseAccepted": true,
    "maxResults": 100,
    "maxSourceAgeDays": 3650,
    "maxTargetCost": 5000,
    "minAssessedValue": 0,
    "minMarketValue": 0,
    "minValueToCostRatio": 0,
    "preferredPropertyTypes": [
        "land"
    ],
    "preferredSaleMethods": [],
    "sortPreference": "lowest_cost",
    "customerDataRightsAccepted": true,
    "customerRecords": [
        {
            "recordReference": "CUSTOMER-SAMPLE-001",
            "stateCode": "AL",
            "county": "Baldwin County",
            "recordYear": 2026,
            "listingStatus": "ACTIVE",
            "dataAsOf": "2026-08-10",
            "parcelId": "SAMPLE-PARCEL-001",
            "propertyType": "land",
            "saleMethod": "non auction tax sale",
            "minimumBidUsd": 900,
            "assessedValueUsd": 12000,
            "marketValueUsd": 15000
        }
    ],
    "jurisdictions": [
        {
            "stateCode": "AL",
            "name": "Baldwin County",
            "jurisdictionId": "US-AL-01003"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("ascensionworks/ascension-works-current-listing-research-request").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 = {
    "requestReference": "SAMPLE-LISTINGS-20260809",
    "requestText": "Normalize and screen my authorized Baldwin County listing record.",
    "years": [2026],
    "businessPurpose": "Internal due-diligence research for a possible direct purchase.",
    "customerType": "direct_customer",
    "expectedVolume": "under_500",
    "deliveryMode": "portal_api",
    "lawfulPurposeAccepted": True,
    "restrictedUseAccepted": True,
    "licenseAccepted": True,
    "maxResults": 100,
    "maxSourceAgeDays": 3650,
    "maxTargetCost": 5000,
    "minAssessedValue": 0,
    "minMarketValue": 0,
    "minValueToCostRatio": 0,
    "preferredPropertyTypes": ["land"],
    "preferredSaleMethods": [],
    "sortPreference": "lowest_cost",
    "customerDataRightsAccepted": True,
    "customerRecords": [{
            "recordReference": "CUSTOMER-SAMPLE-001",
            "stateCode": "AL",
            "county": "Baldwin County",
            "recordYear": 2026,
            "listingStatus": "ACTIVE",
            "dataAsOf": "2026-08-10",
            "parcelId": "SAMPLE-PARCEL-001",
            "propertyType": "land",
            "saleMethod": "non auction tax sale",
            "minimumBidUsd": 900,
            "assessedValueUsd": 12000,
            "marketValueUsd": 15000,
        }],
    "jurisdictions": [{
            "stateCode": "AL",
            "name": "Baldwin County",
            "jurisdictionId": "US-AL-01003",
        }],
}

# Run the Actor and wait for it to finish
run = client.actor("ascensionworks/ascension-works-current-listing-research-request").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 '{
  "requestReference": "SAMPLE-LISTINGS-20260809",
  "requestText": "Normalize and screen my authorized Baldwin County listing record.",
  "years": [
    2026
  ],
  "businessPurpose": "Internal due-diligence research for a possible direct purchase.",
  "customerType": "direct_customer",
  "expectedVolume": "under_500",
  "deliveryMode": "portal_api",
  "lawfulPurposeAccepted": true,
  "restrictedUseAccepted": true,
  "licenseAccepted": true,
  "maxResults": 100,
  "maxSourceAgeDays": 3650,
  "maxTargetCost": 5000,
  "minAssessedValue": 0,
  "minMarketValue": 0,
  "minValueToCostRatio": 0,
  "preferredPropertyTypes": [
    "land"
  ],
  "preferredSaleMethods": [],
  "sortPreference": "lowest_cost",
  "customerDataRightsAccepted": true,
  "customerRecords": [
    {
      "recordReference": "CUSTOMER-SAMPLE-001",
      "stateCode": "AL",
      "county": "Baldwin County",
      "recordYear": 2026,
      "listingStatus": "ACTIVE",
      "dataAsOf": "2026-08-10",
      "parcelId": "SAMPLE-PARCEL-001",
      "propertyType": "land",
      "saleMethod": "non auction tax sale",
      "minimumBidUsd": 900,
      "assessedValueUsd": 12000,
      "marketValueUsd": 15000
    }
  ],
  "jurisdictions": [
    {
      "stateCode": "AL",
      "name": "Baldwin County",
      "jurisdictionId": "US-AL-01003"
    }
  ]
}' |
apify call ascensionworks/ascension-works-current-listing-research-request --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,ascensionworks/ascension-works-current-listing-research-request"
        }
    }
}

```

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/GPGJAy8ah7RaskMFs/builds/liL4J6TsdxVERdLrU/openapi.json
