NAV Navbar
shell ruby python javascript

Introduction

Welcome to the Datashake API! You can use our API to access Datashake endpoints, which include:

Rate limiting

You can make 10 requests per second. Once you go over the rate limit you will receive response with 429 status code (Too Many Requests)

Get in touch if you need to raise this - we can offer higher rate limiting on custom plans.

Authentication

To authorize, you will need to use your spiderman-token with every request.

# With shell, you can just pass the correct header with each request
curl "https://app.datashake.com/api/v2"
  -H "spiderman-token: 1234567890"

Make sure to replace 1234567890 with your API key.

Datashake uses API keys to allow access to the API. You can register for an API key at our developer portal.

We expect for the API key to be included in all requests to the server in a header that looks like the following:

spiderman-token: 1234567890

Local NAP

Add company

Add a company that you wish to receive a local NAP audit for.

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/local_naps?company_name=Brooklyn%20Burgers%20%26%20Beer&phone_number=718-788-1458&post_code=11215")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/local_naps"

querystring = {"company_name":"Brooklyn%20Burgers%20%26%20Beer","phone_number":"718-788-1458","post_code":"11215"}

payload = ""
headers = {
    'spiderman-token': "1234567890",
    }

response = requests.request("POST", url, data=payload, headers=headers, params=querystring)

print(response.text)
curl --request POST --url 'https://app.datashake.com/api/v2/local_naps?company_name=Brooklyn%20Burgers%20%26%20Beer&phone_number=718-788-1458&post_code=11215' --header 'spiderman-token: 1234567890'
var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === 4) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://app.datashake.com/api/v2/local_naps?company_name=Brooklyn%20Burgers%20%26%20Beer&phone_number=718-788-1458&post_code=11215");
xhr.setRequestHeader("spiderman-token", "1234567890");

xhr.send(data);

The above command returns JSON structured like this:

{
    "success": true,
    "job_id": 92222,
    "status": 200,
    "message": "Added this Local NAP to the queue..."
}

HTTP Request

POST https://app.datashake.com/api/v2/local_naps

Request Body

Key Description
company_name The name of the company you would like the local NAP audit for
phone_number The phone number of the company you would like the local NAP audit for
post_code The post code of the company you would like the local NAP audit for
competitor Fetch data on company competitors (defaults to false, set to true to return competitor data)
callback The URL you would like to receive a status POST
external_identifier An identifier for this response in your system, will be included in callback payload

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_id The job_id assigned to the scrape
status HTTP code for status, eg. 200
message Text response

Get info

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/local_naps/info?job_id=92222")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/local_naps/info"

querystring = {"job_id":"92222"}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/local_naps/info?job_id=92222' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/local_naps/info?job_id=92222",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200,
    "job_id": 92222,
    "company_name": "Brooklyn Burgers & Beers",
    "phone_number": "718-788-1458",
    "post_code": "11215",
    "state": "complete"
}

You will receive the following message if the provided job_id does not exist:

{
    "success": false,
    "status": 400,
    "message": "This job ID doesn't exist, please create it"
}

This endpoint retrieves information for a given response job_id.

HTTP Request

GET https://app.datashake.com/api/v2/local_naps/info?job_id=92222

URL Parameters

Parameter Description
job_id The ID of the job to retrieve

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200

status values

The status returned can be one of the following:

crawl_status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the local NAP audit - our team is automatically notified for investigation
invalid_company The company you provided is invalid

Get audit

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/local_naps/local_nap?job_id=92222")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/local_naps/local_nap"

querystring = {"job_id":"92222"}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/local_naps/local_nap?job_id=92222' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/local_naps/local_nap?job_id=92222",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200,
    "company_name": "Brooklyn Burgers & Beer",
    "phone_number": "718-788-1458",
    "address": "11215",
    "percentage_complete": 100,
    "local_nap_sources": [
        {
            "company_name": "Brooklyn Burgers & Beer",
            "phone": "(718) 788-1458",
            "address": "259 5th Ave Brooklyn NY, 11215",
            "url": "https://foursquare.com/v/brooklyn-burgers--beer/5579bd50498e191d31ad8270",
            "average_rating": 8.3,
            "rating_count": 195,
            "rating_distribution": null,
            "source_name": "foursquare.com"
        },
        {
            "average_rating": 4.6,
            "review_count": 526,
            "rating_distribution": null,
            "url": "https://www.google.com/search?q=Brooklyn+Burgers+%26+Beer+11215&hl=en",
            "source_name": "google.com",
            "business_name": "Brooklyn Burgers & Beer",
            "address": "259 5th Ave, Brooklyn, NY 11215, USA",
            "phone": "+1 718-788-1458"
        },
        {
            "review_count": 35,
            "average_rating": 4.5,
            "rating_distribution": {
                "5 stars": "17",
                "4 stars": "4",
                "3 stars": "4",
                "2 stars": "1",
                "1 stars": "0"
            },
            "url": "https://www.tripadvisor.com/Restaurant_Review-g60827-d9453698-Reviews-Brooklyn_Burgers_and_Beers-Brooklyn_New_York.html",
            "source_name": "tripadvisor.com",
            "company_name": "Brooklyn Burgers and Beers",
            "phone_number": "17187881458",
            "address": "259 5th Ave, Brooklyn, New York 11215-1909"
        },
        {
            "average_rating": 4.8,
            "review_count": 113,
            "rating_distribution": null,
            "url": "https://www.facebook.com/BrooklynBurgersandBeer/",
            "source_name": "facebook.com",
            "phone": "+1 718-788-1458",
            "address": "259 5th Ave, Brooklyn, New York 11215",
            "company_name": "Brooklyn Burgers&Beer"
        },
        {
            "company_name": "Brooklyn Burgers & Beer",
            "phone_number": "+17187881458",
            "review_count": 315,
            "average_rating": 4,
            "rating_distribution": {
                "5 stars": 168,
                "4 stars": 80,
                "3 stars": 24,
                "2 stars": 22,
                "1 star": 21
            },
            "address": "259 5th Ave, Brooklyn, NY 11215",
            "url": "https://www.yelp.com/biz/brooklyn-burgers-and-beer-brooklyn?osq=Brooklyn+Burgers",
            "source_name": "yelp.com"
        }
    ]
}

You will receive the following message if the provided job_id does not exist:

{
    "success": false,
    "status": 400,
    "message": "This job ID doesn't exist, please create it"
}

This endpoint retrieves information for a given response job_id.

HTTP Request

GET https://app.datashake.com/api/v2/local_naps/local_nap?job_id=92222

URL Parameters

Parameter Description
job_id The ID of the job to retrieve

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200

status values

The status returned can be one of the following:

crawl_status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the local NAP audit - our team is automatically notified for investigation
invalid_company The company you provided is invalid

Insights

Add insight

Use our API to receive machine learning/natural language processing insights built for reviews.

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/insights/add?review_text=Artichoke%20Basille%27s%20is%20the%20perfect%20spot%20to%20go%20if%20you%27re%20looking%20for%20some%20late%20night%20eats.%20I%20came%20here%20after%20my%20graduation%20ceremony%20because%20I%20was%20craving%20a%20decent%20slice%20and%20dollar%20pizza%20wasn%27t%20going%20to%20cut%20it%21%20I%20ordered%20the%20pepperoni%20and%20margharita%20Sicilian.%20The%20price%20for%20a%20slice%20averages%20from%20$5-6.50.%20This%20may%20seem%20pricey%20but%20you%20can%20taste%20the%20quality,%20also%20these%20slices%20are%20not%20your%20average%20size...%20they%27re%20HUGE.&model=restaurants")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/insights/add"

