Lead generators
Lead generators are saved investment scanners: an area (a set of outcodes or a drawn polygon) plus filter criteria (price, beds, yield, BMV, 60+ keyword flags such asprobate or needs_modernisation), persisted server-side and queryable on demand. They run against 2.1M+ live UK listings refreshed daily, so the same scanner returns new deals each time you poll it. Typical integration: create a scanner once, then page through /{lg_id}/properties (or pull the CSV export) on a schedule.
Required scope: leads:read
Cost: 1 request per call
Available on: Starter, Professional, Business
Scanner endpoints are plan-gated on the underlying account: the number of scanners you can hold is limited by subscription tier, and a free-tier account returns
403. Requests over a paid_* API key are authorised as the key owner’s account.List lead generators
Returns all active lead generators for the authenticated account, with plan limit and remaining headroom.Request
Response
Preview match counts
Fast COUNT preview for a scanner-in-the-making — see the rough size of the result set for a given area + criteria before saving. Where the chosen playbook has stored tiers, a gold/silver/bronze breakdown is included. Soft-fails (never errors): a failed count returnsstatus: "timeout" with total: 0.
Request
| Param | Type | Required | Description |
|---|---|---|---|
selected_outcodes | string[] | No* | Outcode strings, e.g. ["EH1", "EH2"] (uppercased automatically) |
polygon_wkt | string | No* | WKT geometry for a custom drawn area |
search_criteria | object | No | Filter criteria, same shape as the create endpoint |
selected_outcodes or polygon_wkt should be set — with neither, the endpoint returns an empty preview (status: "empty") without querying.
Response
| Field | Type | Description |
|---|---|---|
total | integer | Properties matching area + all criteria |
area_total | integer | Properties in the area before your criteria — if total is 0 but this is non-zero, your filters are too strict |
tier_breakdown | object | null | Gold/silver/bronze counts when the chosen playbook has stored tiers; null otherwise |
playbook | string | null | The playbook slug, if one was set in criteria |
has_tier_data | boolean | True when tier_breakdown is populated |
status | string | ok (honest count) / capped (total is a soft cap, real value higher) / timeout (count took too long — narrow the search) / empty (no area selected) |
Create a lead generator
Persists a new scanner. Eitherselected_outcodes or polygon_wkt must be provided. Plan-based scanner count limits apply — exceeding them returns 403.
Request
| Param | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Scanner name, 1–100 characters |
selected_outcodes | string[] | No* | Outcode strings, e.g. ["EH1", "EH2"] |
polygon_wkt | string | No* | WKT geometry for a custom drawn area |
search_criteria | object | No | Filter criteria (price, beds, type, yield, BMV, keyword flags, etc.) |
map_center_lat | float | No | Map centre latitude (−90 to 90) |
map_center_lng | float | No | Map centre longitude (−180 to 180) |
map_zoom | float | No | Map zoom level (1–22) |
alert_enabled | boolean | No | Enable alert notifications (default false) |
selected_outcodes or polygon_wkt is required — providing neither returns 400.
Response
Returns201 Created with the full lead generator object — same shape as a single item in the list response above.
Get a lead generator
Request
| Param | Type | Required | Description |
|---|---|---|---|
lg_id | UUID | Yes | Lead generator ID (path). Non-UUID values return 400; unknown IDs return 404 |
Response
The full lead generator object — same shape as a single item in the list response above.Update a lead generator
Only the fields you provide are changed.Request
400.
Response
The updated lead generator object.Delete a lead generator
Soft-deletes the scanner (sets it inactive). Returns204 No Content.
Request
Get matching properties
The workhorse endpoint: paginated properties matching the scanner’s area + saved criteria. Every filter below can also be passed as a query param to override or narrow the saved criteria for that request only. Results are cached for 15 minutes per unique filter combination.Request
| Param | Type | Required | Description |
|---|---|---|---|
lg_id | UUID | Yes | Lead generator ID (path) |
status | string | No | Status category or comma-separated list (OR’d): active, available, back_on_market, reduced, back_and_reduced, sold_stc, under_offer, sold, withdrawn, removed |
sort_by | string | No | newest, oldest, price_asc, price_desc, highest_yield, best_bmv, best_investment, best_btl, best_hmo, best_brrr, best_flip, best_sa, best_r2r, bedroom_potential, most_motivated, recently_reduced, best_match |
page | integer | No | Page number, ≥ 1 (default 1) |
limit | integer | No | Results per page, 1–100 (default 20) |
min_price / max_price | integer | No | Price bounds (£) |
min_bedrooms / max_bedrooms | integer | No | Bedroom bounds |
bedrooms | string | No | Comma-separated exact bedroom counts, e.g. 2,3 |
property_types | string | No | Comma-separated property types |
min_yield / max_yield | float | No | Estimated rental yield bounds (%) |
bmv_only | boolean | No | Below-market-value properties only |
bmv_threshold | float | No | Minimum BMV discount (%) |
is_auction | boolean | No | Auction properties only |
auction_date_from / auction_date_to | string | No | ISO date/datetime auction-date window (implies is_auction=true) |
auction_unsold | boolean | No | Post-auction unsold: auction date passed, listing still active/withdrawn |
price_reduced | boolean | No | Price-reduced listings only |
min_days_on_market / max_days_on_market | integer | No | Days-on-market bounds |
epc_ratings | string | No | Comma-separated EPC ratings, e.g. D,E,F |
min_floor_area_sqft / max_floor_area_sqft | float | No | Floor area bounds (sq ft) |
agent_name | string | No | Filter by estate agent name |
exclude_new_builds / exclude_auction / exclude_retirement_homes / exclude_shared_ownership | boolean | No | Exclusion toggles |
property_category | string | No | residential or commercial |
ownership_type | string | No | company, private_landlord, owner_occupied |
playbook | string | No | Playbook eligibility slug, e.g. plot_subdivision, hmo_conversion |
| Keyword flags | boolean | No | Any of 60+ boolean keyword params, passed as ?flag=true. Transaction: chain_free, cash_buyer_only, quick_sale, motivated_seller, repossessed, probate, is_portfolio, is_empty_property. Condition: needs_modernisation, development_potential, stpp, planning_granted, japanese_knotweed, structural_issues, damp_issues. Tenure: freehold, leasehold, share_of_freehold, shared_ownership, short_lease, long_lease. Investment: tenanted, hmo_potential, hmo_licensed, investment_only, article4_area, affordable_housing. Type/features/era/planning flags also accepted, e.g. ex_local_authority, is_bungalow, has_garage, has_annexe, is_victorian, in_conservation_area, is_listed_building, has_outline_planning, is_greenbelt |
Response
probate, repossessed, tenanted, hmo_potential, …), per-strategy scores (btl_score, hmo_score, flip_score, brrr_score, sa_score, r2r_score, motivation_score), BMV metadata (bmv_market_tier, bmv_confidence_level, bmv_data_source), bedroom_potential_score / bedroom_potential_tier, cash_flow, condition_tier and price_per_sqft. Null when not yet enriched.
Get status counts
Property count breakdown by status category for a scanner’s area. Accepts the same filter query params as/{lg_id}/properties (excluding status itself) so counts stay aligned with a filtered result list.
Request
Response
Export properties as CSV
Streams a CSV of properties matching the scanner. Accepts the same filter /sort_by / status query params as /{lg_id}/properties. Capped at 10,000 rows, Excel-compatible (UTF-8 with BOM). The X-Export-Row-Count response header carries the row count.
Request
Response
text/csv stream with a Content-Disposition: attachment header. Columns mirror the property fields returned by /{lg_id}/properties.
Related endpoints
- Off-market lead generators — Off-market and distressed-stock scanners
- Properties — Full property search and detail
- Investment — Yield, BMV and strategy calculations