GoodLeads API

GoodLeads gives you every newly formed US business: the owner’s name, a mailing address and, where verified, a phone and email. The data is ready the morning after the state posts the filing.

Not a developer? Build a list and buy it in your browser. You get the same records at the same prices, with no key.

Not sure your buyers are here? Describe what you sell. The count is free. Try it on the buy page, or send your words to GET /v1/answers?q=.

Which API for what

GoodLeads has two read surfaces over the same records. Pick the one that fits your job.

Partner API /v1Website API /api/v1
Use it toBuy and sync. Get a quote, place an order, read what you bought, and pull each morning's new businesses.Size and explore. Get counts, cross-tabs, industry code translation, plain-words interpretation and saved lists.
Fields you can filter on49 (52 with a key)85
PromiseA stable contract with dated versions. We only add. A change that could break your code ships as a new version.The richer read surface that the buy page and the MCP server use. It has no dated-version promise. Build a product on /v1. Read-only sizing here is fine.
KeyFree to read without a key. You need a key to quote and order.No key for counts and industry code translation. Contact details stay masked.

Why /v1 lists fewer fields: /v1/fields lists the fields that the public API lets you filter on. The owner's name, phone and email are never filterable. /api/v1/schema/attributes lists the full website schema. The website schema is wider. It also has fields that the public API does not filter on, and the owner contact fields (masked without a key). Where both list a field, the names, operators and values are the same.

Which way in fits which client

There are three ways in. They give the same records and the same counts. Do you want to set up an AI agent, not write code? Read the setup guide.

MCP address

Clients that can add a remote MCP server

Claude, Cursor, VS Code, Gemini Spark, Perplexity and Grok accept the address directly. ChatGPT needs one more step. A person must turn on Developer mode in the ChatGPT settings. This takes about one minute and happens one time. An agent in a chat cannot do this step.

https://mcp.goodleads.club/mcp

Paste the address where your client asks for a remote MCP server. You need no key and no account.

Plain web addresses

Any agent that can fetch a web address

A ChatGPT chat without the connector, a script, a notebook, or any tool that can make a GET request.

GET https://app.goodleads.club/api/v1/counts
GET https://app.goodleads.club/api/v1/crosswalk?q=MCC%205812

GET /api/v1/counts sizes a market. It takes states, filters as JSON, and group_by with up to two fields. GET /api/v1/crosswalk?q=MCC%205812 translates an industry between code systems. You need no key. Contact details stay masked.

The buy page

A person

Use this way if you want a list and prefer to click, not connect or code.

https://app.goodleads.club/buy.html

Say who you sell to. See the count and the price. Pay on a hosted page.

Start from your job

Start in four calls

  1. Get your keys

    Enter your email. You get a test key and a live key. Get your keys.

  2. See today’s new businesses

    You need no key. Owner details stay hidden until you buy.

  3. Price it

    A free quote shows the count, the total, and the most the order can cost.

  4. Buy it

    Use your live key and a new Idempotency-Key. You get a checkout link. After you pay, read the records with GET /v1/orders/{order_id}/records.

Get API keys

We email you a link. It works one time, for 30 minutes. It shows your two keys:

Test key gl_test_…Build with it. It can search and quote. It cannot order. It never returns real people.
Live key gl_live_…Buy with it. You pay for every order on a checkout page before any record opens.

Send it as
Add Authorization: Bearer gl_live_… to every call.
Keep it
Keep it on your server. Never put it in a browser, an app, a web address or a log.
Limits
Live key 120 calls a minute, test key 60, no key 30. A 429 response says how long to wait.
Allowed uses
You can use the data for sales, marketing, CRM, research, and building it into a product. We refuse credit, employment, insurance and tenant screening.
Lost a key?
Ask for a new link above. To switch off an old key, email hello@goodleads.club.
What you bought
A read of a record you bought shows the owner’s details as your purchase shipped them. You can download your records again at any time.

What you can do

