> ## Documentation Index
> Fetch the complete documentation index at: https://enrich-docs.dealmachine.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Property Lookup

> Look up property details and owner contact information by address

# Property Lookup

Look up property details and owner contact information by providing a street address.

<Note>
  This endpoint requires an API key. See [Authentication](/api-reference/authentication) for details.
</Note>

## Request

You can provide the address in two ways:

**Option 1: Single-line address**

<ParamField body="address" type="string">
  Full address as a single line (e.g., "123 Main St, Austin, TX 78701"). If provided, the individual `street`, `city`, `state`, and `zip` fields are ignored.
</ParamField>

**Option 2: Separate fields**

<ParamField body="street" type="string">
  Street address including house number (e.g., "123 Main St"). Required if `address` is not provided.
</ParamField>

<ParamField body="city" type="string">
  City name. At least one of `city`, `state`, or `zip` is required when using separate fields.
</ParamField>

<ParamField body="state" type="string">
  Two-letter state abbreviation (e.g., "TX"). At least one of `city`, `state`, or `zip` is required when using separate fields.
</ParamField>

<ParamField body="zip" type="string">
  ZIP code. At least one of `city`, `state`, or `zip` is required when using separate fields.
</ParamField>

## Response

<ResponseField name="success" type="boolean">
  Whether the request was successful
</ResponseField>

