Skip to content

Workspace API

Search Projects

Search the projects you have saved in your workspace with POST /workspace/projects/search.

Endpoint
POST https://api.parcelengineering.com/api/v1/workspace/projects/search

This endpoint searches only the projects 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 Projects browse base, use POST /workspace/views/{id}/records/search. To find new projects to track, use the Data API projects search first, then upsert them into your workspace.

Query parameters

ParameterDescription
workspace_idAttribution. 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 projects sorted by updated_at descending.

FieldTypeDefaultDescription
querystring (min 1)(none)Full-text search term matched against project name.
filtersobject(none)Field, range, and relational filters.
sort.fieldstringupdated_atSort field. Must be a valid sort key (see below). Required when sort is present.
sort.orderasc | descdescSort direction.
limitinteger 1..10025Records per page.
offsetinteger 0..100000Zero-based record offset for pagination.
search_afterstring(none)Opaque keyset cursor from the previous response’s metadata.search_after. Pass it to fetch the next page.

Sort keys

Valid sort fieldsDefault
updated_at, last_signal_at, name, created_atupdated_at (desc)

Workspace filters

Filter keyTypeNotes
workspace_statusfieldYour workflow status string. Exact match.
tagsfieldTag value. Array value = OR.
namefieldProject name. Supports fuzzy match.
stagefieldProject stage value. Array value = OR.
primary_usefieldBuilding use type. Array value = OR.
cityfieldCity name. Fuzzy by default.
statefieldState code, for example "MA".
residential_unitsrangeInteger range, for example { "min": 10 }.
gross_floor_area_sfrangeNumeric range in square feet.
cost_of_construction_usdrangeNumeric range in US dollars.
last_signal_atrangeISO 8601 date range, for example { "gte": "2026-01-01" }.

Relational filters

KeyInner filter fields
has_accountaccount_type, name
has_signalsignal_type, filed_at (range)
has_contacttitle, name

Example

Search workspace projects
curl -X POST https://api.parcelengineering.com/api/v1/workspace/projects/search \
-H "Authorization: Bearer pcl_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"filters": {
"stage": { "value": "under_construction" },
"state": { "value": "MA" }
},
"sort": { "field": "last_signal_at", "order": "desc" },
"limit": 25
}'

Response

Response
{
"data": [
{
"id": "7b2e4d1f-0001-4c8e-af6b-000000000001",
"name": "100 Seaport Boulevard",
"city": "Boston",
"state": "MA",
"stage": "under_construction",
"primary_use": "mixed_use",
"residential_units": 120,
"gross_floor_area_sf": 180000,
"cost_of_construction_usd": 42000000,
"last_signal_at": "2026-06-01T00:00:00Z",
"workspace_status": "watching",
"notes": "GC bid due Q3",
"tags": ["seaport", "mixed-use"]
}
],
"metadata": {
"total": 11,
"total_is_capped": false,
"limit": 25,
"offset": 0,
"search_after": null,
"credits": 11
}
}

The data array is trimmed to one record above. A page returning 11 projects costs 11 credits.

Metadata fields

FieldDescription
totalMatch count, capped at 1,000. When more than 1,000 projects match, total reports 1000 and total_is_capped is true.
total_is_cappedtrue when the actual count exceeds the cap.
limitPage size, echoed back from the request.
offsetEchoed back from the request, or 0 when paging with search_after.
search_afterOpaque cursor for the next page, or null on the last page.
creditsCredits consumed by this request. Equals the number of projects returned.