Search contacts
Search contacts. `data` contains full contact records; contacts surface once their parent district/school has been through the extraction pipeline.
Search contacts. data contains full contact records; contacts surface once their parent district/school has been through the extraction pipeline.
API key (sk_live_... prefix). Generate keys in the UI under Settings > API Keys, then send it as Authorization: Bearer sk_live_...
In: header
Query Parameters
Filter by district UUID
Filter by school UUID
State abbreviation
Text search on name or title
Title pattern (e.g., superintendent, technology)
true for district-level, false for school-level
pending, processing, completed, error
Contacts in this list
Contacts at districts in these lists (comma-separated UUIDs)
Contacts at schools in these lists (comma-separated UUIDs)
Contacts at orgs using these vendors (comma-separated UUIDs)
sis, lms, assessment, communication, hr, finance, security, sso, devices, other
open, closed, won, lost, no_bid
staffing, budget, infrastructure, security, integration, compliance, enrollment, other
true to filter contacts at orgs with pain points
esser, erate, title_i, bond, grant, state, other
true to filter contacts at orgs with expiring contracts
true to use deduplicated contact view (default: true)
Sort field
Sort direction
"true"Results per page
50Pagination offset
0Response Body
application/json
application/json
curl -X GET "https://loading/api/v1/contacts"{
"data": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"district_id": "550e8400-e29b-41d4-a716-446655440000",
"school_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"title": "string",
"email": "string",
"phone": "string",
"state": "string",
"is_district_contact": true,
"linkedin_url": "string",
"profile_summary": "string",
"key_facts": {
"property1": null,
"property2": null
},
"source": "string",
"source_url": "string",
"enrichment_status": "pending",
"enriched_at": "string",
"enrichment_error": "string",
"enrichment_retry_count": -9007199254740991,
"qualification_score": 0,
"qualification_justification": "string",
"qualified_at": "string",
"email_status": "pending",
"email_error": "string",
"email_retry_count": -9007199254740991,
"emailed": true,
"emailed_at": "string",
"email_bounced": true,
"email_bounced_at": "string",
"email_confidence_score": -9007199254740991,
"email_verification_status": "string",
"email_verified_at": "string",
"hubspot_contact_id": "string",
"hubspot_synced_at": "string",
"hubspot_sync_status": "pending",
"hubspot_sync_error": "string",
"notes": "string",
"discovered_at": "string",
"last_updated_at": "string",
"created_at": "string",
"_access": {
"is_unlocked": true,
"is_unlocking": true,
"unlocked_at": "string",
"credits_spent": 0,
"unlock_cost": 0
}
}
],
"pagination": {
"total": -9007199254740991,
"limit": -9007199254740991,
"offset": -9007199254740991,
"has_more": true
},
"_access_summary": {
"total_results": -9007199254740991,
"unlocked": -9007199254740991,
"locked_processed": -9007199254740991,
"locked_unprocessed": -9007199254740991,
"unlock_all_cost": 0
}
}{
"error": "string",
"message": "string",
"statusCode": -9007199254740991
}Promote a brief's person into a contact record POST
"Work this person". Stores a REFERENCE to the brief entry, never its prose: the approach renders from the brief and only where that brief is in scope, so one client's positioning cannot leak into another's view. A person with no corpus contact becomes an unlinked record you can merge later.
Get contact details GET
Get full details for a contact.