<ResponseField name="data" type="object">
  Property and owner data

  <Expandable title="Property Identification">
    <ResponseField name="property_id" type="integer">
      Internal property identifier
    </ResponseField>

    <ResponseField name="apn_parcel_id" type="string">
      Assessor Parcel Number
    </ResponseField>

    <ResponseField name="fips_code" type="string">
      Federal Information Processing Standards county code
    </ResponseField>
  </Expandable>

  <Expandable title="Property Address">
    <ResponseField name="property_address_full" type="string">
      Full formatted address
    </ResponseField>

    <ResponseField name="property_address_line_1" type="string">
      Primary street address
    </ResponseField>

    <ResponseField name="property_address_line_2" type="string">
      Secondary address line (unit, apt, etc.)
    </ResponseField>

    <ResponseField name="property_address_city" type="string">
      City
    </ResponseField>

    <ResponseField name="property_address_state" type="string">
      State abbreviation
    </ResponseField>

    <ResponseField name="property_address_zipcode" type="string">
      ZIP code
    </ResponseField>

    <ResponseField name="property_address_county" type="integer">
      County identifier
    </ResponseField>

    <ResponseField name="property_lat" type="number">
      Latitude coordinate
    </ResponseField>

    <ResponseField name="property_lng" type="number">
      Longitude coordinate
    </ResponseField>
  </Expandable>

  <Expandable title="Valuation & Equity">
    <ResponseField name="estimated_value" type="integer">
      Estimated market value
    </ResponseField>

    <ResponseField name="equity_amount" type="integer">
      Estimated equity in dollars
    </ResponseField>

    <ResponseField name="equity_percent" type="number">
      Estimated equity as percentage
    </ResponseField>

    <ResponseField name="total_loan_amt" type="integer">
      Total estimated loan amount
    </ResponseField>

    <ResponseField name="total_loan_balance" type="integer">
      Total estimated loan balance
    </ResponseField>

    <ResponseField name="total_loan_payment" type="number">
      Total estimated monthly loan payment
    </ResponseField>
  </Expandable>

  <Expandable title="Owner Names (from deed)">
    <ResponseField name="owner_1_name" type="string">
      Primary owner's full name
    </ResponseField>

    <ResponseField name="owner_1_firstname" type="string">
      Primary owner's first name
    </ResponseField>

    <ResponseField name="owner_1_lastname" type="string">
      Primary owner's last name
    </ResponseField>

    <ResponseField name="owner_2_name" type="string">
      Secondary owner's full name
    </ResponseField>

    <ResponseField name="owner_2_firstname" type="string">
      Secondary owner's first name
    </ResponseField>

    <ResponseField name="owner_2_lastname" type="string">
      Secondary owner's last name
    </ResponseField>

    <ResponseField name="owner_location" type="string">
      Owner occupancy status: `owner_occupied` or `absentee`
    </ResponseField>

    <ResponseField name="is_corporate_owner" type="boolean">
      Owned by a corporation
    </ResponseField>

    <ResponseField name="out_of_state_owner" type="boolean">
      Owner lives in different state
    </ResponseField>

    <ResponseField name="owner_address_full" type="string">
      Owner's full mailing address
    </ResponseField>
  </Expandable>

  <Expandable title="Building Characteristics">
    <ResponseField name="building_square_feet" type="integer">
      Living area in square feet
    </ResponseField>

    <ResponseField name="total_bedrooms" type="integer">
      Number of bedrooms
    </ResponseField>

    <ResponseField name="total_baths" type="number">
      Number of bathrooms
    </ResponseField>

    <ResponseField name="year_built" type="integer">
      Year the property was built
    </ResponseField>

    <ResponseField name="property_type" type="string">
      Property type name. Possible values: `Single Family`, `Townhouse`, `Condominium`, `Mobile Home`, `Multi Family`, `Vacant Land`, `Co-Op`, `Apartment`, `Other`, `Office`, `Retail`, `Industrial`, `Hospitality`, `Healthcare`, `Mixed Use`, `Special Purpose`, `Government / Institutional`, `Agriculture`, `Development Site`
    </ResponseField>

    <ResponseField name="construction_type" type="string">
      Construction type
    </ResponseField>

    <ResponseField name="style" type="string">
      Architectural style
    </ResponseField>

    <ResponseField name="effective_year_built" type="integer">
      Effective year built (after renovations)
    </ResponseField>

    <ResponseField name="units_count" type="integer">
      Number of units (for multi-family)
    </ResponseField>

    <ResponseField name="sum_buildings_nbr" type="integer">
      Number of buildings on property
    </ResponseField>

    <ResponseField name="sum_commercial_units" type="integer">
      Number of commercial units
    </ResponseField>

    <ResponseField name="stories" type="string">
      Number of stories (e.g., "1 Story", "2 Story", "Split Level")
    </ResponseField>

    <ResponseField name="sum_garage_sq_ft" type="integer">
      Garage area in square feet
    </ResponseField>

    <ResponseField name="heating_type" type="string">
      Heating system type
    </ResponseField>

    <ResponseField name="heating_fuel_type" type="string">
      Heating fuel type
    </ResponseField>

    <ResponseField name="air_conditioning" type="string">
      Air conditioning type
    </ResponseField>

    <ResponseField name="basement" type="string">
      Basement description
    </ResponseField>

    <ResponseField name="deck" type="string">
      Deck description
    </ResponseField>

    <ResponseField name="exterior_walls" type="string">
      Exterior wall material
    </ResponseField>

    <ResponseField name="interior_walls" type="string">
      Interior wall material
    </ResponseField>

    <ResponseField name="num_of_fireplaces" type="integer">
      Number of fireplaces
    </ResponseField>

    <ResponseField name="floor_cover" type="string">
      Floor covering type
    </ResponseField>

    <ResponseField name="garage" type="boolean">
      Has garage
    </ResponseField>

    <ResponseField name="driveway" type="string">
      Driveway description
    </ResponseField>

    <ResponseField name="other_rooms" type="string">
      Other rooms description
    </ResponseField>

    <ResponseField name="pool" type="boolean">
      Has pool
    </ResponseField>

    <ResponseField name="patio" type="string">
      Patio description
    </ResponseField>

    <ResponseField name="porch" type="string">
      Porch description
    </ResponseField>

    <ResponseField name="roof_cover" type="string">
      Roof cover type
    </ResponseField>

    <ResponseField name="roof_type" type="string">
      Roof type
    </ResponseField>

    <ResponseField name="sewer" type="string">
      Sewer type
    </ResponseField>

    <ResponseField name="topography" type="string">
      Land topography
    </ResponseField>

    <ResponseField name="water" type="string">
      Water source
    </ResponseField>

    <ResponseField name="geographic_features" type="string">
      Geographic features
    </ResponseField>
  </Expandable>

  <Expandable title="Lot Information">
    <ResponseField name="lot_acreage" type="number">
      Lot size in acres
    </ResponseField>

    <ResponseField name="lot_square_feet" type="integer">
      Lot size in square feet
    </ResponseField>

    <ResponseField name="lot_nbr" type="string">
      Lot number
    </ResponseField>

    <ResponseField name="lot_code" type="string">
      Lot code
    </ResponseField>

    <ResponseField name="lot_width" type="number">
      Lot width
    </ResponseField>

    <ResponseField name="lot_depth" type="number">
      Lot depth
    </ResponseField>

    <ResponseField name="corner_lot" type="boolean">
      Is corner lot
    </ResponseField>

    <ResponseField name="legal_description" type="string">
      Legal description
    </ResponseField>

    <ResponseField name="subdivision_name" type="string">
      Subdivision name
    </ResponseField>

    <ResponseField name="property_class" type="string">
      Property class
    </ResponseField>

    <ResponseField name="county_land_use_code" type="string">
      County land use code
    </ResponseField>

    <ResponseField name="situs_census_tract" type="string">
      Census tract
    </ResponseField>

    <ResponseField name="school_district_name" type="string">
      School district name
    </ResponseField>

    <ResponseField name="zoning" type="string">
      Zoning designation
    </ResponseField>

    <ResponseField name="flood_zone" type="string">
      Flood zone name (FEMA flood zone classification, e.g., "Zone X", "Zone AE", "Zone VE")
    </ResponseField>
  </Expandable>

  <Expandable title="Tax Information">
    <ResponseField name="tax_delinquent" type="boolean">
      Has delinquent taxes
    </ResponseField>

    <ResponseField name="tax_delinquent_year" type="integer">
      Year of tax delinquency
    </ResponseField>

    <ResponseField name="tax_year" type="integer">
      Tax assessment year
    </ResponseField>

    <ResponseField name="tax_amt" type="number">
      Annual property tax amount
    </ResponseField>
  </Expandable>

  <Expandable title="Assessment Values">
    <ResponseField name="assd_year" type="integer">
      Assessment year
    </ResponseField>

    <ResponseField name="assd_total_value" type="integer">
      Total assessed value
    </ResponseField>

    <ResponseField name="assd_land_value" type="integer">
      Assessed land value
    </ResponseField>

    <ResponseField name="assd_improvement_value" type="integer">
      Assessed improvement value
    </ResponseField>

    <ResponseField name="calculated_total_value" type="integer">
      Calculated market total value
    </ResponseField>

    <ResponseField name="calculated_land_value" type="integer">
      Calculated market land value
    </ResponseField>

    <ResponseField name="calculated_improvement_value" type="integer">
      Calculated market improvement value
    </ResponseField>
  </Expandable>

  <Expandable title="Sale History">
    <ResponseField name="sale_date" type="string">
      Date of last sale (YYYY-MM-DD)
    </ResponseField>

    <ResponseField name="last_sale_price" type="integer">
      Last recorded sale price
    </ResponseField>

    <ResponseField name="last_sale_doc_type" type="string">
      Sale document type
    </ResponseField>

    <ResponseField name="building_condition" type="string">
      Building condition at sale
    </ResponseField>

    <ResponseField name="building_quality" type="string">
      Building quality rating
    </ResponseField>
  </Expandable>

  <Expandable title="Liens & HOA">
    <ResponseField name="active_lien" type="boolean">
      Has active liens
    </ResponseField>

    <ResponseField name="hoa_fee_amount" type="number">
      HOA fee amount
    </ResponseField>

    <ResponseField name="h_o_a1_name" type="string">
      HOA name
    </ResponseField>

    <ResponseField name="h_o_a1_type" type="string">
      HOA type
    </ResponseField>
  </Expandable>

  <Expandable title="Mortgage Information">
    <ResponseField name="num_mortgages" type="integer">
      Number of mortgages on the property (0-4)
    </ResponseField>

    <ResponseField name="mortgages" type="array">
      Array of mortgage objects (up to 4 mortgages)

      <Expandable title="Mortgage Object">
        <ResponseField name="position" type="integer">
          Mortgage position (1 = first/primary mortgage, 2 = second, etc.)
        </ResponseField>

        <ResponseField name="lien_position" type="integer">
          Lien seniority position (1 = senior lien, 2 = junior, etc.)
        </ResponseField>

        <ResponseField name="loan_type" type="string">
          Loan type name (e.g., "Conventional", "FHA", "VA", "USDA")
        </ResponseField>

        <ResponseField name="financing_type" type="string">
          Financing type name (e.g., "Fixed Rate", "Adjustable Rate", "Interest Only")
        </ResponseField>

        <ResponseField name="interest_rate" type="number">
          Interest rate as a percentage
        </ResponseField>

        <ResponseField name="has_adjustable_rate_rider" type="boolean">
          Whether the mortgage has an adjustable rate rider
        </ResponseField>

        <ResponseField name="start_date" type="string">
          Mortgage origination date (YYYY-MM-DD)
        </ResponseField>

        <ResponseField name="recording_date" type="string">
          Date the mortgage was recorded with the county (YYYY-MM-DD)
        </ResponseField>

        <ResponseField name="term_months" type="integer">
          Loan term in months
        </ResponseField>

        <ResponseField name="due_date" type="string">
          Mortgage maturity date (YYYY-MM-DD)
        </ResponseField>

        <ResponseField name="lender_name" type="string">
          Name of the lending institution
        </ResponseField>

        <ResponseField name="is_private_lender" type="boolean">
          Whether the lender is a private (non-institutional) lender
        </ResponseField>

        <ResponseField name="loan_amount" type="integer">
          Original loan amount
        </ResponseField>

        <ResponseField name="estimated_loan_balance" type="integer">
          Estimated current loan balance
        </ResponseField>

        <ResponseField name="estimated_loan_payment" type="number">
          Estimated monthly loan payment
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>

  <Expandable title="Foreclosure Information">
    <ResponseField name="auction_date" type="string">
      Foreclosure auction date
    </ResponseField>

    <ResponseField name="default_date" type="string">
      Default date
    </ResponseField>

    <ResponseField name="past_due_amount" type="integer">
      Past due amount
    </ResponseField>

    <ResponseField name="recording_date" type="string">
      Recording date
    </ResponseField>

    <ResponseField name="document_type" type="string">
      Foreclosure document type
    </ResponseField>
  </Expandable>

  <Expandable title="Market Status">
    <ResponseField name="market_status" type="string">
      Current market status: `active`, `pending`, `foreclosure`, `preforeclosure`, or `off_market`
    </ResponseField>

    <ResponseField name="property_flags" type="array">
      Array of distress indicator slugs. Possible values: `vacant`, `bank_owned`, `tax_delinquent`, `preforeclosure`, `foreclosure`, `probate`, `active_lien`, `corporate_owned`, `out_of_state_owner`, `high_equity`, `senior_owner`
    </ResponseField>
  </Expandable>

  <Expandable title="Contacts">
    <ResponseField name="contacts" type="array">
      Array of property contacts (owners, residents, etc.)

      <Expandable title="Contact Object">
        <ResponseField name="person_id" type="integer">
          Contact person identifier
        </ResponseField>

        <ResponseField name="first_name" type="string">
          Contact's first name
        </ResponseField>

        <ResponseField name="middle_initial" type="string">
          Contact's middle initial
        </ResponseField>

        <ResponseField name="last_name" type="string">
          Contact's last name
        </ResponseField>

        <ResponseField name="mailing_address" type="string">
          Contact's mailing address
        </ResponseField>

        <ResponseField name="mailing_city" type="string">
          Contact's mailing city
        </ResponseField>

        <ResponseField name="mailing_state" type="string">
          Contact's mailing state
        </ResponseField>

        <ResponseField name="mailing_zip" type="string">
          Contact's mailing ZIP code
        </ResponseField>

        <ResponseField name="type" type="array">
          Contact's relationship to property. Array of strings: `owner`, `owner_family`, `resident`, `renter`
        </ResponseField>

        <ResponseField name="phones" type="array">
          Array of phone objects

          <Expandable title="Phone Object">
            <ResponseField name="number" type="string">
              Phone number in E.164 format (+1XXXXXXXXXX)
            </ResponseField>

            <ResponseField name="type" type="string">
              Phone type: `mobile`, `landline`, `voip`, or `unknown`
            </ResponseField>

            <ResponseField name="do_not_call" type="boolean">
              Whether phone is on Do Not Call list
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="emails" type="array">
          Array of email addresses (strings)
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="usage" type="object">
  Included when approaching monthly limit (90%+ usage)

  <ResponseField name="current" type="integer">
    Current usage count for billing period
  </ResponseField>

  <ResponseField name="limit" type="integer">
    Monthly request limit
  </ResponseField>

  <ResponseField name="warning" type="string">
    Warning message about approaching limit
  </ResponseField>
