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.

request
curl https://api.terminal.house/v1/leads?recipe=oos_long_tenure_high_signal&limit=10 \  -H "Authorization: Bearer th_live_...A3F1"

Query parameters

NameTypeDescription
recipe*stringRequired if filter is omitted. Slug of a saved recipe (created via POST /watchlists or the web UI).
filter*objectRequired if recipe is omitted. Inline filter DSL — same JSON shape as POST /leads/search. DSL reference →
limitintegerPage size. Default 50, max 200. Each result counts as 1 lead-view.
cursorstringOpaque pagination token from a previous response's cursor field. Omit for first page.
min_scorefloatFilter to score ≥ this value. Range 0.0 1.0.
sincetimestampRFC3339 — only return parcels whose composite changed at or after this time. Useful for incremental sync.
includestring[]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
json
// 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

CodeBodyWhen
400invalid_filterFilter DSL failed validation. Body includes field + reason.
401unauthorizedAPI key missing, expired, or scope mismatch.
402quota_exceededMonthly lead-views exhausted. Upgrade tier or wait for reset.
429rate_limitedToo many requests/minute. Honor Retry-After header.
5xxupstream_unavailableA 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.