# BLM MLRS Mining-Claim Status + Transition Feed (`querymill/blm-mlrs-mining-claim-status`) Actor

Mining-claim status intelligence from BLM MLRS public records: single-claim status lookups and a daily-harvested, timestamped feed of newly closed claims (transitions distinguished from previously-closed records that merely changed). Status only — not staking eligibility.

- **URL**: https://apify.com/querymill/blm-mlrs-mining-claim-status.md
- **Developed by:** [Eric Trammell](https://apify.com/querymill) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## BLM MLRS Mining-Claim Status Intelligence

Look up the current status of a U.S. mining claim in the Bureau of Land Management's Mineral & Land Records System (MLRS), and follow timestamped claim-status transitions — especially newly closed claims — from a daily-harvested archive that starts at this actor's launch and cannot be backfilled.

This is **mining-claim status intelligence**. It is not a list of "newly available claims."

### What you get

**Lookup mode — $0.25 per successful lookup (no charge when nothing is found)**
Give a MLRS serial number (e.g. `CA101754060`), a legacy serial (e.g. `CAMC113925`), or a claim name. You get the claim's recorded disposition/status, claim type (lode, placer, mill site, tunnel site), recorded acres, PLSS/MTRS location(s), and the record's created / last-modified dates — each with the source name and retrieval timestamp.

**Delta mode — $0.05 per transition record returned**
The daily harvest diffs BLM's closed-claims layer against the previous day's snapshot and records **transitions**, distinguishing:

- `NEWLY_CLOSED` — a serial that was not in the closed set before and is now Closed.
- `PREVIOUSLY_CLOSED_MODIFIED` — a claim that was already Closed whose MLRS record changed. This is *not* a new closure, and it is labeled as such.

BLM's own closed-claims GIS service already covers roughly the last year of updates; what it does not give you is this actor's timestamped transition history — which serials crossed into Closed on which detected date, separated from records that merely changed.

### Read this before acting on a result

- **Status only.** A Closed disposition does **NOT** establish that land is legally available to re-stake. Staking eligibility requires separate land-status verification — withdrawals, segregations, overlapping rights, valid existing rights, and state/county records are not determined by claim status alone.
- **Closure reasons are labeled.** Every closed record carries the reason BLM recorded (the disposition itself, basis: `RECORDED`) and, separately, any timing-based explanation this actor offers (basis: `INFERRED`). An INFERRED reason — for example, possible maintenance-fee forfeiture inferred from a fall modification date — is this actor's assertion, **not a BLM finding**. Do not stake or spend money on an inferred reason without separate verification.
- **Locations are approximate.** BLM maps mining claims by administrative quarter-section from the Legal Land Description (PLSS/MTRS). That is not the legal claim boundary as staked and monumented; boundaries live in the accepted Notice/Certificate of Location in the official case file at the BLM State Office.
- **As filed — verify.** Every record carries its source and retrieval timestamp and is presented as filed in BLM MLRS public records. Verify against the official MLRS record before acting.

### Seasonality

Mining-claim maintenance fees ($200 per claim) are due **September 1** each year (43 CFR Part 3834), and assessment-work affidavits are due December 30. Closures therefore concentrate in **September–January**. Expect the delta feed to be busy in the fall and quiet in spring/summer. The harvest runs daily year-round regardless.

### Freshness / heartbeat

The harvest is fully automated with retry tolerance — if BLM's services are unreachable, that day's harvest skips, logs, and retries on the next cycle; no human step is ever required. Because a silent skip must never sell stale data as fresh:

- Every output carries the last successful harvest date and a `stale` flag.
- The feed is marked stale if no harvest has succeeded in 36 hours, or if a harvest during forfeiture season (Sep–Jan) returns zero changes.
- **While the feed is stale, delta mode emits no paid records and charges nothing.**

### Source

BLM Mineral & Land Records System (MLRS) public records, via BLM's National Landscape Data ArcGIS services (MLRS Mining Claims — Closed / Not Closed layers, public domain). Holder (claimant) names are not published in these GIS layers and are therefore not returned; consult the official MLRS case file for holder information.

# Actor input Schema

## `claimName` (type: `string`):

Partial claim-name match when no serial is known

## `legacySerialNumber` (type: `string`):

Legacy serial number, e.g. CAMC113925

## `maxRecords` (type: `integer`):

Delta: max records

## `mode` (type: `string`):

lookup = single-claim status lookup ($0.25 per successful lookup; no charge when not found). delta = timestamped claim-status transitions from the daily harvest ($0.05 per record returned; nothing charged and nothing emitted while the feed is stale). harvest = internal daily archive job (free).

## `serialNumber` (type: `string`):

MLRS serial number, e.g. CA101754060

## `since` (type: `string`):

e.g. 2026-09-01. Defaults to the last 30 days.

## `transitionType` (type: `string`):

NEWLY_CLOSED or PREVIOUSLY_CLOSED_MODIFIED. Omit for both.

## Actor input object example

```json
{
  "maxRecords": 500,
  "mode": "lookup",
  "serialNumber": "CA101754060"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `items` (type: `string`):

No description

## `itemCount` (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 = {
    "serialNumber": "CA101754060"
};

// Run the Actor and wait for it to finish
const run = await client.actor("querymill/blm-mlrs-mining-claim-status").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 = { "serialNumber": "CA101754060" }

# Run the Actor and wait for it to finish
run = client.actor("querymill/blm-mlrs-mining-claim-status").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 '{
  "serialNumber": "CA101754060"
}' |
apify call querymill/blm-mlrs-mining-claim-status --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,querymill/blm-mlrs-mining-claim-status"
        }
    }
}
```

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/JZxAgrXx0hKnYznRa/builds/yTpTy6COoiXxa2QnI/openapi.json
