Skip to content

Listing Lookup API

From a name and an address to the business's listings on every platform#

Send a business name and an address; Zembra searches the platforms you choose in parallel and returns each listing's identifier and details, ready for the Reviews and Listing Info APIs. Match picks the single right listing per platform, scored on name and location; Find returns up to 10 candidates per platform for you to choose from.

  • AccessAPI key
  • Platforms115 supported
  • Endpoint GET /listing/match GET /listing/find POST /batch/listing/match · /batch/listing/find
  • CommitmentNone: pay per use, no minimum

At a glance

  • Every requested platform searched in parallel, in one call
  • Match: one verified listing per platform; Find: up to 10 candidates
  • Address as one line, as components, or as coordinates
  • Synchronous: results in the same response
  • Match from 60 credits, Find from 50 credits per call

Why teams choose Zembra for this#

Performance

All requested platforms are searched at the same time, and the answer comes back in the same response.

Accuracy

Match scores every candidate on name and location, normalizes addresses, compares coordinates, and uses an AI model to break ties between close candidates.

Memory

Listings already matched to a business are reused without searching again, and platforms where the business wasn't found are skipped for 15 days by default.

Flexible input

One-line address in any format, address components, or latitude and longitude.

Ready to use

Each result carries the listing's slug and id, ready for the Reviews and Listing Info APIs, in the same standardized format on every platform.

Fair pricing

One base fee for the first platform and a small fee per extra platform. Invalid requests and outages cost nothing.

How it works

From request to data#

  1. 1

    Send a name and an address

    GET /listing/match or GET /listing/find, optionally with networks[] to limit the platforms. Without it, every eligible platform enabled on your account is searched.

  2. 2

    Zembra normalizes the location

    For Match, the address or coordinates are normalized into a reference address, so the same business is recognized however its address is written.

  3. 3

    Platforms are searched in parallel

    Each platform is searched with the business name and location. Match first reuses listings it already knows for this business and skips platforms recently found to have none.

  4. 4

    Candidates are scored (Match)

    Each platform's top candidates are scored on name similarity and on distance or address similarity. A confident match is accepted; borderline ones are re-checked with a normalized address, then by an AI model.

  5. 5

    Results per platform

    One listing per platform for Match, up to 10 for Find, keyed by platform. Platforms with no result are simply absent.

Pricing

Pay per use, no commitment#

One fee for the first platform plus a small fee per extra platform searched. Credits get cheaper as your volume grows: how credit pricing works.

What a call costs#

CallCreditsStarts at
Match, first platform
Per call.
60 $0.012
Match, each extra platform
Per platform searched in the same call.
10 $0.002
Find, first platform
Per call.
50 $0.01
Find, each extra platform
Per platform searched in the same call.
5 $0.001
No result (404), Match on 1 platform
A 404 is charged like a successful call, Find or Match: the search was run.
60 $0.012
Errors
Invalid parameters, platforms not enabled, rate limits and outages are not charged.
0 Free

Examples#

ProjectCreditsPrice
Match on 1 platform 60 Free on sign-up
Match on Google, Yelp and Facebook 80 Free on sign-up
Find on 10 platforms 95 Free on sign-up
Match 1,000 locations on 5 platforms 100,000 $92.00

Prices use the credit tiers of the cost estimator, where you can estimate your own project. The first 10,000 credits are free.

API reference

Requests and parameters#

Base URL https://api.zembra.io, authenticated with Authorization: Bearer <token>. A sandbox at https://sandbox.zembra.io returns realistic dummy data without using credits.