</ResponseField>

## Examples

### Separate Fields (Recommended)

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://dealmachine.com/api/property/lookup \
    -H "Content-Type: application/json" \
    -H "X-API-Key: dm_live_your_api_key_here" \
    -d '{
      "street": "123 Main St",
      "city": "Austin",
      "state": "TX",
      "zip": "78701"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://dealmachine.com/api/property/lookup', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'dm_live_your_api_key_here'
    },
    body: JSON.stringify({
      street: '123 Main St',
      city: 'Austin',
      state: 'TX',
      zip: '78701'
    })
  });

  const data = await response.json();
  console.log(data);
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://dealmachine.com/api/property/lookup',
      headers={
          'Content-Type': 'application/json',
          'X-API-Key': 'dm_live_your_api_key_here'
      },
      json={
          'street': '123 Main St',
          'city': 'Austin',
          'state': 'TX',
          'zip': '78701'
      }
  )

  data = response.json()
  print(data)
  ```
</CodeGroup>

### Single-Line Address

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://dealmachine.com/api/property/lookup \
    -H "Content-Type: application/json" \
    -H "X-API-Key: dm_live_your_api_key_here" \
    -d '{
      "address": "123 Main St, Austin, TX 78701"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://dealmachine.com/api/property/lookup', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': 'dm_live_your_api_key_here'
    },
    body: JSON.stringify({
      address: '123 Main St, Austin, TX 78701'
    })
  });

  const data = await response.json();
  console.log(data);
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      'https://dealmachine.com/api/property/lookup',
      headers={
          'Content-Type': 'application/json',
          'X-API-Key': 'dm_live_your_api_key_here'
      },
      json={
          'address': '123 Main St, Austin, TX 78701'
      }
  )

  data = response.json()
  print(data)
  ```
