Listing Lookup API
Find a Business on Every Platform in One Call
Find a business on every supported platform in one call, from just its name and address.
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.
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
Send a name and an address
GET /listing/matchorGET /listing/find, optionally withnetworks[]to limit the platforms. Without it, every eligible platform enabled on your account is searched. -
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
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
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
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#
| Call | Credits | Starts 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 platformA 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#
| Project | Credits | Price |
|---|---|---|
| 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.
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®ion=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®ion=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®ion=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®ion=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®ion=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®ion=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®ion=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®ion=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#
name | string, required The business name, preferably as it appears on the platforms. |
|---|---|
address | string, one of the three location options The address on one line, in any format. |
street, city, region, postalCode, country | strings, one of the three location options Address components. street, city, postalCode and country are required together; region is optional. |
latitude, longitude | numbers, −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. |
maxDayKnownNotFound | integer ≥ −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#
query | string, required A business name, a category or a keyword. |
|---|---|
location | string, optional An address or area on one line. Often a city is enough. |
street, city, region, postalCode, country | strings, 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#
body | JSON 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#
200 | Found on at least one platform |
|---|---|
400 | Missing or invalid parameter, or the address couldn't be validated |
401 | Missing or invalid token |
402 | Balance too low |
403 | Requested platforms not enabled on your account |
404 | Not found on any requested platform (charged) |
406 | Requested platforms don't support this service |
429 | Rate limit reached |
503 | Requested 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, network | string The listing's ID, slug and URL on the platform: pass slug to the Reviews or Listing Info APIs. |
name, address, formattedAddress | string, object, string As shown in the platform's search results. |
phone, website, categories, priceRange | various When the platform's search results show them. |
globalRating, reviewCount | number, object Rating and review counts, when available. |
photos, profileImage, aliases | arrays, URL Images and earlier slugs, when known. |
link | URL The listing's page in your Zembra dashboard. |
rawData | object 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#
-
Google
-
Yelp
-
Facebook
-
Tripadvisor
-
Trustpilot
-
Booking
-
Expedia
-
Airbnb
-
Glassdoor
-
Indeed
-
G2
-
App Store
-
Google Play
-
OpenTable
-
Healthgrades
-
Zillow
-
Better Business Bureau
-
A Place for Mom
-
Abritel
-
Agoda
-
AliExpress
-
AlternativeTo
-
Apartment Guide
-
ApartmentRatings
-
Apartments.com
-
Avvo
-
Best Buy
-
Bilbayt
-
Bing
-
Bol
-
Bookabach
- Car Dealer Reviews
-
Care.com
-
CarGurus
-
Cars
-
Citysearch
-
Civitatis
-
ClassPass
-
Clutch
-
Community Health Network
-
ConsumerAffairs
-
CreditKarma
-
DealerRater
-
DesignMyNight
-
Doctor
-
DoorDash
-
eBay
-
Edmunds
-
FertilityIQ
-
FeWo-Direkt
-
FindLaw
-
Flipkart
-
Foursquare
-
Gartner
-
GetYourGuide
-
Goibibo
-
Goodreads
-
Google Local Services Ads
-
GreatSchools
-
Grubhub
-
HolidayCheck
-
Hotels
-
Houzz
-
Influenster
-
InsiderPages
-
Just Eat
-
JustDial
-
Kayak
-
Lawyers
-
LendingTree
-
Lieferando
-
MakeMyTrip
-
Martindale
-
Mindbody
-
Motability
-
Niche
-
Orbitz
-
PeerSpot
-
Postmates
-
Practo
-
Priceline
-
Product Hunt
-
Product Review
-
RateMDs
-
RealSelf
-
Rent
-
ResellerRatings
-
Reviews.io
-
Sitejabber
-
Smyths toys
-
Software Advice
-
Solv
-
Stayz
-
Steam
-
SuperMoney
-
Takeaway
-
Target
-
The Knot
-
TheFork
-
Thuisbezorgd
-
Travelocity
-
Treatwell
-
Trip
-
Trusted Shops
-
TrustRadius
-
UberEats
-
Vitals
-
Vrbo
-
Walmart
-
WebMD
-
WeddingWire
-
Yell
-
Yellow Pages
-
ZocDoc
-
Zoover
- A Place for Mom
- Abritel
- Agoda
- Airbnb
- AliExpress
- AlternativeTo
- Apartment Guide
- ApartmentRatings
- Apartments.com
- App Store
- Avvo
- Best Buy
- Better Business Bureau
- Bilbayt
- Bing
- Bol
- Bookabach
- Booking
- Car Dealer Reviews
- Care.com
- CarGurus
- Cars
- Citysearch
- Civitatis
- ClassPass
- Clutch
- Community Health Network
- ConsumerAffairs
- CreditKarma
- DealerRater
- DesignMyNight
- Doctor
- DoorDash
- eBay
- Edmunds
- Expedia
- FertilityIQ
- FeWo-Direkt
- FindLaw
- Flipkart
- Foursquare
- G2
- Gartner
- GetYourGuide
- Glassdoor
- Goibibo
- Goodreads
- Google Local Services Ads
- Google Play
- GreatSchools
- Grubhub
- Healthgrades
- HolidayCheck
- Hotels
- Houzz
- Indeed
- Influenster
- InsiderPages
- Just Eat
- JustDial
- Kayak
- Lawyers
- LendingTree
- Lieferando
- MakeMyTrip
- Martindale
- Mindbody
- Motability
- Niche
- OpenTable
- Orbitz
- PeerSpot
- Postmates
- Practo
- Priceline
- Product Hunt
- Product Review
- RateMDs
- RealSelf
- Rent
- ResellerRatings
- Reviews.io
- Sitejabber
- Smyths toys
- Software Advice
- Solv
- Stayz
- Steam
- SuperMoney
- Takeaway
- Target
- The Knot
- TheFork
- Thuisbezorgd
- Travelocity
- Treatwell
- Trip
- Tripadvisor
- Trusted Shops
- Trustpilot
- TrustRadius
- UberEats
- Vitals
- Vrbo
- Walmart
- WebMD
- WeddingWire
- Yell
- Yellow Pages
- Yelp
- Zillow
- ZocDoc
- Zoover
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.