GET /listing/match?name=&address=&networks[]=
cURL
  • cURL
  • .Net
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
curl --location 'https://api.zembra.io/listing/match?name=My%20Business&address=5621%20Main%20St%2C%20Mallorca%2C%20QC%2078128%2C%20US&street=5621%20Main%20St&city=Mallorca&region=California%2C%20CA&postalCode=78128&country=US%2C%20USA%2C%20United%20States%2C%20etc.' \
--header 'Authorization: Bearer {token}'
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.zembra.io/listing/match?name=My Business&address=5621 Main St, Mallorca, QC 78128, US&street=5621 Main St&city=Mallorca&region=California, CA&postalCode=78128&country=US, USA, United States, etc.");
request.Headers.Add("Authorization", "Bearer {token}");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "https://api.zembra.io/listing/match?name=My%20Business&address=5621%20Main%20St%2C%20Mallorca%2C%20QC%2078128%2C%20US&street=5621%20Main%20St&city=Mallorca&region=California%2C%20CA&postalCode=78128&country=US%2C%20USA%2C%20United%20States%2C%20etc."
  method := "GET"

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, nil)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Authorization", "Bearer {token}")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("text/plain");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
  .url("https://api.zembra.io/listing/match?name=My Business&address=5621 Main St, Mallorca, QC 78128, US&street=5621 Main St&city=Mallorca&region=California, CA&postalCode=78128&country=US, USA, United States, etc.")
  .method("GET", body)
  .addHeader("Authorization", "Bearer {token}")
  .build();
Response response = client.newCall(request).execute();
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer {token}");

var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  redirect: 'follow'
};

