Data API
Signals
Search and retrieve timeline events on projects tracked in Parcel, including permits, entitlements, public reviews, construction loans, and completions.
Signals are discrete timeline events on a project: a permit filed, an entitlement approved, a public review opened, a construction loan recorded, a project completed, and more. Each signal carries a type, a track, a summary, a filing date, and optional reported cost and size figures extracted from source documents.
The Data API requires the Pro plan. Non-Pro requests receive a 403 forbidden response.
Fields
| Field | Type | Notes |
|---|---|---|
id | uuid | Unique signal identifier |
project_id | uuid | Parent project |
signal_type | string | Event type. See Signal types for all 19 values |
track | string | Processing track. See Signal types |
summary | string | null | Human-readable summary of the event |
filed_at | string | null | ISO 8601 date the document was filed (YYYY-MM-DD) |
discovered_at | string | ISO 8601 timestamp Parcel first discovered this signal |
reported_cost_usd | int | null | Construction cost reported in the source document |
reported_gross_floor_area_sf | int | null | Gross floor area reported in the source document |
reported_units | int | null | Unit count reported in the source document |
created_at | string | ISO 8601 timestamp the signal was created in Parcel |
Filters
Default sort: filed_at desc
| Filter key | Type | Notes |
|---|---|---|
signal_type | field | Event type. Array value = OR. Allowed values: project_announcement, pre_application, site_acquisition, demolition_permit, site_prep, entitlement_application, environmental_review, public_review, rfp, entitlement_approval, entitlement_denial, withdrawal, expiration, permit_filed, permit_issued, construction_loan, under_construction, team_update, completion |
project_id | field | Filter to signals on a specific project (UUID) |
Sort keys: filed_at (default, desc), discovered_at
Range keys: filed_at (date, YYYY-MM-DD), discovered_at (date, YYYY-MM-DD)
Range filter shape: { "min": "YYYY-MM-DD", "max": "YYYY-MM-DD" }. Both min and max are optional and inclusive.
Relational filters
Use relational filters to match signals based on properties of their related records.
| Key | Inner filter fields |
|---|---|
for_project | stage, primary_use, city, residential_units (range) |
for_account | name, account_type |
Includes
Valid include keys for GET /data/signals/{id}: project (to-one, embeds an object), accounts.
Example: GET /data/signals/<id>?include=project&include=accounts
Search example
curl -X POST https://api.parcelengineering.com/api/v1/data/signals/search \ -H "Authorization: Bearer pcl_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "filters": { "signal_type": { "value": "permit_issued" }, "filed_at": { "min": "2025-01-01" }, "for_project": { "city": { "value": "Boston" }, "stage": { "value": "approved" } } }, "sort": { "field": "filed_at", "order": "desc" }, "limit": 10 }'const response = await fetch( 'https://api.parcelengineering.com/api/v1/data/signals/search', { method: 'POST', headers: { 'Authorization': 'Bearer pcl_your_api_key', 'Content-Type': 'application/json', }, body: JSON.stringify({ filters: { signal_type: { value: 'permit_issued' }, filed_at: { min: '2025-01-01' }, for_project: { city: { value: 'Boston' }, stage: { value: 'approved' }, }, }, sort: { field: 'filed_at', order: 'desc' }, limit: 10, }), });
const { data, metadata } = await response.json();{ "data": [ { "id": "8a1f3c2e-0004-4b7d-9e5a-000000000004", "project_id": "8a1f3c2e-0003-4b7d-9e5a-000000000003", "signal_type": "permit_issued", "track": "funnel", "summary": "Building permit issued for new 8-story mixed-use residential development at 1250 Boylston St.", "filed_at": "2025-11-14", "discovered_at": "2025-11-15T04:12:00Z", "reported_cost_usd": 62000000, "reported_gross_floor_area_sf": 180000, "reported_units": 120, "created_at": "2025-11-15T04:12:00Z" } ], "metadata": { "total": 512, "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).