# Real Estate Legal Description Checker (`actorfordge/real-estate-legal-description-checker`) Actor

Analyze real estate legal descriptions and flag possible structure, consistency, completeness, and formatting issues before professional review. Does not provide legal advice or validate title.

- **URL**: https://apify.com/actorfordge/real-estate-legal-description-checker.md
- **Developed by:** [Will E](https://apify.com/actorfordge) (community)
- **Categories:** Real estate
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 legal description analyzeds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## Real Estate Legal Description Checker

Real Estate Legal Description Checker analyzes real estate legal description text and flags possible structure, consistency, completeness, and formatting issues before professional review.

It is designed for real estate, title, property research, document intake, due diligence, and pre-review workflows where legal descriptions need a fast structured screening before they are reviewed by a qualified professional.

### What this Actor does

This Actor reviews real estate legal description text and returns structured JSON with:

- Likely legal description type
- Confidence score
- Risk level
- Risk score
- Detected legal description components
- Missing components
- Anomaly flags
- Consistency checks
- Approximate closure check for metes-and-bounds descriptions
- Professional review checklist
- Items that cannot be verified from text alone
- Review recommendation

### Supported description types

The checker can detect and analyze common real estate legal description formats, including:

- Lot and Block
- Metes and Bounds
- Section / Township / Range
- Condominium / Unit
- Tax Parcel / APN reference
- Street Address reference
- Mixed description structures
- Unknown or unclassified structures

### Issues this Actor can flag

The Actor can flag possible issues such as:

- Missing county
- Missing state
- County mismatch
- State mismatch
- Missing lot reference
- Missing block reference
- Missing subdivision or plat name
- Missing unit reference
- Missing section, township, or range
- Missing recording reference
- Missing point of beginning
- Low boundary call count
- Low distance call count
- Low bearing call count
- Possible metes-and-bounds closure issue
- Mixed legal description structures
- Address-only text
- APN or tax parcel-only text
- Placeholder blanks
- Possible OCR or formatting issues
- Ambiguous terms like “more or less,” “part of,” “subject to,” or “unknown”
- Easement or right-of-way language
- Exception or reservation language
- Mineral, water, timber, air, or development rights language
- Restriction, covenant, HOA, zoning, flood, wetland, or setback language

### Best use cases

Use this Actor for:

- Real estate document intake
- Title workflow pre-screening
- Property research
- Due diligence support
- Legal description cleanup workflows
- Flagging descriptions before professional review
- Batch review of legal description text
- Building structured JSON from messy legal descriptions
- Detecting possible missing or inconsistent description components

### Input

You can analyze a single legal description by entering the description text and optional reference fields.

#### Example input

```json
{
  "legalDescription": "Lot 12, Block 4, Sunny Acres Subdivision, according to the plat thereof recorded in Plat Book 10, Page 22, Miami-Dade County, Florida.",
  "county": "Miami-Dade",
  "state": "Florida",
  "parcelId": "",
  "propertyAddress": "",
  "documentReference": "",
  "expectedDescriptionType": "Lot and Block"
}
```

#### Input fields

| Field | Description |
|---|---|
| `legalDescription` | The real estate legal description text to analyze |
| `county` | Optional expected county for mismatch checks |
| `state` | Optional expected state for mismatch checks |
| `parcelId` | Optional parcel ID, APN, folio number, or tax parcel number |
| `propertyAddress` | Optional property address for reference |
| `documentReference` | Optional deed, instrument, title commitment, or file reference |
| `expectedDescriptionType` | Optional expected type, such as Lot and Block, Metes and Bounds, Section Township Range, or Condominium |

### Output

Each result contains a structured legal-description review report.

#### Output fields

| Field | Description |
|---|---|
| `descriptionType` | Likely legal description structure |
| `confidence` | Confidence score for the detected description type |
| `riskLevel` | Low, Medium, or High |
| `riskScore` | Numeric risk score from 0 to 100 |
| `detectedComponents` | Lots, blocks, units, sections, townships, ranges, counties, states, recording references, and other detected parts |
| `missingComponents` | Important components that may be missing |
| `anomalyFlags` | Possible issues found in the legal description |
| `consistencyChecks` | Checks for mixed types, closure estimate, county comparison, state comparison, and parcel/address reference |
| `professionalReviewChecklist` | Checklist of items that may need title, legal, survey, or records review |
| `cannotVerifyFromText` | Items that require external records or professional review |
| `structuredSummary` | Clean summary of detected identifiers and risk |
| `reviewRecommendation` | Suggested review priority |

### Example output

```json
{
  "descriptionType": "Lot and Block",
  "confidence": 96,
  "riskLevel": "Low",
  "riskScore": 0,
  "detectedComponents": {
    "lots": ["12"],
    "blocks": ["4"],
    "subdivisions": ["Sunny Acres Subdivision"],
    "counties": ["Miami-Dade"],
    "states": ["Florida"],
    "recordingReferences": ["Plat Book 10, Page 22"]
  },
  "missingComponents": [],
  "anomalyFlags": [],
  "reviewRecommendation": "No major structure issues were detected from the text, but professional review is still recommended before relying on the description."
}
```

### Example flagged result

```json
{
  "descriptionType": "Metes and Bounds",
  "confidence": 96,
  "riskLevel": "Medium",
  "riskScore": 55,
  "anomalyFlags": [
    {
      "code": "LOW_DISTANCE_CALL_COUNT",
      "severity": "medium",
      "message": "Few distance calls were detected."
    },
    {
      "code": "IMPORTANT_TERM_MORE_OR_LESS",
      "severity": "low",
      "message": "Potentially important qualifier detected: \"more or less\"."
    },
    {
      "code": "IMPORTANT_TERM_UNKNOWN",
      "severity": "high",
      "message": "Potentially important qualifier detected: \"unknown\"."
    }
  ],
  "reviewRecommendation": "Medium-risk flags were found. Review the flagged items before professional review or closing workflow use."
}
```

### API / Standby mode

This Actor is built to work as both a normal Apify Actor and an API-style standby service.

Supported endpoints:

- `GET /`
- `POST /analyze`
- `POST /batch`

#### Example API request

```json
{
  "legalDescription": "Lot 12, Block 4, Sunny Acres Subdivision, according to the plat thereof recorded in Plat Book 10, Page 22, Miami-Dade County, Florida.",
  "county": "Miami-Dade",
  "state": "Florida",
  "saveToDataset": true
}
```

### What this Actor cannot verify from text alone

Some legal and title issues require external records, survey review, title review, or legal review. This Actor does not verify:

- Ownership or title validity
- Chain of title
- County recording acceptance
- State or county-specific legal sufficiency
- Survey accuracy
- Monument location
- Encroachments
- Boundary disputes
- Parcel or APN match
- Zoning restrictions
- Flood, wetland, or land-use restrictions
- Easement enforceability
- Mineral, water, timber, air, or development rights ownership
- Document signatures, notarization, or recording formalities

### Important disclaimer

This Actor flags possible structure, consistency, completeness, and formatting issues for pre-review only. It does not provide legal advice, determine ownership, validate title, validate legal sufficiency, or replace review by an attorney, title professional, surveyor, or other qualified professional.

# Actor input Schema

## `legalDescription` (type: `string`):

Paste one real estate legal description to analyze for possible structure, consistency, and completeness issues before professional review.

## `county` (type: `string`):

Optional. Add the expected county so the checker can flag possible county mismatches.

## `state` (type: `string`):

Optional. Add the expected state so the checker can flag possible state mismatches.

## `parcelId` (type: `string`):

Optional parcel ID, APN, folio number, or tax parcel number for reference in the output.

## `propertyAddress` (type: `string`):

Optional property address for reference. The checker will not treat an address as a legal description.

## `documentReference` (type: `string`):

Optional deed, instrument, file, title commitment, or document reference.

## `expectedDescriptionType` (type: `string`):

Optional. Example: Lot and Block, Metes and Bounds, Section Township Range, or Condominium.

## Actor input object example

```json
{
  "legalDescription": "Lot 12, Block 4, Sunny Acres Subdivision, according to the plat thereof recorded in Plat Book 10, Page 22, Miami-Dade County, Florida.",
  "county": "Miami-Dade",
  "state": "Florida"
}
```

# 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 = {
    "legalDescription": "Lot 12, Block 4, Sunny Acres Subdivision, according to the plat thereof recorded in Plat Book 10, Page 22, Miami-Dade County, Florida.",
    "county": "Miami-Dade",
    "state": "Florida"
};

// Run the Actor and wait for it to finish
const run = await client.actor("actorfordge/real-estate-legal-description-checker").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 = {
    "legalDescription": "Lot 12, Block 4, Sunny Acres Subdivision, according to the plat thereof recorded in Plat Book 10, Page 22, Miami-Dade County, Florida.",
    "county": "Miami-Dade",
    "state": "Florida",
}

# Run the Actor and wait for it to finish
run = client.actor("actorfordge/real-estate-legal-description-checker").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 '{
  "legalDescription": "Lot 12, Block 4, Sunny Acres Subdivision, according to the plat thereof recorded in Plat Book 10, Page 22, Miami-Dade County, Florida.",
  "county": "Miami-Dade",
  "state": "Florida"
}' |
apify call actorfordge/real-estate-legal-description-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,actorfordge/real-estate-legal-description-checker"
        }
    }
}

```

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/xgpxmJ7mBaosq9A2V/builds/ppaRUToiUIHVqbofw/openapi.json
