Using the API

Thank you for your interest in our Parcel API! Please direct feedback, bugs and questions to help@landgrid.com.

The Parcel API supports searching by location (lat/lon), parcel number (APN), or parcel street address. A partial owner name search is still a work in progress and described below. The API does not yet support querying by polygons to get all of the parcels in the polygon, or queries by other attributes. Have a specific need in mind you don’t see covered here? Please reach out to our team with details.

General Introduction

Endpoint

All requests are to the https://landgrid.com/ domain, with the paths described below per request.

Responses

All requests return a GeoJSON response containing an array of GeoJSON features each containing the matched Parcel Records. An empty results set with no error means no Parcel Records could be matched.

You may get multiple Parcel Records per response. This depends on how you search for parcels via our Parcel API. Address matching, parcel number, owner name matching, parcels in a radius are all example of Parcel API requests that will likely return multiple Parcel Records in each response.

Limit Parcel Records returned

Each Parcel API request can return one or more Parcel Records. Any Parcel API request that can return multiple Parcel Records supports the optional limit= parameter that will allow you to limit the number of return Parcel Records. The default limit is 20 Parcel Records. The maximum limit is 1,000 Parcel Records.

API Request Rates

Rates are limited to 10 simultaneous requests or approximately 5,000 requests per hour. Additional capacity is available; please contact our sales team at parcels@landgrid.com for details.

Authentication and tokens

All requests to the API must include a token parameter. If you have an API subscription or Loveland data license, you can find this in Account Settings > API after logging into your account at landgrid.com.

Place paths for context (narrow searches by area)

Most API requests can take an optional context parameter that will narrow down the search to a specific area. These context values are in the form of paths.

The context parameter is most important to provide when doing searches that can have results from many different parts of the US, like address or parcel number searches. The context parameter should not be provided when doing latitude and longitude based searches.

All paths should be all lowercase characters.

At Loveland we use place pathnames to specify administrative boundaries and uniquely describe a geographic region. This includes the country, state, county, and county subdivision. For example, /us/mi/wayne/detroit for Detroit or /us/oh/hamilton for Hamilton County, OH.

If you’re not sure what to use for your requests, browsing on landgrid.com to the desired place and copying the path out of the URL is a good way to get started.

Parcel paths

Parcel paths are similar to place paths and include an integer ID at the end. For example, /us/mi/wayne/detroit/555. These uniquely identify a parcel in our database in a simple, human-readable format. These should be used as described below with the /parcel.json end-point to quickly and reliably get the full record for a parcel.

Note: Eventually these will be replaced functionally with the ll_uuid, but at this time, the parcel path is the best identifier to use with the API once you have found a parcel by one of the search methods.

By lat-long (reverse geocoding)

GET /api/v1/search.json?lat=<y>&lon=<x>&token=<token>

We recommend using lat-long search for most lookups. Because parcels may span several addresses, using a third-party geocoder (eg Mapbox Places) to identify a point for an address and then searching for the parcel at that poing can be more accurate than straight address search.

Request parameters:

  • lat: Latitude (y-coord) in decimal degrees, WGS84 (EPSG 4326) projection.
  • lon: Longitude (x-coord), same.

To return all parcels in a radius of a point:

  • radius (optional): Give a radius in meters for which all parcels will be returned if they are within a definable radius from the lat-long point. Default radius is 50, maximum 500. No need to include the ‘m’ for meters, just the integer value between 0 and 500.
  • nearest: Pass 1 to return parcels within a radius instead of an exact match at the lat-long.
  • limit (optional): Maximum number of results to return.

GET /api/v1/search.json?lat=<y>&lon=<x>&nearest=1&radius=<meters>&token=<token>

By address

GET /api/v1/search.json?query=<address>&context=<path>&token=<token>

Request parameters:

  • query: The URL Encoded address to look up
  • context (optional): See notes on context parameter above
  • limit (optional): Maximum number of results to return.
  • strict (optional): Set strict=1 to only return results in the context.

Response: An array of parcels sorted by descending relevance rank. An empty results set with no error means no parcels could be matched.

Parcel attributes that have a null value are omitted from the results.

By parcel number

GET /api/v1/search.json?parcelnumb=<pin>&token=<token>

Request parameters:

  • parcelnumb: The assessor’s parcel number to look up.
  • context (optional): To specify what county or municipality to search in, you can provide a path. See description above.
  • limit (optional): Maximum number of results to return.
  • strict (optional): Set strict=1 to only return results in the context.

By owner name

Currently only matches based on the start of the name string.