querystring = {"review_text":"Artichoke%20Basille%27s%20is%20the%20perfect%20spot%20to%20go%20if%20you%27re%20looking%20for%20some%20late%20night%20eats.%20I%20came%20here%20after%20my%20graduation%20ceremony%20because%20I%20was%20craving%20a%20decent%20slice%20and%20dollar%20pizza%20wasn%27t%20going%20to%20cut%20it%21%20I%20ordered%20the%20pepperoni%20and%20margharita%20Sicilian.%20The%20price%20for%20a%20slice%20averages%20from%20$5-6.50.%20This%20may%20seem%20pricey%20but%20you%20can%20taste%20the%20quality,%20also%20these%20slices%20are%20not%20your%20average%20size...%20they%27re%20HUGE.","model":"restaurants"}

headers = {
    'spiderman-token': "1234567890"
    }

response = requests.request("POST", url, headers=headers, params=querystring)

print(response.text)
curl --request POST --url 'https://app.datashake.com/api/v2/insights/add?review_text=Artichoke%20Basille%27s%20is%20the%20perfect%20spot%20to%20go%20if%20you%27re%20looking%20for%20some%20late%20night%20eats.%20I%20came%20here%20after%20my%20graduation%20ceremony%20because%20I%20was%20craving%20a%20decent%20slice%20and%20dollar%20pizza%20wasn%27t%20going%20to%20cut%20it%21%20I%20ordered%20the%20pepperoni%20and%20margharita%20Sicilian.%20The%20price%20for%20a%20slice%20averages%20from%20$5-6.50.%20This%20may%20seem%20pricey%20but%20you%20can%20taste%20the%20quality,%20also%20these%20slices%20are%20not%20your%20average%20size...%20they%27re%20HUGE.&model=restaurants' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/insights/add?review_text=Artichoke%20Basille%27s%20is%20the%20perfect%20spot%20to%20go%20if%20you%27re%20looking%20for%20some%20late%20night%20eats.%20I%20came%20here%20after%20my%20graduation%20ceremony%20because%20I%20was%20craving%20a%20decent%20slice%20and%20dollar%20pizza%20wasn%27t%20going%20to%20cut%20it%21%20I%20ordered%20the%20pepperoni%20and%20margharita%20Sicilian.%20The%20price%20for%20a%20slice%20averages%20from%20$5-6.50.%20This%20may%20seem%20pricey%20but%20you%20can%20taste%20the%20quality,%20also%20these%20slices%20are%20not%20your%20average%20size...%20they%27re%20HUGE.&model=restaurants",
  "method": "POST",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "job_id": 4012522,
    "status": 200,
    "message": "Added this insight to the queue..."
}

If the model you are attempting to use doesn't exist or is unavailable, you will see:

{
    "success": false,
    "status": 400,
    "message": "Please choose a valid model"
}

HTTP Request

POST https://app.datashake.com/api/v2/insights/add

Request Body

Key Description
review_text The review text you would like insights for
model The unique identifier of the model you would like to use

We have generic models available for several industries:

We add more models on a rolling basis, but feel free to contact us to train models for your specific industry or use case.

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_id The job_id assigned to the insight
status HTTP code for status, eg. 200
message Text response

Get info

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/insights/info?job_id=4")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/insights/info"

querystring = {"job_id":"41231241"}

headers = {
    'spiderman-token': "1234567890"
    }

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/insights/info?job_id=41231241' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/insights/info?job_id=41231241",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "status": "success",
    "id": 41231241,
    "review_text": "Artichoke Basille's is the perfect spot to go if you're looking for some late night eats. I came here after my graduation ceremony because I was craving a decent slice and dollar pizza wasn't going to cut it! I ordered the pepperoni and margharita Sicilian. The price for a slice averages from $5-6.50. This may seem pricey but you can taste the quality, also these slices are not your average size... they're HUGE.",
    "response": "[{\"sentence\":\"Artichoke Basille's is the perfect spot to go if you're looking for some late night eats.\",\"classification\":\"food\",\"sentiment\":\"positive\"},{\"sentence\":\"I came here after my graduation ceremony because I was craving a decent slice and dollar pizza wasn't going to cut it!\",\"classification\":\"food\",\"sentiment\":\"positive\"},{\"sentence\":\"I ordered the pepperoni and margharita Sicilian.\",\"classification\":\"food\",\"sentiment\":null},{\"sentence\":\"The price for a slice averages from $5-6.50.\",\"classification\":\"value\",\"sentiment\":null},{\"sentence\":\"This may seem pricey but you can taste the quality, also these slices are not your average size... they're HUGE.\",\"classification\":\"value\",\"sentiment\":\"positive\"}]",
    "model": "restaurants"
}

You will receive the following message if the provided job_id does not exist:

{
    "success": false,
    "status": 400,
    "message": "This job ID doesn't exist, please create it"
}

This endpoint retrieves information for a given insight job_id.

HTTP Request

GET https://Datashake.reviewshake.xyz/api/v2/insights/info?job_id=41231241

URL Parameters

Parameter Description
job_id The ID of the job to retrieve

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200
id The ID of the response from the Datashake database (auto-increments)
response The classification and sentiment of each sentence in the review

status values

The status returned can be one of the following:

crawl_status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation

List insight jobs

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/insights/jobs")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/insights/jobs"

querystring = {}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/insights/jobs' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/insights/jobs",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

[
    {
        "job_id": 142324565792319,
        "review_text": "Dr. John Doe has been my doctor (and my family's) for almost 18 years. He is always caring, always provides great communication.",
        "response": "[{\"sentence\":\"Dr. John Doe has been my doctor (and my family's) for almost 18 years.\",\"classification\":\"doctor\",\"sentiment\":\"positive\"},{\"sentence\":\"He is always caring, always provides great communication.\",\"classification\":\"person\",\"sentiment\":\"positive\"}]",
        "insight_status": "success",
        "model": "person",
        "credits_used": 45
    },
    {
        "job_id": 142312345792312,
        "review_text": "I really expetcted more. I wish i had learn about the industrial and chemistry process. Instead, it was like watching a large comercial. Please waste your money in something else. Not worth it.",
        "response": null,
        "insight_status": "pending",
        "model": "tour",
        "credits_used": 15
    },
    {
        "job_id": 142324565792317,
        "review_text": "Séjour très agréable, parc propre avec beaucoup de personnel, très jolis spectacles. Hotel des 3 hiboux propre et confortable, gros petits déjeuners et rencontre avec les personnages. Parc a taille humaine avec diverses attractions pour tous les âges.",
        "response": null,
        "insight_status": "maintenance",
        "model": "hotel",
        "credits_used": 5
    }
]

This endpoint retrieves a list of all your insight jobs.

HTTP Request

GET https://app.datashake.com/api/v2/insights/jobs

Response

The response contains the following keys:

Key Description
job_id The job_id assigned to the insight
review_text The review for which the insight was performed
response The classification and sentiment of each sentence in the review
status success, pending or maintenance
model Model used to perform the insight
credits_used Amount of credits used for this job

status values

The status returned can be one of the following:

status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation

Get insight job

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/insights/jobs/1234")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/insights/jobs/1234"

querystring = {}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/insights/jobs/1234' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/insights/jobs/1234",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "job_id": 142324565792319,
    "review_text": "Dr. John Doe has been my doctor (and my family's) for almost 18 years. He is always caring, always provides great communication.",
    "response": "[{\"sentence\":\"Dr. John Doe has been my doctor (and my family's) for almost 18 years.\",\"classification\":\"doctor\",\"sentiment\":\"positive\"},{\"sentence\":\"He is always caring, always provides great communication.\",\"classification\":\"person\",\"sentiment\":\"positive\"}]",
    "insight_status": "success",
    "model": "person",
    "credits_used": 45
}

