Zembra API
One API for reviews, listings, social media and travel data
Every service returns the same standardized format and is paid for with the same credits. Pick a service to see what it does and how to call it.
Collect data
Act on behalf of businesses
Custom
Pull and Monitor Reviews From 131 Platforms
The Reviews API collects every review of a business listing, from 131 platforms including Google, Yelp, Tripadvisor and Facebook, and returns them in one standardized format. Pull them once, or let Zembra monitor the listing and push you what changed. No platform credentials needed.
- Four monitoring levels: one-time snapshot, monthly, daily, or near real-time tracking of new, edited, replied and deleted reviews
- Changes pushed to your webhook, Slack or email, right away or as a daily digest
- Limit one-time pulls by number of reviews or by date
- Send up to 1,000 requests in a single batch call
- From 50 credits per listing + 1 credit per review
Access: API key
Platforms: See all 131
Get Real-Time Business Info From Any Platform
The Listing Info API returns a business listing as it appears right now on any of 133 platforms: name, address, phone, website, photos, categories, price range, rating and review count. The data comes back in the same response, with no background jobs or waiting.
- Synchronous: results in the same call
- Detailed rating breakdown where the platform provides it (per criteria and distribution)
- Same standardized format on every platform
- 50 credits per listing
Access: API key
Platforms: See all 133
Find a Business on Every Platform in One Call
The Listing Lookup API takes a business name and an address, in any format, and searches all supported platforms at once. It returns each listing's identifier, ready to use with the Reviews and Listing Info APIs. Perfect for onboarding a new location without copying URLs by hand.
- Match: the single best listing per platform; Find: up to 10 candidates per platform
- Search every platform enabled on your account, or pick the ones you need
- Synchronous: results in the same call
- Match from 60 credits per call, Find from 50 credits per call
Access: API key
Platforms: See all 115
Stream Social Media Data From Major Platforms
The Social Media API reads public profiles, pages, posts and hashtags on Facebook, Instagram, LinkedIn, Reddit, TikTok, Glassdoor and the BBB. Get a resource's details, or stream its content: posts, comments, followers, reactions, ads, interviews or complaints, all in one standardized format.
- One-time jobs, or subscriptions that keep collecting new content and push it to your webhook
- Examples: an Instagram user's posts, a TikTok video's comments, a Facebook advertiser's ads, Glassdoor interviews, BBB complaints
- Resource details from 50 credits; streaming from 75 credits + 3 per item
Access: API key
Platforms: See all 7
Hotel Availability and Prices From Booking.com, Expedia and Ostrovok
The Accommodation API returns real-time hotel availability and prices from Booking.com, Expedia and Ostrovok. Fetch prices for the hotels you track by their IDs on Booking.com and Expedia, up to 10,000 hotels in a single call, or search a destination on Booking.com and Ostrovok. Every result includes the hotel name, address, rating, photos, price and booking link.
- Any stay up to 500 days ahead, shorter than 90 nights, and any room setup: number of rooms, adults, and children with their ages
- Quote as a traveler from any country; on Expedia, in the currencies of that country's site
- Price calendars on Booking.com and Ostrovok: up to 500 date ranges for one hotel in one call
- Search from 125 credits; prices by ID at 240 credits per 1,000 hotels
Access: API key
Platforms: See all 3
Capture Any Web Page Exactly as Your Users See It
The Screenshot API will capture any public web page from its URL, at the screen size you choose, on a desktop or mobile display, and return the image. It is in development: request early access to try it first.
- In development: request early access
- Capture any public page from its URL
- Choose the screen size and a desktop or mobile display
Access: API key
Platforms: Any public website
Reply to Reviews Where There Is No Public API
The Reply to Reviews API will post public replies to reviews on behalf of a business, on platforms that offer no reply API, starting with Yelp for Business, and edit or delete them later. The business authorizes access once and you never handle its password. It is in development: request early access.
- In development: request early access
- Starting with Yelp for Business
- Requires the business's authorization: the owner signs in once, you never see the password
- Post, edit and delete replies of up to 5,000 characters
Access: API key + business authorization
Platforms: Yelp
Keep Business Listings Up to Date Over API
The Edit Listing Info API will read and update a business's listing details on platforms that offer no public API, starting with the phone number and website on Yelp for Business, with the same one-time business authorization as Reply to Reviews. It is in development: request early access.
- In development: request early access
- Starting with phone and website on Yelp for Business
- Requires the business's authorization, the same as Reply to Reviews
- Read the current details, then update only what changed
Access: API key + business authorization
Platforms: Yelp
Need Another Source? We Build It for You
If the data you need isn't covered yet, tell us where it lives and we build the scraper for you, at no development cost and with no commitment. It becomes part of the Zembra API, with the same standardized format and the same pay-per-use pricing as every other service.
- Custom sources already delivered include Glassdoor interviews and BBB complaints
- No setup fee, no minimum volume, no contract
- You only pay for what you use, at standard credit rates
Access: API key
Platforms: Any public source, built on request
curl --location 'https://api.zembra.io/reviews' \
--header 'Authorization: Bearer {token}' \
--header 'Content-Type: application/json' \
--data '{
"network": "google",
"slug": "my-listing-slug",
"monitoring": "full",
"autoRenew": true,
"internalId": "location-1042",
"includeRawData": false
}'
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.zembra.io/reviews");
request.Headers.Add("Authorization", "Bearer {token}");
var content = new StringContent("{
\"network\": \"google\",
\"slug\": \"my-listing-slug\",
\"monitoring\": \"full\",
\"autoRenew\": true,
\"internalId\": \"location-1042\",
\"includeRawData\": false
}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.zembra.io/reviews"
method := "POST"
payload := strings.NewReader(`{
"network": "google",
"slug": "my-listing-slug",
"monitoring": "full",
"autoRenew": true,
"internalId": "location-1042",
"includeRawData": false
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Authorization", "Bearer {token}")
req.Header.Add("Content-Type", "application/json")
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("application/json");
RequestBody body = RequestBody.create(mediaType, "{
\"network\": \"google\",
\"slug\": \"my-listing-slug\",
\"monitoring\": \"full\",
\"autoRenew\": true,
\"internalId\": \"location-1042\",
\"includeRawData\": false
}");
Request request = new Request.Builder()
.url("https://api.zembra.io/reviews")
.method("POST", body)
.addHeader("Authorization", "Bearer {token}")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer {token}");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"network": "google",
"slug": "my-listing-slug",
"monitoring": "full",
"autoRenew": true,
"internalId": "location-1042",
"includeRawData": false
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://api.zembra.io/reviews", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
<?php
$client = new Client();
$headers = [
'Authorization' => 'Bearer {token}',
'Content-Type' => 'application/json'
];
$body = '{
"network": "google",
"slug": "my-listing-slug",
"monitoring": "full",
"autoRenew": true,
"internalId": "location-1042",
"includeRawData": false
}';
$request = new Request('POST', 'https://api.zembra.io/reviews', $headers, $body);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();
import requests
import json
url = "https://api.zembra.io/reviews"
payload = json.dumps({
"network": "google",
"slug": "my-listing-slug",
"monitoring": "full",
"autoRenew": True,
"internalId": "location-1042",
"includeRawData": False
})
headers = {
'Authorization': 'Bearer {token}',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("https://api.zembra.io/reviews")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer {token}"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
"network": "google",
"slug": "my-listing-slug",
"monitoring": "full",
"autoRenew": true,
"internalId": "location-1042",
"includeRawData": false
})
response = https.request(request)
puts response.read_body
Response
{
"message": "Reviews fetching order received for Google: my-listing. Please allow a few minutes before requesting reviews.",
"data": {
"job": {
"network": "google",
"slug": "my-listing-slug",
"jobId": "123e4567-e89b-12d3-a456-426614174000",
"uid": "OTBmNTBlYzViMjM2NTU4MGVmNTUxMmQwMmY0YzZlNmU",
"monitoring": "full",
"internalId": "",
"requestedAt": "2023-01-01T00:00:00Z",
"expiresAt": "2023-01-01T00:00:00Z",
"includeRawData": false,
"cost": 165,
"active": true,
"sizeLimit": 100,
"dateLimit": 1734140315,
"autoRenew": true,
"renewed": false,
"url": ""
},
"target": {
"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 slug [not-a-real-listing-slug]"
}
{
"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 listing."
}
curl --location 'https://api.zembra.io/listing/google?slug=my-listing-slug' \
--header 'Authorization: Bearer {token}'
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.zembra.io/listing/google?slug=my-listing-slug");
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/google?slug=my-listing-slug"
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/google?slug=my-listing-slug")
.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/google?slug=my-listing-slug", 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/google?slug=my-listing-slug', $headers);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();
import requests
url = "https://api.zembra.io/listing/google?slug=my-listing-slug"
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/google?slug=my-listing-slug")
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": "Listing found on Google",
"data": {
"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 slug [not-a-real-listing-slug]"
}
{
"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."
}
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."
}
curl --location 'https://api.zembra.io/social/job/instagram/user/zembra/posts' \
--header 'Authorization: Bearer {token}' \
--header 'Content-Type: application/json' \
--data '{
"internalId": "",
"sizeLimit": null,
"dateLimit": null
}'
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.zembra.io/social/job/instagram/user/zembra/posts");
request.Headers.Add("Authorization", "Bearer {token}");
var content = new StringContent("{
\"internalId\": \"\",
\"sizeLimit\": null,
\"dateLimit\": null
}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
package main
import (
"fmt"
"strings"
"net/http"
"io/ioutil"
)
func main() {
url := "https://api.zembra.io/social/job/instagram/user/zembra/posts"
method := "POST"
payload := strings.NewReader(`{
"internalId": "",
"sizeLimit": null,
"dateLimit": null
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Authorization", "Bearer {token}")
req.Header.Add("Content-Type", "application/json")
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("application/json");
RequestBody body = RequestBody.create(mediaType, "{
\"internalId\": \"\",
\"sizeLimit\": null,
\"dateLimit\": null
}");
Request request = new Request.Builder()
.url("https://api.zembra.io/social/job/instagram/user/zembra/posts")
.method("POST", body)
.addHeader("Authorization", "Bearer {token}")
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer {token}");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
"internalId": "",
"sizeLimit": null,
"dateLimit": null
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://api.zembra.io/social/job/instagram/user/zembra/posts", requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
<?php
$client = new Client();
$headers = [
'Authorization' => 'Bearer {token}',
'Content-Type' => 'application/json'
];
$body = '{
"internalId": "",
"sizeLimit": null,
"dateLimit": null
}';
$request = new Request('POST', 'https://api.zembra.io/social/job/instagram/user/zembra/posts', $headers, $body);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();
import requests
import json
url = "https://api.zembra.io/social/job/instagram/user/zembra/posts"
payload = json.dumps({
"internalId": "",
"sizeLimit": None,
"dateLimit": None
})
headers = {
'Authorization': 'Bearer {token}',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
require "uri"
require "json"
require "net/http"
url = URI("https://api.zembra.io/social/job/instagram/user/zembra/posts")
https = Net::HTTP.new(url.host, url.port)
https.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer {token}"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
"internalId": "",
"sizeLimit": nil,
"dateLimit": nil
})
response = https.request(request)
puts response.read_body
Response
{
"message": "Streaming Instagram posts order received for user < zembra >. Please allow a few minutes before requesting data.",
"data": {
"job": {
"jobId": "",
"network": "instagram",
"slug": "zembra",
"resource": "user",
"content": "posts",
"internalId": "",
"requestedAt": "2023-01-01T00:00:00Z",
"expiresAt": "2023-01-01T00:00:00Z",
"sizeLimit": 100,
"dateLimit": null,
"cost": 150,
"active": false
},
"target": {
"slug": "zembra",
"remoteId": "32146585423198958",
"displayUrl": "https://instagram.com/instagram/profile.jpg",
"url": "https://instagram.com/zembra/",
"link": "https://my.zembratech.com/dashboard/instagram/users/MWJmZTc5MDZjMzg5OGI3OGMyNjJiODNjOGJjMWI3Y2Q/posts",
"network": "instagram",
"resource": "user",
"rawData": []
}
}
}
{
"message": "Invalid resource for selected network"
}
{
"message": "Invalid bearer token"
}
{
"message": "Cannot process request: balance too low!"
}
{
"message": "Requested network [Facebook] is not enabled for your account"
}
{
"message": "Requested post was not found on Instagram."
}
curl --location 'https://api.zembra.io/accommodations/lookup?searchString=Rome%2C%20IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009' \
--header 'Authorization: Bearer {token}'
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.zembra.io/accommodations/lookup?searchString=Rome, IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009");
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/accommodations/lookup?searchString=Rome%2C%20IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009"
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/accommodations/lookup?searchString=Rome, IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009")
.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/accommodations/lookup?searchString=Rome, IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009", 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/accommodations/lookup?searchString=Rome, IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009', $headers);
$res = $client->sendAsync($request)->wait();
echo $res->getBody();
import requests
url = "https://api.zembra.io/accommodations/lookup?searchString=Rome, IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009"
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/accommodations/lookup?searchString=Rome, IT&targetCountry=US¤cy=USD&checkin=2023-01-01&checkout=2023-01-04&rooms=&latitude=25.77178&longitude=-80.19009")
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": "List of properties for Miami",
"data": {
"properties": {
"booking": {
"network": "booking",
"id": 123456789,
"name": "The Grand Hotel",
"district": "Larger San Diego",
"distanceFromDestination": "1.3 miles from downtown",
"address": {
"street": "123 Main St.",
"city": "San Diego",
"zipCode": "92078-4605",
"country": "United States",
"countryCode": "us",
"latitude": 25.77178,
"longitude": -80.19009
},
"price": {
"total": 1562.78,
"withoutFees": 1344.99,
"currency": "USD"
},
"reviews": {
"score": 9.2,
"count": 465
},
"link": "",
"photo": ""
}
},
"counts": {
"returned": {
"booking": 501
},
"displayable": {
"booking": 2786
},
"total": 501
}
}
}
{
"message": "Invalid parameter limit"
}
{
"message": "Invalid bearer token"
}
{
"message": "Cannot process request: balance too low!"
}
{
"message": "Requested network [Expedia] is not enabled for your account"
}
{
"message": "Hotels not found!"
}