For example, if you are looking for a parcel owned by “Jones, Festus”, you can search by ‘jon’, ‘jone’, ‘jones’, etc. Searchin for ‘fest’, ‘festus’, or etc. will not match the parcel.

GET /api/v1/search.json?owner=<name>&context=<path>&token=<token>

Request parameters:

  • owner: The owner name in “Last, First” format. Matches by prefix, you can pass just a last name to get any name beginning with that string. (Case insensitive, minimum 4 characters)
  • context (optional): To specify what county or municipality to search in, you can provide a path. See description above.
  • limit (optional): Maximum number of results to return.
  • strict (optional): Set strict=1 to only return results in the context.

Requesting a Parcel Record details

GET /api/v1/parcel.json?path=<path>&token=<token>

Request parameters:

  • path: The canonical path of the parcel in the Loveland system. For example, /us/mi/wayne/detroit/555. See “Parcel Paths” above for more details.

Response: A single GeoJSON Feature for the requested parcel (rather than an array of results).

Parcel attributes that have a null value are omitted from the results.

Response format

All of these requests return a GeoJSON response on success, an array of GeoJSON features representing the matched parcels. These include polygon geometries and properties. Our standard fields are documented in the Loveland Parcel Schema (some additional undocumented fields may be included in the properties). An empty results set with no error means no parcels could be matched. Parcel attributes that have a null value are omitted from the results. Here’s an example response payload with results:

{
  results: [
  	{
      type: "Feature",
      geometry: {
        type: "Polygon",
        coordinates: [[[-83.09659353074045, 42.30794044957642], [-83.09700166154633, 42.307778380507386], [-83.0970481624631, 42.30784446359719], [-83.09664127714791, 42.30800563738071], [-83.09659353074045, 42.30794044957642]]]
      },
      properties: {
        headline: "250 Campbell",
        path: "/us/mi/wayne/detroit/1000",
        fields: {
          address: "250 CAMPBELL",
          parcelnumb: "16014174.",
          owner: "LOVELAND, JACOB & BIANCA",
          zoning: "M4",
          z_description: "Intensive Industrial District",
          taxablesta: "TAXABLE",
          cursev: 200,
          ...
        },
        field_labels: {
          address: "Address",
          parcelnumb: "Parcel ID",
          owner: "Owner",
          zoning: "Zoning Code",
          z_description: "Zoning",
          taxablesta: "Taxable Status",
          cursev: "State Equalized Value",
          ...
        },
        context: {
          headline: "Detroit, MI",
          path: "/us/mi/wayne/detroit",
          active: true
        }
      },
      id: 1000
    },
    ...
  ]
}

Notes on properties:

  • headline: a human-friendly display name for the parcel. If no address is available, it falls back to the parcel number.
  • path: The parcel’s unique identifier as described above in “Parcel Paths Above”
  • fields: Columns from the parcel table. These include standard column names wherever fields are available, plus additional columns varying by the particular county & data available. Parcel attributes that have a null value are omitted from the results.
  • field_labels: Human-friendly labels for each key in fields.
  • context: A bit of info about the city or county where this parcel is found, including a path one can use as context for further searches.

Schema

GET /api/v1/schema.json

Response: A hash with details on all fields in the Loveland Parcel Schema

Reporting data issues

This is an alpha endpoint and may change before release

You can report issues with specific parcels or general areas to us using this report endpoint. Reports help us prioritize updates. However, we cannot apply data received to this endpoint directly to our parcel data or respond individually to specific reports.

POST /api/v1/report.json?token=<token>

Request parameters:

  • path: A path to a specific parcel or place
  • ll_uuid (optional): The ll_uuid of a parcel, if the report is for a specific parcel
  • comment (optional): String describing the issue
  • details (optional): A hash with details on specific fields. This hash only accepts standard column names as keys.

Response: A success message plus the id of the new report.

Example request:

POST https://landgrid.com/api/v1/report.json?token=YOUR_TOKEN_HERE
{
  "path": "/us/al/elmore/eclectic/5",
  "ll_uuid": "8ba95684-e001-4362-801c-39f30a13bee4",
  "comment": "Property has a new owner",
  "details": {
    "owner": "Johnny Parcel",
    "saleprice": 200000
  }
}

Platform / Library Specific Notes

Shapely

To create a shapely shape in Python from the array of coordinates that come as part of the GeoJSON response from the API, the coordinates list can not be passed into a MultiPolygon or Polygon constructor or it may return an error.

Instead try import shape from shapely.geometry and pass in the geojson response to that. The shapely library might have issues instantiating shapes from a list of coordinates versus directly from a geojson the other ways.