> ## 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.

# How it works

> Data Feeds delivers whole datasets of official records into your own systems and sends each new version as the source changes. The records you receive are yours to keep.

Data Feeds puts official county and city records, such as county parcels, permits, zoning, planning decisions and sales, into your own database and keeps them current as each source publishes. You subscribe to the places and topics you want. Ploti delivers each dataset as files, then a new version whenever its source changes, saying exactly which records were added, changed or removed. You keep everything you receive.

You can take each dataset as its source publishes it, or describe the table your system needs and have Ploti build it from them. [Source feeds and custom feeds](https://ploti.ai/docs/feeds/source-and-custom-feeds.md) says how the two differ. This page covers what both share, and the pages after it describe source feeds, the kind a subscription delivers.

Use Data Feeds when the data has to live in your own system. Your product might run its own queries over every parcel, join Ploti's records with your own, or need them offline. When you only need what one question asks for, [read the data where it lives](https://ploti.ai/docs/developers/read-rows.md) instead. [Build with Ploti](https://ploti.ai/docs/developers/overview.md#what-people-build) has examples of both.

## The words this section uses

* **Ploti's agents** are Ploti's own AI systems that collect records from official sources, check them, and match each record to the one before it.
* A **data feed** is a dataset Ploti delivers into your own systems and keeps current. A **source feed** is one dataset as its source publishes it. A **custom feed** is a table Ploti builds to a schema you describe, from one or more of those datasets.
* A **subscription** is your standing order: the places you serve, such as Orange County, Florida, and optionally the topics you want, such as permits or zoning. Datasets Ploti adds to those places later join it on their own. It belongs to your workspace.
* A **dataset** is one set of public records from one source, such as Orange County's building permits. Data Feeds delivers [layers and tables](https://ploti.ai/docs/developers/dataset-kinds.md), the kinds that have rows.
* A **version** is a numbered release of a dataset. Ploti makes a new one each time the source publishes new or changed records.
* A **snapshot** is the whole dataset as of one version. A **changes file** is only what changed since the version before. Ploti maps use "snapshot" for something unrelated: a saved set of records on a map.
* Both are **GeoParquet** files: Parquet, a compact table format that DuckDB, pandas, Spark and most warehouses read, with each record's shape included.
* An **event** is a short message saying something happened, such as a new version. Each subscription keeps an ordered log of them, and can send them to your webhook (a web address of yours).

## How it works

**1. Subscribe to places**

Create a [subscription](https://ploti.ai/docs/feeds/subscriptions.md) for the counties you serve,
optionally limited to some topics.

**2. Load each snapshot once**

The subscription's manifest (its list of datasets) links every dataset's
current snapshot. Load them into your warehouse or database.

**3. Apply changes as they publish**

When a dataset has a new version, Ploti sends a `feed.dataset.updated`
[event](https://ploti.ai/docs/feeds/events.md) and publishes a changes file: the records added,
changed and removed, each under a [record id](https://ploti.ai/docs/feeds/record-ids.md) that stays
the same from version to version. Apply it and your copy matches that
version.

**4. Follow schema changes**

A dataset's columns follow its source, and each change of columns gets a new
[schema version](https://ploti.ai/docs/feeds/schemas.md). An added column arrives with that
version's changes. A breaking change, such as a column removed, asks you to
reload the dataset from its snapshot.

[`ploti feeds sync`](https://ploti.ai/docs/feeds/sync) runs this loop for you and keeps a folder current. The REST API is there when you want to run it yourself.

## What every record carries

Each dataset names the public body that publishes it and where Ploti reads it. Every row carries the same [envelope columns](https://ploti.ai/docs/feeds/versions-and-changes.md#envelope-columns): its record id, dataset, place, version, source and the time Ploti read it. So you can load many places' datasets side by side and ask what changed since Tuesday without knowing any dataset's own columns. Your users can always see where a record came from.

## Access

* Every workspace with an active Ploti plan has Data Feeds.
* Every new API key and every `ploti login` holds the Data Feeds permission. Any member can read what the subscriptions deliver; a workspace admin creates, changes and deletes them. See [Keys and setup](https://ploti.ai/docs/developers/keys-and-setup.md).
* Data Feeds is not offered over MCP. Use the CLI, Python or REST.
* You pay for continuous access to the stream, and the records it delivers are yours. See [Access and usage](https://ploti.ai/docs/feeds/access-and-pricing.md).

```bash CLI theme={null}
ploti places list --state FL
ploti topics list
ploti feeds subscriptions create --name "Orange County permits" \
  --places fl-county-orange --topics development-activity
```

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

ploti.places.list(state="FL")
sub = ploti.feeds.subscriptions.create(
    name="Orange County permits",
    places=["fl-county-orange"],
    topics=["development-activity"],
)
```

```bash REST theme={null}
curl -X POST https://api.ploti.ai/v1/feeds/subscriptions \
  -H "Authorization: Bearer $PLOTI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "name": "Orange County permits",
    "places": ["fl-county-orange"],
    "topics": ["development-activity"]
  }'
```

```text MCP theme={null}
Data Feeds is not offered over MCP.
Use the CLI, Python or REST with an API key that holds the Data Feeds permission.
```

```json Reply theme={null}
{
  "id": "sub_8f3k2m",
  "name": "Orange County permits",
  "places": ["fl-county-orange"],
  "topics": ["development-activity"],
  "datasetIds": [],
  "revision": 1,
  "datasetCount": 14,
  "lastEventCursor": null,
  "createdAt": "2026-11-09T14:02:11.000Z"
}
```


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