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

# Build with Ploti

> Build internal software, or products you sell, on official parcel, zoning, permit and ordinance records. Own the data and keep it current with Data Feeds, or query Ploti directly.

You can build internal software, or products you sell to your own customers, on Ploti's official real estate records: parcels with owners and sales, zoning, permits, ordinances, flood zones and more. Ploti collects them from US county and city offices and keeps them current. You get the records for your coverage areas, the US counties your workspace (your team's Ploti account) pays for.

To make a first call, go to [Keys and setup](https://ploti.ai/docs/developers/keys-and-setup.md).

![Pixel drawing of a terminal window with command lines, and an arrow into a database](https://mintcdn.com/terrascout/PE56AS9AGXUNtOuQ/images/docs/developers-light.webp?fit=max\&auto=format\&n=PE56AS9AGXUNtOuQ\&q=85\&s=88fff93297342aafbe0d7602793e50f0)

## Why not collect the records yourself

Every record Ploti holds is public. You could get it from the county yourself, and for one dataset in one county that is a reasonable afternoon. It stops being reasonable when a product depends on it, because collecting the file is the small part. These are the problems that come after, and what Ploti does about each.

| The problem | What it looks like | What Ploti does |
| - | - | - |
| **Finding the source** | No directory says which office holds which record. Permits can sit with the county, with each city, or both. | Ploti's agents find the public body that publishes each record for each place, and name it on the dataset. |
| **Every source is different** | One office offers a download, another a map service, another a search form that returns one record at a time, another a PDF. | Each source is read the way it is published and delivered in one format, GeoParquet, with the same columns describing every row. |
| **Sites that are not built for programs** | Logins, search-only portals, request limits and blocks on automated visitors. | Ploti uses an office's own download or API wherever one exists, paces its reads, and a person steps in where a site needs one. |
| **Records that are not online** | The office holds the data and publishes none of it. | Ploti asks the office for the records in writing and follows up until they arrive. |
| **Documents, not tables** | Ordinances, plans and meeting minutes are published as long files. | Ploti reads them into searchable text, split into sections, with the original file kept. See [Documents](https://ploti.ai/docs/developers/documents.md). |
| **Knowing when something changed** | Offices update without notice. You find out by downloading everything again and comparing. | Ploti checks each source and publishes a numbered version when it changes, then tells you by [event](https://ploti.ai/docs/feeds/events.md). |
| **Knowing which records changed** | Most sources have no stable id. A parcel is renumbered, a row is edited, and nothing says it is the same record. | Every row carries a [record id](https://ploti.ai/docs/feeds/record-ids.md) that stays with the record. Ploti matches each version to the one before, by key, by content and with a matching agent, and sends only what was added, changed and removed. |
| **Columns that move** | A column is renamed or dropped and your load breaks, or keeps running with empty values. | Each change of columns is a [schema version](https://ploti.ai/docs/feeds/schemas.md). An added column arrives with the next version; a breaking change is flagged and asks you to reload. |
| **A bad release** | An export arrives cut short, or with duplicate keys, and overwrites good data. | A version that fails Ploti's checks is held for review and not sent. |
| **Proving where a value came from** | Your user asks who says this parcel is zoned commercial. | Each dataset names its publisher and where Ploti reads it, and every row carries its source and the time Ploti read it. |
| **Making sources fit one schema** | Eight permit offices, eight sets of columns, and no shared id with the parcel records. | A [custom feed](https://ploti.ai/docs/feeds/custom-feeds.md) delivers the table you describe, with records from different sources matched for you. |
| **Doing it again** | Each new county starts the list over, and each source needs watching for as long as you depend on it. | Adding a coverage area is a setting. What Ploti has collected for a county is open to every customer who covers it. |

None of this is your product. A team that collects its own records ends up running a data operation beside the thing it set out to build, and the operation grows with every county. With Ploti the records arrive current, traceable and in one shape, and your engineers work on what your customers pay for.

## Two ways to build

Ask one question to choose: does the data have to live in your own system and stay current there?

* **Own the data.** Subscribe to the places and topics you want, download every dataset in them, and keep your copy current with Data Feeds, which delivers each new version as its source changes. The records you receive are yours to keep. Data Feeds comes with every Ploti plan. Start with [How it works](https://ploti.ai/docs/feeds/overview.md).
  * Take each dataset as its source publishes it and combine them yourself, or describe the table your system needs and have Ploti build and maintain it. See [Source feeds and custom feeds](https://ploti.ai/docs/feeds/source-and-custom-feeds.md).
* **Query Ploti directly.** Search Ploti's datasets and documents and read what each question needs, where Ploti keeps them, or download one dataset at a time. Without Data Feeds, staying current means downloading a dataset again. Start with [Find datasets](https://ploti.ai/docs/developers/find-datasets.md).

Both start with an API key. [Keys and setup](https://ploti.ai/docs/developers/keys-and-setup.md) makes one and installs the interface you use.

A **dataset** is one set of records from one source, such as Orange County's parcels or a city's zoning code. Its id looks like `orange-parcels` or `ds_orange_fl_building_permits`. Ids come in more than one shape, so use each exactly as Ploti gives it.

## What people build

### Own the data: Data Feeds

Data Feeds delivers whole datasets to your own database and sends each new version as the source changes. Every version says which records were added, changed or removed, and each record keeps the same id from one version to the next whenever Ploti can match it, so you can join it to your own data.

* **A deal-sourcing platform.** An app scores every parcel in the counties it serves for redevelopment potential. Its scoring runs each night in its own database, joined with its own data, so it needs every parcel, sale and permit locally. Each new version lists the records that changed, so it scores only those again.
* **Lender or insurer monitoring.** A loan or policy book is checked against flood zones and ownership transfers. When a new version arrives, its list of changed records names the properties to review, and the record id ties each change back to the loan.
* **A brokerage CRM.** Every listing and contact in the CRM carries the owner, the last sale and the assessed value. The agents see these records inside the CRM, and the data stays after the subscription ends.
* **A data team's warehouse.** County parcels sit next to the firm's own deal history in Snowflake or BigQuery, for dashboards and models. A scheduled sync writes each new version as Parquet files, a table format most data tools read, and the team's models load them.
* **A product with a fixed schema.** A platform's parcel and permit tables have set columns, and each permit must point at its parcel. Its team describes those tables once, and a [custom feed](https://ploti.ai/docs/feeds/custom-feeds.md) delivers them already combined, with each permit carrying its parcel's record id.
* **An alerts product.** "Tell me when anything near my sites is rezoned or gets a permit." Answering it means comparing each version with the last across a whole region, which needs a full copy.

### Query Ploti directly

Your code or agent asks Ploti for what it needs, when it needs it. Ploti holds the data, keeps it current and does the searching, and you show the answer however your product does.

* **One-off analysis.** An analyst downloads a county's parcels once into a Python notebook, joins them with a spreadsheet and writes a memo. It needs no Data Feeds subscription, and nothing has to stay current.
* **A simple internal tool.** A page in your team's internal app shows a parcel's owner, zoning and permit history when someone types an address. Each view is one call, and there is nothing to keep in sync.
* **An always-on assistant answering a broker.** "Who owns 123 Main St, and what did they pay?" in a team chat is one lookup by address, answered in seconds.

### Using both

Many products use both. Data Feeds keeps a platform's main parcel and permit tables current in its own database. Its built-in assistant queries Ploti directly to answer one-off questions, and to search the text of documents such as ordinances and meeting minutes, which Data Feeds delivers only as files.

When Ploti doesn't hold the data a question needs, a [research request](https://ploti.ai/docs/research/overview.md) asks Ploti to collect it from the official sources.

## Using the data

What you may do with the records, in brief, from [Using the data](https://ploti.ai/docs/feeds/access-and-pricing.md#using-the-data):

* You may load them into your own systems, show them to your users inside your product, let your users export the results they work with, and analyse, enrich and combine them. You may sell what you build: apps, alerts, maps, scores, matching and agents.
* You may not offer the records, or a lightly altered copy, as a dataset, feed, download or API of their own, give them away or sell them as a standalone product, or pass Ploti's feed straight through to others.

The test is whether the data is the product or inside the product: a site-selection app that shows parcels is fine, and reselling the parcel file is not. If you are unsure whether something fits, [ask us](mailto:support@ploti.ai) before you launch it. Records delivered to you through Data Feeds are yours to keep, in your own systems, after a subscription ends. [Access and usage](https://ploti.ai/docs/feeds/access-and-pricing.md) has the terms, and your agreement with Ploti sets them.

## Four interfaces, one set of operations

Every page shows the same example four ways, in the column on the right. All four reach the same operations under the same names:

| Interface | What it is | Reading rows |
| - | - | - |
| **CLI** | Ploti's command-line tool, `ploti` | `ploti datasets rows` |
| **Python** | Ploti's Python library | `ploti.datasets.rows()` |
| **REST** | Plain HTTPS calls, shown with `curl` | `POST /v1/datasets/{dataset}/rows` |
| **MCP** | The tool an AI assistant calls | `datasets_rows` |

Setting up an AI assistant such as Claude Code or ChatGPT instead of writing code? See [AI agents](https://ploti.ai/docs/mcp/overview.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.