browse_leads
Browse leads
Browse leads â rows for a shape or a saved list, or (`summary=True`) its counts, facets and price.
Two ways to say which records, one contract underneath:
* a saved list â `list_id`, the 8-char id in `#browse?list=<id>`. Its states,
filters, sort and inactive-or-holding toggle are read from the list;
pass nothing else about the shape.
* an inline shape â `filters` plus `state` (one state) or `states`
(several); omit both for every live state (CO, CT, FL, NY, TX, VA).
`summary=True` returns the summary contract instead of rows â the same
numbers the buying surface shows, from the same code path: `matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`,
`facets`, `prices`, `quote` (present when `lane` or `cap` is given),
`exact`, `computed_at`, `quote_valid_until`, `per_state`. **Only `sellable`
â a matching record whose filing names a person â is ever billed or
delivered; never quote `matching` as a price.** name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). Lanes: `all` / `best` / `contact`
(`all` = every sellable record at the name-and-address price; `best` =
each record at its own grade, verified first; `contact` = only records
with a verified phone or email). Cap: `{"type": "count|budget", "value"}`
â records for count, cents for budget. To buy, hand the same list / shape,
lane and cap to `create_checkout`.
Speak the canonical vocabulary â it is the same across every state:
`status` and `entity_type` take canonical values (`"active"`, `"LLC"`),
so `entity_type = "LLC"` matches Colorado's raw `DLLC`, Florida's `FLAL`,
and New York's spelled-out form alike; state-specific raw codes live
behind `status_raw` / `entity_type_raw` if you ever need them.
"Contacts" is the buyer's word for the records themselves â every record
names a person, so "contacts for new salons" needs no extra filter.
"Decision-makers" = filter
`contact_relevance_tier in ["Decision Maker", "Likely Decision Maker"]` â
our scored is-this-the-right-person opinion, available in EVERY state;
apply it when the buyer asks for decision-makers, never silently.
(`role_is_decision_maker: true` is the stricter, title-attested variant:
it means the state's own filing lists an authority title. Several states â
Colorado and New York among them â publish no officer titles at all, so
filtering on it there returns zero and silently drops real decision-makers.
Layer it on top only when you specifically want title-attested records.)
When a filter touches a (field, value) the requested state never populates
by design (e.g. `entity_type="SOLE_PROP"` in TX), the payload additionally
carries `zero_reasons` â machine-readable notes saying WHY the count is
zero and the nearest alternative; the key is absent otherwise. A
`formation_date` window that holds nothing explains itself the same way
on a summary: whether it ends before our earliest matching record, and
what the same filters match without the date limit.
Add `has_phone` / `has_email` for reachable ones. Worked example â active
LLC decision-makers with a phone, across all states, excluding two sectors:
browse_leads(filters=[
{"field": "status", "op": "eq", "value": "active"},
{"field": "entity_type", "op": "eq", "value": "LLC"},
{"field": "contact_relevance_tier", "op": "in",
"value": ["Decision Maker", "Likely Decision Maker"]},
{"field": "has_phone", "op": "eq", "value": true},
{"field": "industry_sector", "op": "not_in",
"value": ["Real Estate", "Finance"]},
])
`filing_kind` says what the state filing did. The default is Just started
(`formation`) â a business that did not exist before its filing â so a plain
call never returns an existing business that the state gave a new document
number. Widen with `include_existing=True` (every existing business with a
new filing at once) or by name: `filing_kind in ["registration", "conversion",
"name_change", "reinstatement", "address_change"]` returns existing businesses
the state published a fresh event about; `lead_class` on every row carries
the answer in the buyer's words â `Just started`, `New to <state>` (the
record's own state), `Established business, new entity`, `New trade name`,
`Back in business`, `Moved`. Never mix the two in one order â they are priced and
sold as separate lists. Closed businesses (`dissolution`) are excluded unless
named or `include_non_operating=True`. Every row also carries `last_event`
and `last_event_date` â the most recent thing the state published and the day
it published it.
Same owner: `cluster_size >= 2` is every business whose owner filed more
than one, so one call reaches the set; `cluster_code` is the record's place
in that group (`XF-O` / `XP-O` / `XM-O` an operating business, the `-V` codes
a holding company built around one). Blank on a single, so a filter on either
never matches a business with no related filing. `new_business_tier`
(`Confirmed new` ⦠`Established`, newest first) is how sure we are the
business is genuinely new â filter on it, never sort by it; an empty result on
a fresh cohort means the score has not reached it yet.
Filter grammar (rendered from the schema â `list_filterable_fields(section="grammar")` is the full contract): a leaf is `{"field", "op", "value"}`; the top-level filters list is an implicit `and` group; group nodes `{"op": "and", "filters": [...]}` and `{"op": "or", "filters": [...]}` nest one or more children, `{"op": "not", "filters": [<one leaf or group>]}` negates exactly one. Operators by field type â text: eq, neq, in, not_in, contains, does_not_contain, exists, missing; number: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; date: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; boolean: eq, neq; geo: within. Narrower pseudo-fields â `run_manifest_id` eq; `cluster_ref` eq; `missing_stage` eq; `created_at` gt, gte, lt, lte, between; `geo_polygon` within; `geo_radius` within; `has_phone_or_email` eq; `filing_kind` eq, neq, in, not_in; `new_business_tier` eq, neq, in, not_in. `neq`, `not_in`, `does_not_contain`, `not` keep rows where the field has no value. `exists` / `missing` take no value; `in` / `not_in` take a non-empty list; `between` takes `[start, end]`, both required. A (field, op) pair outside its type's row is a 422 naming the row, never a 500. Records appear here the morning after the state posts them â speed is measured from publication, never from filing.
Args:
state: Two-letter state code (e.g. `FL`, `CO`) for one state.
states: Several state codes (rows or summary). Omit both `state` and
`states` for every live state.
list_id: A saved list id. Mutually exclusive with `state` / `states` /
`filters` â the list already carries them.
filters: Filter clauses in the grammar above (leaves and `and` / `or` /
`not` groups). Use `list_filterable_fields` to discover the
85 fields, each one's enforced operators and allowed values.
page: 1-based page number.
page_size: Rows per page (1â200 with a key; capped at 25 on the free
tier, default 50).
sort: `[{"field", "dir"}]`, one or more keys over any of the 76 sortable fields (`asc` / `desc`); a bare field name still works with `sort_dir`. Tier fields sort by rank (reachability_tier On Fire > Very Hot > Hot > Warm > Cold; contact_relevance_tier Decision Maker > Likely Decision Maker > Probable Contact > Uncertain Contact > Unlikely Decision Maker; contact_confidence_tier Verified Contact > Likely Contact > Possible Contact > Uncertain Contact; industry_confidence_tier confirmed > likely > possible > unknown; new_business_tier Confirmed new > Likely new > Uncertain > Likely established > Established); lead_ref ASC is always appended (total order). An unknown field or direction is a 422 listing the sortable fields â never a silent fallback. Default `reachability_score` descending.
sort_dir: `asc` or `desc` (default `desc`) â used when `sort` is a bare field name.
include_non_operating: Include inactive or holding businesses
(default False â only the records we sell). A saved list's own
toggle wins when `list_id` is given.
include_existing: Include existing businesses with a new filing â
opening a location here, formed in another state, back in
business, a new entity, moved, a new trade name (default False â
Just started only). Naming a `filing_kind` implies it.
summary: Return the summary contract (counts, facets, prices, quote)
instead of rows. Implied when `lane` or `cap` is given.
lane: `all` / `best` / `contact` â asks the summary for a `quote`.
cap: `{"type": "count|budget", "value": <int>}` â the dial the quote is
solved against (records for count, cents for budget).
Returns:
Rows: `{"items": [...], "total", "page", "page_size", "pages", "access_level",
"_meta"}`. `_meta` is the provenance block every read carries:
`schema_version` (the read-contract version â pin migrations to it),
`freshness.data_refreshed_at` (when this state's data was last worked),
`source` (public registry + derived-field attribution), `score_versions`,
and `access_level` (preview = masked contacts, full = keyed). Keyless
callers see `contact_name`, `email_primary`, `phone_primary` masked and may not filter the summary on them (422).
Summary: the contract described above.
Lecture seule
Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'browse_leadsArguments', 'properties': {'cap': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Cap', 'default': None}, 'lane': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Lane', 'default': None}, 'page': {'type': 'integer', 'title': 'Page', 'default': 1}, 'sort': {'anyOf': [{'type': 'string'}, {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Sort', 'default': None}, 'state': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'State', 'default': None}, 'states': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'States', 'default': None}, 'filters': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Filters', 'default': None}, 'list_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'List Id', 'default': None}, 'summary': {'type': 'boolean', 'title': 'Summary', 'default': False}, 'sort_dir': {'type': 'string', 'title': 'Sort Dir', 'default': 'desc'}, 'page_size': {'type': 'integer', 'title': 'Page Size', 'default': 50}, 'include_existing': {'type': 'boolean', 'title': 'Include Existing', 'default': False}, 'include_non_operating': {'type': 'boolean', 'title': 'Include Non Operating', 'default': False}}}
Schéma de sortie
{'type': 'object', 'title': 'browse_leadsDictOutput', 'additionalProperties': True}
checkout_list
Checkout link for a list
Turn a quoted list into a payment link a person completes â the buyer gets the file within a minute of paying.
Creating the link costs nothing and charges nobody â payment only happens
if a human opens the returned `checkout_url` and completes it on Stripe's
hosted page. Hand the URL to your human; do not represent the purchase as
complete until they confirm payment. Nothing is charged until a person completes checkout; the file arrives about a minute after they pay; if we find a phone or email on the records after that, the updated file replaces it on the order's receipt page within a few hours and the receipt shows what was found and billed. A hard bounce, a disconnected phone or the wrong person is replaced within 30 days; what you buy is yours to re-download any time.
Pass a saved list (`list_id`, `#browse?list=<id>`) or the inline shape
`filters` + `states` (omit `states` for every live state:
CO, CT, FL, NY, TX, VA), a `lane` (`all` / `best` / `contact`) and an optional `cap`
(`{"type": "count|budget", "value"}` â records for count, cents for
budget). The list is quoted through the same summary path `quote_list`
uses, then checkout is opened against exactly that quote â if the price
rule or the count moved in between, the server answers 409 with the fresh
quote and nothing is minted. **Billing base is `sellable` (a matching
record whose filing names a person), never `matching`.** name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). The
selected records are frozen when the link is minted, so what is billed is
what is delivered. After payment we go find a phone and email on every
record bought without one: the buyer authorizes a ceiling (`ceiling_cents` â
today's total plus the forecast upgrades), is charged `charged_now_cents` for
what exists now, and later only what we find, at that grade's price and
never above the ceiling. Every record ships the owner's name and mailing address plus the business facts â the business name, entity type and status, the state filing number and formation date, the industry with its NAICS, SIC and Google Business codes, the registered agent, the Lead Reference, and the Reachability, Contact Relevance and Contact Confidence scores; open the exact file before paying (ten made-up records, every column): https://app.goodleads.club/api/v1/commerce/sample-file?format=xlsx (or format=csv). A standing order on the same list (new matches on a
daily / weekly / monthly / quarterly cadence, billed monthly by the record
actually delivered, at the same graded rule) is set up from the paid
order's receipt â this tool sells the one-time purchase.
`delivery`: `file` (the customer workbook â CSV / Excel / JSON, yours to
re-download any time), `crm` (push into `crm_connection_id`), or
`connector` (the file ships today and `connector_crm_name` is recorded as
a request for that CRM).
`include_existing`: the order is Just started only â brand-new businesses â
unless you pass this (or name `filing_kind` / `business_origin` in
`filters`); then existing businesses with a new filing are in the file too,
labeled, and the file's Read Me says you asked for them.
`offer_code`: the offer code your human was given, if any â the same one
you quoted with. Every grade then bills at the lower of list and the
offer; a code bound to one buyer needs their `customer_email`; a code
that cannot cover the whole list answers with the cap to set.
Returns: `checkout_url`, `order_id`, `session_id`, `records`,
`total_cents`, `currency`, `lines` (one per grade), `lane`, `cap`,
`price_rule_version`, `quote_valid_until`, `computed_at`, `exact`,
`counts` (`matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`), `offer` (when a code priced it), `saved_list` (`id`, `url`, `name`, and the
one-time `claim_token` when this call saved an inline shape as a list),
`after_payment` and `guarantee` (the two sentences above, to relay), and â
when there are records to find on after payment â `ceiling_cents`,
`charged_now_cents` and `ceiling_note`.
Schéma d’entrée
{'type': 'object', 'title': 'checkout_listArguments', 'properties': {'cap': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Cap', 'default': None}, 'lane': {'type': 'string', 'title': 'Lane', 'default': 'best'}, 'states': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'States', 'default': None}, 'filters': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Filters', 'default': None}, 'list_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'List Id', 'default': None}, 'delivery': {'type': 'string', 'title': 'Delivery', 'default': 'file'}, 'offer_code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Offer Code', 'default': None}, 'customer_email': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Customer Email', 'default': None}, 'include_existing': {'type': 'boolean', 'title': 'Include Existing', 'default': False}, 'crm_connection_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Crm Connection Id', 'default': None}, 'connector_crm_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Connector Crm Name', 'default': None}}}
Schéma de sortie
{'type': 'object', 'title': 'checkout_listDictOutput', 'additionalProperties': True}
create_checkout
Checkout link for a list (older name)
Mint a hosted Stripe Checkout link for a list you shaped â the same code as `checkout_list`.
Creating the link costs nothing and charges nobody â payment only happens
if a human opens the returned `checkout_url` and completes it on Stripe's
hosted page. Hand the URL to your human; do not represent the purchase as
complete until they confirm payment.
For new work, use the dedicated buying journey: `interpret_list` (the
buyer's words â a shape) or `list_starters` (ready-made lists with live
counts) â `quote_list` (graded counts + the price) â `checkout_list`
(this link). This tool keeps accepting a list for compatibility â the
list path is the same code as `checkout_list`.
What you can buy: a list â `list_id` (a saved list, `#browse?list=<id>`) or the
inline shape `filters` + `states` (omit `states` for every live state:
CO, CT, FL, NY, TX, VA), with a `lane` (`all` / `best` / `contact`) and an optional `cap`
(`{"type": "count|budget", "value"}` â records for count, cents for budget).
The list is quoted through the same summary code path `browse_leads(summary=True)`
uses, then checkout is opened against exactly that quote â if the price
rule or the count moved in between, the server answers 409 with the
fresh quote and nothing is minted. **Billing base is `sellable` (a
matching record whose filing names a person), never `matching`.**
name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). The selected records are frozen when the link is minted, so
what is billed is what is delivered.
`product_id` buys nothing: fixed-price shelf products were replaced by
starter lists with live counts. Passing one returns an error that names
the next calls â `list_starters` (or `interpret_list`), `quote_list`,
`checkout_list`. Every purchase is one-time; a standing order is set up
from a paid order's receipt, billed monthly for the records actually
delivered.
`delivery`: `file` (the customer workbook â CSV / Excel / JSON, durable
re-download), `crm` (push into `crm_connection_id`), or `connector`
(the file ships today and `connector_crm_name` is recorded as a request
for that CRM). Delivery fires automatically on payment, typically within
a minute.
Returns: `checkout_url`, `order_id`, `session_id`, `records`,
`total_cents`, `currency`, `lines` (one per grade), `lane`, `cap`,
`price_rule_version`, `quote_valid_until` (counts refresh tomorrow
morning; the quote holds until then â and the frozen selection holds for
the life of the checkout session), `computed_at`, `exact`, `counts`
(`matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`), and `saved_list` (`id`, `url`, `name`, and the one-time
`claim_token` when this call saved an inline shape as a list).
Nothing is charged until a person completes checkout; the file arrives about a minute after they pay; if we find a phone or email on the records after that, the updated file replaces it on the order's receipt page within a few hours and the receipt shows what was found and billed. A hard bounce, a disconnected phone or the wrong person is replaced within 30 days; what you buy is yours to re-download any time.
Schéma d’entrée
{'type': 'object', 'title': 'create_checkoutArguments', 'properties': {'cap': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Cap', 'default': None}, 'lane': {'type': 'string', 'title': 'Lane', 'default': 'best'}, 'states': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'States', 'default': None}, 'filters': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Filters', 'default': None}, 'list_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'List Id', 'default': None}, 'delivery': {'type': 'string', 'title': 'Delivery', 'default': 'file'}, 'offer_code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Offer Code', 'default': None}, 'product_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Product Id', 'default': None}, 'customer_email': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Customer Email', 'default': None}, 'crm_connection_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Crm Connection Id', 'default': None}, 'connector_crm_name': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Connector Crm Name', 'default': None}}}
Schéma de sortie
{'type': 'object', 'title': 'create_checkoutDictOutput', 'additionalProperties': True}
interpret_list
Interpret a list request
Start here: the buyer's own words become a list we can count, price and sell.
Give it what the buyer would type ("cleaning companies in Texas", "denver
plumbers formed last 30 days with a phone", "NAICS 238220") and you get
back a list shape in the one filter contract â `states`, `filters`, `sort`,
`lane`, `cap` â with a one-sentence `readback` to show the buyer, `assumed`
(every default and substitution, named), `unresolved` (the words it could
not place) and up to three `alternatives`. It is the same interpreter
behind the buy page's search box, so a person and an agent get the same
list from the same words. It never answers in prose, never asks a question
back, never looks a person up, and never emits a predicate on a masked
field (`contact_name`, `email_primary`, `phone_primary`).
When the buyer asked a question or raised an objection instead ("where does
this come from", "is it legal to call", "how fresh"), the response also
carries `answer` (`{family, headline, body, next_step, facts}`) â our
answer, in our words. Relay it to the buyer verbatim.
When the ask pulls two ways â the newest records AND a phone to call â
`alternatives` come back live-quoted (`quote: {records, total_cents,
unit_cents}`, a `why`, one `recommended`): call today · mail first with
phones verified on order · a standing order. The close is two questions:
present your human the quoted choice, then hand over the payment link for
the one chosen â per record, no minimums, so a small first order is the
normal first step.
Next: hand the shape to `quote_list` for the count and the price, then to
`checkout_list` to buy it.
Args:
text: What the buyer typed, in their own words.
state: Optional two-letter state hint (live states: CO, CT, FL, NY, TX, VA).
current: Optional current shape `{states, filters, lane, cap}` â the
answer merges into it instead of starting over.
Returns:
`{states, filters, sort, lane, cap, readback, assumed, unresolved,
alternatives, used_model}` â always a shape, never a 500.
Lecture seule
Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'interpret_listArguments', 'required': ['text'], 'properties': {'text': {'type': 'string', 'title': 'Text'}, 'state': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'State', 'default': None}, 'current': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Current', 'default': None}}}
Schéma de sortie
{'type': 'object', 'title': 'interpret_listDictOutput', 'additionalProperties': True}
list_filterable_fields
Filterable fields and grammar
The filter contract, from the schema endpoint (`GET /api/v1/schema/attributes?include=grammar`): fields, grammar, or recipes.
Call this before building `browse_leads` filters you haven't used before.
Args:
section: `fields` (default) â every one of the 85 filterable
fields as `{"field", "label", "type", "operators", "sortable",
"masked", "allowed_values"?, "description", "job", "absence",
"synonyms"}`: `operators` is the ENFORCED set for that field (its
type's row, or a narrower pseudo-field override), `sortable`
flags the 76 fields `sort` accepts, `masked` flags
`contact_name`, `email_primary`, `phone_primary` (redacted for keyless callers, who may not filter the
summary on them), `allowed_values` lists the vocabulary where it is
enumerable (tiers in rank order, canonical `status` / `entity_type`
values â identical across all states), `job` names the jobs-ladder
step the field serves (LINK / CHOOSE / REACH, or IDENTITY),
`absence` states what a zero/null means per state where states
differ, and `synonyms` lists the buyer words that name this field;
canonical-vocabulary fields additionally carry `"canonical": true`,
the `"values"` list and a `"raw_variant"` naming the sibling field
that filters the raw state-specific SOS codes.
`grammar` â the leaf and group shapes (`and` / `or` / `not`), the
operator row per field type and the pseudo-field overrides, the
null semantics of the negative operators, and the sort contract
(multi-key shape, rank-ordered tier fields, tiebreaker) â plus
`sortable_fields` and `masked_fields` projected from the same
response. Filter grammar (rendered from the schema â `list_filterable_fields(section="grammar")` is the full contract): a leaf is `{"field", "op", "value"}`; the top-level filters list is an implicit `and` group; group nodes `{"op": "and", "filters": [...]}` and `{"op": "or", "filters": [...]}` nest one or more children, `{"op": "not", "filters": [<one leaf or group>]}` negates exactly one. Operators by field type â text: eq, neq, in, not_in, contains, does_not_contain, exists, missing; number: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; date: eq, neq, gt, gte, lt, lte, between, in, not_in, exists, missing; boolean: eq, neq; geo: within. Narrower pseudo-fields â `run_manifest_id` eq; `cluster_ref` eq; `missing_stage` eq; `created_at` gt, gte, lt, lte, between; `geo_polygon` within; `geo_radius` within; `has_phone_or_email` eq; `filing_kind` eq, neq, in, not_in; `new_business_tier` eq, neq, in, not_in. `neq`, `not_in`, `does_not_contain`, `not` keep rows where the field has no value. `exists` / `missing` take no value; `in` / `not_in` take a non-empty list; `between` takes `[start, end]`, both required. A (field, op) pair outside its type's row is a 422 naming the row, never a 500.
`recipes` â the outcome-recipe bank (`GET /api/v1/schema/recipes`):
jobs-to-be-done answered with the exact filters, what each score
means for that job, and the load-bearing caveats.
The same payload backs the Browse UI's filter builder, so anything listed
here works on browse, summary, export, checkout and pipeline scoping alike.
Lecture seule
Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'list_filterable_fieldsArguments', 'properties': {'section': {'type': 'string', 'title': 'Section', 'default': 'fields'}}}
quote_list
Quote a list
What this list costs before anyone pays: how many records name a person, and the price by grade.
Pass a saved list (`list_id`, the 8-char id in `#browse?list=<id>`) or an inline
shape (`filters` + `states`; omit `states` for every live state:
CO, CT, FL, NY, TX, VA). You get the same numbers the buy page shows a person:
`matching`, `sellable`, `verified_one`, `verified_both`, `no_channel`, `unnamed`, `facets`, `prices` (the live graded price rule +
`price_rule_version`), `quote` (present when `lane` or `cap` is given),
`exact`, `computed_at`, `quote_valid_until` (counts refresh tomorrow
morning; the quote holds until then), `per_state`, and the `_meta`
provenance block every read carries (schema_version, freshness, source,
access_level). When a count is zero by design the payload adds
`zero_reasons` â a state that never publishes the value, or a channel
asked of records too new to carry one yet: the morning after the
state posts a filing the record carries the name and mailing address;
phone and email are verified when you order. Each reason names the
widened count (`nearest_alternative`, e.g. "last 90 days: 99 with a
phone") and the filters that reach it (`alternative_filters`) â relay it
instead of a silent $0.
**Billing discipline â read before quoting money to anyone.** Only
`sellable` records â matching records whose filing names a person â are
ever billed or delivered. `matching` includes `unnamed` records with no
person to reach; it is never a billable count and must never be presented
as one. Every price line is computed from `sellable` and its grades:
name and address $0.25 per record · plus one verified phone or email $0.50 · plus both $0.70 (price rule v1; live prices always come from the summary call's `prices` block). Lanes: `all` / `best` / `contact` (`all` = every sellable record at the
name-and-address grade; `best` = each record at its own grade, verified
first; `contact` = only records with a verified phone or email â add a
`has_email` filter for emailable now, `has_phone` for callable now). Cap:
`{"type": "count|budget", "value"}` â records for count, cents for
budget. Quote the server's numbers, never arithmetic of your own.
Each `quote.lines[]` entry carries `ships` (what a record at that grade
ships with, in the buyer's words â a name-and-address record never ships a
phone or email), and the summary carries `forecast` ({checked,
phone_expected, email_expected, both_expected, basis, as_of}): how many of
the records still to find on would come back with a verified phone or email,
from our measured outcomes on comparable records â relay it with its basis.
`ceiling_cents` is the most a buyer can be charged: today's total plus the forecast upgrades, charged only for what we find. Every record ships the owner's name and mailing address plus the business facts â the business name, entity type and status, the state filing number and formation date, the industry with its NAICS, SIC and Google Business codes, the registered agent, the Lead Reference, and the Reachability, Contact Relevance and Contact Confidence scores; open the exact file before paying (ten made-up records, every column): https://app.goodleads.club/api/v1/commerce/sample-file?format=xlsx (or format=csv).
The close is two questions: put the quoted choice in front of your human
â callable now (a verified phone), emailable now (a verified email, verified
for deliverability and recent activity), or newest, mail-first â plus a
standing order, then hand over the payment link for the one chosen â per
record, no minimums, so a small first order is the normal first step.
Next: to buy exactly what was quoted, hand the same list / shape, lane and
cap to `checkout_list`.
**Offer codes.** If your human was given an offer code â a price we agreed
with them, like `GL-7K3Q9M` â pass it as `offer_code` here AND on
`checkout_list`, so the quote and the payment link carry the same price.
A code is a ceiling: every grade bills at the lower of list and the
offer, never above list, and the reply adds an `offer` block (what is
left on it, when it expires). A code that cannot be used answers with
the reason in plain words â relay it, then quote again without the
code for list price.
Args:
list_id: A saved list id. Mutually exclusive with `states` / `filters`.
states: State codes for an inline shape; omit for every live state.
filters: Filter clauses in the one contract (see `list_filterable_fields`).
include_held: Include inactive-or-holding entities (default False).
include_existing: Include existing businesses with a new filing (a
registration, a conversion, a reinstatement, a move, a rename) â
the default quotes Just started only, exactly as Browse and the
file do. Naming `filing_kind` / `business_origin` in `filters`
widens on its own.
lane: `all` / `best` / `contact` â asks for a `quote`.
cap: `{"type": "count|budget", "value": <int>}` â the dial the quote
is solved against.
offer_code: The offer code your human was given, if any.
Returns:
The summary contract described above. Keyless callers may not filter
on `contact_name`, `email_primary`, `phone_primary` (422).
Lecture seule
Idempotent
Schéma d’entrée
{'type': 'object', 'title': 'quote_listArguments', 'properties': {'cap': {'anyOf': [{'type': 'object', 'additionalProperties': True}, {'type': 'null'}], 'title': 'Cap', 'default': None}, 'lane': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Lane', 'default': None}, 'states': {'anyOf': [{'type': 'array', 'items': {'type': 'string'}}, {'type': 'null'}], 'title': 'States', 'default': None}, 'filters': {'anyOf': [{'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}}, {'type': 'null'}], 'title': 'Filters', 'default': None}, 'list_id': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'List Id', 'default': None}, 'offer_code': {'anyOf': [{'type': 'string'}, {'type': 'null'}], 'title': 'Offer Code', 'default': None}, 'include_held': {'type': 'boolean', 'title': 'Include Held', 'default': False}, 'include_existing': {'type': 'boolean', 'title': 'Include Existing', 'default': False}}}
Schéma de sortie
{'type': 'object', 'title': 'quote_listDictOutput', 'additionalProperties': True}