Workspace API
Search Accounts
Search the accounts you have saved in your workspace with POST /workspace/accounts/search.
POST https://api.parcelengineering.com/api/v1/workspace/accounts/searchThis endpoint searches only the accounts you have saved and annotated in your workspace (your book), not the global Parcel dataset. It does not accept view_id. For Dynamic or Static View execution over the broader Accounts browse base, use POST /workspace/views/{id}/records/search. To find new accounts to track, use the Data API accounts search first, then upsert them into your workspace.
The Workspace API requires the Pro plan. A request from a non-Pro workspace or a non-member receives 403 forbidden.
Query parameters
| Parameter | Description |
|---|---|
workspace_id | Attribution. Required when authenticating with a user JWT (for example, via the MCP server). Optional for API keys. Omitting it on a user-token request returns 400 bad_request. |
Request body
All fields are optional. An empty body returns the first 25 accounts sorted by updated_at descending.
| Field | Type | Default | Description |
|---|---|---|---|
query | string (min 1) | (none) | Full-text search term matched against account name and aliases. |
filters | object | (none) | Field, range, and relational filters. |
sort.field | string | updated_at | Sort field. Must be a valid sort key (see below). Required when sort is present. |
sort.order | asc | desc | desc | Sort direction. |
limit | integer 1..100 | 25 | Records per page. |
offset | integer 0..10000 | 0 | Zero-based record offset for pagination. |
search_after | string | (none) | Opaque keyset cursor from the previous response’s metadata.search_after. Pass it to fetch the next page. |
Sort keys
| Valid sort fields | Default |
|---|---|
updated_at, atlas_score, name, created_at | updated_at (desc) |
Workspace filters
| Filter key | Type | Notes |
|---|---|---|
icp_tier | field | One of tier_1, tier_2, tier_3, disqualified. Array value = OR. |
workspace_status | field | Your workflow status string. Exact match. |
tags | field | Tag value. Array value = OR. |
atlas_score | range | Integer range, for example { "min": 50 }. |
name | field | Organization name. Supports fuzzy match. |
city | field | City name. Fuzzy by default. |
state | field | State code, for example "MA". |
account_type | field | Matches against account_types[]. Array value = OR. |
Relational filters
| Key | Inner filter fields |
|---|---|
has_project | stage, primary_use, city, residential_units (range) |
has_signal | signal_type, filed_at (range) |
has_contact | title, name |
Example
curl -X POST https://api.parcelengineering.com/api/v1/workspace/accounts/search \ -H "Authorization: Bearer pcl_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "filters": { "icp_tier": { "value": "tier_1" }, "has_signal": { "signal_type": { "value": "permit_filed" }, "filed_at": { "gte": "2026-03-31" } } }, "sort": { "field": "atlas_score", "order": "desc" }, "limit": 25 }'const response = await fetch( 'https://api.parcelengineering.com/api/v1/workspace/accounts/search', { method: 'POST', headers: { 'Authorization': 'Bearer pcl_your_api_key', 'Content-Type': 'application/json', }, body: JSON.stringify({ filters: { icp_tier: { value: 'tier_1' }, has_signal: { signal_type: { value: 'permit_filed' }, filed_at: { gte: '2026-03-31' }, }, }, sort: { field: 'atlas_score', order: 'desc' }, limit: 25, }), });
const { data, metadata } = await response.json();Response
{ "data": [ { "id": "8a1f3c2e-0001-4b7d-9e5a-000000000001", "name": "Acme Development Group", "account_types": ["developer"], "domains": ["acmedev.com"], "website": "https://acmedev.com", "icp_tier": "tier_1", "workspace_status": "active", "notes": "Met at BuildBoston 2025", "tags": ["boston", "developer"], "atlas_score": 87, "atlas_trend": "up" } ], "metadata": { "total": 4, "total_is_capped": false, "limit": 25, "offset": 0, "search_after": null, "credits": 4 }}The data array is trimmed to one record above. A page returning 4 accounts costs 4 credits.
Metadata fields
| Field | Description |
|---|---|
total | Match count, capped at 1,000. When more than 1,000 accounts match, total reports 1000 and total_is_capped is true. |
total_is_capped | true when the actual count exceeds the cap. |
limit | Page size, echoed back from the request. |
offset | Echoed back from the request, or 0 when paging with search_after. |
search_after | Opaque cursor for the next page, or null on the last page. |
credits | Credits consumed by this request. Equals the number of accounts returned. |
Each account returned costs 1 credit toward your workspace’s rolling 24-hour ceiling of 250,000 credits. See Credits.