List leads GET
https://api.terminal.house/v1/leads?recipe={recipe}&limit={n}&cursor={cursor}
Returns scored, signal-rich parcels matching a saved recipe or an inline filter. Results are sorted by composite score descending. Each result counts as one lead-view against your monthly quota.
Lead-views explained. A lead-view is a unique
(folio, account, day) tuple. Re-querying the same parcel within 24h is free. Read the freshness policy →Authentication
Pass your API key as a bearer token. Every key is scoped — read:leads at minimum is required.
curl https://api.terminal.house/v1/leads?recipe=oos_long_tenure_high_signal&limit=10 \ -H "Authorization: Bearer th_live_...A3F1"
Query parameters
| Name | Type | Description |
|---|---|---|
| recipe* | string | Required if filter is omitted. Slug of a saved recipe (created via POST /watchlists or the web UI). |
| filter* | object | Required if recipe is omitted. Inline filter DSL — same JSON shape as POST /leads/search. DSL reference → |
| limit | integer | Page size. Default 50, max 200. Each result counts as 1 lead-view. |
| cursor | string | Opaque pagination token from a previous response's cursor field. Omit for first page. |
| min_score | float | Filter to score ≥ this value. Range 0.0 – 1.0. |
| since | timestamp | RFC3339 — only return parcels whose composite changed at or after this time. Useful for incremental sync. |
| include | string[] | Hydrate optional fields: signals, owner, valuation, permits, violations, sales_history. Default: signals, owner. |
Response
200 OK · returns a results array, a cursor for the next page (null if exhausted), and a total match count. Rate-limit and quota headers always present.
200 · OK401 · Unauthorized429 · Rate-limited142 ms · 4,853 lead-views remaining
// HTTP/1.1 200 OK// X-RateLimit-Limit: 600/min · X-RateLimit-Remaining: 587// X-Quota-Lead-Views-Remaining: 4853 · X-Quota-Resets: 2026-05-31T00:00:00Z{ "results": [ { "folio": "30-3122-008-0440", "address": "4567 NW 22nd Av, ZIP 33125", "score": 0.78, "signals_fired": ["out_of_state_owner", "code_violation", "no_homestead", "tenure_years_long"], "owner": { "name": "SUNNY HOLDINGS LLC", "registry_manager": "M. REYES", "mailing_state": "NY" }, "valuation": { "just_value": 412000, "est_equity": 298000 }, "observed_at": "2026-05-09T10:14:00Z" }, // … 9 more … ], "cursor": "eyJv...A3", "total": 340}
Errors
| Code | Body | When |
|---|---|---|
| 400 | invalid_filter | Filter DSL failed validation. Body includes field + reason. |
| 401 | unauthorized | API key missing, expired, or scope mismatch. |
| 402 | quota_exceeded | Monthly lead-views exhausted. Upgrade tier or wait for reset. |
| 429 | rate_limited | Too many requests/minute. Honor Retry-After header. |
| 5xx | upstream_unavailable | A public-records source is degraded. Cached data still served when possible. |
Next
→ POST /leads/search for ad-hoc filter recipes without saving a watchlist · Webhook events to receive new matches push-style instead of polling.