curl --request POST \
--url https://api.partoo.co/v2/reviews \
--header 'Content-Type: application/json' \
--header 'x-APIKey: <api-key>' \
--data '
{
"partner_slug": "custom_partner",
"external_id": "ue-review-8f21c0",
"business_id": "5409c35a97bbc544d8e26737",
"rating": 4,
"author": {
"display_name": "Camille D.",
"is_anonymous": false,
"profile_photo_url": "<string>"
},
"date": "2026-09-15T18:32:11+02:00",
"content": "Fast delivery, meal was still hot. Thanks !",
"update_date": "2026-09-16T09:04:55+02:00",
"link": "https://www.custom_partner.com/reviews/8f21c0",
"reply": {
"content": "Thank you for your review!",
"date": "2026-09-16T09:04:55+02:00"
}
}
'import requests
url = "https://api.partoo.co/v2/reviews"
payload = {
"partner_slug": "custom_partner",
"external_id": "ue-review-8f21c0",
"business_id": "5409c35a97bbc544d8e26737",
"rating": 4,
"author": {
"display_name": "Camille D.",
"is_anonymous": False,
"profile_photo_url": "<string>"
},
"date": "2026-09-15T18:32:11+02:00",
"content": "Fast delivery, meal was still hot. Thanks !",
"update_date": "2026-09-16T09:04:55+02:00",
"link": "https://www.custom_partner.com/reviews/8f21c0",
"reply": {
"content": "Thank you for your review!",
"date": "2026-09-16T09:04:55+02:00"
}
}
headers = {
"x-APIKey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-APIKey': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
partner_slug: 'custom_partner',
external_id: 'ue-review-8f21c0',
business_id: '5409c35a97bbc544d8e26737',
rating: 4,
author: {display_name: 'Camille D.', is_anonymous: false, profile_photo_url: '<string>'},
date: '2026-09-15T18:32:11+02:00',
content: 'Fast delivery, meal was still hot. Thanks !',
update_date: '2026-09-16T09:04:55+02:00',
link: 'https://www.custom_partner.com/reviews/8f21c0',
reply: {content: 'Thank you for your review!', date: '2026-09-16T09:04:55+02:00'}
})
};
fetch('https://api.partoo.co/v2/reviews', 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.partoo.co/v2/reviews",
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([
'partner_slug' => 'custom_partner',
'external_id' => 'ue-review-8f21c0',
'business_id' => '5409c35a97bbc544d8e26737',
'rating' => 4,
'author' => [
'display_name' => 'Camille D.',
'is_anonymous' => false,
'profile_photo_url' => '<string>'
],
'date' => '2026-09-15T18:32:11+02:00',
'content' => 'Fast delivery, meal was still hot. Thanks !',
'update_date' => '2026-09-16T09:04:55+02:00',
'link' => 'https://www.custom_partner.com/reviews/8f21c0',
'reply' => [
'content' => 'Thank you for your review!',
'date' => '2026-09-16T09:04:55+02:00'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-APIKey: <api-key>"
],
]);
$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.partoo.co/v2/reviews"
payload := strings.NewReader("{\n \"partner_slug\": \"custom_partner\",\n \"external_id\": \"ue-review-8f21c0\",\n \"business_id\": \"5409c35a97bbc544d8e26737\",\n \"rating\": 4,\n \"author\": {\n \"display_name\": \"Camille D.\",\n \"is_anonymous\": false,\n \"profile_photo_url\": \"<string>\"\n },\n \"date\": \"2026-09-15T18:32:11+02:00\",\n \"content\": \"Fast delivery, meal was still hot. Thanks !\",\n \"update_date\": \"2026-09-16T09:04:55+02:00\",\n \"link\": \"https://www.custom_partner.com/reviews/8f21c0\",\n \"reply\": {\n \"content\": \"Thank you for your review!\",\n \"date\": \"2026-09-16T09:04:55+02:00\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-APIKey", "<api-key>")
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.partoo.co/v2/reviews")
.header("x-APIKey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"partner_slug\": \"custom_partner\",\n \"external_id\": \"ue-review-8f21c0\",\n \"business_id\": \"5409c35a97bbc544d8e26737\",\n \"rating\": 4,\n \"author\": {\n \"display_name\": \"Camille D.\",\n \"is_anonymous\": false,\n \"profile_photo_url\": \"<string>\"\n },\n \"date\": \"2026-09-15T18:32:11+02:00\",\n \"content\": \"Fast delivery, meal was still hot. Thanks !\",\n \"update_date\": \"2026-09-16T09:04:55+02:00\",\n \"link\": \"https://www.custom_partner.com/reviews/8f21c0\",\n \"reply\": {\n \"content\": \"Thank you for your review!\",\n \"date\": \"2026-09-16T09:04:55+02:00\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.partoo.co/v2/reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-APIKey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"partner_slug\": \"custom_partner\",\n \"external_id\": \"ue-review-8f21c0\",\n \"business_id\": \"5409c35a97bbc544d8e26737\",\n \"rating\": 4,\n \"author\": {\n \"display_name\": \"Camille D.\",\n \"is_anonymous\": false,\n \"profile_photo_url\": \"<string>\"\n },\n \"date\": \"2026-09-15T18:32:11+02:00\",\n \"content\": \"Fast delivery, meal was still hot. Thanks !\",\n \"update_date\": \"2026-09-16T09:04:55+02:00\",\n \"link\": \"https://www.custom_partner.com/reviews/8f21c0\",\n \"reply\": {\n \"content\": \"Thank you for your review!\",\n \"date\": \"2026-09-16T09:04:55+02:00\"\n }\n}"
response = http.request(request)
puts response.read_body{
"key": "<string>",
"org_id": 42,
"id": 34,
"business_id": "5409c35a97bbc544d8e26737",
"partner": "google_my_business",
"partner_id": "accounts/114063712393225091258/locations/74805271119400652054",
"author_name": "Castorche",
"date": "2017-07-01T16:10:23.156000+02:00",
"update_date": "2017-08-01T19:15:54.256000+02:00",
"delete_date": "<string>",
"rating": 3,
"recommended": true,
"title": "<string>",
"content": "Magasin un peu vieillot , mais personnel très sympathique, nombreuses références en rayons , un très bon choix côté vin...",
"state": "treated",
"link": "<string>",
"comments": [
{
"id": 82938,
"partner_id": "accounts/114063712393225091258/locations/74805271119400652054",
"created": "2019-08-01T19:15:54.256000+02:00",
"author_name": "Castorche",
"content": "Merci ❤️",
"date": "2017-08-01T19:15:54.256000+02:00",
"update_date": "2017-08-01T19:15:54.256000+02:00",
"can_edit": true,
"review_id": 34,
"parent_id": 123,
"user_id": "123456789abcdef2f60c42ff",
"is_reply_suggestion": true,
"replies": "<array>"
}
],
"tags": [
{
"id": 25,
"label": "food",
"color": "#808080"
}
],
"media_links": [
"https://lh3.googleusercontent.com/gpms...",
"https://lh3.googleusercontent.com/gpms-cs-s/AB8u6HYwO..."
]
}{
"errors": {
"json": {}
}
}{
"errors": {
"authentication": "User not authenticated"
}
}{
"errors": {
"json": "Your organization cannot push reviews for this partner",
"authorization": "Operation not allowed"
}
}{
"errors": {
"json": "Partner not found"
}
}{
"errors": {
"json": "Partner not found"
}
}{
"errors": {
"json": "Partner not found"
}
}Create and update a review from a custom partner
This endpoint lets you push into Partoo the reviews you collect on your own platform, through a custom review partner enabled on your organization.
A review is identified by the pair (partner_slug, external_id):
- the first call with a given pair creates the review,
- every later call with the same pair updates it in place.
Sending the same payload twice is therefore safe: the second call is a no-op and still
answers 200. Pushing a review you previously deleted restores it.
You can push for partners that are flagged as is_custom by
List review partners. Reviews created this
way behave like any other review: they are returned by
Search for reviews, they can be replied to,
and they trigger the review_created / review_updated webhooks.
You must use an API key with ORG_ADMIN rights and the review_edit permission, and the
business must belong to the organization of the API key’s.
curl --request POST \
--url https://api.partoo.co/v2/reviews \
--header 'Content-Type: application/json' \
--header 'x-APIKey: <api-key>' \
--data '
{
"partner_slug": "custom_partner",
"external_id": "ue-review-8f21c0",
"business_id": "5409c35a97bbc544d8e26737",
"rating": 4,
"author": {
"display_name": "Camille D.",
"is_anonymous": false,
"profile_photo_url": "<string>"
},
"date": "2026-09-15T18:32:11+02:00",
"content": "Fast delivery, meal was still hot. Thanks !",
"update_date": "2026-09-16T09:04:55+02:00",
"link": "https://www.custom_partner.com/reviews/8f21c0",
"reply": {
"content": "Thank you for your review!",
"date": "2026-09-16T09:04:55+02:00"
}
}
'import requests
url = "https://api.partoo.co/v2/reviews"
payload = {
"partner_slug": "custom_partner",
"external_id": "ue-review-8f21c0",
"business_id": "5409c35a97bbc544d8e26737",
"rating": 4,
"author": {
"display_name": "Camille D.",
"is_anonymous": False,
"profile_photo_url": "<string>"
},
"date": "2026-09-15T18:32:11+02:00",
"content": "Fast delivery, meal was still hot. Thanks !",
"update_date": "2026-09-16T09:04:55+02:00",
"link": "https://www.custom_partner.com/reviews/8f21c0",
"reply": {
"content": "Thank you for your review!",
"date": "2026-09-16T09:04:55+02:00"
}
}
headers = {
"x-APIKey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'x-APIKey': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
partner_slug: 'custom_partner',
external_id: 'ue-review-8f21c0',
business_id: '5409c35a97bbc544d8e26737',
rating: 4,
author: {display_name: 'Camille D.', is_anonymous: false, profile_photo_url: '<string>'},
date: '2026-09-15T18:32:11+02:00',
content: 'Fast delivery, meal was still hot. Thanks !',
update_date: '2026-09-16T09:04:55+02:00',
link: 'https://www.custom_partner.com/reviews/8f21c0',
reply: {content: 'Thank you for your review!', date: '2026-09-16T09:04:55+02:00'}
})
};
fetch('https://api.partoo.co/v2/reviews', 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.partoo.co/v2/reviews",
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([
'partner_slug' => 'custom_partner',
'external_id' => 'ue-review-8f21c0',
'business_id' => '5409c35a97bbc544d8e26737',
'rating' => 4,
'author' => [
'display_name' => 'Camille D.',
'is_anonymous' => false,
'profile_photo_url' => '<string>'
],
'date' => '2026-09-15T18:32:11+02:00',
'content' => 'Fast delivery, meal was still hot. Thanks !',
'update_date' => '2026-09-16T09:04:55+02:00',
'link' => 'https://www.custom_partner.com/reviews/8f21c0',
'reply' => [
'content' => 'Thank you for your review!',
'date' => '2026-09-16T09:04:55+02:00'
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-APIKey: <api-key>"
],
]);
$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.partoo.co/v2/reviews"
payload := strings.NewReader("{\n \"partner_slug\": \"custom_partner\",\n \"external_id\": \"ue-review-8f21c0\",\n \"business_id\": \"5409c35a97bbc544d8e26737\",\n \"rating\": 4,\n \"author\": {\n \"display_name\": \"Camille D.\",\n \"is_anonymous\": false,\n \"profile_photo_url\": \"<string>\"\n },\n \"date\": \"2026-09-15T18:32:11+02:00\",\n \"content\": \"Fast delivery, meal was still hot. Thanks !\",\n \"update_date\": \"2026-09-16T09:04:55+02:00\",\n \"link\": \"https://www.custom_partner.com/reviews/8f21c0\",\n \"reply\": {\n \"content\": \"Thank you for your review!\",\n \"date\": \"2026-09-16T09:04:55+02:00\"\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-APIKey", "<api-key>")
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.partoo.co/v2/reviews")
.header("x-APIKey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"partner_slug\": \"custom_partner\",\n \"external_id\": \"ue-review-8f21c0\",\n \"business_id\": \"5409c35a97bbc544d8e26737\",\n \"rating\": 4,\n \"author\": {\n \"display_name\": \"Camille D.\",\n \"is_anonymous\": false,\n \"profile_photo_url\": \"<string>\"\n },\n \"date\": \"2026-09-15T18:32:11+02:00\",\n \"content\": \"Fast delivery, meal was still hot. Thanks !\",\n \"update_date\": \"2026-09-16T09:04:55+02:00\",\n \"link\": \"https://www.custom_partner.com/reviews/8f21c0\",\n \"reply\": {\n \"content\": \"Thank you for your review!\",\n \"date\": \"2026-09-16T09:04:55+02:00\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.partoo.co/v2/reviews")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-APIKey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"partner_slug\": \"custom_partner\",\n \"external_id\": \"ue-review-8f21c0\",\n \"business_id\": \"5409c35a97bbc544d8e26737\",\n \"rating\": 4,\n \"author\": {\n \"display_name\": \"Camille D.\",\n \"is_anonymous\": false,\n \"profile_photo_url\": \"<string>\"\n },\n \"date\": \"2026-09-15T18:32:11+02:00\",\n \"content\": \"Fast delivery, meal was still hot. Thanks !\",\n \"update_date\": \"2026-09-16T09:04:55+02:00\",\n \"link\": \"https://www.custom_partner.com/reviews/8f21c0\",\n \"reply\": {\n \"content\": \"Thank you for your review!\",\n \"date\": \"2026-09-16T09:04:55+02:00\"\n }\n}"
response = http.request(request)
puts response.read_body{
"key": "<string>",
"org_id": 42,
"id": 34,
"business_id": "5409c35a97bbc544d8e26737",
"partner": "google_my_business",
"partner_id": "accounts/114063712393225091258/locations/74805271119400652054",
"author_name": "Castorche",
"date": "2017-07-01T16:10:23.156000+02:00",
"update_date": "2017-08-01T19:15:54.256000+02:00",
"delete_date": "<string>",
"rating": 3,
"recommended": true,
"title": "<string>",
"content": "Magasin un peu vieillot , mais personnel très sympathique, nombreuses références en rayons , un très bon choix côté vin...",
"state": "treated",
"link": "<string>",
"comments": [
{
"id": 82938,
"partner_id": "accounts/114063712393225091258/locations/74805271119400652054",
"created": "2019-08-01T19:15:54.256000+02:00",
"author_name": "Castorche",
"content": "Merci ❤️",
"date": "2017-08-01T19:15:54.256000+02:00",
"update_date": "2017-08-01T19:15:54.256000+02:00",
"can_edit": true,
"review_id": 34,
"parent_id": 123,
"user_id": "123456789abcdef2f60c42ff",
"is_reply_suggestion": true,
"replies": "<array>"
}
],
"tags": [
{
"id": 25,
"label": "food",
"color": "#808080"
}
],
"media_links": [
"https://lh3.googleusercontent.com/gpms...",
"https://lh3.googleusercontent.com/gpms-cs-s/AB8u6HYwO..."
]
}{
"errors": {
"json": {}
}
}{
"errors": {
"authentication": "User not authenticated"
}
}{
"errors": {
"json": "Your organization cannot push reviews for this partner",
"authorization": "Operation not allowed"
}
}{
"errors": {
"json": "Partner not found"
}
}{
"errors": {
"json": "Partner not found"
}
}{
"errors": {
"json": "Partner not found"
}
}Authorizations
The authentication system on Partoo API is using API Key that should be put in the header of the request (the name of the header is x-APIKey). An api_key is linked to a user. This user's role will give you different access level to the API features.
Body
The review to create or update
Slug of the custom partner the review comes from.
It must be a partner enabled on your organization, returned with
is_custom: true by List review partners.
1 - 100"custom_partner"
The review's unique id on the source platform. This is the key of the upsert:
re-sending the same external_id for the same partner_slug updates the
review instead of creating a new one.
It is returned as key and partner_id on the review. An external_id
already used by a review of another partner is rejected with a 409.
1 - 255"ue-review-8f21c0"
Business id
"5409c35a97bbc544d8e26737"
Star rating given by the author.
1 <= x <= 54
Author of the review, as displayed on the source platform.
Show child attributes
Show child attributes
When the review was posted on the source platform.
The offset is required (for example +02:00 or Z); Partoo stores the date in
UTC and renders it in the business timezone.
Two reviews of the same business cannot share the same date and
author.display_name: such a push answers 409.
"2026-09-15T18:32:11+02:00"
Body of the review. Omit it for a rating-only review.
4096"Fast delivery, meal was still hot. Thanks !"
Last update of the review on the source platform. Defaults to date, and
cannot be earlier than it.
"2026-09-16T09:04:55+02:00"
Public URL of the review on the source platform.
"https://www.custom_partner.com/reviews/8f21c0"
The reply already published on the source platform, if any. It is created with the review, and updated on a later push carrying a different content or date.
Replies written from Partoo are handled by Post a reply to a review instead.
Show child attributes
Show child attributes
Response
The review that was created or updated
Business Review on partner
Identifier of the review on the partner platform. For a review pushed through a
custom partner, this is the external_id you sent.
Unique identifier of an organization in Partoo.
42
Review id
34
Business id
"5409c35a97bbc544d8e26737"
Review partner slug
"google_my_business"
Review id on publisher
"accounts/114063712393225091258/locations/74805271119400652054"
The author name of the review.
Note: Replies don't have an author.
"Castorche"
Review creation date
"2017-07-01T16:10:23.156000+02:00"
Review update date
"2017-08-01T19:15:54.256000+02:00"
Review deletion date (only specified if the review has been deleted)
Review rating (can be null)
0 <= x <= 53
Review recommended (can be null)
Review title
Review body content
"Magasin un peu vieillot , mais personnel très sympathique, nombreuses références en rayons , un très bon choix côté vin..."
Reply state
treated, not_treated, deleted Link to review on publisher platform
Replies to the review
Show child attributes
Show child attributes
Tags associated to the review
Show child attributes
Show child attributes
Array of Google photo URLs associated with the review.
Populated when with_media_links=true query parameter is used.
Empty array if no associated media found or if with_media_links=false.
[
"https://lh3.googleusercontent.com/gpms...",
"https://lh3.googleusercontent.com/gpms-cs-s/AB8u6HYwO..."
]
Was this page helpful?