This endpoint retrieves an insight jobs.

HTTP Request

GET https://app.datashake.com/api/v2/insights/jobs/1234

Response

The response contains the following keys:

Key Description
job_id The job_id assigned to the insight
review_text The review for which the insight was performed
response The classification and sentiment of each sentence in the review
status success, pending or maintenance
model Model used to perform the insight
credits_used Amount of credits used for this job

status values

The status returned can be one of the following:

status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation

Responses

Add review response

Use our API to respond to reviews for sites which don't have an API. Currently available for Yelp and Tripadvisor.

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/responds/add")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["spiderman-token"] = '1234567890'
request.body = "{\"username\": \"xxx\", \"password\": \"xxx\", \"profile_url\": \"xxx\", \"review_id\": \"xxx\", \"text\": \"xxx\", \"review_text\": \"xxx\", \"reviewer_name\":\"xxx\", \"callback\": \"https://app.reviewcompany.com/Datashake_callback\", \"external_identifier\": \"xxx\"}"

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/responds/add"

payload = "{\"username\": \"xxx\", \"password\": \"xxx\", \"profile_url\": \"xxx\", \"review_id\": \"xxx\", \"text\": \"xxx\", \"review_text\": \"xxx\", \"reviewer_name\":\"xxx\", \"callback\": \"https://app.reviewcompany.com/Datashake_callback\", \"external_identifier\": \"xxx\"}"
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request POST --url https://app.datashake.com/api/v2/responds/add --header 'spiderman-token: 1234567890' --data '{ "username": "xxx", "password": "xxx", "profile_url": "xxx", "review_id": "xxx", "text": "xxx", "review_text": "xxx", "reviewer_name":"xxx", "callback": "https://app.reviewcompany.com/Datashake_callback", "external_identifier": "xxx" }'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/responds/add",
  "method": "POST",
  "headers": {
    "spiderman-token": "1234567890"
  },
  "processData": false,
  "data": "{\"username\": \"xxx\", \"password\": \"xxx\", \"profile_url\": \"xxx\", \"review_id\": \"xxx\", \"text\": \"xxx\", \"review_text\": \"xxx\", \"reviewer_name\":\"xxx\",\"callback\": \"https://app.reviewcompany.com/Datashake_callback\", \"external_identifier\": \"xxx\" }"
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "job_id": 12312313,
    "status": 200,
    "message": "Added response to the queue..."
}

If we don't support the review site you are submitting, you will see:

{
    "success": false,
    "status": 400,
    "message": "We do not support www.deliveroo.com yet, please submit it to our feedback forum (https://feedback.reviewshake.com)"
}

HTTP Request

POST https://app.datashake.com/api/v2/responds/add

Request Body

Key Description
username The username for logging into the review site in question (required)
password The password for logging into the review site in question (required)
profile_url The URL for the review profile (required)
review_id The unique ID of the review to be responded to, as provided by the review site (required)
text The text of the response (required)
reviewer_name The name of the reviewer (required)
review_text The text of the review (required)
callback The URL you would like to receive a status POST (optional)
external_identifier An identifier for this response in your system, will be included in callback payload (optional, max: 255 characters)

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_id The job_id assigned to the response
status HTTP code for status, eg. 200
message Text response

Get info

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/responds/info?job_id=12312313")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/responds/info"

querystring = {"job_id":"12312313"}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/responds/info?job_id=12312313' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/responds/info?job_id=12312313",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200,
    "respond": {
        "id": 12312313,
        "username": "xxx",
        "profile_url": "https://www.yelp.com/biz/naturally-delicious-brooklyn",
        "review_id": "xxx",
        "text": "xxx",
        "status": "pending",
        "external_identifier": 8394
    }
}

You will receive the following message if the provided job_id does not exist:

{
    "success": false,
    "status": 400,
    "message": "This job ID doesn't exist, please create it"
}

This endpoint retrieves information for a given response job_id.

HTTP Request

GET https://app.datashake.com/api/v2/responds/info?job_id=123123132

URL Parameters

Parameter Description
job_id The ID of the job to retrieve

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200
id The ID of the response from the Datashake database (auto-increments)
username The username for logging into the review site in question
profile_url The URL for the review profile
review_id The unique ID of the review to be responded to, as provided by the review site
text The text of the response
status pending, complete, maintenance or invalid_credentials (see below for explanation)
external_identifier An identifier for this response in your system, will be included in callback payload

status values

The status returned can be one of the following:

crawl_status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation
invalid_credentials The credentials you have provided are invalid

List Response jobs

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/responds/jobs")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/responds/jobs"

querystring = {}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/responds/jobs' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/responds/jobs",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

[
    {
        "job_id": 1234556789,
        "profile_url": "https://www.yelp.com/biz/naturally-delicious-newyork",
        "review_id": "252A3F4",
        "status": "complete",
        "text": "Great place to eat burgers and fries.",
        "credits_used": 5
    },
    {
        "job_id": 1234356789,
        "profile_url": "https://www.yelp.com/biz/naturally-delicious-brooklyn",
        "review_id": "BB52A3F4",
        "status": "complete",
        "text": "My dad used to take me to this place when I was a kid.",
        "credits_used": 2
    }
]

This endpoint retrieves a list of all your responses jobs.

HTTP Request

GET https://app.datashake.com/api/v2/responds/jobs

Response

The response contains the following keys:

Key Description
job_id The job_id assigned to the insight
profile_url The URL for the review profile
review_id The unique ID of the review to be responded to, as provided by the review site
status success, pending, invalid_credentials or maintenance
text The review for which the insight was performed
credits_used Amount of credits used for this job

status values

The status returned can be one of the following:

status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation
invalid_credentials The credentials you have provided are invalid

Get Response job

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/responds/jobs/1234")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/responds/jobs/1234"

querystring = {}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/responds/jobs/1234' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/responds/jobs/1234",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "job_id": 1234,
    "profile_url": "https://www.yelp.com/biz/naturally-delicious-newyork",
    "review_id": "252A3F4",
    "status": "complete",
    "text": "Great place to eat burgers and fries.",
    "credits_used": 5
}

This endpoint retrieves a responses jobs.

HTTP Request

GET https://app.datashake.com/api/v2/responds/jobs/1234

Response

The response contains the following keys:

Key Description
job_id The job_id assigned to the insight
profile_url The URL for the review profile
review_id The unique ID of the review to be responded to, as provided by the review site
status success, pending, invalid_credentials or maintenance
text The review for which the insight was performed
credits_used Amount of credits used for this job

status values

The status returned can be one of the following:

status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation
invalid_credentials The credentials you have provided are invalid

Reviews

Add review profile

Add a review profile for scraping, must include either url or query or place_id parameter.

Notes:

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/profiles/add?url=https://www.amazon.com/dp/B003YH9MMI&from_date=2018-01-01")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/profiles/add"

querystring = {"url":"https://www.amazon.com/dp/B003YH9MMI","from_date":"2018-01-01"}

headers = {
    'spiderman-token': "1234567890",
    }

response = requests.request("POST", url, headers=headers, params=querystring)

print(response.text)
curl --request POST --url 'https://app.datashake.com/api/v2/profiles/add?url=https://www.amazon.com/dp/B003YH9MMI&from_date=2018-01-01' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/add?url=https://www.amazon.com/dp/B003YH9MMI&from_date=2018-01-01",
  "method": "POST",
  "headers": {
    "spiderman-token": "1234567890",
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "job_id": 1234232,
    "status": 200,
    "message": "Added this profile to the queue..."
}

