Skip to content

Data API

Projects

Search and retrieve construction and development projects tracked in Parcel, with stage, use, size, team, and timeline data.

Projects are individual construction or development initiatives tracked by Parcel: new buildings, renovations, mixed-use developments, and more. Each project carries address and geographic data, physical attributes (floor area, unit count, construction cost), a regulatory stage, and rolling counts of associated accounts, contacts, and signals.

Fields

FieldTypeNotes
iduuidUnique project identifier
namestringProject name
primary_addressstring | nullStreet address
citystring | nullCity
statestring | nullState (two-letter code)
neighborhoodstring | nullNeighborhood within the city
primary_usestring | nullPrimary building use: multifamily, mixed_use, office, industrial, retail, hotel, institutional, educational, r_and_d, other. See Enums
usesstring[]All uses (may include mixed-use values)
stagestring | nullRegulatory stage. See Project stages for allowed values: pre_filing, filed, under_review, approved, permitted, under_construction, completed
dispositionstring | nullOutcome for inactive projects: active, denied, withdrawn, expired, stalled, cancelled
gross_floor_area_sfint | nullGross floor area in square feet
residential_unitsint | nullNumber of residential units
cost_of_construction_usdint | nullEstimated construction cost in USD
latnumber | nullLatitude
lngnumber | nullLongitude
first_signal_atstring | nullISO 8601 date of the earliest signal
last_signal_atstring | nullISO 8601 date of the most recent signal
created_atstringISO 8601 timestamp, first seen in Parcel
accounts_countintNumber of associated accounts
contacts_countintNumber of associated contacts
signals_countintNumber of associated signals

Filters

Default sort: last_signal_at desc

Filter keyTypeNotes
stagefieldRegulatory stage. Array value = OR
primary_usefieldPrimary building use. Array value = OR
cityfieldCity name. Supports fuzzy match
statefieldState code, e.g. "MA"
namefieldProject name. Supports fuzzy match

Sort keys: last_signal_at (default, desc), name, created_at

Range keys: residential_units, gross_floor_area_sf, cost_of_construction_usd, last_signal_at (date, YYYY-MM-DD)

Range filter shape: { "min": <number | "YYYY-MM-DD">, "max": <number | "YYYY-MM-DD"> }. Both min and max are optional and inclusive.

Relational filters

Use relational filters to match projects based on properties of their related records.

KeyInner filter fields
has_accountrole, name, account_type
without_accountrole, name, account_type
has_signalsignal_type, filed_at (range)
without_signalsignal_type, filed_at (range)
has_contactrole, title
without_contactrole, title

has_account.role and has_contact.role use different vocabularies. Account roles are developer, architect, gc, engineer, law_firm, consultant, landscape_architect, other; contact roles are developer_contact, architect_contact, engineer_contact, gc_contact, agency_pm, attorney, owner_contact, other. An account role like gc in has_contact.role matches nothing.

Each without_* key takes the same inner fields as its has_* twin, but matches projects with NO related record satisfying the inner criteria (NOT EXISTS) instead of at least one. See Filtering for the semantics.

Includes

Valid include keys for GET /data/projects/{id}: accounts, contacts, signals.

Example: GET /data/projects/<id>?include=accounts&include=signals

Search example

Search projects
curl -X POST https://api.parcelengineering.com/api/v1/data/projects/search \
-H "Authorization: Bearer pcl_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"filters": {
"city": { "value": "Boston" },
"stage": { "value": "approved" },
"residential_units": { "min": 50 },
"has_account": {
"account_type": { "value": "developer" }
}
},
"sort": { "field": "last_signal_at", "order": "desc" },
"limit": 10
}'
Response
{
"data": [
{
"id": "8a1f3c2e-0003-4b7d-9e5a-000000000003",
"name": "1250 Boylston Street",
"primary_address": "1250 Boylston St",
"city": "Boston",
"state": "MA",
"neighborhood": "Fenway",
"primary_use": "mixed_use",
"uses": ["residential", "retail"],
"stage": "approved",
"disposition": "active",
"gross_floor_area_sf": 180000,
"residential_units": 120,
"cost_of_construction_usd": 62000000,
"lat": 42.3467,
"lng": -71.0972,
"first_signal_at": "2023-06-01",
"last_signal_at": "2025-11-14",
"created_at": "2023-06-01T09:00:00Z",
"accounts_count": 3,
"contacts_count": 7,
"signals_count": 14
}
],
"metadata": {
"total": 218,
"total_is_capped": false,
"credits": 10
}
}

The data array is trimmed to one record above; a full limit: 10 page returns 10 records and costs 10 credits (1 per record returned).

See also