curl --request POST \
--url https://api.birdeye.com/resources/v1/review/response \
--header 'Content-Type: application/json' \
--data '
{
"fromTimestamp": 1712986782000,
"toTimestamp": 1715578782000,
"sources": [
"google",
"citysearch"
],
"ratings": [
1,
2,
3,
4,
5,
0
],
"searchStr": "test string",
"subBusinessIds": [
12345678,
1232111,
1231231321
],
"statuses": [
"all"
],
"allChild": "true",
"tags": [
"positive",
"negative"
],
"messageOptions": {
"reviewFilterOptions": [
"responded",
"non-responded"
]
}
}
'import requests
url = "https://api.birdeye.com/resources/v1/review/response"
payload = {
"fromTimestamp": 1712986782000,
"toTimestamp": 1715578782000,
"sources": ["google", "citysearch"],
"ratings": [1, 2, 3, 4, 5, 0],
"searchStr": "test string",
"subBusinessIds": [12345678, 1232111, 1231231321],
"statuses": ["all"],
"allChild": "true",
"tags": ["positive", "negative"],
"messageOptions": { "reviewFilterOptions": ["responded", "non-responded"] }
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
fromTimestamp: 1712986782000,
toTimestamp: 1715578782000,
sources: ['google', 'citysearch'],
ratings: [1, 2, 3, 4, 5, 0],
searchStr: 'test string',
subBusinessIds: [12345678, 1232111, 1231231321],
statuses: ['all'],
allChild: 'true',
tags: ['positive', 'negative'],
messageOptions: {reviewFilterOptions: ['responded', 'non-responded']}
})
};
fetch('https://api.birdeye.com/resources/v1/review/response', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.birdeye.com/resources/v1/review/response",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fromTimestamp' => 1712986782000,
'toTimestamp' => 1715578782000,
'sources' => [
'google',
'citysearch'
],
'ratings' => [
1,
2,
3,
4,
5,
0
],
'searchStr' => 'test string',
'subBusinessIds' => [
12345678,
1232111,
1231231321
],
'statuses' => [
'all'
],
'allChild' => 'true',
'tags' => [
'positive',
'negative'
],
'messageOptions' => [
'reviewFilterOptions' => [
'responded',
'non-responded'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.birdeye.com/resources/v1/review/response"
payload := strings.NewReader("{\n \"fromTimestamp\": 1712986782000,\n \"toTimestamp\": 1715578782000,\n \"sources\": [\n \"google\",\n \"citysearch\"\n ],\n \"ratings\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 0\n ],\n \"searchStr\": \"test string\",\n \"subBusinessIds\": [\n 12345678,\n 1232111,\n 1231231321\n ],\n \"statuses\": [\n \"all\"\n ],\n \"allChild\": \"true\",\n \"tags\": [\n \"positive\",\n \"negative\"\n ],\n \"messageOptions\": {\n \"reviewFilterOptions\": [\n \"responded\",\n \"non-responded\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.birdeye.com/resources/v1/review/response")
.header("Content-Type", "application/json")
.body("{\n \"fromTimestamp\": 1712986782000,\n \"toTimestamp\": 1715578782000,\n \"sources\": [\n \"google\",\n \"citysearch\"\n ],\n \"ratings\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 0\n ],\n \"searchStr\": \"test string\",\n \"subBusinessIds\": [\n 12345678,\n 1232111,\n 1231231321\n ],\n \"statuses\": [\n \"all\"\n ],\n \"allChild\": \"true\",\n \"tags\": [\n \"positive\",\n \"negative\"\n ],\n \"messageOptions\": {\n \"reviewFilterOptions\": [\n \"responded\",\n \"non-responded\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.birdeye.com/resources/v1/review/response")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromTimestamp\": 1712986782000,\n \"toTimestamp\": 1715578782000,\n \"sources\": [\n \"google\",\n \"citysearch\"\n ],\n \"ratings\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 0\n ],\n \"searchStr\": \"test string\",\n \"subBusinessIds\": [\n 12345678,\n 1232111,\n 1231231321\n ],\n \"statuses\": [\n \"all\"\n ],\n \"allChild\": \"true\",\n \"tags\": [\n \"positive\",\n \"negative\"\n ],\n \"messageOptions\": {\n \"reviewFilterOptions\": [\n \"responded\",\n \"non-responded\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body[
{
"reviewId": "5876543375490790392",
"response": "Hi Bellatrix,\nWe are so happy to hear that you had a great experience with us and that Eric and Kayla provided exceptional service. We will be sure to pass along your kind words to our team and look forward to welcoming you back!",
"responseDate": 1790726400000
},
{
"reviewId": "5876543395490790394",
"response": "Hi Ariana,\nThank you for leaving us a 5-star review. We appreciate your feedback and look forward to welcoming you back soon!",
"responseDate": 1790726400000
}
]{
"code": 1163,
"message": "Invalid start index value"
}{
"code": 1161,
"message": "Invalid API key"
}{
"code": 1011,
"message": "Business id is invalid"
}{
"code": 89,
"message": "Rate limit exceeded"
}Get Review Responses
Get Review Responses returns only the response details (review id, response text, and response date) for reviews belonging to a business account.
Behavior Note
- If
statusesis not provided, the API defaults to["published"], which returns featured reviews only.- Status mapping:
published= featured reviews,parked= non-featured reviews.- To fetch both featured and non-featured reviews, pass
statuses: ["published","parked"]orstatuses: ["all"]in the request body.ratingsfilters are applied only within the statuses selected for the request.- If
messageOptionsis not provided, the API defaults toreviewFilterOptions: ["responded"], which returns only reviews that have a response.
Note
- Deep Pagination with record window greater than 100k is not supported. Either reduce the sindex + count to be less than equal to 100k or use appropriate filters to narrow down your result set.
curl --request POST \
--url https://api.birdeye.com/resources/v1/review/response \
--header 'Content-Type: application/json' \
--data '
{
"fromTimestamp": 1712986782000,
"toTimestamp": 1715578782000,
"sources": [
"google",
"citysearch"
],
"ratings": [
1,
2,
3,
4,
5,
0
],
"searchStr": "test string",
"subBusinessIds": [
12345678,
1232111,
1231231321
],
"statuses": [
"all"
],
"allChild": "true",
"tags": [
"positive",
"negative"
],
"messageOptions": {
"reviewFilterOptions": [
"responded",
"non-responded"
]
}
}
'import requests
url = "https://api.birdeye.com/resources/v1/review/response"
payload = {
"fromTimestamp": 1712986782000,
"toTimestamp": 1715578782000,
"sources": ["google", "citysearch"],
"ratings": [1, 2, 3, 4, 5, 0],
"searchStr": "test string",
"subBusinessIds": [12345678, 1232111, 1231231321],
"statuses": ["all"],
"allChild": "true",
"tags": ["positive", "negative"],
"messageOptions": { "reviewFilterOptions": ["responded", "non-responded"] }
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
fromTimestamp: 1712986782000,
toTimestamp: 1715578782000,
sources: ['google', 'citysearch'],
ratings: [1, 2, 3, 4, 5, 0],
searchStr: 'test string',
subBusinessIds: [12345678, 1232111, 1231231321],
statuses: ['all'],
allChild: 'true',
tags: ['positive', 'negative'],
messageOptions: {reviewFilterOptions: ['responded', 'non-responded']}
})
};
fetch('https://api.birdeye.com/resources/v1/review/response', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.birdeye.com/resources/v1/review/response",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'fromTimestamp' => 1712986782000,
'toTimestamp' => 1715578782000,
'sources' => [
'google',
'citysearch'
],
'ratings' => [
1,
2,
3,
4,
5,
0
],
'searchStr' => 'test string',
'subBusinessIds' => [
12345678,
1232111,
1231231321
],
'statuses' => [
'all'
],
'allChild' => 'true',
'tags' => [
'positive',
'negative'
],
'messageOptions' => [
'reviewFilterOptions' => [
'responded',
'non-responded'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.birdeye.com/resources/v1/review/response"
payload := strings.NewReader("{\n \"fromTimestamp\": 1712986782000,\n \"toTimestamp\": 1715578782000,\n \"sources\": [\n \"google\",\n \"citysearch\"\n ],\n \"ratings\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 0\n ],\n \"searchStr\": \"test string\",\n \"subBusinessIds\": [\n 12345678,\n 1232111,\n 1231231321\n ],\n \"statuses\": [\n \"all\"\n ],\n \"allChild\": \"true\",\n \"tags\": [\n \"positive\",\n \"negative\"\n ],\n \"messageOptions\": {\n \"reviewFilterOptions\": [\n \"responded\",\n \"non-responded\"\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.birdeye.com/resources/v1/review/response")
.header("Content-Type", "application/json")
.body("{\n \"fromTimestamp\": 1712986782000,\n \"toTimestamp\": 1715578782000,\n \"sources\": [\n \"google\",\n \"citysearch\"\n ],\n \"ratings\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 0\n ],\n \"searchStr\": \"test string\",\n \"subBusinessIds\": [\n 12345678,\n 1232111,\n 1231231321\n ],\n \"statuses\": [\n \"all\"\n ],\n \"allChild\": \"true\",\n \"tags\": [\n \"positive\",\n \"negative\"\n ],\n \"messageOptions\": {\n \"reviewFilterOptions\": [\n \"responded\",\n \"non-responded\"\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.birdeye.com/resources/v1/review/response")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"fromTimestamp\": 1712986782000,\n \"toTimestamp\": 1715578782000,\n \"sources\": [\n \"google\",\n \"citysearch\"\n ],\n \"ratings\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 0\n ],\n \"searchStr\": \"test string\",\n \"subBusinessIds\": [\n 12345678,\n 1232111,\n 1231231321\n ],\n \"statuses\": [\n \"all\"\n ],\n \"allChild\": \"true\",\n \"tags\": [\n \"positive\",\n \"negative\"\n ],\n \"messageOptions\": {\n \"reviewFilterOptions\": [\n \"responded\",\n \"non-responded\"\n ]\n }\n}"
response = http.request(request)
puts response.read_body[
{
"reviewId": "5876543375490790392",
"response": "Hi Bellatrix,\nWe are so happy to hear that you had a great experience with us and that Eric and Kayla provided exceptional service. We will be sure to pass along your kind words to our team and look forward to welcoming you back!",
"responseDate": 1790726400000
},
{
"reviewId": "5876543395490790394",
"response": "Hi Ariana,\nThank you for leaving us a 5-star review. We appreciate your feedback and look forward to welcoming you back soon!",
"responseDate": 1790726400000
}
]{
"code": 1163,
"message": "Invalid start index value"
}{
"code": 1161,
"message": "Invalid API key"
}{
"code": 1011,
"message": "Business id is invalid"
}{
"code": 89,
"message": "Rate limit exceeded"
}Headers
e.g. application/json
e.g. [Required] Partner specific API key provided by Birdeye for data exchange.
e.g. [Required] User-associated business number.
Media type of the JSON request body.
Query Parameters
Start index of the reviews. Refer API note for max permissible value.
Number of reviews to query. Refer API note for max permissible value.
Include Reviews whose auto-crawling is blocked e.g. PressGaney
Body
Review start date in milliseconds, pass either fromDate or fromTimestamp.
Review end date in milliseconds, pass either endDate or toTimestamp.
Aggregation source name Note: use "our_website" to filter reviews posted on Birdeye platform or use "direct_feedback" for direct feedback.
Review rating Possible values 0,1,2,3,4,5.
String that is contained by review.
BusinessIds under enterprise account.
Review status filter. Valid values are "published", "parked", and "all". If omitted, default is "published" only (featured reviews). "published" refers to featured reviews and "parked" refers to non-featured reviews.
Get review from all child ignoring merge reviews flag configured at parent/child relationship level.
Reviews with assigned tags
Filter reviews by their response message options.
Show child attributes
Show child attributes