If we don't support the review site you are submitting, you will see:

{
    "success": false,
    "status": 200,
    "message": "We do not support www.deliveroo.com yet, please submit it to our feedback forum (https://feedback.reviewshake.com)"
}

HTTP Request

POST https://app.datashake.com/api/v2/profiles/add

Query Parameters

Parameter Description
url Review profile URL.
query Google search query that shows the Google My Business listing in the search results.
place_id You can provide a Google Place ID (eg. ChIJr5dFzfKAhYARj99B34yuZOw) to be more specific about the Google Business you need reviews from.
from_date Only scrape reviews from a specific date (optional). Only works for url parameter. Format is yyyy-mm-dd
blocks Number of blocks you want to return from search results (optional). In blocks of 10.
diff Previous job ID for your given profile, for which you only need latest reviews.
callback The URL where you would like us to POST the result payload when the status is complete
external_identifier An identifier for this response in your system, will be included in callback payload (max: 255 characters)

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_id The job_id assigned to the scrape
status HTTP code for status, eg. 200
message Text response

Callback Response

If you provide the callback parameter while adding the review profile, you will get the following data posted to the callback url when the job completes:

Key Description
success true or false depending on outcome
job_id The job_id assigned to the scrape
status HTTP code for status, eg. 200
source_url URL used to create the job
place_id the place_id used to create the job
external_identifier any external_identifier passed when creating the job
meta_data site specific metadata collected
unique_id Unique id of the profile in the site
review_count Review count shown in the profile page
average_rating Average rating shown in the profile page
last_crawl date the last crawl ran on
crawl_status status of the crawl (complete, maintenance, pending)
percentage_complete total percentage of the job completed (100 in case it is complete)
result_count The number of reviews we got from the site
credits_used Credits used to complete the job
from_date The from_date parameter passed when creating the job
blocks The blocks parameter passed when creating the job
reviews The list of collected reviews

The collected reviews contain the following keys:

Key Description
id The review_id assigned to the review by our system
name Name of the reviewer as shown in the site
date The date the review was posted
rating_value The rating given by the reviewer
review_text The text of the review given by the reviewer
url The url to the review
profile_picture The profile picture of the reviewer when the review was collected
location The location of the reviewer
review_title The title of the review
verified_order true if the review was verified
language_code The language code of the review extracted from the review site
reviewer_title The title, designation or the relation of the reviewer to the reviewed profile
unique_id The id that uniquely identifies the review in the site
meta_data Source specific data for each review
response The response given by the business owner or page owner to the review/reviewer

The collected review responses contain the following keys:

Key Description
id The response_id assigned to the review response by our system
name Name of the responder
date The date the responder responded to the review
comment The response of the responder

Add review profiles (bulk)

Add multiple review profiles for scraping, must include either url or query or place_id parameter.

Notes:

require "uri"
require "net/http"

url = URI("https://app.datashake.comapi/v2/profiles/add_bulk")

http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["spiderman-token"] = "1234567890"
request["Content-Type"] = "application/json"
request.body = "[\n\t{ \"url\": \"https://www.homeaway.com/vacation-rental/p4494671\", \"callback\": \"https://app.reviewcompany.com/Datashake_callback\", \"from_date\": \"2019-12-1\"},\n\t{ \"query\": \"I-80 Towing & Service, 1209 S 3rd St, Laramie, WY 82070, USA\", \"callback\": \"https://app.reviewcompany.com/Datashake_callback\", \"blocks\":\"10\"}\n]"

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/profiles/add_bulk"

payload = "[\n\t{ \"url\": \"https://www.homeaway.com/vacation-rental/p4494671\", \"callback\": \"https://app.reviewcompany.com/Datashake_callback\", \"from_date\": \"2019-12-1\"},\n\t{ \"query\": \"I-80 Towing & Service, 1209 S 3rd St, Laramie, WY 82070, USA\", \"callback\": \"https://app.reviewcompany.com/Datashake_callback\", \"blocks\":\"10\"}\n]"
headers = {
  'spiderman-token': '1234567890',
  'Content-Type': 'application/json'
}

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

print(response.text.encode('utf8'))
curl --location --request POST 'https://app.datashake.com/api/v2/profiles/add_bulk' \
--header 'spiderman-token: 1234567890' \
--header 'Content-Type: application/json' \
--data-raw '[
    { "url": "https://www.homeaway.com/vacation-rental/p4494671", "callback": "https://app.reviewcompany.com/Datashake_callback", "from_date": "2019-12-1"},
    { "query": "I-80 Towing & Service, 1209 S 3rd St, Laramie, WY 82070, USA", "callback": "https://app.reviewcompany.com/Datashake_callback", "blocks":"10"}
]'
var settings = {
  "url": "https://app.datashake.com/api/v2/profiles/add_bulk",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "spiderman-token": "1234567890",
    "Content-Type": "application/json"
  },
  "data": JSON.stringify([{"url":"https://www.homeaway.com/vacation-rental/p4494671","callback":"https://app.reviewcompany.com/Datashake_callback","from_date":"2019-12-1"},{"query":"I-80 Towing & Service, 1209 S 3rd St, Laramie, WY 82070, USA","callback":"https://app.reviewcompany.com/Datashake_callback","blocks":"10"}]),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

[
    {
        "url": "https://www.homeaway.com/vacation-rental/p4494671",
        "callback": "https://app.reviewcompany.com/Datashake_callback",
        "from_date": "2019-12-1",
        "success": true,
        "job_id": 4807,
        "status": 200,
        "message": "Added this profile to the queue..."
    },
    {
        "query": "I-80 Towing & Service, 1209 S 3rd St, Laramie, WY 82070, USA",
        "callback": "https://app.reviewcompany.com/Datashake_callback",
        "blocks": "10",
        "success": true,
        "job_id": 4808,
        "status": 200,
        "message": "Added this profile to the queue..."
    }
]

If we don't support the review site you are submitting, you will see:

[
    {
        "url": "https://www.deliveroo.com/vacation-rental/p4494671",
        "callback": "https://app.reviewcompany.com/Datashake_callback",
        "from_date": "2019-12-1",
        "success": false,
        "job_id": 4807,
        "status": 200,
        "message": "We do not support www.deliveroo.com yet, please submit it to our feedback forum (https://feedback.reviewshake.com)"
    },
    {
        "query": "I-80 Towing & Service, 1209 S 3rd St, Laramie, WY 82070, USA",
        "callback": "https://app.reviewcompany.com/Datashake_callback",
        "blocks": "10",
        "success": true,
        "job_id": 4808,
        "status": 200,
        "message": "Added this profile to the queue..."
    }
]

HTTP Request

POST https://app.datashake.com/api/v2/profiles/add_bulk

Request Body

Parameter Description
url Review profile URL.
query Google search query that shows the Google My Business listing in the search results.
place_id You can provide a Google Place ID (eg. ChIJr5dFzfKAhYARj99B34yuZOw) to be more specific about the Google Business you need reviews from.
from_date Only scrape reviews from a specific date (optional). Only works for url parameter. Format is yyyy-mm-dd
blocks Number of blocks you want to return from search results (optional). In blocks of 10.
diff Previous job ID for your given profile, for which you only need latest reviews.
callback The URL where you would like us to POST the result payload when the status is complete
external_identifier An identifier for this response in your system, will be included in callback payload (max: 255 characters)

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_id The job_id assigned to the scrape
status HTTP code for status, eg. 200
message Text response

Get info

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/profiles/info?job_id=1234232")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/profiles/info"

querystring = {"job_id":"1234232"}

