Local Business Intelligence API

A name and a city is not an identity — this returns the match, and how sure it is

The Local Business Enrichment API resolves a business to structured data as clean JSON.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Local Business Intelligence endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
L
/enrich-local/v1

2 active endpoints. Every call is 8 credits.

  • POST/enrich-local/v1/business_lookup
  • POST/enrich-local/v1/batch

What Local Business Intelligence endpoints does ReefAPI ship?

2 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

2 endpoints

business_lookup

8 cr

name+location ‖ place_query → matched place (Google Maps) + multi-source review presence + we…

required
optional
name, location, place_query, lat, lng, country, yelp_enc_biz_id, include, exclude

batch

8 cr

enrich up to 10 businesses in one call (lead-list use-case.

required
businesses
optional
include, exclude

Every parameter, every allowed value →

Local Business Intelligence API

2 of 2 endpoints, ready to run

View docs ↗

One business, resolved and enriched: the matched place with address, phone, category, star rating, coordinates and today's hours; a match block with the confidence, how close the name was, how many other candidates were weighed and how far behind the runner-up finished; which review sites carry it and with what; the website's age, registrar, certificate and DNS; recent news mentions; and a list of legitimacy signals with an explicit list of what stayed unknown.

8 credits0 required · 8 optional
POST/enrich-local/v1/business_lookup
ok10545 ms · 1 records · sample
{
  "ok": true,
  "meta": {
    "api": "enrich-local",
    "endpoint": "business_lookup",
    "mode": "live",
    "latency_ms": 10545.1,
    "record_count": 1,
    "cache_hit": false
  },
  "data": {
    "provenance": {
      "place": {
        "status": "matched",
        "engine": "google-maps"
      },
      "reviews": {
        "status": "matched",
        "engine": "google-maps+yelp+tripadvisor+trustpilot",
        "real_sources": [
          "trustpilot"
        ],
        "coverage_note": "Yelp: pass `yelp_enc_biz_id` to receive review samples. Without it this endpoint reports Yelp presence only — the rating and review count — which are real values, not estimates. Tripadvisor (travel/hospitality) provides review samples for this business. Trustpilot is matched by the business's website domain, and is reported only when a real profile is matched."
      },
      "website": {
        "status": "matched",
        "engine": "domain-intel"
      },
      "presence": {
        "status": "error",
        "engine": "google-search",
        "missing_reason": "error"
      },
      "news": {
        "status": "matched",
        "engine": "news-intel",
        "negative_hits": 1
      },
      "legitimacy": {
        "status": "matched",
        "engine": "composite",
        "signal_count": 8,
        "unknown_count": 4
      }
    },
    "freshness": "2026-08-29T22:36:40Z",
    "place": {
      "fid": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
      "place_id": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
      "cid": "3545819340560108778",
      "name": "Katz's Delicatessen",
      "rating": 4.5,
      "category_primary": "Deli",
      "categories": [
        "Deli",
        "American restaurant",
        "Jewish restaurant"
      ],
      "address": "205 E Houston St, New York, NY 10002",
      "locality": "New York, NY 10002",
      "latitude": 40.722232999999996,
      "longitude": -73.98742899999999,
      "website": "https://katzsdelicatessen.com/",
      "domain": "katzsdelicatessen.com",
      "phone": "+12122542246",
      "phone_display": "(212) 254-2246",
      "hours_today": [
        "Open 24 hours"
      ],
      "maps_url": "https://www.google.com/maps?cid=3545819340560108778"
    },
    "match": {
      "match_confidence": 0.97,
      "name_similarity": 1,
      "distance_km": null,
      "geo_validated": false,
      "alternatives_considered": 1,
      "runner_up": null
    },
    "coverage_note": "Yelp: pass `yelp_enc_biz_id` to receive review samples. Without it this endpoint reports Yelp presence only — the rating and review count — which are real values, not estimates. Tripadvisor (travel/hospitality) provides review samples for this business. Trustpilot is matched by the business's website domain, and is reported only when a real profile is matched.",
    "review_presence": {
      "google": {
        "found": false,
        "rating": 4.5,
        "review_count": null,
        "note": "Google Maps provides a star rating only (review text is not available from this source). Review samples come from Yelp (US/CA businesses), Tripadvisor (travel categories), and Trustpilot (by domain)."
      },
      "yelp": {
        "found": false,
        "unknown": true,
        "missing_reason": "the web-index lookup that finds a business's Yelp page could not be completed on this run, so Yelp presence is unknown rather than absent. Pass `yelp_enc_biz_id` to skip the lookup entirely."
      },
      "tripadvisor": {
        "found": false,
        "unknown": true,
        "missing_reason": "the web-index lookup that finds a business's Tripadvisor page could not be completed on this run, so Tripadvisor presence is unknown rather than absent."
      },
      "trustpilot": {
        "found": true,
        "name": "katzsdelicatessen.com",
        "domain": "katzsdelicatessen.com",
        "trust_score": 3.3,
        "stars": 3.5,
        "review_count": 2,
        "is_claimed": false,
        "sample": [
          {
            "rating": 2,
            "title": "Food is amazing but prices are a joke…",
            "text": "Food is amazing but prices are a joke 47 dollars for one sandwich and coke and a bottle water.",
            "date": "2023-09-13T01:42:26.000Z"
          },
          {
            "rating": 5,
            "title": "The meat melts in your mouth!",
            "text": "The meat melts in your mouth!  Make sure you don't lose your tickets.  Try to get there before lunch so that the line isn't too long.",
            "date": "2022-04-22T06:29:14.583Z"
          }
        ]
      }
    },
    "website": {
      "domain": "katzsdelicatessen.com",
      "registered": true,
      "registrar": "GoDaddy.com, LLC",
      "domain_created": "2010-08-10T19:06:45Z",
      "domain_age_days": 5863,
      "ssl_active": true,
      "ssl_latest_issuer": "C=US, O=Let's Encrypt, CN=YE1",
      "dns_summary": {
        "A": 2,
        "AAAA": 0,
        "MX": 5,
        "TXT": 3,
        "NS": 4,
        "CNAME": 0,
        "SOA": 1,
        "CAA": 0
      },
      "website_alive": true
    },
    "presence": {
      "indexed": null,
      "top_results": [],
      "unknown": true,
      "note": "the web-index lookup did not answer on this run, so this business's indexed presence is unknown — this is NOT a finding that it is absent from the web."
    },
    "negative_news": {
      "found": true,
      "count": 1,
      "scanned": 97,
      "articles": [
        {
          "title": "Katz’s Deli will become accessible to the disabled after federal lawsuit",
          "url": "https://news.google.com/rss/articles/CBMirgFBVV95cUxNUk1jeEFRSDQ0RHhHQTNfMFpJekNzUFF3SnJsZUlrNTUxYnI1SjlNTHVPM1cyMXlHWEl1aEJXdGxYN2trY2h0OUR0dFhLSzNlS1pXdldFOGFoU2ZfN29Gd0g3SFVrMkxmdkxpUmxfdjU3Xzk0cVBSZk9ydkJScHpOeUcxdEVYeHlqb0Y1RnphVFJDTVBwb2VXdlFjUnZ0WGxLZEltRzhta1dDMWE5UUHSAbMBQVVfeXFMT3pXV0pSWTVKSThaN3pwUTlxd1pnZ05QM1NHX3JDQ2hHNWY1M3U0dnhObTZWaEROZ2k5SUs0b2huQlNaSUg3X2hqOV9lQU1uTkJkZkg0aDh6a3laYVF2UW9GZEFndUpKNElpcUVXU0ZxdzBkNXhtenloaENjdHVZOUZ2QzcxYlBFaXRjSmlZVTlYOXJtOHJlenRlUHlhN3hxSHZyM1AwTDdtQ3JQeEk4X0xaTXc?oc=5",
          "source": "timesofisrael.com",
          "published": "2025-01-03T08:00:00Z"
        }
      ],
      "note": "keyword-matched recent news mentions — a LEAD for manual review, NOT an adjudication of the business (R17 signal-only)."
    },
    "legitimacy": {
      "signals": [
        {
          "signal": "listed_on_google_maps",
          "present": true,
          "detail": "Found on Google Maps as 'Katz's Delicatessen' (Deli)."
        },
        {
          "signal": "has_public_address",
          "present": true,
          "detail": "205 E Houston St, New York, NY 10002"
        },
        {
          "signal": "has_public_phone",
          "present": true,
          "detail": "(212) 254-2246"
        }
      ],
      "unknowns": [
        "google_maps_review_count",
        "google_presence",
        "yelp_presence"
      ],
      "coverage_note": "Yelp: pass `yelp_enc_biz_id` to receive review samples. Without it this endpoint reports Yelp presence only — the rating and review count — which are real values, not estimates. Tripadvisor (travel/hospitality) provides review samples for this business. Trustpilot is matched by the business's website domain, and is reported only when a real profile is matched.",
      "disclaimer": "Signal list for due-diligence context only. Absence of reviews/data is reported as 'unknown', NOT as a negative or risk signal. This is NOT a KYB/AML/credit decision, trust score, or verdict."
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Local Business Intelligence API works

Local Business Intelligence is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /enrich-local/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
8 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Turning a list of names into a list you can actually call

A scraped or bought lead list is names and cities. What it is missing is whether each name is a real place, which one it is, and whether anything about it should stop you calling.

01batch
POST/enrich-local/v1/batch
{"businesses": [...], "include": ["website"]}

Ten at a time, cheaply: the place resolves for every row and only the website check runs, so you can throw away the rows that matched badly before paying for the rest.

02business_lookup
POST/enrich-local/v1/business_lookup
{"name": "Katz's Delicatessen", "location": "New York", "country": "us"}

Then the full picture on the survivors: review presence, website age and health, news mentions, and the signal list with its unknowns.

A lead list where every row carries the confidence of its own match, so the ones that are really coincidences can be dropped rather than dialled.

request
curl -X POST https://api.reefapi.com/enrich-local/v1/business_lookup \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"name":"Katz's Delicatessen","location":"Manhattan","lat":40.7223,"lng":-73.9874,"include":["website"]}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "enrich-local",
    "endpoint": "business_lookup",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

How to tell a real match from a nearest-neighbor match

This engine always returns a place, so the match block is the only thing standing between you and the wrong business. The two columns below are real calls: one for a business that exists, given with coordinates, and one for a name that does not exist anywhere. Both returned ok:true and a fully populated place, and the difference is visible only in these fields.

FieldReal business, lat/lng suppliedFabricated name, no coordinates
Query sentKatz's Delicatessen, Manhattan, lat 40.7223 lng -73.9874Qqxzv Nonexistent Plumbing Services, Austin, Texas
place.name returnedKatz's DelicatessenEconomy Plumbing Services, LLC
match_confidence0.970.83
name_similarity1.00.67
geo_validatedtruefalse
distance_km0.01null
runner_upnullReliant Plumbing - Austin, score_gap 0.09

geo_validated is the field that separated the two, and it can only be true when you supply lat and lng or an address specific enough to geocode. A second fabricated name, this one a bakery in an invented Kansas town, behaved identically: it returned a real bakery in Herington, KS at match_confidence 0.75 with geo_validated false. Gate on geo_validated and name_similarity together, not on match_confidence alone.

How a match can be wrong, and how the response tells you before you act on it

Measured on a real business with an exact name, an invented business that does not exist, a branch of a chain in a non-English market, and the same lookup restricted to one enrichment group.

There is no 'no such business' — there is a confidence score, and you must read it

An invented café name in San Francisco did not come back empty. It came back as a real, well-known restaurant, with the confidence and the name similarity both saying plainly that the name barely matched, ten other candidates weighed, and the runner-up finishing a hair behind. A genuine exact name, by contrast, matched with near-total confidence and a perfect name similarity and no runner-up at all. The engine always hands you its best candidate; the match block is the only thing separating that from a coincidence, and a runner-up that close means the second choice was nearly as good as the first.

The negative-news flag is a keyword lead, and it is wrong on purpose rather than silent

For one restaurant it reported recent items matching negative keywords, and the top item was a warm piece about the place celebrating its fortieth birthday. The response labels the field as a lead for manual review and not an adjudication, and it means it. It is built to over-fire, because a due-diligence signal that misses is worse than one you have to read.

Review text comes from a minority of the sources, and each one says why not

The maps listing gives a star rating and no review text at all, and says so in the field itself. Trustpilot matched by the business's own domain returned a real profile with sample reviews. Yelp reports presence and needs its own identifier before it will hand over samples. Every source that returns nothing carries the reason it returned nothing, so you never have to guess whether a business has no reviews or was simply not looked up.

A step of ours that did not run is marked unknown, never as an absence

Some sources are reached through a preliminary lookup, and when that lookup does not answer the source is reported as unknown rather than as a business that is not on that site. This is the distinction that breaks lead lists quietly: if you filter on 'not on Trustpilot' without excluding the unknowns first, you are filtering on our failure rather than on theirs. The per-group provenance block says which of the two happened for every group in every response.

The signal list is deliberately not a score, and absence is never counted against a business

You get a list of things that are true — listed on maps, has a public address, has a public phone, domain registered this long ago, valid certificate — and, beside it, an explicit list of what stayed unknown. Nothing is rolled into a number, and a missing review profile is recorded as unknown rather than as a risk. A business with no website on its listing simply has no website block instead of a failing one. It is context for a human decision, not a verdict, and the disclaimer in every response says so.

What people build with Local Business Intelligence

The jobs this data is most often used for.

2

endpoints

8

credits per call

01

CRM enrichment calls business_lookup to attach place data to a lead.

02

Lead-gen tools resolve a business to its phone and website.

03

Data pipelines use batch to enrich a whole list of businesses.

What Local Business Intelligence data costs

The cheapest call here is 8 credits, so $15/mo (Pro) buys 1,250 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 184 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/enrich-local/v1/business_lookup \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"name":"Katz's Delicatessen","location":"Manhattan","lat":40.7223,"lng":-73.9874,"include":["website"]}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/enrich-local/v1/business_lookup",
    headers={"x-api-key": REEF_KEY},
    json={
  "name": "Katz's Delicatessen",
  "location": "Manhattan",
  "lat": 40.7223,
  "lng": -73.9874,
  "include": [
    "website"
  ]
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Local Business Intelligence.

Get a free key →
What does the response look like when the business does not exist?

It does not 404 and it does not come back empty. In two measured runs with invented business names, the engine returned ok:true and the nearest same-category real business: a fabricated Kansas bakery resolved to 'Sweet Creations Bakery' at match_confidence 0.75, and a fabricated Austin plumber resolved to 'Economy Plumbing Services, LLC' at 0.83. In both cases geo_validated was false, name_similarity was 0.67 or lower, and a runner_up was present with a small score_gap. Treat a miss as something you detect from the match block rather than from an error code.

Google shows found:false but there is a rating in the same object. Which is it?

found on the google entry means review text is available, not that the place has no rating. A measured lookup returned google {found:false, rating:4.5, review_count:null} together with the note that Maps supplies a star rating only. A second lookup on the same business, phrased as a place_query with country US, returned found:true with review_count 54698. The rating is reliable in both, so read rating and review_count directly instead of branching on found.

Yelp and Tripadvisor keep coming back found:false. Are they really absent?

Not necessarily. Each source carries its own missing_reason, and that reason describes the lookup path rather than proving the business has no page there. In one measured run for a famously reviewed New York deli, both came back found:false, and a repeat of the same business returned more sources. If Yelp coverage matters, pass yelp_enc_biz_id, the encrypted business identifier, which skips the resolution step and populates the review samples directly.

What are fid, place_id and cid, and are they the same thing?

fid and place_id came back identical in every measured response, both in the hex-pair form 0x89c2598f7ff4aa09:0x313547e757cb8cea. cid is the decimal form of the second half, 3545819340560108778 in that example, and it is what maps_url uses: https://www.google.com/maps?cid=3545819340560108778. Store all of them as strings, because cid overflows a 32-bit integer and the hex pair is not a number at all.

Is the legitimacy block a trust score?

No, and the response goes out of its way to say so. It returns signals as a list of named checks, each with present true or false and a human-readable detail, alongside an unknowns array for anything that could not be established. A measured lookup produced 7 signals and 4 unknowns, including listed_on_google_maps, has_public_address, has_public_phone, has_working_website, domain_registered and website_has_ssl. The disclaimer in the payload states that missing data is reported as unknown and never as a risk signal, and that this is not a KYB, AML or credit decision.

Does passing country actually change anything?

Yes, it changes source routing and the honesty note attached to it. Without country, a measured response carried a coverage_note beginning 'country could not be determined' and its reviews group listed only one real source. With country US on the same business, the note dropped that clause and the reviews group reported two real sources. It costs nothing to send, so send it.

When should I use enrich-company instead?

When your input is a domain rather than a name and a place. This engine is anchored on a Maps listing, so it wants a business name plus a location, coordinates or a place_query, and it will not accept a bare domain. enrich-company starts from the domain and returns firmographics, WHOIS, hiring and tech instead of storefront data. The overlap is small: both can surface a Trustpilot match and basic domain health.

How do include and exclude behave, and what is the batch limit?

The place group is always resolved because it is the anchor, so include and exclude only govern reviews, website, presence, news and legitimacy. Groups you leave out appear in provenance with status 'skipped', which is distinct from 'not_found'. Batch takes up to 10 businesses per call and reports per-item ok or error; an empty request with no name, location or place_query returns MISSING_PARAM.

What is the Local Business Intelligence API?

Local Business Intelligence API is a ReefAPI endpoint group for local business intelligence It returns live JSON through POST requests under /enrich-local/v1.

Is the Local Business Intelligence API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Local Business Intelligence calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Local Business Intelligence login or account?

No login to Local Business Intelligence is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Local Business Intelligence data?

The page example is captured from a live business_lookup call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Local Business Intelligence API use?

Local Business Intelligence actions currently cost 8 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Local Business Intelligence from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call enrich-local actions with the same key, credit pool and JSON envelope used by normal REST requests.

14 Reputation & Reviews APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Local Business Intelligence, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.