JobCallKey
Start from your buyer’s jobGET /v1/jobsNo
Ask in plain words, get filters and a free countGET /v1/answersNo
Find new businessesGET /v1/leads/newNo
Search all businessesGET /v1/leadsNo
Look up one business by Lead IDGET /v1/leads/{lead_id}No
See pricesGET /v1/pricingNo
Price a listPOST /v1/quotesYes
Buy a listPOST /v1/ordersYes
Get what you boughtGET /v1/orders/{order_id}/recordsYes
Report a bad record. We replace it within 30 days.POST /v1/feedbackYes

Coming next: standing orders from your code, notifications to your server when new records land, practice orders with made-up records and billing to an account.

Standing orders on the website. Set it up from your first order's receipt. The first delivery goes out when delivery opens.

Do you prefer to click, not code? Buy a list on the website. You get the same records at the same prices.

Size a market by industry and place

This is free. You need no key, and contact details stay masked. Counts start from just-started businesses and show when we computed them. Widen the filter to widen the market.

Two calls. First translate an industry. Then count it and split it by residential or commercial address:

curl -G "https://app.goodleads.club/api/v1/crosswalk" --data-urlencode "q=MCC 5812"

curl -G "https://app.goodleads.club/api/v1/counts" \
  --data-urlencode 'filters=[{"field":"mcc","op":"eq","value":"5812"}]' \
  --data-urlencode "group_by=property_classification"

The same group_by works in a JSON body with POST /api/v1/leads/summary. Read the guides: /counts.llms.txt and /crosswalk.llms.txt.

Filter values are forgiving. Case, spacing and plurals do not matter. Everyday words work: cell means mobile, CST means every Central time-zone zone, and Texas means TX. Working from home means a residential address. Every answer carries interpreted_values, the values we understood. For a value we could not place, the answer also carries value_hints, the closest real values.

Keep a daily sync

Filters

A filter is a JSON list of {"field", "op", "value"}. Every item in the list must match. To group items, use {"op": "or", "filters": [...]}.

[
  {"field": "industry_sector", "op": "eq", "value": "construction"},
  {"field": "has_phone", "op": "eq", "value": true},
  {"op": "or", "filters": [
    {"field": "principal_city", "op": "eq", "value": "Tampa"},
    {"field": "principal_city", "op": "eq", "value": "Orlando"}
  ]}
]

Limits

Partners and resellers

This section is for CRMs, directories, marketplaces and agents that want every new business on the day it exists. It describes what is in place today.

Errors

Every error has a stable code and a request_id to quote to us. Many errors also have a next_step. Use code in your logic, not the wording.

StatusCodeMeaningWhat to do
The table loads with the page.

New codes can appear. If you do not know a code, use its HTTP status.

Versions

For AI agents

API reference

The full contract is /v1/openapi.json (OpenAPI 3.1). Import it into Postman or generate a client.

Every endpoint:

MethodPathWhat it doesKey
GET/v1Describe the APINo
GET/v1/jobsBuyer jobs: why GoodLeads fits, and ready filtersNo
GET/v1/jobs/{job_id}One buyer jobNo
GET/v1/answersAnswer a buyer's intent, in plain wordsNo
GET/v1/statesThe states we carry, and when each last loadedNo
GET/v1/fieldsEvery field you can filter onNo
GET/v1/pricingCurrent per-record pricesNo
GET/v1/meThe key you are calling withYes
POST/v1/keysGet API keys — we email you a one-time linkNo
POST/v1/keys/claimExchange your key link for a test key and a live key (shown once)No
GET/v1/leadsFind leadsNo
GET/v1/leads/newNew leads — today's run, the last few days, or since your last pollNo
GET/v1/leads/{lead_id}Get one lead by its Lead IDNo
POST/v1/feedbackReport on a record you boughtYes
GET/v1/feedbackYour reports, newest firstYes
GET/v1/feedback/{feedback_id}One reportYes
POST/v1/quotesPrice a listYes
POST/v1/ordersOrder a listYes
GET/v1/orders/{order_id}Get one of your ordersYes
GET/v1/orders/{order_id}/recordsThe records an order boughtYes

Try it

These buttons call the API from this page. You need no key.