payload = ""
headers = {
    'spiderman-token': "1234567890",
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/profiles/info?job_id=1234232' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/info?job_id=1234232",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200,
    "meta_data": null,
    "unique_id": null,
    "review_count": null,
    "average_rating": null,
    "last_crawl": null,
    "crawl_status": "pending",
    "percentage_complete": null,
    "result_count": 0
}

You will receive the following message if the provided job_id does not exist:

{
    "success": false,
    "status": 400,
    "message": "This job ID doesn't exist, please create it"
}

This endpoint retrieves information for a given review profile job_id.

HTTP Request

GET https://app.datashake.com/api/v2/profiles/info?job_id=1234232

URL Parameters

Parameter Description
job_id The ID of the job to retrieve

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200
source The source URL/Place ID/Google Query that initiated the job
meta_data Any meta data associated with the review profile
unique_id The unique ID of the review profile
review_count The total number of reviews as reported by the review site
average_rating The average review rating as reported by the review site
last_crawl The date of the last crawl
crawl_status pending, complete, maintenance invalid_url or failed (see below for explanation)
percentage_complete Number of reviews saved divided by total reviews available
result_count The total number of reviews saved

crawl_status values

The crawl_status returned can be one of the following:

crawl_status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the scrape - our team is automatically notified for investigation
failed The job has failed after multiple automated retries, please check your provided URL
invalid_url The URL you have provided is invalid

Refer to our help documentation for a more in-depth explanation of these job statuses.

Get reviews

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/profiles/reviews?job_id=112233")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/profiles/reviews"

querystring = {"job_id":"112233"}

headers = {
    'spiderman-token': "1234567890",
    }

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/profiles/reviews?job_id=112233' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/reviews?job_id=112233",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890",
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200,
    "meta_data": "{\"star_ratings\"=>{\"1star\"=>\"0%\", \"2star\"=>\"2%\", \"3star\"=>\"3%\", \"4star\"=>\"18%\", \"5star\"=>\"77%\"}}",
    "unique_id": null,
    "review_count": 91,
    "average_rating": 4.6,
    "last_crawl": "2019-01-16",
    "crawl_status": "complete",
    "percentage_complete": 100,
    "result_count": 3,
    "reviews": [
        {
            "id": 56868,
            "name": "Mahmoud M. Abdel-Fattah",
            "date": "2018-12-03",
            "rating_value": 4,
            "review_text": "The book is good but repetitive, and it'll be great if there is a summary (tasks/todo list) with the output.",
            "url": "https://www.amazon.com/gp/customer-reviews/R2NFQ2VFAIGZ3G/ref=cm_cr_arp_d_rvw_ttl?ie=UTF8&ASIN=B003YH9MMI",
            "profile_picture": null,
            "location": null,
            "review_title": "I highly recommend it but it is repittive",
            "verified_order": true,
            "language_code": "en",
            "reviewer_title": null,
            "unique_id": "R2NFQ2VFAIGZ3G",
            "meta_data": null
        }
    ]
}

You will receive the following message if the provided job_id does not exist:

{
    "success": false,
    "status": 400,
    "message": "This job ID doesn't exist, please create it"
}

This endpoint returns the actual reviews from the scrape.

HTTP Request

GET https://app.datashake.com/api/v2/profiles/reviews?job_id=112233

URL Parameters

Parameter Example Description
job_id 112233 The job ID returned from the /add endpoint.
from_date 2018-01-01 Only return reviews from a given date (optional). Format is yyyy-mm-dd
language_code en Only return reviews in a specific language (support varies by review site).
page 1 Page number to retrieve (optional).
per_page 100 The number of reviews to retrieve per page (defaults to 20, max 100).
allow_response true Show responses for reviews (optional).

Response

The response for the reviews key contains the following keys (see the /info endpoint for the other keys):

Key Description
id The ID of the review from the Datashake database (auto-increments)
name Name of the reviewer
date Date of the review, format is yyyy-mm-dd
rating_value Star rating of the review
review_text Text of the review
url Direct link to the review (when available)
profile_picture URL to the profile picture of the reviewer (when available)
location Location the review belongs to (when available)
review_title Title of the review (when available)
verified_order Verified order status, true or false
language_code Language code of the review, for example en (when available)
reviewer_title Title of the reviewer
unique_id Unique ID of the review as reported by the review site (when available)
meta_data Any available meta data for this review (when available)

Get jobs

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/profiles/jobs")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/profiles/jobs"

querystring = {}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/profiles/jobs' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/jobs",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

[
    {
        "job_id": 233412312,
        "url": "https://www.amazon.com/dp/B003YH9MMI",
        "crawl_status": "maintenance",
        "last_crawl": null,
        "from_date": "2018-01-01",
        "blocks": null,
        "credits_used": 22
    },
    {
        "job_id": 2366454234,
        "url": "https://www.amazon.com/dp/B003YH9MMI",
        "crawl_status": "maintenance",
        "last_crawl": null,
        "from_date": "2018-01-01",
        "blocks": null,
        "credits_used": 5
    }
]

This endpoint retrieves a list of all your review profile jobs.

HTTP Request

GET https://app.datashake.com/api/v2/profiles/jobs

Query Parameters

Parameter Description
from_created_at yyyy-mm-dd Returns jobs created on or after the date.
crawl_status pending, complete, invalid_url, maintenance or failed.
per_page Number of jobs to return page. (Default: 20)
page The page of per_page job. (Default: 1)

Response

The response contains the following keys:

Key Description
job_id The job_id assigned to the review profile
url The URL for the review profile
place_id The place_id for the review profile
status complete, pending, invalid_url or maintenance
last_crawl The date of the last crawl
from_date Only scraping reviews newer than this date
blocks blocks parameter used to create the review profile
diff diff parameter used to create the review profile
credits_used Amount of credits used for this job
created_at The date the job was created at

status values

The status returned can be one of the following:

status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation
invalid_url The URL you have provided is invalid

Get job

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/profiles/jobs/1234")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/profiles/jobs/1234"

querystring = {}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/profiles/jobs/1234' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/jobs/1234",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "job_id": 1234,
    "url": "https://www.amazon.com/dp/B003YH9MMI",
    "crawl_status": "maintenance",
    "date": null,
    "from_date": "2018-01-01",
    "blocks": null,
    "credits_used": 22
}

This endpoint retrieves information about a profile jobs.

HTTP Request

GET https://app.datashake.com/api/v2/profiles/jobs/1234

Response

The response contains the following keys:

Key Description
job_id The job_id assigned to the insight
url The URL for the review profile
status success, pending, invalid_url, maintenance or failed
last_crawl The date of the last crawl
from_date Only scraping reviews newer than this date
credits_used Amount of credits used for this job

status values

The status returned can be one of the following:

status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the response - our team is automatically notified for investigation
failed The job has failed after multiple automated retries, please check your provided URL
invalid_url The URL you have provided is invalid

Refer to our help documentation for a more in-depth explanation of these job statuses.

Reviews job groups

A job group is a collection of review profiles, making it easier for you to manage groups of profiles that you want to run.

For example, if you want to track reviews for Slack, you can create a job group and add their review profiles on G2, Capterra, TrustRadius and so on to it. Now you can manage the entire group as one.

Below are the endpoints available for job groups.

Base URI: https://app.datashake.com/api/v2/

Endpoint Request Description
/profiles/job_groups GET List all your job groups.
/profiles/job_groups/1 GET List profiles of specific job group.
/profiles/job_groups/1/reviews GET List all reviews for a specific job group.
/profiles/job_groups/1/profiles/1 GET List all jobs of a specific profile inside a job group.
/profiles/job_groups POST Create a new job group.
/profiles/job_groups/1/resync POST Resync all the profiles of a job group.
/profiles/job_groups/1 PUT Edit a specific job group, including adding URLs as array.
/profiles/job_groups/1 DELETE Delete a specific job group.

