Skip to content

Workspace API

Search Contacts

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

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

This endpoint searches only the contacts 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 (including Static Contact follow visibility), use POST /workspace/views/{id}/records/search. To find new contacts to track, use the Data API contacts 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 contacts sorted by updated_at descending.

FieldTypeDefaultDescription
querystring (min 1)(none)Fuzzy search over contact name, title, email, phone, and associated account name.
filtersobject(none)Field 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, name, created_atupdated_at (desc)

Workspace filters

Filter keyTypeNotes
workspace_statusfieldYour workflow status string. Exact match.
tagsfieldTag value. Array value = OR.
namefieldContact name. Supports fuzzy match.
titlefieldJob title. Supports fuzzy match.
emailfieldEmail address. Exact match.
account_idfieldUUID of the associated account.

Relational filters

KeyInner filter fields
at_accountaccount_type, name
on_projectstage, primary_use, city

Example

Search workspace contacts
curl -X POST https://api.parcelengineering.com/api/v1/workspace/contacts/search \
-H "Authorization: Bearer pcl_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"filters": {
"title": { "value": "Project Manager" },
"on_project": {
"stage": { "value": "under_construction" }
}
},
"sort": { "field": "name", "order": "asc" },
"limit": 25
}'

Response

Response
{
"data": [
{
"id": "3c7a9f2d-0001-4e1b-bc4a-000000000001",
"name": "Jordan Rivera",
"title": "Project Manager",
"email": "jrivera@acmedev.com",
"account_id": "8a1f3c2e-0001-4b7d-9e5a-000000000001",
"workspace_status": "prospect",
"notes": "Met at Boston Planning Forum 2026",
"tags": ["vip", "developer"]
}
],
"metadata": {
"total": 7,
"total_is_capped": false,
"limit": 25,
"offset": 0,
"search_after": null,
"credits": 7
}
}

The data array is trimmed to one record above. A page returning 7 contacts costs 7 credits.

Metadata fields

FieldDescription
totalMatch count, capped at 1,000. When more than 1,000 contacts 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 contacts returned.