</CodeGroup>

### Success Response

```json theme={null}
{
  "success": true,
  "data": {
    "property_id": 12345678,
    "apn_parcel_id": "123-456-789",
    "fips_code": "48453",
    "property_address_full": "123 Main St, Austin, TX 78701",
    "property_address_line_1": "123 Main St",
    "property_address_line_2": null,
    "property_address_city": "Austin",
    "property_address_state": "TX",
    "property_address_zipcode": "78701",
    "property_address_county": 453,
    "property_lat": 30.2672,
    "property_lng": -97.7431,
    "estimated_value": 425000,
    "equity_amount": 278375,
    "equity_percent": 65.5,
    "total_loan_amt": 146625,
    "total_loan_balance": 146625,
    "total_loan_payment": 1125.50,
    "owner_1_name": "John Smith",
    "owner_1_firstname": "John",
    "owner_1_lastname": "Smith",
    "owner_2_name": null,
    "owner_2_firstname": null,
    "owner_2_lastname": null,
    "owner_location": "absentee",
    "is_corporate_owner": false,
    "out_of_state_owner": false,
    "owner_address_full": "456 Oak Ave, Houston, TX 77001",
    "building_square_feet": 1850,
    "total_bedrooms": 3,
    "total_baths": 2,
    "year_built": 1995,
    "property_type": "Single Family Residential",
    "units_count": 1,
    "stories": "1 Story",
    "garage": true,
    "pool": false,
    "lot_acreage": 0.25,
    "lot_square_feet": 10890,
    "tax_delinquent": false,
    "tax_amt": 8500,
    "assd_total_value": 380000,
    "sale_date": "2018-06-15",
    "last_sale_price": 310000,
    "active_lien": false,
    "num_mortgages": 1,
    "mortgages": [
      {
        "position": 1,
        "lien_position": 1,
        "loan_type": "Conventional",
        "financing_type": "Fixed Rate",
        "interest_rate": 3.75,
        "has_adjustable_rate_rider": false,
        "start_date": "2018-06-15",
        "recording_date": "2018-06-18",
        "term_months": 360,
        "due_date": "2048-06-15",
        "lender_name": "Wells Fargo Bank",
        "is_private_lender": false,
        "loan_amount": 248000,
        "estimated_loan_balance": 198500,
        "estimated_loan_payment": 1148.53
      }
    ],
    "market_status": "off_market",
    "property_flags": [],
    "contacts": [
      {
        "person_id": 98765432,
        "first_name": "John",
        "middle_initial": "A",
        "last_name": "Smith",
        "mailing_address": "456 Oak Ave",
        "mailing_city": "Houston",
        "mailing_state": "TX",
        "mailing_zip": "77001",
        "type": ["owner", "resident"],
        "phones": [
          {
            "number": "+15125551234",
            "type": "mobile",
            "do_not_call": false
          }
        ],
        "emails": ["john.smith@email.com"]
      }
    ]
  }
}
```