Get groups

curl --request GET --url 'https://app.datashake.com/api/v2/profiles/job_groups' --header 'spiderman-token: 1234567890'
  import requests

  url = "https://app.datashake.com/api/v2/profiles/job_groups"

  headers = {
      'spiderman-token': "1234567890"
      }

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

  print(response.text)
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Get.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "groups": [
        {
            "id": 1,
            "name": "Hello World",
            "profile_count": 1,
            "review_count": 3
        },
        {
            "id": 2,
            "name": "Helloo World",
            "profile_count": 2,
            "review_count": 4
        }
    ],
    "status": 200
}

This GET request lists all your groups.

GET https://app.datashake.com/api/v2/profiles/job_groups

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
groups Array containing groups.
status HTTP code for status, eg. 200

Get group profiles

curl --request GET --url 'https://app.datashake.com/api/v2/profiles/job_groups/1' --header 'spiderman-token: 1234567890'
  import requests

  url = "https://app.datashake.com/api/v2/profiles/job_groups/1"

  headers = {
      'spiderman-token': "1234567890"
      }

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

  print(response.text)
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups/1",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups/1")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Get.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "job_group_profiles": [
        {
            "id": 1,
            "profile": "https://www.g2.com/products/rubymine/reviews"
        },
        {
            "id": 2,
            "profile": "https://www.g2.com/products/sublime-text/reviews"
        }
    ],
    "status": 200
}

This GET request lists all profiles in a job group.

GET https://app.datashake.com/api/v2/profiles/job_groups/1

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_group_profiles Array containing job_group_profiles of a group.
status HTTP code for status, eg. 200

Get group reviews

curl --request GET --url 'https://app.datashake.com/api/v2/profiles/job_groups/1/reviews' --header 'spiderman-token: 1234567890'
  import requests

  url = "https://app.datashake.com/api/v2/profiles/job_groups/1/reviews"

  headers = {
      'spiderman-token': "1234567890"
      }

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

  print(response.text)
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups/1/reviews",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups/1/reviews")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Get.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "reviews": [
        {
            "id": 1,
            "name": "Andres O.",
            "date": "2019-12-18",
            "rating_value": 5.0,
            "review_text": "Love getting coffee here Friday afternoons. Barista is always friendly and the coffee is always amazing. Definitely recommend this place if your in San Francisco during the day!",
            "url": "https://www.yelp.com/biz/iron-horse-coffee-san-francisco-2?hrid=cNc371Fj0V0wyGPJzqs9tQ",
            "profile_picture": "https://s3-media0.fl.yelpcdn.com/photo/8GPsJSiMLX_iH7aLGVLKPQ/180s.jpg",
            "location": null,
            "review_title": null,
            "verified_order": false,
            "language_code": "fr",
            "reviewer_title": null,
            "unique_id": "cNc371Fj0V0wyGPJzqs9tQ",
            "meta_data": null
        }
    ],
    "status": 200
}

This GET request lists all reviews of a job group.

GET https://app.datashake.com/api/v2/profiles/job_groups/1/reviews

URL Parameters

Parameter Example Description
from_date 2018-01-01 Only return reviews from a given date (optional). Format is yyyy-mm-dd
language_code en Only return reviews in a specific language (support varies by review site).
page 1 Page number to retrieve (optional).
per_page 100 The number of reviews to retrieve per page (defaults to 20, max 100).
allow_response true Show responses for reviews (optional).

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
reviews Array containing reviews of a group.
status HTTP code for status, eg. 200

Get a profile

curl --request GET --url 'https://app.datashake.com/api/v2/profiles/job_groups/1/profiles/1' --header 'spiderman-token: 1234567890'
  import requests

  url = "https://app.datashake.com/api/v2/profiles/job_groups/1/profiles/1"

  headers = {
      'spiderman-token': "1234567890"
      }

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

  print(response.text)
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups/1/profiles/1",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups/1/profiles/1")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Get.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "job_group_profile": {
        "profile": "https://www.g2.com/products/rubymine/reviews",
        "jobs": [
            {
                "id": 1,
                "job_group_profile_id": 1
            },
            {
                "id": 2,
                "job_group_profile_id": 1
            }
        ],
        "jobs_count": 2,
        "reviews": [
            {
                "id": 1,
                "name": "Andres O.",
                "date": "2019-12-18",
                "rating_value": 5.0,
                "review_text": "Love getting coffee here Friday afternoons. Barista is always friendly and the coffee is always amazing. Definitely recommend this place if your in San Francisco during the day!",
                "url": "https://www.yelp.com/biz/iron-horse-coffee-san-francisco-2?hrid=cNc371Fj0V0wyGPJzqs9tQ",
                "profile_picture": "https://s3-media0.fl.yelpcdn.com/photo/8GPsJSiMLX_iH7aLGVLKPQ/180s.jpg",
                "location": null,
                "review_title": null,
                "verified_order": false,
                "language_code": "fr",
                "reviewer_title": null,
                "unique_id": "cNc371Fj0V0wyGPJzqs9tQ",
                "meta_data": null
            }
        ]
    },
    "status": 200
}

This GET request lists details for a specific profile.

GET https://app.datashake.com/api/v2/profiles/job_groups/1/profiles/1

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_group_profile Json containing profile data of a group.
status HTTP code for status, eg. 200

Create a group

import requests

url = "https://app.datashake.com/api/v2/profiles/job_groups?name=SomeAwesomeName&description=This is some awesome description&category=Software Reviews&public=true&profiles=[abc.com, xyz.com]"

querystring = {}

headers = {
    'spiderman-token': "1234567890"
    }

response = requests.request("POST", url, headers=headers, params=querystring)

print(response.text)
curl --request POST --url 'https://app.datashake.com/api/v2/profiles/job_groups?name=SomeAwesomeName&description=This is some awesome description&category=Software Reviews&public=true&profiles=[abc.com, xyz.com]' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups?name=SomeAwesomeName&description=This is some awesome description&category=Software Reviews&public=true&profiles=[abc.com, xyz.com]",
  "method": "POST",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups?name=SomeAwesomeName&description=This is some awesome description&category=Software Reviews&public=true&profiles=[abc.com, xyz.com]")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Post.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200
}

This POST request creates a job group.

POST https://app.datashake.com/api/v2/profiles/job_groups

Request Params

The request params for creating a group contains the following values.

Key Description
name Name of the group
description Description of the group
category Category of that group
public Boolean value either true or false
profiles Array with review profiles

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200

Resync a group

import requests

url = "https://app.datashake.com/api/v2/profiles/job_groups/1/resync"

querystring = {}

headers = {
    'spiderman-token': "1234567890"
    }

response = requests.request("POST", url, headers=headers, params=querystring)

print(response.text)
curl --request POST   --url https://app.datashake.com/api/v2/profiles/job_groups/1/resync  --header 'Content-Length: 0'   --header 'spiderman-token: 1234567890
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups/1/resync",
  "method": "POST",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

This POST requests a resync for a given job group.

  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups/1/resync")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Post.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "message": "The source group is been added to the resync queue"
}

Request Params

The request params for resync a group requires ID of the group.

POST https://app.datashake.com/api/v2/profiles/job_groups/<id>/resync

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
message The source group has been added to the resync queue
status HTTP code for status, eg. 200

Edit a group

import requests

url = "https://app.datashake.com/api/v2/profiles/job_groups/1"

querystring = {"name":"NewAwesomeName","profiles":"[def.com,efg.com]"}

headers = {
    'spiderman-token': "1234567890"
    }

