Skip to content

Data API

Data Model

How the four Parcel datasets relate to each other.

The Data API exposes four datasets. All record ids are UUIDs.

The four datasets

DatasetWhat it represents
accountsOrganizations: developers, architects, engineers, GCs, agencies, law firms, consultants, and others active in the construction pipeline.
contactsPeople at accounts. Each contact has an account_id linking it to its parent account.
projectsIndividual construction or development projects tracked through the permitting and entitlement lifecycle.
signalsTimeline events on a project (permits filed, approvals, team updates, etc.). Each signal has a project_id.

Relationships

accounts ──< contacts (one account, many contacts)
projects ──< signals (one project, many signals)
accounts >──< projects (many-to-many via project_accounts, with a role)
contacts >──< projects (many-to-many via project_contacts, with a role)
RelationshipHow it works
Contact → Accountcontacts.account_id is a direct FK to accounts.id.
Account ↔ ProjectJoined through project_accounts. Each row carries a role (e.g., developer, architect).
Contact ↔ ProjectJoined through project_contacts. Each row carries a role.
Signal → Projectsignals.project_id is a direct FK to projects.id.

Convenience count fields

Each dataset includes pre-computed *_count fields so you can gauge relationship depth without a separate query:

DatasetCount fields
accountsprojects_count, contacts_count
contactsprojects_count
projectsaccounts_count, contacts_count, signals_count

Signals do not carry count fields.

Traversing relationships

Use the include parameter on GET /data/{dataset}/{id} to embed related records directly in the response. For example, fetching a project with include=accounts&include=signals returns the project record with its related accounts array and signals array nested under those keys.

See Related Records for the full include reference per dataset.