### Error Responses

**Missing Street Address (400)**

```json theme={null}
{
  "success": false,
  "error": "Bad Request",
  "message": "Street address is required"
}
```

**Property Not Found (404)**

```json theme={null}
{
  "success": false,
  "error": "Not Found",
  "message": "Property not found"
}
```

**Rate Limit Exceeded (429)**

```json theme={null}
{
  "success": false,
  "error": "Too Many Requests",
  "message": "Monthly request limit exceeded. Your limit resets on 2024-02-15.",
  "usage": {
    "current": 5001,
    "limit": 5000,
    "reset": "2024-02-15"
  }
}
```

## Response Headers

All successful responses include rate limit headers:

| Header                  | Description                                  |
| ----------------------- | -------------------------------------------- |
| `X-RateLimit-Limit`     | Your monthly request limit                   |
| `X-RateLimit-Remaining` | Requests remaining this billing period       |
| `X-RateLimit-Reset`     | Date your limit resets (YYYY-MM-DD)          |
| `X-RateLimit-Warning`   | Present with value `true` when at 90%+ usage |


## OpenAPI

````yaml POST /api/property/lookup
openapi: 3.0.3
info:
  title: DealMachine Property Enrichment API
  description: Property and owner data lookup API for CRM integrations
  version: 1.0.0
  contact:
    name: DealMachine Support
    email: support@dealmachine.com
    url: https://dealmachine.com