response = requests.request("PUT", url, headers=headers, params=querystring)

print(response.text)
curl --request PUT --url 'https://app.datashake.com/api/v2/profiles/job_groups/1?name=NewAwesomeName&profiles=[def.com,efg.com]' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups/1?name=NewAwesomeName&profiles=[def.com,efg.com]",
  "method": "PUT",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups/1?name=New Name&description=This is some awesome description&category=Software Reviews&public=true&profiles=[abc.com,something.com, hello.com]")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Put.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200
}

This PUT request edits a specific job group.

Note that it will not delete previously created profiles. It simply checks for the presence of the supplied profiles, and creates a profile for any that do not already exist in our system.

PUT https://app.datashake.com/api/v2/profiles/job_groups/1

Request Params

The request params for creating a group contains folowing values.

Key Description
id ID of the group goes in the URL.
name Name of the group
description Description of the group
category Category of that group
public Boolean value either true or false
profiles Array of your review profiles

PUT https://app.datashake.com/api/v2/profiles/job_groups/<id>?params

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200

Delete a group

import requests

url = "https://app.datashake.com/api/v2/profiles/job_groups/1"

headers = {
    'spiderman-token': "1234567890"
    }

response = requests.request("DELETE", url, headers=headers)

print(response.text)
curl --request DELETE --url 'https://app.datashake.com/api/v2/profiles/job_groups/1' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/profiles/job_groups/1",
  "method": "DELETE",
  "headers": {
    "spiderman-token": "1234567890"
  }
}

$.ajax(settings).done(function (response) {
  console.log(response);
});
  require 'uri'
  require 'net/http'

  url = URI("https://app.datashake.com/api/v2/profiles/job_groups/1")

  http = Net::HTTP.new(url.host, url.port)

  request = Net::HTTP::Delete.new(url)
  request["spiderman-token"] = '1234567890'

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

The above command returns JSON structured like this:

{
    "success": true,
    "data": {
        "id": 1,
        "user_id": 1,
        "name": "SomeAwesomeName",
        "description": "This is some awesome description",
        "public": true,
        "category": "Software Reviews",
        "created_at": "2019-12-04T16:03:41.000Z",
        "updated_at": "2019-12-04T16:03:41.000Z"
    },
    "status": 200
}

This DELETE request deletes a specific job group.

DELETE https://app.datashake.com/api/v2/profiles/job_groups/1

Request Params

The request params for deleting a group requires id of that group.

DELETE https://app.datashake.com/api/v2/profiles/job_groups/<id>

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
data This is the data which is been deleted from group
status HTTP code for status, eg. 200

Review Index

Get Reviews

curl --request GET \
  --url 'https://app.datashake.com/api/v2/review_index?domain=zoom.us&per_page=10' \
  --header 'spiderman-token: 1234567890'
require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/review_index?domain=zoom.us&per_page=10")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/review_index"

querystring = {
    'domain': "zoom.us",
    'per_page': 10,
}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/review_index?domain=zoom.us&company_name=zoom&per_page=10",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
  "success": true,
  "status": 200,
  "organization": {
    "ticker_symbol": "ZM",
    "country_code": "US",
    "official_name": "Zoom Video Communications Inc",
    "description": "Zoom Video Communications, Inc. develops a people-centric cloud service that transforms real-time collaboration experience. The Company offers unified meeting experience, a cloud service that provides a 3-in-1 meeting platform with HD video conferencing, mobility, and web meetings. Zoom Video Communications serves customers worldwide.",
    "sector": "Technology",
    "industry": "Software",
    "sub_industry": "Infrastructure Software",
    "founded": "2011-04-21T00:00:00+00:00",
    "address": "55 Almaden Blvd\n6th Floor\nSan Jose, CA 95113\nUnited States",
    "phone": "1-888-799-9666",
    "website": "www.zoom.us",
    "number_of_employees": 2532
  },
  "profiles_count": 6,
  "profiles": [
    {
      "company_name": "Zoom Video Communications",
      "product_name": "Zoom Video Webinar",
      "url": "https://www.capterra.com/p/157062/Zoom-Video-Webinar",
      "domain": "https://zoom.us",
      "source_name": "capterra",
      "reported_review_count": 5465,
      "reported_rating_average": 4.6,
      "review_count": 50,
      "rating_average": 4.8
    },
    {
      "company_name": null,
      "product_name": "Zoom Video Webinar",
      "url": "https://www.trustradius.com/products/zoom-video-webinar/reviews",
      "domain": "",
      "source_name": "trustradius",
      "reported_review_count": 149,
      "reported_rating_average": 4.4,
      "review_count": 42,
      "rating_average": 4.54
    },
    {
      "company_name": "Zoom Video Communications",
      "product_name": "Zoom",
      "url": "https://www.g2.com/products/zoom/reviews",
      "domain": "https://zoom.us",
      "source_name": "g2",
      "reported_review_count": 24574,
      "reported_rating_average": 4.5,
      "review_count": 36,
      "rating_average": 4.5
    },
    {
      "company_name": null,
      "product_name": "Zoom",
      "url": "https://www.trustradius.com/products/zoom/reviews",
      "domain": "",
      "source_name": "trustradius",
      "reported_review_count": 1595,
      "reported_rating_average": 4.45,
      "review_count": 592,
      "rating_average": 4.68
    },
    {
      "company_name": "Zoom Video Communications",
      "product_name": "Zoom Rooms",
      "url": "https://www.g2.com/products/zoom-rooms/reviews",
      "domain": "https://www.zoom.us",
      "source_name": "g2",
      "reported_review_count": 168,
      "reported_rating_average": 4.5,
      "review_count": 39,
      "rating_average": 4.53
    },
    {
      "company_name": "Zoom Video Communications",
      "product_name": "Zoom Meetings & Chat",
      "url": "https://www.capterra.com/p/144037/Zoom-Video-Conferencing",
      "domain": "https://zoom.us",
      "source_name": "capterra",
      "reported_review_count": 5465,
      "reported_rating_average": 4.6,
      "review_count": 54,
      "rating_average": 4.81
    }
  ],
  "reported_review_count": 37416,
  "reported_rating_average": 4.53,
  "review_count": 813,
  "rating_average": 4.68,
  "page": 1,
  "per_page": 100,
  "page_count": 8,
  "reviews": [
    {
      "id": "https://www.trustradius.com/products/zoom-video-webinar/reviews:5dc5abbb12abd8002cd66e72",
      "name": "Ryan Connolly",
      "date": "2020-06-16T00:00:00",
      "rating_value": 3.0,
      "review_text": "Use Cases and Deployment Scope\nZoom Video Webinar is being used within my agency to host remote meetings with clients for various purposes such as onboarding, consulting, reviews, etc. This makes remote meetings very simple saving both myself and the client time that might be spent traveling to meet.\nPros and Cons\nVery easy to use.\nAbility to connect through desktop, mobile apps or even landline.\nThe webinar recording is a great feature.\nEdit\nChatting within the mobile app can be a little difficult.\nLikelihood to Recommend\nI believe Zoom Video Webinar is well suited for most situations where remote conferencing is needed.",
      "url": "https://www.trustradius.com/reviews/zoom-video-webinar-2019-11-08-11-54-03",
      "profile_picture": "https://media.trustradius.com/profile-photos/5d8a22d892f9df002c53c4fd/EQMU2KXJVH80.jpeg",
      "unique_id": "5dc5abbb12abd8002cd66e72",
      "review_title": "Zoom Video Webinar: the great low cost solution to remote meetings",
      "source_name": "trustradius"
    },
    {
      "id": "https://www.capterra.com/p/144037/Zoom-Video-Conferencing:GetApp___2211817",
      "name": "Verified Reviewer",
      "date": "2020-06-10T05:44:25-04:00",
      "rating_value": 5,
      "review_text": "Overall:If you can ensure that your conversational partner(s) know how to use the software in a professional way (headphones, how to cut out background noise, lighting etc) then this is a great tool for running meetings and collaborative projects. It can also be used for preparing videos for training purposes or to share on social media.\nPros:I love that I can run virtually my whole business via Zoom and have been doing for a number of years now. During the Corona Lockdown I've been running Scout meetings using the platform too\n\nThe software is intuitive enough to use that my elderly parents are able to use it (we are in different countries) so we are able to celebrate family events online with 3 generations of the family together.\n\nIt's uncomplicated and reliable, and as long as you use it sensibly (as with any other software) it's also secure.\nCons:The calendar scheduling is probably one of the weaker points, or at least less intuitive - I add first to my usual calendar and then invite participants from there which adds an additional step but is more reliable.",
      "url": "https://www.capterra.com/p/144037/Zoom-Video-Conferencing/reviews/2211817",
      "profile_picture": "https://cdn0.capterra-static.com/profile-images/linkedin/",
      "unique_id": "GetApp___2211817",
      "review_title": "Powerful video conferencing software",
      "source_name": "capterra"
    },
    ...
  ]
}

