Skip to content

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

POST /reviews
cURL
  • cURL
  • .Net
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
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."
}
GET /listing/{network}?slug=my-listing-slug
cURL
  • cURL
  • .Net
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
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."
}
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."
}
POST /social/job/{network}/{resource}/{slug}/{content}
cURL
  • cURL
  • .Net
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
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."
}
GET /accommodations/lookup?networks[]=&searchString=
cURL
  • cURL
  • .Net
  • Go
  • Java
  • Node.js
  • PHP
  • Python
  • Ruby
curl --location 'https://api.zembra.io/accommodations/lookup?searchString=Rome%2C%20IT&targetCountry=US&currency=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&currency=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&currency=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&currency=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&currency=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&currency=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&currency=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&currency=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!"
}

Don't see your data source?

We build new scrapers on demand, at no development cost and with no commitment

Tell us which platform and which data you need. We build it, it becomes part of the Zembra API, and you only pay per use at standard credit rates. No setup fee, no contract, no minimum volume.