Short answer
HubSpot's docs list these search limits: 10,000 total results per query (paging beyond returns 400), 200 records per page, five requests per second per account, a 3,000-character query body, and up to five filter groups with six filters each and 18 in total. To read more than 10,000 records, sort by a stable property, page with after, and start a fresh query filtered from the last value.
1. A windowed query
POST https://api.hubapi.com/crm/v3/objects/contacts/search
{
"filterGroups": [
{ "filters": [ { "propertyName": "createdate", "operator": "GTE", "value": "1767225600000" } ] }
],
"sorts": [ { "propertyName": "createdate", "direction": "ASCENDING" } ],
"properties": ["email", "createdate"],
"limit": 200,
"after": 0
}
When you approach 10,000 results, take the last createdate you received and run the query again with GTE that value. Deduplicate on record ID, since records sharing that timestamp come back twice.
2. Other things that catch people
- New and updated records can take a few moments to appear in search.
- Archived records never appear.
- Enumeration filters are case-sensitive. IN and NOT_IN on strings need lowercase values.
- Only one sort rule per search.
3. Alternatives
For SQL-style queries, see HubSQL. For reading a whole object, see choosing a read method. Rate limits: HubSpot API rate limits.