fetch("https://api.zembra.io/listing/match?name=My Business&address=5621 Main St, Mallorca, QC 78128, US&street=5621 Main St&city=Mallorca&region=California, CA&postalCode=78128&country=US, USA, United States, etc.", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
<?php
$client = new Client();
$headers = [
  'Authorization' => 'Bearer {token}'
];
$request = new Request('GET', 'https://api.zembra.io/listing/match?name=My Business&address=5621 Main St, Mallorca, QC 78128, US&street=5621 Main St&city=Mallorca&region=California, CA&postalCode=78128&country=US, USA, United States, etc.', $headers);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();
import requests

url = "https://api.zembra.io/listing/match?name=My Business&address=5621 Main St, Mallorca, QC 78128, US&street=5621 Main St&city=Mallorca&region=California, CA&postalCode=78128&country=US, USA, United States, etc."

payload = {}
headers = {
  'Authorization': 'Bearer {token}'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
require "uri"
require "net/http"

url = URI("https://api.zembra.io/listing/match?name=My Business&address=5621 Main St, Mallorca, QC 78128, US&street=5621 Main St&city=Mallorca&region=California, CA&postalCode=78128&country=US, USA, United States, etc.")

https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer {token}"

response = https.request(request)
puts response.read_body

Response

{
    "message": "Found listing on Google and Yelp",
    "data": {
        "google": {
            "address": {
                "street": "5621 Main St",
                "city": "Mallorca",
                "region": "QC",
                "postalCode": "78128",
                "country": "US"
            },
            "aliases": [
                "my-listing-1",
                "my-first-listing"
            ],
            "categories": [
                "Restaurant",
                "Fast Food"
            ],
            "formattedAddress": "5621 Main St, Mallorca, QC 78128, US",
            "globalRating": 4.5,
            "id": "ChIJV9OJxsOq3oARnyGzSXY0ym8",
            "lastCrawled": "2023-01-01T00:00:00Z",
            "lastUpdated": "2023-01-01T00:00:00Z",
            "link": "https://my.zembratech.com/dashboard/review-page/insights/MWJmZTc5MDZjMzg5OGI3OGMyNjJiODNjOGJjMWI3Y2Q",
            "name": "My Google Business",
            "network": "google",
            "phone": "(210) 456-0987",
            "photos": [
                "https://media2.trover.com/T/5a5eae0184b8636d6b0385f0/fixedw-1.jpg",
                "https://media2.trover.com/T/5a5eae0184b8636d6b0385f0/fixedw-2.jpg"
            ],
            "priceRange": "$$$",
            "profileImage": "https://media2.trover.com/T/5a5eae0184b8636d6b0385f0/fixedw.jpg",
            "ratingBreakdown": {
                "overall": 8.4,
                "perCriteria": [
                    {
                        "criteria": "Overall",
                        "rating": 8.4
                    },
                    {
                        "criteria": "Cleanliness",
                        "rating": 8.9
                    },
                    {
                        "criteria": "Facilities",
                        "rating": 8.3
                    },
                    {
                        "criteria": "Location",
                        "rating": 8.7
                    },
                    {
                        "criteria": "Service",
                        "rating": 8.7
                    },
                    {
                        "criteria": "Value for money",
                        "rating": 8.2
                    }
                ],
                "ratingDistribution": [
                    {
                        "rating": "9+ Exceptional",
                        "count": 135
                    },
                    {
                        "rating": "8-9 Excellent",
                        "count": 66
                    },
                    {
                        "rating": "7-8 Very Good",
                        "count": 32
                    },
                    {
                        "rating": "6-7 Good",
                        "count": 24
                    },
                    {
                        "rating": "<6 Below Expectation",
                        "count": 11
                    }
                ]
            },
            "rawData": [],
            "reviewCount": {
                "native": {
                    "total": 6320,
                    "active": 5986,
                    "hidden": 334
                },
                "available": {
                    "total": 6320,
                    "active": 5986,
                    "hidden": 334
                }
            },
            "slug": "my-listing-slug",
            "url": "https://maps.google.com/?cid=16256511492469774330",
            "website": "https://my-business.com"
        },
        "yelp": {
            "address": {
                "street": "5621 Main St",
                "city": "Mallorca",
                "region": "QC",
                "postalCode": "78128",
                "country": "US"
            },
            "aliases": [
                "my-listing-1",
                "my-first-listing"
            ],
            "categories": [
                "Restaurant",
                "Fast Food"
            ],
            "formattedAddress": "5621 Main St, Mallorca, QC 78128, US",
            "globalRating": 4.5,
            "id": "ChIJV9OJxsOq3oARnyGzSXY0ym8",
            "lastCrawled": "2023-01-01T00:00:00Z",
            "lastUpdated": "2023-01-01T00:00:00Z",
            "link": "https://my.zembratech.com/dashboard/review-page/insights/MWJmZTc5MDZjMzg5OGI3OGMyNjJiODNjOGJjMWI3Y2Q",
            "name": "My Google Business",
            "network": "google",
            "phone": "(210) 456-0987",
            "photos": [
                "https://media2.trover.com/T/5a5eae0184b8636d6b0385f0/fixedw-1.jpg",
                "https://media2.trover.com/T/5a5eae0184b8636d6b0385f0/fixedw-2.jpg"
            ],
            "priceRange": "$$$",
            "profileImage": "https://media2.trover.com/T/5a5eae0184b8636d6b0385f0/fixedw.jpg",
            "ratingBreakdown": {
                "overall": 8.4,
                "perCriteria": [
                    {
                        "criteria": "Overall",
                        "rating": 8.4
                    },
                    {
                        "criteria": "Cleanliness",
                        "rating": 8.9
                    },
                    {
                        "criteria": "Facilities",
                        "rating": 8.3
                    },
                    {
                        "criteria": "Location",
                        "rating": 8.7
                    },
                    {
                        "criteria": "Service",
                        "rating": 8.7
                    },
                    {
                        "criteria": "Value for money",
                        "rating": 8.2
                    }
                ],
                "ratingDistribution": [
                    {
                        "rating": "9+ Exceptional",
                        "count": 135
                    },
                    {
                        "rating": "8-9 Excellent",
                        "count": 66
                    },
                    {
                        "rating": "7-8 Very Good",
                        "count": 32
                    },
                    {
                        "rating": "6-7 Good",
                        "count": 24
                    },
                    {
                        "rating": "<6 Below Expectation",
                        "count": 11
                    }
                ]
            },
            "rawData": [],
            "reviewCount": {
                "native": {
                    "total": 6320,
                    "active": 5986,
                    "hidden": 334
                },
                "available": {
                    "total": 6320,
                    "active": 5986,
                    "hidden": 334
                }
            },
            "slug": "my-listing-slug",
            "url": "https://maps.google.com/?cid=16256511492469774330",
            "website": "https://my-business.com"
        }
    }
}
{
    "message": "Invalid parameter [networks]: must be an array or omitted"
}
{
    "message": "Invalid bearer token"
}
{
    "message": "Cannot process request: balance too low!"
}
{
    "message": "Requested network [Facebook] is not enabled for your account"
}
{
    "message": "Listing not found. Maybe not a valid business."
}

GET /listing/match: Match: the single right listing per platform#

namestring, required
The business name, preferably as it appears on the platforms.
addressstring, one of the three location options
The address on one line, in any format.
street, city, region, postalCode, countrystrings, one of the three location options
Address components. street, city, postalCode and country are required together; region is optional.
latitude, longitudenumbers, −90 to 90 and −180 to 180, one of the three location options
The business's coordinates. When both are sent, they're used instead of the address.
networks[]array of platform names, optional
The platforms to search. Default: every platform enabled on your account that supports Match.
maxDayKnownNotFoundinteger ≥ −1, optional
Skip platforms where this business wasn't found in the last N days. Default 15; 0 always searches again; -1 never searches them again.
fields[]array of field names, optional
Return only these fields for each listing.

GET /listing/find: Find: up to 10 candidates per platform#

querystring, required
A business name, a category or a keyword.
locationstring, optional
An address or area on one line. Often a city is enough.
street, city, region, postalCode, countrystrings, optional
Address components, used when location is not sent.
networks[]array of platform names, optional
The platforms to search. Default: every platform enabled on your account that supports Find.
fields[]array of field names, optional
Return only these fields for each listing.

POST /batch/listing/match · /batch/listing/find: Up to 1,000 lookups in one batch#

bodyJSON array, 1–1,000 objects
Each object holds the same parameters as a single Match or Find. The call returns a batchId; read results free with GET /batch/{batchId}/{requestIndex}.

Status codes#

200Found on at least one platform
400Missing or invalid parameter, or the address couldn't be validated
401Missing or invalid token
402Balance too low
403Requested platforms not enabled on your account
404Not found on any requested platform (charged)
406Requested platforms don't support this service
429Rate limit reached
503Requested platforms temporarily unavailable, not charged

Data

What you get back#

A lookup result#

data.{network}object (Match) or array (Find)
Results keyed by platform: one listing for Match, up to 10 for Find. Platforms with no result are absent.
id, slug, url, networkstring
The listing's ID, slug and URL on the platform: pass slug to the Reviews or Listing Info APIs.
name, address, formattedAddressstring, object, string
As shown in the platform's search results.
phone, website, categories, priceRangevarious
When the platform's search results show them.
globalRating, reviewCountnumber, object
Rating and review counts, when available.
photos, profileImage, aliasesarrays, URL
Images and earlier slugs, when known.
linkURL
The listing's page in your Zembra dashboard.
rawDataobject
Everything else the platform returned.
Example response
{
    "status": "SUCCESS",
    "message": "Listing found on Google and Yelp",
    "data": {
        "google": {
            "address": {
                "street": "5621 Main St",
                "city": "San Diego",
                "region": "CA",
                "postalCode": "92101",
                "country": "US"
            },
            "aliases": [],
            "categories": [
                "Restaurant"
            ],
            "formattedAddress": "5621 Main St, San Diego, CA 92101, US",
            "globalRating": 4.4,
            "id": "ChIJV9OJxsOq3oARnyGzSXY0ym8",
            "lastCrawled": null,
            "lastUpdated": "2026-11-01 09:30:05",
            "link": "https://my.zembratech.com/dashboard/review-page/insights/MWJmZTc5MDZjMzg5OGI3OGMyNjJiODNjOGJjMWI3Y2Q",
            "name": "My Restaurant",
            "network": "google",
            "phone": "(619) 555-0134",
            "photos": [],
            "priceRange": "$$",
            "profileImage": "https://lh5.googleusercontent.com/p/AF1Qip-example",
            "rawData": {
                "…": "everything else the platform returned"
            },
            "reviewCount": {
                "native": {
                    "total": 320,
                    "active": 312,
                    "hidden": 8
                }
            },
            "slug": "ChIJV9OJxsOq3oARnyGzSXY0ym8",
            "url": "https://maps.google.com/?cid=16256511492469774330",
            "website": "https://my-restaurant.com"
        },
        "yelp": {
            "address": {
                "street": "5621 Main St",
                "city": "San Diego",
                "region": "CA",
                "postalCode": "92101",
                "country": "US"
            },
            "aliases": [],
            "categories": [
                "Restaurants"
            ],
            "formattedAddress": "5621 Main St, San Diego, CA 92101, US",
            "globalRating": 4,
            "id": "WavvLdfdP6g8aZTtbBQHTw",
            "lastCrawled": null,
            "link": "https://my.zembratech.com/dashboard/review-page/insights/ZTc5MDZjMzg5OGI3OGMyNjJiODNjOGJjMWI3Y2QxYQ",
            "name": "My Restaurant",
            "network": "yelp",
            "phone": "(619) 555-0134",
            "photos": [],
            "priceRange": "$$",
            "profileImage": "https://s3-media0.fl.yelpcdn.com/bphoto/example/o.jpg",
            "rawData": {
                "…": "everything else the platform returned"
            },
            "reviewCount": {
                "native": {
                    "total": 188,
                    "active": 152,
                    "hidden": 36
                }
            },
            "slug": "my-restaurant-san-diego",
            "url": "https://www.yelp.com/biz/my-restaurant-san-diego",
            "website": null
        }
    },
    "cost": 70,
    "balance": 98930
}

Match or Find?#

Use Match when you know the business and want its listing on each platform, chosen for you: it needs a name and a full location. Use Find to explore: search by name, category or keyword, with or without a location, and choose among up to 10 candidates per platform.

How Match decides#

The three best candidates on each platform are scored on name similarity and on location: distance when the platform gives coordinates (within 0.5 mile scores highest), otherwise address similarity. A score of 80 or more is a match. Between 50 and 80, the candidate's address is normalized and scored again. Close or borderline candidates are compared by an AI model. If nothing qualifies, the platform returns no result rather than a wrong listing.

Known listings and known gaps#

Match links the listings it finds to the business. Next time, they're returned straight away without searching again. Platforms where the business wasn't found are skipped for 15 days by default; change it with maxDayKnownNotFound.

Partial results#

You get a 200 as soon as at least one platform returns a result; platforms with nothing are left out. 404 means no platform found the business; 503 means none of them could be searched.

Which platforms support lookup#

Not every platform can be searched. Platforms that don't support Find or Match are skipped when you omit networks[]; requesting only unsupported ones returns 406. Platforms of the same family, like Expedia, Hotels.com and Vrbo, are searched once and share the result.

Lookup results vs full details#

Lookup returns what the platform shows in its search results. For the complete, freshly read listing, with opening hours and rating breakdown, pass the returned slug to the Listing Info API.

Performance

Speed and limits#

Rate limit #

100 requests per minute by default, per account and per service; 429 beyond that.

Results per platform #

Match: at most 1. Find: at most 10.

Batches #

Up to 1,000 lookups per batch, one batch submission per minute.

Platforms per call #

Every platform enabled on your account that supports the service, in one call.

Supported platforms

115 platforms, one format#

Use cases

What teams build with it#

Customer onboarding

Connect a new client's locations to every platform without copying URLs by hand.

Presence audits

See on which platforms a business is listed, and where it's missing.

Bulk imports

Match thousands of locations with batches of up to 1,000 lookups.

Competitor discovery

Use Find with a category or keyword and a city to list the businesses on each platform.

FAQ

Common questions#

What's the difference between Match and Find?

Match picks the single right listing on each platform for you, from a name and a full location. Find returns up to 10 candidates per platform from a name, category or keyword, so you can choose. #

Which address formats work?

For Match: an address on one line in any format, the components street, city, postal code and country, or latitude and longitude. For Find, the location is optional and often a city is enough. #

How many platforms can I search at once?

Every platform enabled on your account that supports the service, in a single call. Limit them with networks[]. #

How much does a call cost?

Match costs 60 credits for the first platform and 10 per extra platform; Find costs 50 and 5. Without networks[], every eligible platform on your account is searched and counted. #

Am I charged when nothing is found?

Yes. A 404 is charged like a successful call because the search was run. Errors and outages are not charged. #

Is it synchronous?

Yes. Results come back in the same response. For large volumes, send up to 1,000 lookups in a batch. #

How accurate is Match?

Candidates are scored on name and location, with addresses normalized and coordinates compared; borderline cases are checked by an AI model. When no candidate qualifies, the platform returns nothing rather than a wrong listing. #

Can I test without spending credits?

Yes. The sandbox at https://sandbox.zembra.io returns realistic dummy results for Match and Find. #

Start today for free

Create an account and get 10,000 free credits to try the Listing Lookup API and every other Zembra service. No commitment, no minimum.