This endpoint returns the actual reviews from review index.

HTTP Request

GET https://app.datashake.com/api/v2/review_index?domain=slack.com

URL Parameters

Parameter Example Description
domain slack.com The company domain to look up
company_name Slack Name of company. If you have this, passing is recommended to improve profiles matching
ticker_symbol MSFT Ticker symbol belonging to the company
site g2 Only return reviews from a specific site
from_date 2019-10-24T18:00:00 Only return reviews from a specific date (parsable string representing date)
to_date 2019-11-02 Only return reviews to a specific date (parsable string representing date)
product_name Azure Only return profiles and reviews filtered by given product name
page 2 Page number to retrieve (optional).
per_page 100 The number of reviews to retrieve per page (defaults to 50, max 500).
update true When this parameter is used, we immediately start crawl latest reviews for given organization. It usually takes few minutes to accomplish

Response

Key Description
updated_at Date of latest update of profiles and reviews
organization General information about organization (optional)
profiles_count Number of profiles we matched for given company
profiles List of company profiles
review_count Number of reviews we stored in index
review_average Average review rating based on reviews stored in index
reported_review_count Sum of all reviews reported on all profiles pages
reported_rating_average Average rating reported on all profiles pages
reviews List of reviews

Organization structure

Key Description
ticker_symbol ticker symbol
country_code 2 letter
official_name official organization name (optional)
description short description (optional)
sector sector (optional)
industry industry category (optional)
sub_industry sub industry category (optional)
address address (optional)
phone phone number (optional)
website website address (optional)
number_of_employees number of employees (optional)

Profile structure

Key Description
company_name Name of the company as it appears on the profile page
product_name Specific product name
url Url of company profile
domain Company website domain
source_name Name of the source
reported_review_count Number of reviews reported on profile page
reported_review_rating Average rating reported on profile page
review_count Number of reviews we indexed in Review Index
review_average Average rating based on reviews indexed in Review Index

Review structure

Key Description
id The ID of the review from the Supervisor database (auto-increments)
name Name of the reviewer
date Date of the review, format is iso 8601
rating_value Star rating of the review
review_text Text of the review
url Direct link to the review (when available)
profile_picture URL to the profile picture of the reviewer (when available)
review_title Title of the review (when available)
reviewer_title Title of the reviewer
unique_id Unique ID of the review as reported by the review site (when available)
meta_data Any available meta data for this review (when available)

URLs

Add URL

Add a URL to receive meta data from. Supported sites:

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/url/add?url=https://www.facebook.com/pg/AnnapolisPropertyServices/reviews/")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/url/add"

querystring = {"url":"https://www.facebook.com/pg/AnnapolisPropertyServices/reviews/"}

headers = {
    'spiderman-token': "1234567890",
    'cache-control': "no-cache",
    'Postman-Token': "10f9a175-dbcd-44f1-9717-668fab7b0eee"
    }

response = requests.request("POST", url, headers=headers, params=querystring)

print(response.text)
curl --request POST --url 'https://app.datashake.com/api/v2/url/add?url=https://www.facebook.com/pg/AnnapolisPropertyServices/reviews/' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/url/add?url=https://www.facebook.com/pg/AnnapolisPropertyServices/reviews/",
  "method": "POST",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "job_id": 12312313,
    "status": 200,
    "message": "Added this URL to the queue..."
}

If we don't support the URL you are submitting, you will see:

{
    "success": false,
    "status": 400,
    "message": "We do not support www.deliveroo.com yet, please submit it to our feedback forum (https://feedback.reviewshake.com)"
}

HTTP Request

POST https://app.datashake.com/api/v2/url/add

Request Body

Key Description
url The URL you would like meta data for

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
job_id The job_id assigned to the scrape
status HTTP code for status, eg. 200
message Text response

Get info

require 'uri'
require 'net/http'

url = URI("https://app.datashake.com/api/v2/url/info?job_id=12312313")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["spiderman-token"] = '1234567890'

response = http.request(request)
puts response.read_body
import requests

url = "https://app.datashake.com/api/v2/url/info"

querystring = {"job_id":"12312313"}

payload = ""
headers = {
    'spiderman-token': "1234567890"
    }

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

print(response.text)
curl --request GET --url 'https://app.datashake.com/api/v2/url/info?job_id=12312313' --header 'spiderman-token: 1234567890'
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://app.datashake.com/api/v2/url/info?job_id=12312313",
  "method": "GET",
  "headers": {
    "spiderman-token": "1234567890"
  }
};

$.ajax(settings).done(function (response) {
  console.log(response);
});

The above command returns JSON structured like this:

{
    "success": true,
    "status": 200,
    "social_data": {
        "facebook": "https://www.facebook.com/ChicagoStyleSEO",
        "google": "https://plus.google.com/+Chicagostyleseo/about",
        "twitter": "https://twitter.com/chicagostyleseo",
        "instagram": "https://instagram.com/chicagostyleseo/",
        "linkedin": "https://www.linkedin.com/company/chicago-style-seo"
    },
    "contact_data": {
        "phone": "+17738095002",
        "email": "info@chicagostyleseo.com"
    },
    "review_data": {},
    "website": null,
    "last_crawl": "2018-10-03",
    "crawl_status": "complete"
}

You will receive the following message if the provided job_id does not exist:

{
    "success": false,
    "status": 400,
    "message": "This job ID doesn't exist, please create it"
}

This endpoint retrieves information for a given response job_id.

HTTP Request

GET https://app.datashake.com/api/v2/url/info?job_id=92724

URL Parameters

Parameter Description
job_id The ID of the job to retrieve

Response

The response contains the following keys:

Key Description
success true or false depending on outcome
status HTTP code for status, eg. 200
social_data Hash containing links to the social profiles found on the URL
contact_data Hash containing contact data found on the URL
review_data Hash containing links to reviw sites found on the URL

status values

The status returned can be one of the following:

crawl_status Description
pending The job is still in the queue and is pending completion
complete The job is complete
maintenance There has been an issue with the scrape - our team is automatically notified for investigation
invalid_url The URL you provided is invalid

Errors

The Supervisor API uses the following error codes:

Error Code Meaning
400 Bad Request - The resource you are requesting does not exist
401 Unauthorized - Your API key is wrong.
402 Payment Required - You do not have available credits.
404 Not Found - The request could not be found.