Search the book
How the search route works, its filters, paging and the shape of a masked result.
GET /market/catalog/search returns a page of masked records matching a sector, an area and a set of filters. Search is free and does not use your export allowance.
Turn a sector into a category
Search takes a category code, not free words. GET /market/catalog/resolve-sector?q=letting agents returns the closest categories and how many records sit in each. Pass the chosen code as category.
A search
GET /market/catalog/search?category=accountants&area=Sheffield&has_website=1&page_size=2
Authorization: Bearer <sign-in token>
{
"total": 412,
"page": 1,
"page_size": 2,
"included_sectors": [{"code": "accountants-bookkeepers", "label": "Bookkeepers"}],
"results": [
{
"lead_id": "mkt_sample0001",
"name": "Marsh and Keel Accountants",
"director_name": "Jess Morgan",
"website_domain": "marshandkeel.example",
"category_label": "Accountants",
"locality": "Sheffield",
"postcode_out": "S1",
"phone_type": "landline",
"availability": {"has_phone": true, "has_email": true, "has_website": true, "has_socials": false},
"email_type": "role",
"evidence": {"email": {"grade": "claimed"}, "website": {"grade": "proven"}},
"entity_type": "limited company",
"revealed": false
}
],
"widened": null,
"did_you_mean": []
}
A sample, trimmed. Real rows carry a few more fields such as the registered name and group details. A name is shown. An email and a phone number never are. evidence gives a grade per field, which the app draws as its labels. See Proven, Claimed, Contested, Unknown and All there is.
Filters
All are query parameters. A flag is 1 to turn it on.
| Parameter | Type | What it does |
|---|---|---|
category |
string, 60 | A category code. Several can be comma separated |
exclude_category |
string, 240 | Category codes to drop, each with its sub-sectors |
area |
string, 60 | A town, city or postcode area such as S1 or SW |
exclude_area |
string, 60 | An area to leave out |
q |
string, 80 | Words in the name, or a website address |
has_email, has_phone, has_mobile, has_website, has_socials |
flag | Only records that hold that field |
has_director, has_director_email, has_general_email, verified_email |
flag | Narrow by who or what is held |
email_status, email_kind, website_kind |
string | Narrow by kind of email or site |
entity_type |
string | Limited company, partnership and so on |
size, staff_band, employees_min, employees_max |
Size filters | |
founding_year_min, founding_year_max |
integer, 0 to 2100 | Founding year range |
recently_incorporated, new_director, leadership_change |
flag | Recent changes |
chain, registered_differs, ch_active |
flag | Group and company status filters |
strike_off |
include or only |
Include or isolate businesses flagged for closure |
sort |
newest (default) or name. Any other value gives the default quality order |
Order of results |
page |
integer, 1 or more | Page number |
page_size |
integer, 1 to 200 | Rows per page. Default 20 |
A zero is not always a zero
If a typed q finds nothing, the server may widen it or suggest names. widened says what was searched instead and did_you_mean lists real names. If a filter that only the search index can answer cannot be answered, the route returns 503 rather than ignoring the filter.
Limits
No per-minute limit applies to this route when you call it directly. The connector's tool search_leads has its own limits and a narrower set of filters: Rate limits, credits and allowances.