Data API
Accounts
Search and retrieve organizations tracked in Parcel, including developers, architects, engineers, general contractors, agencies, law firms, and consultants.
Accounts represent organizations involved in construction and development projects: developers, architects, engineers, general contractors, agencies, law firms, consultants, and more. Each account may have one or more types, a list of known domains, and aggregated counts of associated projects and contacts.
The Data API requires the Pro plan. Non-Pro requests receive a 403 forbidden response.
Fields
| Field | Type | Notes |
|---|---|---|
id | uuid | Unique account identifier |
name | string | Primary display name |
account_types | string[] | One or more organization types. See Account types for allowed values |
aliases | string[] | Known alternate names |
domains | string[] | Associated web domains |
website | string | null | Primary website URL |
linkedin_url | string | null | LinkedIn company page URL |
city | string | null | Primary city |
state | string | null | Primary state (two-letter code) |
created_at | string | ISO 8601 timestamp, first seen in Parcel |
projects_count | int | Number of associated projects |
contacts_count | int | Number of associated contacts |
Filters
Default sort: name asc
| Filter key | Type | Notes |
|---|---|---|
account_type | field | Matches against account_types[]. Array value = OR. "other" matches unclassified accounts (empty account_types), not a literal type value. See Account types |
city | field | City name. exact_match: false (default) = fuzzy |
state | field | State code, e.g. "MA" |
name | field | Organization name. Supports fuzzy match |
Sort keys: name, created_at
Range keys: none
Relational filters
Use relational filters to match accounts based on properties of their related records.
| Key | Inner filter fields |
|---|---|
has_project | stage, primary_use, city, name, residential_units (range) |
without_project | stage, primary_use, city, name, residential_units (range) |
has_signal | signal_type, filed_at (range) |
without_signal | signal_type, filed_at (range) |
has_contact | title, name |
without_contact | title, name |
Each without_* key takes the same inner fields as its has_* twin, but matches accounts 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/accounts/{id}: projects, contacts, signals.
Example: GET /data/accounts/<id>?include=projects&include=contacts
Search example
curl -X POST https://api.parcelengineering.com/api/v1/data/accounts/search \ -H "Authorization: Bearer pcl_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "filters": { "account_type": { "value": "developer" }, "has_project": { "city": { "value": "Boston" }, "stage": { "value": "approved" } } }, "sort": { "field": "name", "order": "asc" }, "limit": 10 }'const response = await fetch( 'https://api.parcelengineering.com/api/v1/data/accounts/search', { method: 'POST', headers: { 'Authorization': 'Bearer pcl_your_api_key', 'Content-Type': 'application/json', }, body: JSON.stringify({ filters: { account_type: { value: 'developer' }, has_project: { city: { value: 'Boston' }, stage: { value: 'approved' }, }, }, sort: { field: 'name', order: 'asc' }, limit: 10, }), });
const { data, metadata } = await response.json();{ "data": [ { "id": "8a1f3c2e-0001-4b7d-9e5a-000000000001", "name": "Acme Development Group", "account_types": ["developer"], "aliases": ["Acme Dev"], "domains": ["acmedev.com"], "website": "https://acmedev.com", "linkedin_url": "https://www.linkedin.com/company/acme-development-group", "city": "Boston", "state": "MA", "created_at": "2024-03-15T12:00:00Z", "projects_count": 12, "contacts_count": 4 } ], "metadata": { "total": 47, "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).