servers:
  - url: https://dealmachine.com
    description: Production
  - url: https://www.dealmachine.com
    description: WWW production alias
  - url: https://next.dealmachine.com
    description: Legacy production alias
  - url: https://next.v3.dealmachine.com
    description: Legacy API alias
security:
  - ApiKeyAuth: []
paths:
  /api/property/lookup:
    post:
      tags:
        - Property Enrichment
      summary: Property Lookup
      description: Look up property details and owner contact information by address
      operationId: propertyLookup
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PropertyLookupRequest'
            examples:
              separate-fields:
                summary: Separate address fields (recommended)
                value:
                  street: 123 Main St
                  city: Austin
                  state: TX
                  zip: '78701'
              single-line:
                summary: Single-line address
                value:
                  address: 123 Main St, Austin, TX 78701
      responses:
        '200':
          description: Successful property lookup
          headers:
            X-RateLimit-Limit:
              description: Monthly request limit
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests remaining in billing period
              schema:
                type: integer
            X-RateLimit-Reset:
              description: Date limit resets (YYYY-MM-DD)
              schema:
                type: string
                format: date
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PropertyLookupResponse'
        '400':
          description: Bad request - missing or invalid parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error: Bad Request
                message: Street address is required
        '401':
          description: Unauthorized - invalid or missing API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error: Unauthorized
                message: X-API-Key header is required
        '403':
          description: Forbidden - subscription required or inactive
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error: Subscription Required
                message: No active subscription found
        '404':
          description: Property not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                error: Not Found
                message: Property not found
        '429':
          description: Rate limit exceeded
          headers:
            Retry-After:
              description: Seconds until limit resets
              schema:
                type: integer
            X-RateLimit-Limit:
              schema:
                type: integer
            X-RateLimit-Reset:
              schema:
                type: string
                format: date
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    PropertyLookupRequest:
      type: object
      properties:
        address:
          type: string
          description: >-
            Full address as a single line. If provided, street/city/state/zip
            fields are ignored.
          example: 123 Main St, Austin, TX 78701
        street:
          type: string
          description: >-
            Street address including house number. Required if 'address' is not
            provided.
          example: 123 Main St
        city:
          type: string
          description: City name
          example: Austin
        state:
          type: string
          description: Two-letter state abbreviation
          example: TX
          minLength: 2
          maxLength: 2
        zip:
          type: string
          description: ZIP code
          example: '78701'
    PropertyLookupResponse:
      type: object
      properties:
        success:
          type: boolean
          example: true
        data:
          $ref: '#/components/schemas/PropertyData'
        usage:
          $ref: '#/components/schemas/UsageInfo'
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: string
        message:
          type: string
    RateLimitErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        error:
          type: string
          example: Too Many Requests
        message:
          type: string
          example: Monthly request limit exceeded. Your limit resets on 2024-02-15.
        usage:
          type: object
          properties:
            current:
              type: integer
            limit:
              type: integer
            reset:
              type: string
              format: date
    PropertyData:
      type: object
      properties:
        property_id:
          type: integer
          description: Internal property identifier
        apn_parcel_id:
          type: string
          nullable: true
          description: Assessor Parcel Number
        fips_code:
          type: string
          nullable: true
          description: County FIPS code
        property_address_full:
          type: string
          description: Full formatted property address
        property_address_line_1:
          type: string
        property_address_line_2:
          type: string
          nullable: true
        property_address_city:
          type: string
        property_address_state:
          type: string
          description: Two-letter state abbreviation
        property_address_zipcode:
          type: string
        property_address_county:
          type: integer
          nullable: true
        property_lat:
          type: number
          format: double
        property_lng:
          type: number
          format: double
        estimated_value:
          type: integer
          nullable: true
          description: Estimated market value
        equity_amount:
          type: integer
          nullable: true
          description: Estimated equity in dollars
        equity_percent:
          type: number
          nullable: true
          description: Estimated equity percentage
        total_loan_amt:
          type: integer
          nullable: true
        total_loan_balance:
          type: integer
          nullable: true
        total_loan_payment:
          type: number
          nullable: true
          description: Total estimated monthly loan payment
        owner_1_name:
          type: string
          nullable: true
          description: Primary owner full name (from deed)
        owner_1_firstname:
          type: string
          nullable: true
        owner_1_lastname:
          type: string
          nullable: true
        owner_2_name:
          type: string
          nullable: true
          description: Secondary owner full name
        owner_2_firstname:
          type: string
          nullable: true
        owner_2_lastname:
          type: string
          nullable: true
        owner_location:
          type: string
          enum:
            - owner_occupied
            - absentee
          description: Whether owner lives at property
        is_corporate_owner:
          type: boolean
        out_of_state_owner:
          type: boolean
        owner_address_full:
          type: string
          nullable: true
          description: Owner mailing address
        building_square_feet:
          type: integer
          nullable: true
        total_bedrooms:
          type: integer
          nullable: true
        total_baths:
          type: number
          nullable: true
        year_built:
          type: integer
          nullable: true
        property_type:
          type: string
          nullable: true
          description: >-
            Property type name. Possible values: Single Family, Townhouse,
            Condominium, Mobile Home, Multi Family, Vacant Land, Co-Op,
            Apartment, Other, Office, Retail, Industrial, Hospitality,
            Healthcare, Mixed Use, Special Purpose, Government / Institutional,
            Agriculture, Development Site
        units_count:
          type: integer
          nullable: true
        stories:
          type: string
          nullable: true
          description: Number of stories (e.g., 1 Story, 2 Story, Split Level)
        garage:
          type: boolean
          nullable: true
        pool:
          type: boolean
          nullable: true
        lot_acreage:
          type: number
          nullable: true
        lot_square_feet:
          type: integer
          nullable: true
        legal_description:
          type: string
          nullable: true
        subdivision_name:
          type: string
          nullable: true
        school_district_name:
          type: string
          nullable: true
        zoning:
          type: string
          nullable: true
        flood_zone:
          type: string
          nullable: true
          description: FEMA flood zone classification (e.g., Zone X, Zone AE, Zone VE)
        tax_delinquent:
          type: boolean
        tax_amt:
          type: integer
          nullable: true
          description: Annual property tax
        assd_total_value:
          type: integer
          nullable: true
        assd_land_value:
          type: integer
          nullable: true
        assd_improvement_value:
          type: integer
          nullable: true
        calculated_total_value:
          type: integer
          nullable: true
          description: Market total value
        calculated_land_value:
          type: integer
          nullable: true
        calculated_improvement_value:
          type: integer
          nullable: true
        sale_date:
          type: string
          format: date
          nullable: true
        last_sale_price:
          type: integer
          nullable: true
        active_lien:
          type: boolean
        hoa_fee_amount:
          type: number
          nullable: true
        h_o_a1_name:
          type: string
          nullable: true
        num_mortgages:
          type: integer
          nullable: true
          description: Number of mortgages on the property (0-4)
        mortgages:
          type: array
          description: Array of mortgage objects (up to 4 mortgages)
          items:
            $ref: '#/components/schemas/Mortgage'
        auction_date:
          type: string
          format: date
          nullable: true
          description: Foreclosure auction date
        default_date:
          type: string
          format: date
          nullable: true
          description: Foreclosure default date
        market_status:
          type: string
          enum:
            - active
            - pending
            - foreclosure
            - preforeclosure
            - off_market
          description: Current listing status
        property_flags:
          type: array
          items:
            type: string
          description: >-
            Distress indicator slugs. Possible values: vacant, bank_owned,
            tax_delinquent, preforeclosure, foreclosure, probate, active_lien,
            corporate_owned, out_of_state_owner
        contacts:
          type: array
          description: Property contacts (owners, residents, etc.)
          items:
            $ref: '#/components/schemas/Contact'
    UsageInfo:
      type: object
      description: Included when at 90%+ of monthly limit
      properties:
        current:
          type: integer
        limit:
          type: integer
        warning:
          type: string
    Mortgage:
      type: object
      description: Mortgage information for a property
      properties:
        position:
          type: integer
          description: Mortgage position (1 = first/primary, 2 = second, etc.)
          minimum: 1
          maximum: 4
        lien_position:
          type: integer
          nullable: true
          description: Lien seniority position (1 = senior lien, 2 = junior, etc.)
        loan_type:
          type: string
          nullable: true
          description: Loan type name (e.g., Conventional, FHA, VA, USDA)
        financing_type:
          type: string
          nullable: true
          description: Financing type name (e.g., Fixed Rate, Adjustable Rate)
        interest_rate:
          type: number
          nullable: true
          description: Interest rate as a percentage
        has_adjustable_rate_rider:
          type: boolean
          nullable: true
          description: Whether the mortgage has an adjustable rate rider
        start_date:
          type: string
          format: date
          nullable: true
          description: Mortgage origination date
        recording_date:
          type: string
          format: date
          nullable: true
          description: Date the mortgage was recorded with the county
        term_months:
          type: integer
          nullable: true
          description: Loan term in months
        due_date:
          type: string
          format: date
          nullable: true
          description: Mortgage maturity date
        lender_name:
          type: string
          nullable: true
          description: Name of the lending institution
        is_private_lender:
          type: boolean
          nullable: true
          description: Whether the lender is a private (non-institutional) lender
        loan_amount:
          type: integer
          nullable: true
          description: Original loan amount
        estimated_loan_balance:
          type: integer
          nullable: true
          description: Estimated current loan balance
        estimated_loan_payment:
          type: number
          nullable: true
          description: Estimated monthly loan payment
    Contact:
      type: object
      properties:
        person_id:
          type: integer
          nullable: true
        first_name:
          type: string
          nullable: true
        middle_initial:
          type: string
          nullable: true
        last_name:
          type: string
          nullable: true
        mailing_address:
          type: string
          nullable: true
        mailing_city:
          type: string
          nullable: true
        mailing_state:
          type: string
          nullable: true
        mailing_zip:
          type: string
          nullable: true
        type:
          type: array
          description: Contact's relationship to property
          items:
            type: string
            enum:
              - owner
              - owner_family
              - resident
              - renter
          example:
            - owner
            - resident
        phones:
          type: array
          items:
            $ref: '#/components/schemas/Phone'
        emails:
          type: array
          items:
            type: string
            format: email
    Phone:
      type: object
      properties:
        number:
          type: string
          description: E.164 format (+1XXXXXXXXXX)
        type:
          type: string
          enum:
            - mobile
            - landline
            - voip
            - unknown
          nullable: true
        do_not_call:
          type: boolean
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: 'API key for authentication (format: dm_live_xxxxxxxx)'

````