{
  "openapi": "3.0.1",
  "info": {
    "title": "Parcel Data API - Boundaries, Owners, Zoning, Land Use",
    "description": "Look up land parcel records by address, assessor parcel number, owner name, coordinate or map polygon, and read the full record: boundary geometry, owner and mailing address, zoning and land use, acreage, assessed value, sale history and flood zone. Bring your own key.",
    "version": "0.1",
    "x-build-id": "GDJgFSt3OTb9cbzrj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/nabeelbaghoor~parcel-boundary-data-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-nabeelbaghoor-parcel-boundary-data-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/nabeelbaghoor~parcel-boundary-data-api/runs": {
      "post": {
        "operationId": "runs-sync-nabeelbaghoor-parcel-boundary-data-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/nabeelbaghoor~parcel-boundary-data-api/run-sync": {
      "post": {
        "operationId": "run-sync-nabeelbaghoor-parcel-boundary-data-api",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mode": {
            "title": "What this run does",
            "enum": [
              "address",
              "apn",
              "owner",
              "point",
              "area",
              "query",
              "path",
              "parcelId",
              "typeahead"
            ],
            "type": "string",
            "description": "A run answers one question. Address, parcel number, owner name, coordinate, path and parcel id look up parcels you already have an identifier for. Area returns every parcel inside a map polygon. Query filters the nationwide dataset by indexed fields. Typeahead returns ranked address suggestions and is the cheap way to turn a messy address list into stable parcel ids first. Fields belonging to another mode are ignored rather than causing an error.",
            "default": "address"
          },
          "apiKey": {
            "title": "API token",
            "type": "string",
            "description": "Your own account's API token, generated in the API section of your account profile. Bring your own key: nothing is shared between runs and the token is never written to the dataset or the log."
          },
          "addresses": {
            "title": "Addresses",
            "type": "array",
            "description": "Street addresses to look up, one per line. Used by address mode and by typeahead mode. A partial address works, matched from the beginning, so narrow the search with the county path below when an address is common.",
            "items": {
              "type": "string"
            }
          },
          "parcelNumbers": {
            "title": "Assessor parcel numbers",
            "type": "array",
            "description": "Assessor parcel numbers, also called PINs, one per line. Punctuation is ignored when matching. The same number can exist in more than one county, so set the county path below to be sure which parcel you get.",
            "items": {
              "type": "string"
            }
          },
          "ownerNames": {
            "title": "Owner names",
            "type": "array",
            "description": "Owner names to search, one per line, individuals in Last, First order and entities by their registered name. Matched from the start of the name, so Jones finds Jones, Festus while Festus does not, and at least four characters are needed. Owner search covers the United States only.",
            "items": {
              "type": "string"
            }
          },
          "coordinates": {
            "title": "Coordinates",
            "type": "array",
            "description": "Latitude and longitude pairs, one per line, written latitude first, for example 42.36511, -83.073107. An exact point sometimes falls just outside a boundary, so set a search radius below when a point comes from a geocoder or a device.",
            "items": {
              "type": "string"
            }
          },
          "paths": {
            "title": "Parcel paths",
            "type": "array",
            "description": "The provider's readable parcel paths, one per line, in the form /country/state/county/place/id. These come back on every parcel row, so this is how you re-read a parcel you stored earlier.",
            "items": {
              "type": "string"
            }
          },
          "parcelIds": {
            "title": "Parcel ids",
            "type": "array",
            "description": "The provider's stable parcel identifiers, one per line. Unlike a county parcel number these never change, so they are the right key to store against your own records.",
            "items": {
              "type": "string"
            }
          },
          "geojson": {
            "title": "Search area",
            "type": "string",
            "description": "A GeoJSON Feature Collection, Feature or bare geometry to search inside, used by area mode. Polygon, MultiPolygon, Point, MultiPoint, LineString and MultiLineString are all accepted. The provider caps a search area at 80 square miles, and a radius widens it further."
          },
          "radiusMeters": {
            "title": "Search radius in metres",
            "minimum": 0,
            "maximum": 32000,
            "type": "integer",
            "description": "Widens a coordinate or an area into a circle of this radius, up to 32000 metres. A small radius is what rescues a point that a geocoder placed in the road rather than on the lot."
          },
          "scopePath": {
            "title": "Restrict to a state or county",
            "type": "string",
            "description": "Narrows an address, parcel number, owner or field search to one place, written as the provider's path: /us/mi for a state, /us/mi/wayne for a county, /us/mi/wayne/detroit for a city. This is the fix for a common street name or a parcel number that repeats across counties."
          },
          "ownerContains": {
            "title": "Owner name contains",
            "type": "string",
            "description": "Query mode only. Keeps parcels whose owner name contains this text, matched anywhere in the name and ignoring case. Unlike owner mode this is a contains match rather than a prefix one. For example HOLDINGS."
          },
          "states": {
            "title": "States",
            "type": "array",
            "description": "Query mode only. Keeps parcels in any of these states, one two letter code per line.",
            "items": {
              "type": "string"
            }
          },
          "counties": {
            "title": "Counties",
            "type": "array",
            "description": "Query mode only. Keeps parcels in any of these counties, one per line, written the way the provider spells them in lower case, such as wayne.",
            "items": {
              "type": "string"
            }
          },
          "postalCodes": {
            "title": "Postal codes",
            "type": "array",
            "description": "Query mode only. Keeps parcels with any of these situs postal codes, one per line.",
            "items": {
              "type": "string"
            }
          },
          "zoningCodes": {
            "title": "Zoning codes",
            "type": "array",
            "description": "Query mode only. Keeps parcels with any of these county zoning codes, one per line, matched exactly as the county writes them.",
            "items": {
              "type": "string"
            }
          },
          "zoningTypes": {
            "title": "Zoning types",
            "type": "array",
            "description": "Query mode only. Keeps parcels in any of these standardised zoning types. This is the cross jurisdiction classification rather than the county's own code, so it is the one that works across state lines. Special covers uses no other zone reflects, such as parks and universities; Planned covers a zone created for one development; Overlay adds conditions on top of another zone; NZ marks a jurisdiction confirmed to have no zoning at all.",
            "items": {
              "type": "string",
              "enum": [
                "Residential",
                "Commercial",
                "Industrial",
                "Agricultural",
                "Mixed",
                "Special",
                "Planned",
                "Overlay",
                "NZ"
              ]
            }
          },
          "landUseActivity": {
            "title": "Standard land use activity code",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "Query mode only. Keeps parcels with this standardised land use activity code, the Land Based Classification Standards activity dimension, for example 1100 for household activities and 2300 for office."
          },
          "vacancy": {
            "title": "USPS vacancy flag",
            "enum": [
              "Y",
              "N"
            ],
            "type": "string",
            "description": "Query mode only. Keeps parcels the postal service marks vacant or occupied. Vacancy is one of the strongest signals of a distressed or abandoned property."
          },
          "residentialIndicator": {
            "title": "Residential delivery indicator",
            "enum": [
              "Y",
              "N"
            ],
            "type": "string",
            "description": "Query mode only. Keeps parcels the postal service classes as a residential delivery point or not. It answers whether somebody lives there, and does not separate the non-residential kinds from each other."
          },
          "minAcres": {
            "title": "Minimum acres",
            "minimum": 0,
            "type": "number",
            "description": "Query mode only. Keeps parcels of at least this measured acreage. A minimum and a maximum on acreage together count as one field against the provider's four field limit, not two."
          },
          "maxAcres": {
            "title": "Maximum acres",
            "minimum": 0,
            "type": "number",
            "description": "Query mode only. Keeps parcels of at most this measured acreage."
          },
          "minYearBuilt": {
            "title": "Built no earlier than",
            "minimum": 1600,
            "maximum": 2100,
            "type": "integer",
            "description": "Query mode only. Keeps parcels whose main structure was built in this year or later."
          },
          "maxYearBuilt": {
            "title": "Built no later than",
            "minimum": 1600,
            "maximum": 2100,
            "type": "integer",
            "description": "Query mode only. Keeps parcels whose main structure was built in this year or earlier."
          },
          "minSalePrice": {
            "title": "Minimum sale price",
            "minimum": 0,
            "type": "integer",
            "description": "Query mode only. Keeps parcels whose recorded sale price is at least this much, in dollars."
          },
          "maxSalePrice": {
            "title": "Maximum sale price",
            "minimum": 0,
            "type": "integer",
            "description": "Query mode only. Keeps parcels whose recorded sale price is at most this much, in dollars."
          },
          "soldFrom": {
            "title": "Sold on or after",
            "type": "string",
            "description": "Query mode only. Keeps parcels last sold on or after this date, written as YYYY-MM-DD or as a year. For example 2020-01-01."
          },
          "soldTo": {
            "title": "Sold on or before",
            "type": "string",
            "description": "Query mode only. Keeps parcels last sold on or before this date, written as YYYY-MM-DD or as a year. For example 2024-12-31."
          },
          "minLandValue": {
            "title": "Minimum land value",
            "minimum": 0,
            "type": "integer",
            "description": "Query mode only. Keeps parcels whose assessed land value is at least this much, in dollars. Land value separated from improvement value is what identifies an underbuilt lot."
          },
          "minBuildings": {
            "title": "Minimum building count",
            "minimum": 0,
            "type": "integer",
            "description": "Query mode only. Keeps parcels with at least this many matched building footprints. Set it to 0 to find vacant land."
          },
          "opportunityZone": {
            "title": "Qualified opportunity zone",
            "enum": [
              "Yes",
              "No"
            ],
            "type": "string",
            "description": "Query mode only. Keeps parcels inside or outside a qualified opportunity zone, the federal tax designation."
          },
          "includeGeometry": {
            "title": "Include boundary geometry",
            "type": "boolean",
            "description": "Return the parcel boundary polygon on every row. Turning it off makes each row far smaller, which is worth doing when you only want the attributes.",
            "default": true
          },
          "includeBuildings": {
            "title": "Include matched building footprints",
            "type": "boolean",
            "description": "Return building footprints alongside the parcels they sit on, when your account has that dataset. Footprint rows are stored but never charged for, because the parcel they belong to already was.",
            "default": true
          },
          "includeExtraAddresses": {
            "title": "Include matched secondary addresses",
            "type": "boolean",
            "description": "Return the unit level addresses matched to each parcel, when your account has that dataset. This is what turns one apartment building parcel into its individual units.",
            "default": true
          },
          "includeOwnership": {
            "title": "Include enhanced ownership",
            "type": "boolean",
            "description": "Return the provider's enhanced ownership records, when your account has that dataset: additional owner names, mailing addresses and entity classification beyond what the county supplies.",
            "default": true
          },
          "includeZoning": {
            "title": "Include standardised zoning",
            "type": "boolean",
            "description": "Return zoning normalised across jurisdictions, when your account has that dataset, rather than only the county's own code.",
            "default": true
          },
          "includeCountyFields": {
            "title": "Include raw county fields",
            "type": "boolean",
            "description": "Pass through the county's own extra columns beyond the standard schema. These vary county by county, which is exactly why they are off by default.",
            "default": false
          },
          "countryCode": {
            "title": "Country",
            "type": "string",
            "description": "Which country's parcel dataset to read, as a two letter code. Leave empty or set us for the United States, ca for Canada, or a European country code your plan covers. Coverage is enabled per account, so the provider rather than this actor decides which codes work."
          },
          "pageSize": {
            "title": "Records per request",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many parcel records to ask for per request, up to the provider's maximum of 1000. Billing counts records rather than requests, so a larger page is not cheaper, it just means fewer round trips.",
            "default": 100
          },
          "maxResults": {
            "title": "Maximum rows",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "The most rows this run may store, and so the most it can charge for. A county wide field search can match millions of parcels, so this is the cap that keeps a run predictable.",
            "default": 100
          },
          "requestsPerMinute": {
            "title": "Requests per minute",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How fast this run calls the provider. The documented ceiling is about 200 a minute, so lower this if your plan is rate limited more tightly.",
            "default": 120
          },
          "baseUrl": {
            "title": "API base URL",
            "type": "string",
            "description": "Overrides the API host. Only needed if the provider has given your account a different endpoint."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}