The Partoo Rest API allows you to automate all the actions that are possible to do in the Partoo Web Application.
The Partoo Rest API can be used for many different purposes:
phone
and keywords
fields for users
The phone
and keywords
fields in all user-related endpoints
(see Users documentation) are now deprecated and will be permanently removed on 2026-01-15.
Please update your integrations to remove any dependencies on these fields before this date to ensure uninterrupted service. If you currently store data in these fields, we strongly recommend exporting or backing up your data prior to removal.
The impacted endpoints are:
You can use the new GET /v2/review_analytics/metrics endpoint to get the same data:
/v2/reviews/stats
➡ /v2/review_analytics/metrics?metrics=average_rating,rating_distribution,reply_time,reviews_count
/v2/reviews/quantitative-evolution
➡ /v2/review_analytics/metrics?dimensions={dimension}&metrics=reviews_count
day
| week
| month
| year
/v2/reviews/qualitative-evolution
➡ /v2/review_analytics/metrics?dimensions={dimension}&metrics=reviews_count,average_rating
day
| week
| month
| year
We're replacing our products for a new system with features.
This will allow to have a more fine-grained control over the features available to organizations, businesses and users.
You can now retrieve the list of features your org has access to with its subscribed plans through the org_features
field.
You can also retrieve the list of all available features from the org subscribed plans as well as the plans only some businesses may have subscribed to, through the features
field.
Deprecated fields:
has_google_post
display_google_post
You can now retrieve the list of features your business has access to with its organization and its own subscribed plans through the features
field. This field does not appear in the GET /v2/business/search endpoint.
You can now search businesses by features using the features__in
and features__notin
query parameters.
We're replacing the sidebar_products
field with sidebar_pages
field.
This will allow you to control which pages a user can access to in a more granular way.
You can find the correspondence between products and features in the table below, this will be used during the transition period.
⚠ Warning: during the deprecation time, if you update a user's sidebar_product
field and give them presence_management
, it will give them the available_features
diffusion
and presence_analytics
.
⚠ Warning: during the depreciation time, if you update a user's sidebar_product
field with any value, it will give them the posts
and bulk_modification
features if their organization have the feature.
⚠ Warning: during the deprecation time, a user having the product presence_management
returned in the sidebar_product
field may have only one of the features diffusion
and presence_analytics
.
Deprecated field:
sidebar_products
Product | Feature |
---|---|
presence_management |
diffusion and presence_analytics |
review_management |
review_management and review_analytics |
review_booster |
review_invite |
messages |
messages |
Managed at Organization level if the Organization has subscribed to Google Posts | posts |
Managed at Organization level if the Organization has subscribed to Bulk Modification | bulk_modification |
The impacted endpoints are:
We added a new endpoint:
We added support for a new channel: Custom
. This channel only supports Text
content for now.
The impacted endpoints following this change are:
We added support for 3 new message content_types : Audio
, Video
and Document
.
This means that you will now be able to receive media messages in your conversations, and also send them.
Channel | Image | Video | Audio | Document |
---|---|---|---|---|
✅ | ✅ | ✅ | ✅ | |
✅ | ✅ | ✅ | ❌ | |
SMS | ❌ | ❌ | ❌ | ❌ |
✅ | ✅ | ✅ | ✅ |
This changes will reflect in all endpoints that deal with messages :
And message webhooks events :
Customers with access to the webhook feature can now configure their webhooks directly from the API. You can also set webhooks on our website in the settings > integrations > webhooks.
Content-Type
validation
Following an upgrade on our webservers, we now enforce a validation of Content-Type
on all the requests to avoid guessing.
The default value expected is application/json
, unless specified on an endpoint.
All endpoints with method POST
, PATCH
and PUT
are affected.
category_gmb_id is definitely removed, use category_gmb_name for the GmbServices endpoints
Presence analytics endpoints are removed and replaced by Profile metrics and Profile keywords endpoints.
It is now possible to replace business id by business code as path parameter, only for users inside the same organization.
To do so, you may replace /{business_id}
by /c-{code}
For example, you can now update a business directly from its code using
curl -H "x-APIKey: ${API_KEY}" --json '{"address_full": "221b Baker Street"}' https://api.partoo.co/v2/business/c-LON-HQ
The following endpoints are affected:
/business/{business_id}
/business/{business_id}/subscription
/business/{business_id}/additional_data
/business/{business_id}/attributes
/business/{business_id}/more_hours
/business/{business_id}/services
/business/{business_id}/services/{service_id}
/business/{business_id}/structured_services
/business/{business_id}/free_form_services
/business/{business_id}/food_menus
/business/{business_id}/place_action_links
/business/{business_id}/business_fields
/publisher_errors/{business_id}
Since the rate limit has been put in place, it has become harder to integrate our API while complying with this limit. Enabling the search by store code will simplify integrations which required business search just to map our internal ids with codes which are ids in external.
Why the /c-
prefix?
We believe it is best for an integration to be explicit about requesting with a code rather than an id and we don't want to make guess.
Following an update on Google's API, REPEATABLE_URL
attributes will no longer be supported.
The impacted endpoints are:
Replace any usage of REPEATABLE_URL
with Place Action Links:
Address-related fields within the Business object (address, address_full, address2, zipcode, city, long, lat) can now be null if the business does not have an address filled out.
The impacted endpoints are :
These body parameters are moved to query parameters for these endpoints:
DELETE Organization: force
DELETE Custom Field: forced_update
becomes force
This route with body parameter is replaced by new route with path parameters:
DELETE Google Services with body parameter route is deprecated and replaced with DELETE Google Services with path parameter route
All these body parameters will be removed on January 15th 2025, please update your integrations by then.
forced_update
parameter
The forced_update
parameter in the PUT Custom Field endpoint has been renamed to force
.
Our Swagger file has been cleaned to make it compliant with standard OpenAPI 3.0.
No change in API is to expect and no change is required in your existing integrations.
New integrations can now leverage on tools to automate boilerplate code.
Introduced a new endpoint to report and detail errors detected by publishers in specific sections and fields of business information edits. This feature allows users to receive targeted feedback on errors identified by different publishers, enabling more precise and efficient corrections. You can find it here
Due to recent incidents with faulty integrations consuming too much resources from our API and causing unavailability for others, we’ve decided to put a rate limit for each organization on API integrations. All organizations will be limited to 300 API calls per minute.
country
will not appear in the field names
after 2022-10-15
countries
field, use the parameter with_countries
names
will not appear in the returned payload by default, use the parameter with_names
to get itorder_by
parameter.
address_full
will replace deprecated address_details
that will be deleted from July, 2022 :
address_full
(string) is the new unique address field allowing not to split address in several fields :address_details
will be deleted from following endpoints :
⚠️ It's not possible to use
address_full
withaddress_details
per_page
parameter.
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.
Security Scheme Type | API Key |
---|---|
Header parameter name | x-APIKey |
We provide two public environments, Sandbox and Production.
First, it's a good idea to start building and testing your integration in the Sandbox environment.
Ask your Partoo Account Manager to send you an API Key for Sandbox. You'll need to pass this API Key in all your API calls in order
to be authentified, in the header x-APIKey
. More details in the Authentication section.
From there, you can call any route that your user has access to. To know the exact API endpoint to use, you can click on the route url above the "Response samples", and this will give you the urls for Production and Sandbox.
If you need a UI access to Sandbox, ask your Partoo Account Manager for one. Be aware, Sandbox environment is empty by default, and has limited functionalities.
Once you're confident that your integration is production ready, ask your Partoo Account Manager for a user access in Production, and to give you access to the API Key Manager tool. From there, you'll be able to generate and manage your own API Keys inside the Partoo Web Application.
You can now use the Production API Key to start calling the Production API.
Partoo uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided. Codes in the 5xx range indicate an error with Partoo servers (these are rare). List of potential error code
"error": {
"json": { }
}
"error": {
"authentication": "User not authenticated"
}
"error": {
"authorization": "Operation not allowed"
}
"error": {
"json": "Resource not found"
}
Our API framework requires Content-Type
header to be provided as application/json
on POST
, PUT
and PATCH
operations.
If your API integration doesn't properly send this header, an error may appear
{
"errors": {
"json": "Unsupported media type. Please use application/json"
}
}
See Rate Limiting
The Partoo Rest API is meant to be used only from a server that you control. You'll need an API Key in order to make API calls, and you should treat this key as secret as a password. The API Key should never be transmitted to or included into the front-end. If you need to make calls from a front-end, you should proxy them by a server that you control, that will add your API Key.
Some functionalities are disabled in Sandbox, to avoid having a production impact:
In order to keep service available for everyone, our APIs are protected using a Rate Limit.
Each organization is limited to 300 calls per minute by default. If your integration requires more calls for any reason, get in touch with your customer success to update this limit, with review from our Tech team.
Any call beyond the reached limit will result in an error with status code 429.
A http header Retry-After
is added to the response to hint when a query can be retried (60s later).
Partoo data is organised around 5 main resources:
organizations
, businesses
, users
and groups
. If you are a Partoo reseller there will be a provider resource representing
you inside Partoo app.businesses
(or listings).
If you are a Partoo client there are one or several organizations representing your companies.
An organization belongs to a provider
.organization
and has a role
which gives him different levels of access on the different resources on Partoo (see section below).organization
To use Partoo Rest API, you need an api_key
(see authentication section). An api_key
authenticates a user and each user has a role
.
A role
defines for each resource (for instance user
) aREAD
and/or WRITE
access with the scope on which this access can be used.
For instance a user with BUSINESS_MANAGER
role has WRITE
access on its own user and READ
acces to all the users of its organization.
For now there are 5 roles available:
PROVIDER
role is meant for reseller admin user. It can manage organizations, users and businesses of a providerORG_ADMIN
role is meant for client admin user. It can manage the user and businesses of its organizationGROUP_MANAGER
role is meant for client group manager. It can manage several businesses and users that belong to the group he managedBUSINESS_MANAGER
role is meant for client business manager. It can manage several businesses, only if these businesses are in the same group.PUBLISHER
role is meant for publisher wanting to use Partoo as a data source. It can read Partoo businesses subscribed to presence management productPROVIDER
role is meant for reseller admin user. It can manage its provider organizations, users and businesses.
Resource | Scope | Details |
---|---|---|
User | Provider | Can access the users that shares its provider |
Organization | Provider | Can access the organizations that shares its provider |
Group | Provider | Can access the groups that share its provider |
Business | Provider | Can access the businesses that share its provider |
Category | All | Can access all categories |
Resource | Scope | Details |
---|---|---|
User | Provider | - Can create user, it will share its provider - Can update user that shares its provider - Can give role ORG_ADMIN and BUSINESS_MANAGER to user |
Organization | Provider | - Can create organization, it will share its provider - Can update org that shares its provider |
Group | Provider | - Can create group, it will share its provider - Can update group that shares its provider |
Business | Provider | - Can create business, they will share its provider (and its org_id if no org_id given) - Can update businesses that shares its provider |
Category | not writable |
ORG_ADMIN
role is meant for client admin user. It can manage its organization users and businesses.
Resource | Scope | Details |
---|---|---|
User | Organization | Can access the users that shares its org_id |
Organization | Organization | Can access only its own org |
Group | Organization | Can access the group that shares its org_id |
Business | Organization | Can access the businesses that shares its org_id |
Category | All | Can access all categories |
Resource | Scope | Details |
---|---|---|
User | Organization | - Can create user, it will share its provider and its org_id . - Can update user that shares its org_id - Can give the role GROUP_MANAGER and BUSINESS_MANAGER to its user |
Organization | Organization | - Can update itself - Cannot create new org. |
Group | Organization | - Can create group, it will share its provider and its org_id - Can update group that shares its org_id |
Business | Organization | - Can create business, it will share its provider and its org_id - Can update businesses that shares its org_id |
Category | not writable |
GROUP_MANAGER
role is meant for client group manager. It can manage several businesses and users that belong to the group he managed.
Resource | Scope | Details |
---|---|---|
User | Organization | Can access the ORG_ADMIN that shares its org_id and the GROUP_MANAGER and BUSINESS_MANAGER that belong to its group |
Organization | Organization | Can access only its own org |
Group | Group | Can access only its group |
Business | Group | Can access the businesses that belong to its group |
Category | All | Can access all categories |
Resource | Scope | Details |
---|---|---|
User | Group | - Can create user, it will share its provider, its org_id and its group_id . - Can update user that shares its org_id - Can only give the role BUSINESS_MANAGER to its user |
Organization | No access | |
Group | Group | - Can update its own group - Cannot create group |
Business | Group | - Can update businesses that belong to its group - Cannot create business |
Category | not writable |
BUSINESS_MANAGER
role is meant for client business manager. It can manage several businesses, only if these businesses are in the same group.
Resource | Scope | Details |
---|---|---|
User | Organization | Can access the users that shares its org_id |
Organization | Organization | Can access only its own org |
Group | Group | Can access only its group |
Business | Business | Can access the businesses that it has direct access to |
Category | All | Can access all categories |
Resource | Scope | Details |
---|---|---|
User | User | - Can update its user only |
Organization | No access | |
Group | No access | |
Business | Business | - Can update businesses that it has direct access to - Cannot create business |
Category | not writable |
PUBLISHER
role is meant for publisher wanting to use Partoo as a data source. It can read Partoo businesses subscribed to presence management product.
Resource | Scope | Details |
---|---|---|
User | No access | |
Organization | All | Can access all Partoo organizations |
Group | No access | |
Business | Subscribed to Presence Management | Can access the businesses subscribed to presence management product |
Category | All | Can access all categories |
For any questions related to the API functionality, please contact the technical support team at api@partoo.fr.
In this section you will have all the operation to list/information/revoke/update api keys that can be used to authenticate user either on the REST API or on the JS API. A user has access to it's own api keys. Only ORG_ADMIN and PROVIDER users can access api keys type BOT.
This endpoint lets you list all the API keys you have access to.
status | string (Status) Enum: "active" "inactive" "disabled" "expired" Example: status=active Filter api_keys by status. A key is inactive when expired or disabled. |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "api_keys": [
- {
- "id": 3245,
- "label": "API key name",
- "user_id": "5309c3a237bbc544d8e26737",
- "user_name": "Perceval de Galles",
- "user_role": "BUSINESS_MANAGER",
- "disabled": false,
- "expiration_date": "2022-06-05",
- "last_used_at": "2019-08-22 11:46:38.914467+00",
- "created_by": "5309c3a237bbc544d8e26737",
- "created_by_name": "John Smith",
- "created_at": "2018-03-12 11:49:03.399475+00",
- "revoked_by": "5309c3a237bbc544d8e26737",
- "revoked_by_name": "John Smith",
- "revoked_at": "2020-10-20 11:46:38.914467+00",
- "ip_whitelist": [
- "172.16.0.0/12",
- "127.0.0.1"
]
}
]
}
Given an API key ID, this endpoint gives you information about one key.
api_key_id required | integer (id) Example: 3245 Key ID |
{- "id": 3245,
- "label": "API key name",
- "user_id": "5309c3a237bbc544d8e26737",
- "user_name": "Perceval de Galles",
- "user_role": "BUSINESS_MANAGER",
- "disabled": false,
- "expiration_date": "2022-06-05",
- "last_used_at": "2019-08-22 11:46:38.914467+00",
- "created_by": "5309c3a237bbc544d8e26737",
- "created_by_name": "John Smith",
- "created_at": "2018-03-12 11:49:03.399475+00",
- "revoked_by": "5309c3a237bbc544d8e26737",
- "revoked_by_name": "John Smith",
- "revoked_at": "2020-10-20 11:46:38.914467+00",
- "ip_whitelist": [
- "172.16.0.0/12",
- "127.0.0.1"
]
}
This endpoint lets you update API keys you have access to.
api_key_id required | integer (id) Example: 3245 Key ID |
label | string (label) Name given to recognize the Api key |
expiration_date | string (expiration_date) yyyy-mm-dd Must be at least the day after today. If you want it to expire today you must revoke it. You can set it to null. |
ip_whitelist | Array of strings (ip_whitelist) List of IP or CIDR network notations to which API Key calls are restricted. Empty list means no restriction. |
{- "label": "API key name",
- "expiration_date": "2022-06-05",
- "ip_whitelist": [
- "172.16.0.0/12",
- "127.0.0.1"
]
}
{- "id": 3245,
- "label": "API key name",
- "user_id": "5309c3a237bbc544d8e26737",
- "user_name": "Perceval de Galles",
- "user_role": "BUSINESS_MANAGER",
- "disabled": false,
- "expiration_date": "2022-06-05",
- "last_used_at": "2019-08-22 11:46:38.914467+00",
- "created_by": "5309c3a237bbc544d8e26737",
- "created_by_name": "John Smith",
- "created_at": "2018-03-12 11:49:03.399475+00",
- "revoked_by": "5309c3a237bbc544d8e26737",
- "revoked_by_name": "John Smith",
- "revoked_at": "2020-10-20 11:46:38.914467+00",
- "ip_whitelist": [
- "172.16.0.0/12",
- "127.0.0.1"
]
}
A business
object contains all the details related to a local store. All the businesses created will be grouped under your organization
. The organization is created at the onboarding phase, by Partoo.
In this section, is explained how a business can be created, updated or retrieved.
This lets you search among the businesses you have READ
access to. You can use several filters. The response is paginated (30 results per page).
query | string Parameter to fuzzy search businesses on city, zipcode and name |
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
org_id | integer Filter by organization id |
groups | Array of integers Example: groups=1,2,3 Filter by groups, using the access logic with the and/or depending on the groups sections |
country | string Filter by country - ISO 3166 alpha2 code (i.e. “FR” for France) |
name | string Filter by name |
status | string (BusinessStatusFilter) Default: "open" Enum: "open" "closed" "opening_soon" "temporarily_closed" Example: status=open Defines the current status of the business. `Open` indicates the business is up and running. `Closed` means that the business has definitely closed. `Opening Soon` indicates the business is open with an opening date set in the future. `Temporarily closed` means that the business is temporarily closed. ⚠️ To get all businesses with the status |
zipcode | string Filter by zipcode |
city | string Filter by city |
code | string Filter by code |
modified__gte | number Filter by modified attribute (modified >= modified_gte) |
features__in | string Enum: "diffusion" "feedback_management" "messages" "posts" "review_invite" "review_management" Example: features__in=diffusion,review_management Filter businesses that have all the features provided, separated by commas. |
features__notin | string Enum: "diffusion" "feedback_management" "messages" "posts" "review_invite" "review_management" Example: features__notin=diffusion,review_management Filter businesses that do not have all the features provided, separated by commas. |
subscribed_to_rm | string Enum: "True" "False" Filter by current subscription to |
subscribed_to_pm | string Enum: "True" "False" Filter by current subscription to |
subscribed_to_rb | string Enum: "True" "False" Filter by current subscription to |
subscribed_to_bm | string Enum: "True" "False" Filter by current subscription to |
completion_rate__gte | number Filter by completion_rate attribute (completion_rate >= completion_rate__gte) |
completion_rate__lte | number Filter by completion_rate attribute (completion_rate <= completion_rate__lte) |
completion_rate | string Enum: "low" "mid" "high" Example: completion_rate=low,mid Filter by completion_rate attribute. You can separate the values by a comma, as done in the example. |
has_promo | string Deprecated Enum: "True" "False" Retrieve only businesses having promotional offers |
connected_to_gmb_location | string Enum: "True" "False" Filter by current link to a Google location |
connected_to_facebook_location | string Enum: "True" "False" Filter by current link to a Facebook location |
page | integer Default: 1 Page number, Starts at 1. From 1 to 100 results per page (see |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. Currently limited to 100. |
order_by | string Default: "id" Enum: "id" "name" "code" "created" "modified" "country" "city" "zipcode" "completion_rate" "-id" "-name" "-code" "-created" "-modified" "-country" "-city" "-zipcode" "-completion_rate" Order result by given attribute.
Reverse order can as well be obtained by using a |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "businesses": [
- {
- "id": "5409c35a97bbc544d8e26737",
- "created": 1409925979.5,
- "modified": 1561335111.681374,
- "code": "CS-75019",
- "status": "open",
- "opening_date": "2025-01-01",
- "org_id": 42,
- "group_id": 23,
- "groups": [
- 1,
- 2,
- 3
], - "name": "Corner shop",
- "address": "string",
- "address_full": "12 bis rue du coquelicot",
- "address2": "string",
- "city": "Paris",
- "zipcode": "75019",
- "region": "Ile-de-France",
- "country": "FR",
- "default_lang": "fr",
- "categories": [
- "gcid:restaurant",
- "gcid:fast_food_restaurant",
- "gcid:hamburger_restaurant"
], - "time_slot_reference": [
- "10:00-14:00"
], - "open_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "specific_hours": {
- "open": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-20",
- "open_hours": [
- "10:00-14:00"
]
}
], - "close": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-22"
}
]
}, - "description_short": "lorem ipsum",
- "description_long": "lorem ipsum dolor sit amet",
- "google_location_id": "string",
- "facebook_page_id": "string",
- "national_identification_number": "string",
- "contacts": [
- {
- "name": "Hubert Bonisseur de la Bath",
- "email": "hubert@oss117.fr",
- "phone_numbers": [
- "+33302060628"
], - "fax": "+33302060629"
}
], - "photos": {
}, - "lat": -3.585993,
- "long": 47.870341,
- "subscriptions": {
- "presence_management": {
- "active": true
}, - "review_management": {
- "active": true
}, - "review_booster": {
- "active": false
}, - "messages": {
- "active": false
}
}, - "features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages"
], - "custom_fields": [
- {
- "id": 1,
- "type": "BOOLEAN",
- "name": "Parking",
- "value": true,
- "order": 1
}, - {
- "id": 2,
- "type": "TEXT",
- "name": "ManagerName",
- "value": "toto",
- "order": 2
}, - {
- "id": 3,
- "type": "TEXT",
- "name": "Supervisor",
- "value": null,
- "order": 2
}, - {
- "id": 4,
- "type": "INTEGER",
- "name": "Surface",
- "value": 2,
- "order": 3
}, - {
- "id": 5,
- "type": "FLOAT",
- "name": "DistanceFromSubway",
- "value": 2.55,
- "order": 4
}, - {
- "id": 6,
- "type": "SINGLE_SELECT",
- "name": "Level",
- "value": "two",
- "order": 4
}, - {
- "id": 7,
- "type": "MULTIPLE_SELECT",
- "name": "Services",
- "value": [
- "one",
- "two"
], - "order": 5
}, - {
- "id": 8,
- "type": "MULTIPLE_SELECT_IMAGE",
- "name": "BannerImage",
- "value": [
- "image 1",
- "image 2"
], - "order": 6
}, - {
- "id": 9,
- "type": "IMAGES_UPLOADER",
- "name": "TeamMembers",
- "value": [
- {
- "url": "image1",
- "texts": {
- "name1": "value 1",
- "name2": "value 2"
}
}
], - "order": 7
}
], - "completion_rate": 77,
- "promos": [
- {
- "title": "string",
- "description": "string",
- "term_of_use": "string",
- "additional_informations": "string",
- "begin": 0,
- "end": 0,
}
]
}
]
}
This endpoint works in the same way as the operation/searchBusinesses endpoint, but instead of returning data on all returned businesses, this endpoint returns completion rate statistics aggregated across all businesses.
The statistics returned are the average completion rate for all businesses that fit the given filters, as well as the count of businesses with a low, medium, and high respectively. The thresholds for low, medium, and high can be found below in the response details.
Note that this endpoint works in the exact same way as operation/searchBusinesses (with the exception of parameters that format the output, such as order_by
and pagination), but the return value is different.
query | string Parameter to fuzzy search businesses on city, zipcode and name |
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
org_id | integer Filter by organization id |
groups | Array of integers Example: groups=1,2,3 Filter by groups, using the access logic with the and/or depending on the groups sections |
country | string Filter by country - ISO 3166 alpha2 code (i.e. “FR” for France) |
name | string Filter by name |
status | string (BusinessStatusFilter) Default: "open" Enum: "open" "closed" "opening_soon" "temporarily_closed" Example: status=open Defines the current status of the business. `Open` indicates the business is up and running. `Closed` means that the business has definitely closed. `Opening Soon` indicates the business is open with an opening date set in the future. `Temporarily closed` means that the business is temporarily closed. ⚠️ To get all businesses with the status |
zipcode | string Filter by zipcode |
city | string Filter by city |
code | string Filter by code |
modified__gte | number Filter by modified attribute (modified >= modified_gte) |
features__in | string Enum: "diffusion" "feedback_management" "messages" "posts" "review_invite" "review_management" Example: features__in=diffusion,review_management Filter businesses that have all the features provided, separated by commas. |
features__notin | string Enum: "diffusion" "feedback_management" "messages" "posts" "review_invite" "review_management" Example: features__notin=diffusion,review_management Filter businesses that do not have all the features provided, separated by commas. |
subscribed_to_rm | string Enum: "True" "False" Filter by current subscription to |
subscribed_to_pm | string Enum: "True" "False" Filter by current subscription to |
subscribed_to_rb | string Enum: "True" "False" Filter by current subscription to |
subscribed_to_bm | string Enum: "True" "False" Filter by current subscription to |
completion_rate__gte | number Filter by completion_rate attribute (completion_rate >= completion_rate__gte) |
completion_rate__lte | number Filter by completion_rate attribute (completion_rate <= completion_rate__lte) |
completion_rate | string Enum: "low" "mid" "high" Example: completion_rate=low,mid Filter by completion_rate attribute. You can separate the values by a comma, as done in the example. |
has_promo | string Deprecated Enum: "True" "False" Retrieve only businesses having promotional offers |
connected_to_gmb_location | string Enum: "True" "False" Filter by current link to a Google location |
connected_to_facebook_location | string Enum: "True" "False" Filter by current link to a Facebook location |
{- "average_completion_rate": 72,
- "counts": {
- "low": 2,
- "mid": 10,
- "high": 22
}
}
This endpoint lets you access the number of businesses connected to different platforms.
{- "count": 0,
- "linked_to_gmb_count": 0,
- "linked_to_facebook_count": 0,
- "linked_to_tripadvisor_count": 0,
- "linked_to_instagram_count": 0
}
This API allows the creation of a new business in the context of your organization.
name required | string (BusinessName) non-empty The name of the business (POI) as it will appear on the publishing platforms |
org_id | integer (BusinessOrgId) The organization unique identifier at Partoo. During onboarding, Partoo creates an organization where all your businesses will be aggregated |
groups | Array of integers (groups) List of Group ID of the business. Groups the business belongs to. |
reach | string (BusinessReach) Enum: "LOCAL" "GLOBAL" Defines whether the business is a physical entity with an address (LOCAL) or a Brand (GLOBAL). |
country required | string (BusinessCountry) Business country - In the ISO 3166 alpha2 code format (i.e. use “FR” for France instead of "fr") |
zipcode | string or null (BusinessZipcode) Zipcode (or postal code) for the business address. Can be empty if the business' country does not require one. |
city | string (RequiredBusinessCity) The city where the business is located.
|
region | string or null (BusinessRegion) The region where the business is located. Can be empty, it is only useful for some countries like Italy or Spain among others. |
categories required | Array of strings (BusinessCategories) non-empty A list of category ids mapped to the business. At least one category needs to be provided. For more information see Categories section |
code | string (BusinessCode) The unique store code of the business. If not provided, it will be automatically generated |
status | string (BusinessStatus) Enum: "open" "closed" "temporarily_closed" Defines the current status of the business. |
opening_date | string <YYYY-MM-DD> (BusinessOpeningDate) The opening_date represents the date when a business was opened. The format of the date must be in ISO 8601 format (YYYY-MM-DD). ⚠️ The date must be in the past or no more than one year in the future from the current date (Google API requirement). |
address_full | string or null (AddressFull) Full address of the business. For example : |
address2 | string or null (Address2) Complement of address. Any additional information that could help better find the business location |
lat | number <double> (BusinessLatitude) Latitude. Decimals are separated by a dot and not by a comma. |
long | number <double> (BusinessLongitude) Longitude. Decimals are separated by a dot and not by a comma. |
website_url | string <uri> (BusinessWebsite) The business own website url or the main url of the company. |
facebook_url | string <uri> (BusinessFacebookPage) Business Facebook page url |
twitter_url | string <uri> (BusinessTwitter) Business twitter page url |
description_short | string (BusinessShortDescription) A short description of the business. ⚠️It is limited to 80 characters |
description_long | string (BusinessLongDescription) A more detailed description of the business. ⚠️It is limited to 750 characters |
object (OpenHours) The opening hours of the business (in its timezone). Opening hours are specified per weekday. This is done by supplying an object mapping weekdays ("monday", "tuesday", etc.) to a list of of strings. These strings in turn represent time slots during which the business is open. For example, the following value would set the opening hours to between 08:00-15:00 in the afternoon and 18:00-23:00 in the evening on Mondays:
To indicate that a business is open 24 hours for a specific weekday, use the value ❗ This field is not mandatory, but if not provided then the business will not be pushed on some platforms (example: Google). If provided, then a schedule needs to be sent for each day in particular | |
object (SpecificHours) Exceptional opening or closing times for the business (in its timezone). All exceptional days of the year, including temporarily closed, can be specified beforehand or on the go. For example:
Specific hours are defined by two values:
These values in turn, contain:
| |
required | Array of objects (BusinessContactsCreate) Specify how the clients can reach the persons in charge of the business in case they have questions. |
object (Photos) Business photos Each business can have one or more photos associated | |
national_identification_number | string (BusinessNationalIdentificationNumber) The National Identification Number of the business It describes a unique number for which the business is registered in a specific country. For example, in France, it's SIRET code or for Ireland it's the CRO |
object (CustomFields.Update) Custom Fields set for this Business They represent configurable fields that can be defined in addition to the normal business fields proposed by Partoo. They are unique to the organization and should suit your company needs. |
{- "name": "Corner shop",
- "org_id": 42,
- "groups": [
- 1,
- 2,
- 3
], - "reach": "LOCAL",
- "country": "FR",
- "zipcode": "75019",
- "city": "Paris",
- "region": "Ile-de-France",
- "categories": [
- "gcid:restaurant",
- "gcid:fast_food_restaurant",
- "gcid:hamburger_restaurant"
], - "code": "CS-75019",
- "status": "open",
- "opening_date": "2025-01-01",
- "address_full": "12 bis rue du coquelicot",
- "address2": "string",
- "lat": -3.585993,
- "long": 47.870341,
- "description_short": "lorem ipsum",
- "description_long": "lorem ipsum dolor sit amet",
- "open_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "specific_hours": {
- "open": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-20",
- "open_hours": [
- "10:00-14:00"
]
}
], - "close": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-22"
}
]
}, - "contacts": [
- {
- "name": "Hubert Bonisseur de la Bath",
- "email": "hubert@oss117.fr",
- "phone_numbers": [
- "+33302060628"
], - "fax": "+33302060629"
}
], - "photos": {
}, - "national_identification_number": "string",
- "custom_fields": {
- "Parking": true,
- "ManagerName": "toto",
- "Surface": 35,
- "DistanceFromSubway": 1.5,
- "Level": "one",
- "Services": [
- "DisabledAccess",
- "FreeParking"
], - "BannerImage": [
- "image 1",
- "image 2"
], - "TeamMembers": [
- {
- "url": "image1",
- "texts": {
- "name1": "value 1",
- "name2": "value 2"
}
}
]
}
}
{- "status": "success",
- "id": "5409c35a97bbc544d8e26737"
}
This endpoint lets you access to the information of a business. You need to have READ
access on this business.
business_id required | string Business id. |
{- "id": "5409c35a97bbc544d8e26737",
- "created": 1409925979.5,
- "modified": 1561335111.681374,
- "code": "CS-75019",
- "status": "open",
- "opening_date": "2025-01-01",
- "org_id": 42,
- "group_id": 23,
- "groups": [
- 1,
- 2,
- 3
], - "name": "Corner shop",
- "address": "string",
- "address_full": "12 bis rue du coquelicot",
- "address2": "string",
- "city": "Paris",
- "zipcode": "75019",
- "region": "Ile-de-France",
- "country": "FR",
- "default_lang": "fr",
- "categories": [
- "gcid:restaurant",
- "gcid:fast_food_restaurant",
- "gcid:hamburger_restaurant"
], - "time_slot_reference": [
- "10:00-14:00"
], - "open_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "specific_hours": {
- "open": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-20",
- "open_hours": [
- "10:00-14:00"
]
}
], - "close": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-22"
}
]
}, - "description_short": "lorem ipsum",
- "description_long": "lorem ipsum dolor sit amet",
- "google_location_id": "string",
- "facebook_page_id": "string",
- "national_identification_number": "string",
- "contacts": [
- {
- "name": "Hubert Bonisseur de la Bath",
- "email": "hubert@oss117.fr",
- "phone_numbers": [
- "+33302060628"
], - "fax": "+33302060629"
}
], - "photos": {
}, - "lat": -3.585993,
- "long": 47.870341,
- "subscriptions": {
- "presence_management": {
- "active": true
}, - "review_management": {
- "active": true
}, - "review_booster": {
- "active": false
}, - "messages": {
- "active": false
}
}, - "features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages"
], - "custom_fields": [
- {
- "id": 1,
- "type": "BOOLEAN",
- "name": "Parking",
- "value": true,
- "order": 1
}, - {
- "id": 2,
- "type": "TEXT",
- "name": "ManagerName",
- "value": "toto",
- "order": 2
}, - {
- "id": 3,
- "type": "TEXT",
- "name": "Supervisor",
- "value": null,
- "order": 2
}, - {
- "id": 4,
- "type": "INTEGER",
- "name": "Surface",
- "value": 2,
- "order": 3
}, - {
- "id": 5,
- "type": "FLOAT",
- "name": "DistanceFromSubway",
- "value": 2.55,
- "order": 4
}, - {
- "id": 6,
- "type": "SINGLE_SELECT",
- "name": "Level",
- "value": "two",
- "order": 4
}, - {
- "id": 7,
- "type": "MULTIPLE_SELECT",
- "name": "Services",
- "value": [
- "one",
- "two"
], - "order": 5
}, - {
- "id": 8,
- "type": "MULTIPLE_SELECT_IMAGE",
- "name": "BannerImage",
- "value": [
- "image 1",
- "image 2"
], - "order": 6
}, - {
- "id": 9,
- "type": "IMAGES_UPLOADER",
- "name": "TeamMembers",
- "value": [
- {
- "url": "image1",
- "texts": {
- "name1": "value 1",
- "name2": "value 2"
}
}
], - "order": 7
}
], - "completion_rate": 77,
- "promos": [
- {
- "title": "string",
- "description": "string",
- "term_of_use": "string",
- "additional_informations": "string",
- "begin": 0,
- "end": 0,
}
]
}
This endpoint lets you access to the information of a business. You need to have WRITE
access on this business. Only indicated values are taken into account (it works like a PATCH
). You cannot push fields disabled for your org.
business_id required | string Business id. |
name | string (BusinessName) non-empty The name of the business (POI) as it will appear on the publishing platforms |
org_id | integer (BusinessOrgId) The organization unique identifier at Partoo. During onboarding, Partoo creates an organization where all your businesses will be aggregated |
groups | Array of integers (groups) List of Group ID of the business. Groups the business belongs to. |
country | string (BusinessCountry) Business country - In the ISO 3166 alpha2 code format (i.e. use “FR” for France instead of "fr") |
zipcode | string or null (BusinessZipcode) Zipcode (or postal code) for the business address. Can be empty if the business' country does not require one. |
city | string or null (BusinessCity) The city where the business is located |
region | string or null (BusinessRegion) The region where the business is located. Can be empty, it is only useful for some countries like Italy or Spain among others. |
categories | Array of strings (BusinessCategories) non-empty A list of category ids mapped to the business. At least one category needs to be provided. For more information see Categories section |
code | string (BusinessCode) The unique store code of the business. If not provided, it will be automatically generated |
status | string (BusinessStatus) Enum: "open" "closed" "temporarily_closed" Defines the current status of the business. |
opening_date | string <YYYY-MM-DD> (BusinessOpeningDate) The opening_date represents the date when a business was opened. The format of the date must be in ISO 8601 format (YYYY-MM-DD). ⚠️ The date must be in the past or no more than one year in the future from the current date (Google API requirement). |
address2 | string Row address string |
address_full | string or null (AddressFull) Full address of the business. For example : |
lat | number <double> (BusinessLatitude) Latitude. Decimals are separated by a dot and not by a comma. |
long | number <double> (BusinessLongitude) Longitude. Decimals are separated by a dot and not by a comma. |
website_url | string <uri> (BusinessWebsite) The business own website url or the main url of the company. |
facebook_url | string <uri> (BusinessFacebookPage) Business Facebook page url |
twitter_url | string <uri> (BusinessTwitter) Business twitter page url |
description_short | string (BusinessShortDescription) A short description of the business. ⚠️It is limited to 80 characters |
description_long | string (BusinessLongDescription) A more detailed description of the business. ⚠️It is limited to 750 characters |
object (OpenHours) The opening hours of the business (in its timezone). Opening hours are specified per weekday. This is done by supplying an object mapping weekdays ("monday", "tuesday", etc.) to a list of of strings. These strings in turn represent time slots during which the business is open. For example, the following value would set the opening hours to between 08:00-15:00 in the afternoon and 18:00-23:00 in the evening on Mondays:
To indicate that a business is open 24 hours for a specific weekday, use the value ❗ This field is not mandatory, but if not provided then the business will not be pushed on some platforms (example: Google). If provided, then a schedule needs to be sent for each day in particular | |
object (SpecificHours) Exceptional opening or closing times for the business (in its timezone). All exceptional days of the year, including temporarily closed, can be specified beforehand or on the go. For example:
Specific hours are defined by two values:
These values in turn, contain:
| |
Array of objects (BusinessContacts) Specify how the clients can reach the persons in charge of the business in case they have questions. | |
object (Photos) Business photos Each business can have one or more photos associated | |
national_identification_number | string (BusinessNationalIdentificationNumber) The National Identification Number of the business It describes a unique number for which the business is registered in a specific country. For example, in France, it's SIRET code or for Ireland it's the CRO |
object (CustomFields.Update) Custom Fields set for this Business They represent configurable fields that can be defined in addition to the normal business fields proposed by Partoo. They are unique to the organization and should suit your company needs. |
{- "name": "Corner shop",
- "org_id": 42,
- "groups": [
- 1,
- 2,
- 3
], - "country": "FR",
- "zipcode": "75019",
- "city": "Paris",
- "region": "Ile-de-France",
- "categories": [
- "gcid:restaurant",
- "gcid:fast_food_restaurant",
- "gcid:hamburger_restaurant"
], - "code": "CS-75019",
- "status": "open",
- "opening_date": "2025-01-01",
- "address2": "string",
- "address_full": "12 bis rue du coquelicot",
- "lat": -3.585993,
- "long": 47.870341,
- "description_short": "lorem ipsum",
- "description_long": "lorem ipsum dolor sit amet",
- "open_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "specific_hours": {
- "open": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-20",
- "open_hours": [
- "10:00-14:00"
]
}
], - "close": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-22"
}
]
}, - "contacts": [
- {
- "name": "Hubert Bonisseur de la Bath",
- "email": "hubert@oss117.fr",
- "phone_numbers": [
- "+33302060628"
], - "fax": "+33302060629"
}
], - "photos": {
}, - "national_identification_number": "string",
- "custom_fields": {
- "Parking": true,
- "ManagerName": "toto",
- "Surface": 35,
- "DistanceFromSubway": 1.5,
- "Level": "one",
- "Services": [
- "DisabledAccess",
- "FreeParking"
], - "BannerImage": [
- "image 1",
- "image 2"
], - "TeamMembers": [
- {
- "url": "image1",
- "texts": {
- "name1": "value 1",
- "name2": "value 2"
}
}
]
}
}
{- "status": "success",
- "id": "5409c35a97bbc544d8e26737"
}
This endpoint lets you delete a business. You need to have WRITE
access on this business.
business_id required | string Business id. |
{- "id": "5409c35a97bbc544d8e26737",
- "status": "success"
}
This endpoint lets you access the subscription of a business. You need to have READ
access on this business.
business_id required | string Business id. |
{- "presence_management": {
- "status": "inactive",
- "canceling_date": 0
}, - "review_management": {
- "status": "inactive",
- "canceling_date": 0
}, - "review_booster": {
- "status": "inactive",
- "canceling_date": 0
}, - "messages": {
- "status": "inactive",
- "canceling_date": 0
}
}
This endpoint lets you subscribe a business to one or several Partoo products. You need to have WRITE
access on the business you want to subscribe. You need to have PROVIDER
to be able to perform this action.
business_id required | string Business id. |
subscription_date | number Timestamp representing the date on which the subscription will start |
products | Array of strings (Product) Items Enum: "presence_management" "review_booster" "review_management" "messages" List of products |
plan | string Any string that define your offer |
{- "subscription_date": 1540628702,
- "products": [
- "presence_management"
], - "plan": "string"
}
{- "presence_management": {
- "subscription_date": 1540628702,
- "status": "active"
}, - "review_management": {
- "subscription_date": 1540628702,
- "status": "active"
}, - "review_booster": {
- "subscription_date": 1540628702,
- "status": "active"
}, - "messages": {
- "subscription_date": 1540628702,
- "status": "active"
}
}
This endpoint lets you unsubscribe a business from one or several Partoo products. You need to have WRITE
access on the business you want to subscribe. You need to have PROVIDER
to be able to perform this action.
business_id required | string Business id. |
canceling_date | number Timestamp representing the date on which the subscription will stop to be valid |
products | Array of strings (Product) Items Enum: "presence_management" "review_booster" "review_management" "messages" List of products |
{- "canceling_date": 1540628702,
- "products": [
- "presence_management"
]
}
{- "presence_management": {
- "subscription_date": 1540628702,
- "status": "active"
}, - "review_management": {
- "subscription_date": 1540628702,
- "status": "active"
}, - "review_booster": {
- "subscription_date": 1540628702,
- "status": "active"
}, - "messages": {
- "subscription_date": 1540628702,
- "status": "active"
}
}
This endpoint lets you access to the additional data of business. You need to have READ
access on this business.
business_id required | string Business id. |
{- "additionnal_data_1": "Some data",
- "additionnal_data_2": 3.1415
}
This endpoint lets you set additional data on a business. You need to have WRITE
access on this business. Additional is a flat object with at most 10 keys.
business_id required | string Business id. |
additionnal_data_1 | string |
additionnal_data_2 | number |
{- "additionnal_data_1": "Some data",
- "additionnal_data_2": 3.1415
}
{- "id": "5409c35a97bbc544d8e26737",
- "status": "success"
}
This endpoint allows you to view the Google attributes set for your business.
business_id required | string Business id. |
category_name | string Example: category_name=gcid:restaurant Category for which availabe attributes will be fetched. |
country required | string Example: country=FR Country for which available attributes will be fetched - use ISO 3166 alpha2 code ("FR", "EN", "IT"). |
{- "attributes": [
- {
- "type": "BOOL",
- "gmb_id": "has_curbside_pickup",
- "value": false
}, - {
- "type": "BOOL",
- "gmb_id": "has_delivery",
- "value": true
}, - {
- "type": "ENUM",
- "gmb_id": "wi_fi",
- "value": "free_wi_fi"
}, - {
- "type": "REPEATABLE_ENUM",
- "gmb_id": "pay_credit_card_types_accepted",
- "value": {
- "set_values": [
- "american_express",
- "discover"
], - "unset_values": [ ]
}
}, - {
- "type": "REPEATABLE_URL",
- "gmb_id": "url_order_ahead",
- "value": null
}, - {
- "type": "REPEATABLE_URL",
- "gmb_id": "url_reservations",
}
]
}
This endpoint allows you to set Google attributes for your business.
business_id required | string Business id. |
Array of Attributes.Field.BOOL (object) or Attributes.Field.ENUM (object) or Attributes.Field.REPEATABLE_ENUM (object) or Attributes.Field.URL (object) or Attributes.Field.REPEATABLE_URL (object) (PostAttributes.Array) List of Business Attributes |
{- "attributes": [
- {
- "type": "BOOL",
- "gmb_id": "has_curbside_pickup",
- "value": false
}, - {
- "type": "ENUM",
- "gmb_id": "wi_fi",
- "value": "free_wi_fi"
}, - {
- "type": "REPEATABLE_ENUM",
- "gmb_id": "pay_credit_card_types_accepted",
- "value": {
- "set_values": [
- "american_express",
- "discover"
], - "unset_values": [ ]
}
}, - {
- "type": "REPEATABLE_URL",
- "gmb_id": "url_reservations",
}
]
}
{- "status": "success"
}
This endpoint allows you to view the More Hours set for your business.
business_id required | string Business id. |
category | string Example: category=gcid:restaurant If supplied, will only return more hours that are available for the specified business category. If not supplied, the business' main category will be used. |
country | string Example: country=FR If supplied, will only return more hours that are available in the specified country. - use ISO 3166 alpha2 code ("FR", "EN", "IT"). If not supplied, the country from the business' address will be used. |
{- "more_hours": [
- {
- "gmb_id": "KITCHEN",
- "value": {
- "monday": [
- "08:00-15:00",
- "18:00-23:00"
], - "tuesday": [
- "08:00-15:00",
- "18:00-23:00"
], - "wednesday": [
- "08:00-15:00",
- "18:00-23:00"
], - "thursday": [
- "08:00-15:00",
- "18:00-23:00"
], - "friday": [
- "08:00-15:00",
- "18:00-23:00"
], - "saturday": [
- "08:00-15:00",
- "18:00-23:00"
], - "sunday": [
- "08:00-15:00",
- "18:00-23:00"
]
}
}, - {
- "gmb_id": "LUNCH",
- "value": {
- "monday": [
- "11:00-15:00"
], - "tuesday": [
- "11:00-15:00"
], - "wednesday": [
- "11:00-15:00"
], - "thursday": [
- "11:00-15:00"
], - "friday": [
- "11:00-15:00"
], - "saturday": [ ],
- "sunday": [ ]
}
}
]
}
This endpoint allows you to set the More Hours for your business.
business_id required | string Business id. |
Array of objects Array containing the more hours values to update. Grouped by More Hour ID. Only More Hour IDs included in the body will be updated. |
{- "more_hours": [
- {
- "gmb_id": "KITCHEN",
- "value": {
- "monday": [ ],
- "tuesday": [ ],
- "wednesday": [ ],
- "thursday": [ ],
- "friday": [ ],
- "saturday": [
- "08:00-15:00",
- "18:00-23:00"
], - "sunday": [
- "08:00-15:00",
- "18:00-23:00"
]
}
}, - {
- "gmb_id": "BRUNCH",
- "value": null
}
]
}
{- "status": "success",
- "id": "545f7bf982efa41a496379d2"
}
This endpoint allows you to view the Google Services set for your business.
business_id required | string Business id. |
{- "services": [
- {
- "service_id": 1,
- "type": "STRUCTURED_SERVICE_ITEM",
- "name": "Climbing Gym",
- "price": 50,
- "description": "Our climbing gym available for all",
- "category_gmb_name": "gcid:climbing_gym"
}, - {
- "service_id": 2,
- "type": "FREE_FORM_SERVICE_ITEM",
- "name": "Random Name",
- "price": 25.35,
- "description": "This is our custom service",
- "category_gmb_name": "gcid:climbing_gym"
}
]
}
This endpoint allows you to delete the Google Services set for your business.
business_id required | string Business id. |
service_id required | string Id of the service (For creation you can get this id by calling get services suggestions endpoint) |
{- "status": "success"
}
This endpoint allows you to set or update Google Services for your business. When you set a service of type STRUCTURED_SERVICE_ITEM for a category, every category that have this service available will also have it set for them.
business_id required | string Business id. |
service_id required | integer (ServiceId) Id of the service (For creation you can get this id by calling get services suggestions endpoint) |
price | number (ServicePrice) Price of the service. |
description | string (ServiceDescription) <= 300 characters Description of the service. |
{- "service_id": 1,
- "price": 12.5,
- "description": "string"
}
{- "services": [
- {
- "service_id": 1,
- "type": "STRUCTURED_SERVICE_ITEM",
- "name": "Climbing Gym",
- "price": 50,
- "description": "Our climbing gym available for all",
- "category_gmb_name": "gcid:climbing_gym"
}, - {
- "service_id": 2,
- "type": "FREE_FORM_SERVICE_ITEM",
- "name": "Random Name",
- "price": 25.35,
- "description": "This is our custom service",
- "category_gmb_name": "gcid:climbing_gym"
}
]
}
This endpoint allows you to set or update custom Google Services for your business.
business_id required | string Business id. |
category_gmb_name required | string Google name of the category. The category must belong to your business. |
name required | string Name of the service. |
price | number Price of the service. |
description | string <= 300 characters Description of the service. |
{- "category_gmb_name": "gcid:climbing_gym",
- "name": "Random Name",
- "price": 25.35,
- "description": "This is our custom service"
}
{- "services": [
- {
- "service_id": 1,
- "type": "STRUCTURED_SERVICE_ITEM",
- "name": "Climbing Gym",
- "price": 50,
- "description": "Our climbing gym available for all",
- "category_gmb_name": "gcid:climbing_gym"
}, - {
- "service_id": 2,
- "type": "FREE_FORM_SERVICE_ITEM",
- "name": "Random Name",
- "price": 25.35,
- "description": "This is our custom service",
- "category_gmb_name": "gcid:climbing_gym"
}
]
}
This endpoint allows you to view the Google Food Menus set for your business.
business_id required | string Business id. |
{- "menus": [
- {
- "name": "Starters",
- "order": 1,
- "items": [
- {
- "name": "Starter 1",
- "order": 1,
- "description": "First starter of the food menu",
- "price": 1,
- "media": {
}
}, - {
- "name": "Starter 2",
- "order": 2,
- "description": "Second starter of the food menu",
- "price": 5
}
]
}, - {
- "name": "Main dishes",
- "order": 2,
- "items": [
- {
- "name": "Today's special",
- "order": 1,
- "description": "Today's special description",
- "price": 25,
- "media": {
}
}
]
}
]
}
This endpoint allows you to delete the Google Food Menus for your business.
business_id required | string Business id. |
{- "status": "success"
}
This endpoint allows you to set or update Google Food Menus for your business.
business_id required | string Business id. |
Array of objects (FoodMenuSection) |
{- "menus": [
- {
- "name": "Starters",
- "order": 1,
- "items": [
- {
- "name": "Starter 1",
- "order": 1,
- "description": "First starter of the food menu",
- "price": 1,
- "media": {
}
}, - {
- "name": "Starter 2",
- "order": 2,
- "description": "Second starter of the food menu",
- "price": 5
}
]
}, - {
- "name": "Main dishes",
- "order": 2,
- "items": [
- {
- "name": "Today's special",
- "order": 1,
- "description": "Today's special description",
- "price": 25,
- "media": {
}
}
]
}
]
}
{- "menus": [
- {
- "name": "Starters",
- "order": 1,
- "items": [
- {
- "name": "Starter 1",
- "order": 1,
- "description": "First starter of the food menu",
- "price": 1,
- "media": {
}
}, - {
- "name": "Starter 2",
- "order": 2,
- "description": "Second starter of the food menu",
- "price": 5
}
]
}, - {
- "name": "Main dishes",
- "order": 2,
- "items": [
- {
- "name": "Today's special",
- "order": 1,
- "description": "Today's special description",
- "price": 25,
- "media": {
}
}
]
}
]
}
Retrieve a list of place action links for a given business_id. Only the available gmb_id links for the business are returned in the GET request. Additionally, the business must be connected to a Google location. For more details, refer to the Partner Connection page.
business_id required | string Business id. |
{- "place_action_links": [
- {
- "gmb_id": "SHOP_ONLINE",
- "urls": [
]
}, - {
- "gmb_id": "FOOD_TAKEOUT",
- "urls": [
- {
- "id": 3,
- "is_preferred": false,
- "is_editable": false
}, - {
- "id": 4,
- "is_preferred": false,
- "is_editable": true
}, - {
- "id": 5,
- "is_preferred": false,
- "is_editable": true
}
]
}, - {
- "gmb_id": "ONLINE_APPOINTMENT",
- "urls": [
- {
- "id": 6,
- "is_preferred": true,
- "is_editable": true
}, - {
- "id": 7,
- "is_preferred": false,
- "is_editable": true
}
]
}, - {
- "gmb_id": "DINING_RESERVATION",
- "urls": [
- {
- "id": 8,
- "is_preferred": true,
- "is_editable": false
}, - {
- "id": 9,
- "is_preferred": false,
- "is_editable": true
}
]
}, - {
- "gmb_id": "APPOINTMENT",
- "urls": [
- {
- "id": 10,
- "is_preferred": true,
- "is_editable": true
}, - {
- "id": 11,
- "is_preferred": false,
- "is_editable": true
}
]
}, - {
- "gmb_id": "FOOD_ORDERING",
- "urls": [
- {
- "id": 12,
- "is_preferred": true,
- "is_editable": true
}, - {
- "id": 13,
- "is_preferred": false,
- "is_editable": true
}
]
}, - {
- "gmb_id": "FOOD_DELIVERY",
- "urls": [ ]
}
]
}
This endpoint enables you to manage place action links for a given business. Create, update, or delete place action links by modifying the urls array for each gmb_id.
business_id required | string Business id. |
Array of objects (PostPlaceActionLinks.Array) List of Business Place Action Links |
{- "place_action_links": [
- {
- "gmb_id": "SHOP_ONLINE",
- "urls": [
]
}, - {
- "gmb_id": "FOOD_TAKEOUT",
- "urls": [
]
}, - {
- "gmb_id": "ONLINE_APPOINTMENT",
- "urls": [
]
}, - {
- "gmb_id": "DINING_RESERVATION",
- "urls": [
]
}, - {
- "gmb_id": "APPOINTMENT",
- "urls": [
]
}, - {
- "gmb_id": "FOOD_ORDERING",
- "urls": [
]
}, - {
- "gmb_id": "FOOD_DELIVERY",
- "urls": [
]
}
]
}
{- "status": "success"
}
These endpoints give you the list of all the fields that are available for the business / organization / provider, grouped by section.
A section
corresponds to the tabs in the Business Edit view of Partoo UI. Examples: Coordinates, Description, Custom Fields...
Each section contains an array of fields that are displayed within it. Examples: Name, Country, Email...
For each field, these endpoints give you the permissions
for each fields, depending on your role:
enabled
Your right to write on a field, given by roles less restricitves than yours. enabled_for_subroles
The right to write on a field you give to roles more restrictives than yours. For example:
enabled_for_subroles
describes the permissions of the field for all the GROUP_MANAGER and BUSINESS_MANAGER of the given organization. enabled_for_subroles
describes the permissions of the field for all the ORG_ADMIN, GROUP_MANAGER and BUSINESS_MANAGER of the given provider. For each custom_fields
, these endpoints also give you their metadata
:
See the response schema below for more details about each type metadata.
This endpoint gives you the list of all the fields that are available for a given Business.
It also tells you, for each field, if you have the permission to edit it or not, depending of the permission configured by your ORG_ADMIN and your PROVIDER.
business_id required | string Business id. |
[- {
- "name": "address",
- "fields": [
- {
- "name": "country",
- "enabled": true,
- "enabled_for_subroles": true
}, - {
- "name": "city",
- "enabled": true,
- "enabled_for_subroles": false
}
]
}, - {
- "name": "description",
- "fields": [
- {
- "name": "categories",
- "enabled": true,
- "enabled_for_subroles": true
}, - {
- "name": "website_url",
- "enabled": true,
- "enabled_for_subroles": true
}
]
}, - {
- "name": "hours",
- "fields": [
- {
- "name": "open_hours",
- "enabled": true,
- "enabled_for_subroles": true
}
]
}, - {
- "name": "photos",
- "fields": [
- {
- "name": "cover",
- "enabled": false,
- "enabled_for_subroles": false
}
]
}, - {
- "name": "contact",
- "fields": [
- {
- "name": "phone_number",
- "enabled": true,
- "enabled_for_subroles": false
}
]
}, - {
- "name": "custom_fields",
- "fields": [
- {
- "name": "has_parking",
- "enabled": true,
- "enabled_for_subroles": true,
- "type": "BOOLEAN",
- "id": 1,
- "order": 10,
- "section_id": 4
}, - {
- "name": "special_description",
- "enabled": true,
- "enabled_for_subroles": true,
- "type": "TEXT",
- "id": 2,
- "order": 11,
- "max_len": 250,
- "section_id": 6
}, - {
- "name": "facilities",
- "enabled": true,
- "enabled_for_subroles": true,
- "type": "MULTIPLE_SELECT",
- "id": 3,
- "order": 2,
- "possible_values": [
- "handicapped access",
- "toilets",
- "break room"
]
}, - {
- "name": "banner image",
- "enabled": true,
- "enabled_for_subroles": true,
- "id": 4,
- "type": "MULTIPLE_SELECT_IMAGE",
- "order": 10,
- "possible_values": [
- "image 1",
- "image 2",
- "image 3"
], - "possible_images_labels": [
- "label image 1",
- "label image 2",
- "label image 3"
], - "possible_images_urls": [
- "url_of_image_1",
- "url_of_image_2",
- "url_of_image_3"
]
}, - {
- "name": "team members",
- "enabled": true,
- "enabled_for_subroles": true,
- "id": 5,
- "type": "IMAGES_UPLOADER",
- "order": 11,
- "text_fields": [
- {
- "text_field": "text 1",
- "max_length": 10
}, - {
- "text_field": "text 2",
- "max_length": 20
}, - {
- "text_field": "text 3",
- "max_length": 30
}
]
}
]
}
]
This endpoint gives you the list of all the fields that are available for a given Organization.
Also tells you, for each field:
Only User roles ORG_ADMIN or PROVIDER can access this information.
org_id required | integer Organization id |
[- {
- "name": "address",
- "fields": [
- {
- "name": "country",
- "enabled": true,
- "enabled_for_subroles": true
}, - {
- "name": "city",
- "enabled": true,
- "enabled_for_subroles": false
}
]
}, - {
- "name": "description",
- "fields": [
- {
- "name": "categories",
- "enabled": true,
- "enabled_for_subroles": true
}, - {
- "name": "website_url",
- "enabled": true,
- "enabled_for_subroles": true
}
]
}, - {
- "name": "hours",
- "fields": [
- {
- "name": "open_hours",
- "enabled": true,
- "enabled_for_subroles": true
}
]
}, - {
- "name": "photos",
- "fields": [
- {
- "name": "cover",
- "enabled": false,
- "enabled_for_subroles": false
}
]
}, - {
- "name": "contact",
- "fields": [
- {
- "name": "phone_number",
- "enabled": true,
- "enabled_for_subroles": false
}
]
}, - {
- "name": "custom_fields",
- "fields": [
- {
- "name": "has_parking",
- "enabled": true,
- "enabled_for_subroles": true,
- "type": "BOOLEAN",
- "id": 1,
- "order": 10,
- "section_id": 4
}, - {
- "name": "special_description",
- "enabled": true,
- "enabled_for_subroles": true,
- "type": "TEXT",
- "id": 2,
- "order": 11,
- "max_len": 250,
- "section_id": 6
}, - {
- "name": "facilities",
- "enabled": true,
- "enabled_for_subroles": true,
- "type": "MULTIPLE_SELECT",
- "id": 3,
- "order": 2,
- "possible_values": [
- "handicapped access",
- "toilets",
- "break room"
]
}, - {
- "name": "banner image",
- "enabled": true,
- "enabled_for_subroles": true,
- "id": 4,
- "type": "MULTIPLE_SELECT_IMAGE",
- "order": 10,
- "possible_values": [
- "image 1",
- "image 2",
- "image 3"
], - "possible_images_labels": [
- "label image 1",
- "label image 2",
- "label image 3"
], - "possible_images_urls": [
- "url_of_image_1",
- "url_of_image_2",
- "url_of_image_3"
]
}, - {
- "name": "team members",
- "enabled": true,
- "enabled_for_subroles": true,
- "id": 5,
- "type": "IMAGES_UPLOADER",
- "order": 11,
- "text_fields": [
- {
- "text_field": "text 1",
- "max_length": 10
}, - {
- "text_field": "text 2",
- "max_length": 20
}, - {
- "text_field": "text 3",
- "max_length": 30
}
]
}
]
}
]
Categories describe your business and has a huge impact on its discoverability on directories. For each business, you will need to pass at least one category id (example: "gcid:restaurant") and up to 10. Please note that the order you pass to business.categories array is important: the first category id should correspond to the most relevant category for your business.
You can find below all available operations that will let you get more information about categories you can use on Partoo.
This endpoint lets you read and filter through Partoo categories.
country | string Example: country=FR Filters categories available for businesses in given country. If no country is given, then the endpoint returns the list of all existing available categories. Use country ISO 3166 alpha2 code. |
lang | string (Lang) Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Example: lang=fr Language to get the category name. If not given, the user's language is used. |
state | string Enum: "OK" "DEPRECATED" |
block_push_long_description_on_gmb | boolean Filter on |
search_query | string Fuzzy search on gmb_id and names translations |
order_by | string Enum: "gmb_id" "-gmb_id" Order results by colum. Add "-" before for ordering by descending order. |
live__isnull | boolean Filter on True: Recover categories which False: Recover categories which Null: Do not filter on |
page | integer Default: 0 Page number. 30 results per page |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. Currently limited to 100. |
with_names | boolean Default: false Returns an object representing the list of translations in the available languages for the requested category. See example on the right. If |
with_countries | boolean Default: false Returns an array of strings representing the list of country codes in which the requested category is available. If |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "categories": [
- {
- "id": 4018,
- "gmb_id": "gcid:wood_industry",
- "name": "Industrie du bois",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}
]
}
This endpoint lets you retrieve the data of a specific category.
required | integer or string (CategoryId) Example: 5706 or gcid:bank Category id or Google's category id |
lang | string (Lang) Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Example: lang=fr Language to get the category name. If not given, the user's language is used. |
return_live | boolean Default: false Return the corresponding live category instead of the requested category |
with_names | boolean Default: false Returns an object representing the list of translations in the available languages for the requested category. See example on the right. If |
with_countries | boolean Default: false Returns an array of strings representing the list of country codes in which the requested category is available. If |
{- "id": 4018,
- "gmb_id": "gcid:wood_industry",
- "name": "Industrie du bois",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}
This endpoint lets you retrieve Partoo's suggestions for additional categories, based on a given category.
required | integer or string (CategoryId) Example: 5706 or gcid:bank Category id or Google's category id |
lang | string (Lang) Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Example: lang=fr Language to get the category name. If not given, the user's language is used. |
{- "categories": [
- {
- "id": 7984,
- "gmb_id": "gcid:atm",
- "name": "ATM",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 4917,
- "gmb_id": "gcid:savings_bank",
- "name": "Savings bank",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 5742,
- "gmb_id": "gcid:home_insurance_agency",
- "name": "Home insurance agency",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 6678,
- "gmb_id": "gcid:auto_insurance_agency",
- "name": "Auto insurance agency",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 5520,
- "gmb_id": "gcid:life_insurance_agency",
- "name": "Life insurance agency",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 5339,
- "gmb_id": "gcid:motorcycle_insurance_agency",
- "name": "Motorcycle insurance agency",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 7133,
- "gmb_id": "gcid:insurance_agency",
- "name": "Insurance agency",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 7012,
- "gmb_id": "gcid:investment_service",
- "name": "Investment service",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}, - {
- "id": 6026,
- "gmb_id": "gcid:financial_consultant",
- "name": "Financial consultant",
- "state": "OK",
- "block_push_long_description_on_gmb": false,
- "live_id": null
}
]
}
In this section you will have all the operations to create/check/revoke connection tokens that can be used to authenticate users on the JS SDK or to build a SSO.
This endpoint lets you generate a connection token to authenticate a user without having to indicate its credentials. To be able to generate a connection token for a user, you need to have WRITE
access on that user and that user cannot have PROVIDER
role. A connection token is valid only once and has a time to live of maximum one day.
user_id required | string (UserId) User id |
ttl | integer <= 86400 Default: 86400 Token time to live in seconds. It can be maximum 1 day. |
{- "user_id": "5309c3a237bbc544d8e26737",
- "ttl": 3600
}
{- "token": "\\xaf3e8951c1f4c42f9cc53116b3fc855bd44bce01cf27604b",
- "expiration_date": "2019-08-01T19:15:54.256000+02:00"
}
This endpoint lets you revoke a connection token. To be able to revoke a connection token for a user, you need to have WRITE
access on that user and the connection token must be valid (not expired, not revoked and not consumed).
user_id required | string (UserId) User id |
token | string Token to revoke |
{- "user_id": "5309c3a237bbc544d8e26737",
- "token": "\\xaf3e8951c1f4c42f9cc53116b3fc855bd44bce01cf27604b"
}
{ }
This endpoint lets you check the status of a connection token. To be able to check a connection token of a user, you need to have WRITE
access on that user.
user_id required | string (UserId) Example: user_id=5309c3a237bbc544d8e26737 User id |
token required | string Example: token=\xaf3e8951c1f4c42f9cc53116b3fc855bd44bce01cf27604b User connection token |
{- "token": "\\xaf3e8951c1f4c42f9cc53116b3fc855bd44bce01cf27604b",
- "expiration_date": "2019-08-02T19:15:54.256000+02:00",
- "generated_by": "5309c3a237bbc544d8e26737",
- "creation_date": "2019-08-01T19:15:54.256000+02:00",
- "consumption_date": "2019-08-01T23:15:54.256000+02:00",
- "status": "consumed"
}
All operations available on Custom Fields metadata : creation, update and deletion of custom fields.
⚠️ What are Custom fields ?
Custom Fields allow Enterprise Administrators to add custom data fields to businesses in Partoo / Localoo under different formats (List, Text, Number…) in order to create a central datahub for local information. These fields can be used to:
Once created, Custom Fields values can be updated like any other business field.
To handle custom fields values for businesses, see business endpoints.
To recover the list of custom fields available for a business see GET business fields endpoint.
This endpoint enables you to create custom fields for your organization as an ORG_ADMIN
name | string (CustomFieldName) [ 1 .. 50 ] characters The name of the custom field |
type | string (CustomFieldTypeBool) non-empty BOOLEAN |
order | integer (CustomFieldOrder) Describes where the custom field is displayed on the Business Edit view of the Partoo App. If the custom field is within a section, order specifies its position within the custom field section. |
section_id | integer (CustomFieldSectionId) Id of the custom field section |
{- "name": "Click and collect",
- "type": "BOOLEAN",
- "order": 30,
- "section_id": 6
}
{- "id": 42
}
This endpoint enables an ORG_ADMIN to update a specific custom field of his organization by specifying its id.
Name and constraints can be updated. The type of a custom field cannot be modified.
custom_field_id required | integer (CustomFieldId) Example: 42 Id of the custom field |
name | string (CustomFieldName) [ 1 .. 50 ] characters The name of the custom field |
type | string (CustomFieldTypeBool) non-empty BOOLEAN |
force | boolean (CustomFieldForceUpdate) The deletion of a custom field or the update of its metadata can have impacts on custom fields which are already set for businesses.
|
section_id | integer (CustomFieldSectionId) Id of the custom field section |
{- "name": "Click and collect",
- "type": "BOOLEAN",
- "force": false,
- "section_id": 6
}
{- "id": "success"
}
This endpoint enables an ORG_ADMIN to delete a specific custom field of his organization by specifying its id.
custom_field_id required | integer (CustomFieldId) Example: 42 Id of the custom field |
force | boolean (CustomFieldForceUpdate) Default: false The deletion of a custom field or the update of its metadata can have impacts on custom fields which are already set for businesses.
|
{- "id": "success"
}
This endpoint enables you to reorganize the order of the custom fields of your organization
required | Array of objects (CustomFieldOrders) On the Business Edit view of the Partoo App, custom fields will be displayed depending on their order. The lowest number will be the first. |
Array of objects (CustomFieldSectionOrders) On the Business Edit view of the Partoo App, custom fields section will be displayed depending on their order. The lowest number will be the first. |
{- "orders": [
- {
- "id": 42,
- "order": 30
}
], - "section_orders": [
- {
- "id": 6,
- "order": 18
}
]
}
{- "id": "success"
}
All operations on Custom Field Sections: retrieval, creation, update, and deletion of custom field sections.
⚠️ What are Custom Field Sections ?
Custom Field Sections are used to group related custom fields together for better organization and management. Each section can contain multiple custom fields, allowing you to structure, order and categorize your custom fields effectively.
Retrieve list of custom fields sections for a given org_id.
org_id | integer Organization id |
{- "sections": [
- {
- "id": 1,
- "name": "Section A",
- "order": 3
}, - {
- "id": 2,
- "name": "Section B",
- "order": 4
}, - {
- "id": 3,
- "name": "Section C",
- "order": 5
}
]
}
This endpoint enables you to create custom field sections for your organization as an ORG_ADMIN. If no order is provided, it will be set to -> max(all current sections orders) + 1.
name required | string (CustomFieldSectionName) The name of the custom field section. Needs to be unique from all other section names. |
order | integer (CustomFieldSectionOrder) Describes where the custom field section is displayed on the Business Edit view of the Partoo App. |
{- "name": "Section A",
- "order": 18
}
{- "section_id": 6
}
This endpoint enables an ORG_ADMIN to update the name of a specific custom field section of his organization by specifying its id.
section_id required | integer (CustomFieldSectionId) Example: 6 Id of the custom field section |
name required | string (CustomFieldSectionName) The name of the custom field section. Needs to be unique from all other section names. |
{- "name": "Section A"
}
{- "id": "success"
}
This endpoint enables an ORG_ADMIN to delete a specific custom field section of his organization by specifying its id.
section_id required | integer (CustomFieldSectionId) Example: 6 Id of the custom field section |
{- "id": "success"
}
⚠️ This feature is available only for businesses subscribed to Feedback Management. ⚠️
All available operation regarding the management of your feedbacks.
The Feedback Management API is currently in BETA, therefore the following endpoints are subject to modification, given a 2 week notice.
If you are planning to use any of them, please notify us so we will be able to keep you informed about upcoming changes.
This endpoint lets you search for the feedback forms of your organization.
The response is paginated (30 results per page).
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "items": [
- {
- "id": "674d791c13c9d976e20001b1",
- "org_id": 42,
- "email_reply_source": "noreply@example.com",
- "email_reply_subject": "About your feedback",
- "email_reply_to_business": false,
- "email_reply_expeditor_name": "MyCompany",
- "expiration_interval_seconds": 1209600,
- "display_name": "Global Satisfaction"
}
]
}
This endpoint lets you modify the properties of your feedback forms.
feedback_form_id required | string |
display_name | string Name of your form |
{- "display_name": "Global Satisfaction"
}
{- "id": "674d791c13c9d976e20001b1",
- "org_id": 42,
- "email_reply_source": "noreply@example.com",
- "email_reply_subject": "About your feedback",
- "email_reply_to_business": false,
- "email_reply_expeditor_name": "MyCompany",
- "expiration_interval_seconds": 1209600,
- "display_name": "Global Satisfaction"
}
This endpoint lets you search for the feedback results of your businesses.
The response is paginated (30 results per page).
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
business__notin | Array of strings (BusinessId) Example: business__notin=5409c35a97bbc544d8e26737 Excludes from the request all businesses provided |
state__in | Array of strings Items Enum: "treated" "not_treated" Example: state__in=treated,not_treated State of the feedback result |
created__lte | string <datetime> Example: created__lte=2024-10-01T00:00:00Z Max date the feedback result was created on |
created__gte | string <datetime> Example: created__gte=2024-11-01T00:00:00Z Min date the feedback result was created on |
nps__lte | integer [ 0 .. 10 ] Example: nps__lte=9 Max NPS of the feedback result |
nps__gte | integer [ 0 .. 10 ] Example: nps__gte=9 Min NPS of the feedback result |
nps__in | Array of integers[ items [ 0 .. 10 ] ] Example: nps__in=0,1,2,8,9,10 The possible NPS values of the feedback result |
search | Array of strings <= 6 items The possible words contained in the text field of the feedback result |
optin | boolean Enum: true false Whether the respondent accepts to be contacted |
feedback_form_ids | Array of strings Example: feedback_form_ids=674d791c13c9d976e20001b1 The forms for which the feedback result is for |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "items": [
- {
- "id": 1,
- "business_id": "5409c35a97bbc544d8e26737",
- "firstname": "John",
- "lastname": "Doe",
- "nps": 9,
- "content": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse vulputate efficitur augue, ac auctor nibh scelerisque at. Nulla facilisi. Maecenas luctus efficitur sem sit amet ullamcorper. Donec tempor augue lorem, vitae convallis sapien aliquam id. Maecenas eu odio non est pretium eleifend. Nullam at odio eu ligula ultrices tincidunt. Nulla euismod aliquet ex eget efficitur.",
- "state": "treated",
- "optin": true,
- "created": "2024-10-25T15:12:11+00:00",
- "feedback_form": {
- "id": "674d791c13c9d976e20001b1",
- "display_name": "Global Satisfaction"
}, - "feedback_result_fields": [
- {
- "rating": 4,
- "content": null,
- "choices": null,
- "feedback_form_field": {
- "id": "674d7aaa13e599deae0001b2",
- "field_type": "CSAT",
- "field_label": "How would you rate our service?",
- "field_choices": null
}
}
], - "comments": [
- {
- "id": 1,
- "created": "2024-11-15T10:00:15+00:00",
- "author_name": "Jane Doe",
- "content": "Thank you for your feedback",
- "feedback_result_id": 1,
- "user_id": "5309c3a237bbc544d8e26737",
- "is_reply_suggestion": false
}
], - "extra": {
- "extra_field": "value",
- "extra_field_2": "value_2"
}
}
]
}
This endpoint lets you reply to a feedback result.
In order to be able to reply to a feedback result:
optin
property of the corresponding feedback result must be trueemail_reply_source
of the corresponding feedback form must be setemail_reply_subject
of the corresponding feedback form must be setfeedback_result_id required | integer |
content required | string <text> Content of your reply |
object Suggestion details for the reply, check how to retrieve values in the Fetch AI reply suggestion for feedback results section. |
{- "content": "Merci ❤️",
- "reply_suggestion": {
- "reply_suggestion_id": 123,
- "reply_suggestion_modified": true
}
}
{- "id": 1,
- "created": "2024-11-15T10:00:15+00:00",
- "author_name": "Jane Doe",
- "content": "Thank you for your feedback",
- "feedback_result_id": 1,
- "user_id": "5309c3a237bbc544d8e26737",
- "is_reply_suggestion": false
}
Fetch a reply suggestion generated by AI for a specific feedback result.
⚠️ This feature provides reply SUGGESTIONS, NOT AUTOMATIC REPLIES. It is NOT designed for fully automating conversations. Similar to the app, a human reviewer is expected to validate the suggestion before selecting it in order to use Reply to a feedback result endpoint ⚠️
How does the AI reply suggestion work?
index
(0, 1, or 2) of the parametersreply_suggestion
request body when calling the Reply to a feedback result service to link the response to the suggestion.feedback_result_id required | integer ID of the feedback result for which we want an AI suggestion |
index required | integer [ 0 .. 2 ] Index of the reply suggestion (0, 1, or 2) |
{- "id": 1,
- "index": 0,
- "content": "Thank you for your feedback.",
- "feedback_result_id": 123,
- "report": {
- "id": 3587,
- "user_id": "xyz123",
- "created_at": "2025-05-12T12:57:21.895170Z"
}
}
Get all Google Attributes available for a Category in a given language.
⚠️ What are Google Attributes ?
Google Attributes are highly visible statements about your business that appear on your Google listing.
They indicate things like Payment Options, Amenities, Accessibility and Highlights.
Does a business provide parking? Does it have a fireplace? Can customers pay with a debit card?
To recover attributes values set for a business, see get attributes business endpoints.
To handle attributes values for businesses, see set attributes business endpoints.
This endpoint allows you to view the **Google** attributes available for a given Category.
category_name required | string Example: category_name=gcid:restaurant Category for which availabe attributes will be fetched. |
country required | string Example: country=FR Country for which available attributes will be fetched - use ISO 3166 alpha2 code ("FR", "EN", "IT"). |
lang | string Enum: "fr" "es" "it" "en" "de" "pt" "pt-BR" Language in which the attributes name and groups name will be translated. If language is not specified, by default we take the language of the user. |
{- "groups": [
- {
- "attributes": [
- {
- "type": "URL",
- "gmb_id": "gcid:restaurant",
- "name": "Delivery",
- "order": 1
}
], - "name": "Services disponibles",
- "order": 5
}
]
}
⚠️ What are Google More Hours ?
More Hours is a feature in Google that allows the business owner to display hours for specific services available.
Examples of such services include opening hours for the kitchen, for breakfast, for happy hour, etc.
Notice that the available More Hour IDs vary between both business categories and countries. For example, a restaurant will have different More Hour IDs available than a bank, and a restaurant in France will have different IDs available than a restaurant in the USA.
To recover More Hours set for a business, see Get More Hours for your Business endpoints.
To handle More Hours for businesses, see Update More Hours for your Business endpoints.
This endpoint allows you to get all the different **More Hour IDs** available for a given business category, including their translated names for the given language.
category required | string Example: category=gcid:restaurant Category for which availabe More Hour IDs will be fetched. |
country required | string Example: country=FR Country for which available More Hour IDs will be fetched - use ISO 3166 alpha2 code ("FR", "EN", "IT"). |
lang | string Enum: "fr" "es" "it" "en" "de" "pt" "pt-BR" Language in which the More Hours names will be translated. If language is not specified, by default we take the language of the user. |
{- "more_hours": [
- {
- "gmb_id": "BREAKFAST",
- "name": "Breakfast"
}, - {
- "gmb_id": "BRUNCH",
- "name": "Brunch"
}, - {
- "gmb_id": "DELIVERY",
- "name": "Delivery"
}, - {
- "gmb_id": "DINNER",
- "name": "Dinner"
}, - {
- "gmb_id": "DRIVE_THROUGH",
- "name": "Drive through"
}, - {
- "gmb_id": "HAPPY_HOUR",
- "name": "Happy hours"
}, - {
- "gmb_id": "KITCHEN",
- "name": "Kitchen"
}, - {
- "gmb_id": "LUNCH",
- "name": "Lunch"
}, - {
- "gmb_id": "ONLINE_SERVICE_HOURS",
- "name": "Online service hours"
}, - {
- "gmb_id": "PICKUP",
- "name": "Pickup"
}, - {
- "gmb_id": "TAKEOUT",
- "name": "Takeout"
}, - {
- "gmb_id": "SENIOR_HOURS",
- "name": "Senior hours"
}, - {
- "gmb_id": "ACCESS",
- "name": "Access"
}
]
}
Get all Google Services available for your business categories.
⚠️ What are Google Services ?
Google Services are highly visible statements about your business that appear on your Google listing.
They indicate the different services available for your business, to which you can also add a price and a description.
For example, the category gcid:bakery has several suggested services available, such as catering or delivery.
Not satisfy with those ? You can add your very own custom services and link them to the category of your business of your choice !
To recover services values set for a business, see get services business endpoints.
To handle services values for businesses, see set structured services business endpoints.
To handle custom services values for businesses, see set free form services business endpoints.
This endpoint allows you to view the Google Services available for your business.
The services available depends on the categories of the business not only the main one.
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
{- "services_suggestions": [
- {
- "service_id": 1,
- "type": "STRUCTURED_SERVICE_ITEM",
- "name": "Salle d'escalade",
- "category_id": 42,
- "category_gmb_name": "gcid:climbing_gym"
}
]
}
Returns a Google location object that corresponds to the given google_location_id. The google_location_id is a unique identifier on Partoo for each location. This endpoint requires authentication, and only authorized users with the appropriate permissions can access it.
google_location_id required | string Google location unique id on Partoo |
{- "id": "6047dac0604f33da03018004",
- "location_name": "Annie - HQ",
- "store_code": "annie-hq",
- "region_code": "FR",
- "postal_code": "75018",
- "address_details": "130 rue mont cenis",
- "locality": "Paris",
- "place_id": "ChIJ3Qu-HpFt5kcRNHUedqwIzQY",
- "google_verifications": {
- "status": "verified",
- "checked_at": "2023-01-30T14:25:11.163950Z"
}, - "phone_numbers": "0675181818"
}
Performs a search for Google locations based on the provided query parameters. This endpoint requires authentication, and only authorized users with the appropriate permissions can access it.
query | string The search query string. It searches on the following fields of the Google location:
|
google_location_id | string The ID of the Google location stored in Partoo. |
oauth_account_id | string The ID of the OAuth account stored in Partoo. |
not_connected_only | boolean Filter for locations not connected to any business. |
verification_status | string Filter by verification status. |
page | integer Default: 1 The page number for pagination. |
{- "locations": [
- {
- "id": "6047dac0604f33da03018004",
- "location_name": "Annie - HQ",
- "store_code": "annie-hq",
- "region_code": "FR",
- "postal_code": "75018",
- "address_details": "130 rue mont cenis",
- "locality": "Paris",
- "place_id": "ChIJ3Qu-HpFt5kcRNHUedqwIzQY",
- "google_verifications": {
- "status": "verified",
- "checked_at": "2023-01-30T14:25:11.163950Z"
}, - "phone_numbers": "0675181818"
}
], - "page": 1,
- "max_page": 10,
- "count": 287
}
This endpoint retrieves verification options for a specific Google location identified by google_location_id
. It requires authentication and authorization to access. The user must have at least the role of a BUSINESS_MANAGER
to use this endpoint.
Note that the response can return an empty options list, this can mean two things:
google_location_id required | string Google location unique id on Partoo |
{- "status": "success",
- "options": [
- {
- "method": "PHONE_CALL",
- "phone_number": "+33187662490",
- "email": "email.api@partoo.fr",
- "full_name": "John Doe",
- "full_address": "190 Rue Championnet, 75018 Paris",
- "expected_delivery_days": 2,
- "status": "AVAILABLE"
}
], - "message": null
}
This endpoint initiates the verification process for a specific Google location identified by google_location_id
. It requires authentication and authorization to access. The user must have at least the role of a BUSINESS_MANAGER
to use this endpoint.
The endpoint ensures that the chosen verification method has all the necessary information for the specific method chosen. If any required information is missing, it raises an error with the associated error message.
google_location_id required | string Google location unique id on Partoo |
method | string Enum: "SMS" "PHONE_CALL" "EMAIL" "ADDRESS" |
phone_number | string REQUIRED for |
string REQUIRED for | |
full_name | string REQUIRED for |
{- "method": "SMS",
- "phone_number": "+33187662490",
- "email": "email.api@partoo.fr",
- "full_name": "John Doe"
}
{- "status": "success",
- "message": null
}
This endpoint completes the Google location verification process identified by google_location_id
. It requires authentication and authorization with at least the role of BUSINESS_MANAGER
.
If the verification process is not in the PENDING
status, or if the PIN code is invalid, an error response will be returned. If the completion is successful, the verification status of the location will be updated.
google_location_id required | string Google location unique id on Partoo |
method | string Enum: "PHONE_CALL" "SMS" "EMAIL" "ADDRESS" |
pin_code | string The PIN code provided by the user during the verification process. |
{- "method": "PHONE_CALL",
- "pin_code": "1234"
}
{- "status": "success",
- "message": null
}
Our group system offers flexible organization of businesses through a comprehensive system of Groups and Sections. Businesses can belong to multiple groups, and groups are organized into logical sections for easier management and filtering.
BUSINESS_MANAGER
role can manage businesses from multiple GroupsHere, Country / Facade Color / Service are the sections in which groups are organized.
A business can belong to any combination of these groups, for example:
Groups are used as a filtering system, either to filter businesses by group in our different pages (such as our Analytics pages), or to assign multiple businesses to a user using groups:
Users with the GROUP_MANAGER
role can manage businesses using group combinations.
A business filtering using groups is what we call an access. For example, the access "France/Bakery" will return all businesses that belong to the "France" group and the "Bakery" group.
A GROUP_MANAGER
can be assigned to one or multiple accesses, and will be able to manage all businesses that belong to the groups included in these accesses.
A GROUP_MANAGER
can be set up to manage all Bakery businesses in France with the access "France/Bakery":
For more complex scenarios, multiple accesses can be created for the same user. For example, this user can manage:
groups
field during the creation or update of the business using the create business endpoint or the update business endpoint.GROUP_MANAGER
user using the accesses
field during the creation or update of the user using the create user endpoint or the update user endpoint.If you have any questions about implementing the groups system, please reach out to our technical support team at api@partoo.fr.
Create a new section.
This endpoint endpoint let's you create a new section. Only Group Managers and above can use this endpoint. Business Managers are restricted from accessing this endpoint. For more information about the group system, see the Groups and Sections description.
name required | string (SectionName) Name of the section. Cannot include any of the following characters: |
org_id | integer (SectionCreateOrgId) ID of the organization in which to create the section (only available to |
{- "name": "Country",
- "org_id": 1
}
{- "status": "success",
- "id": 1
}
Get all the sections for an organization.
For more information about the group system, see the Groups and Sections description.
page | integer Default: 0 Page number. 30 results per page |
org_id | integer Organization id |
{- "page": 1,
- "count": 6,
- "max_page": 1,
- "sections": [
- {
- "id": 1,
- "name": "Country",
- "groups": [
- {
- "id": 0,
- "name": "string",
- "has_puller": true
}
], - "can_edit": true,
- "has_puller": true
}
]
}
Delete a section.
This endpoint endpoint let's you delete an existing section. Only Group Managers and above can use this endpoint. Business Managers are restricted from accessing this endpoint. For more information about the group system, see the Groups and Sections description.
section_id required | string Section id |
{- "status": "success",
- "id": 1
}
Update the name of a section.
This endpoint endpoint let's you update an existing section. Only Group Managers and above can use this endpoint. Business Managers are restricted from accessing this endpoint. For more information about the group system, see the Groups and Sections description.
section_id required | string Section id |
name required | string (SectionName) Name of the section. Cannot include any of the following characters: |
{- "name": "Country"
}
{- "status": "success",
- "id": 1
}
Get a single section.
For more information about the group system, see the Groups and Sections description.
section_id required | string Section id |
{- "id": 1,
- "name": "Country",
- "groups": [
- {
- "id": 0,
- "name": "string",
- "has_puller": true
}
], - "can_edit": true,
- "has_puller": true
}
Create a new group.
This endpoint allows Group Managers to create new groups within the system. For more information about the group system, see the Groups and Sections description.
⚠️ You need to precise which businesses are part of the group when creating it using the business__in
parameter.
If don't precise any business, the group will be created with all the businesses. If you want to create an empty group, you can just put an empty array in the business__in
parameter.
section_id required | string Section id |
name required | string (GroupV2Name) Name of the group. Cannot include any of the following characters: |
business__in required | Array of strings (business_ids) List of business ids |
{- "name": "France",
- "business__in": [
- "5409c35a97bbc544d8e26737",
- "595badaef348ab6b3530033f",
- "59d53302b12ff6429f262639"
]
}
{- "status": "success",
- "id": 1
}
Update a group.
This endpoint endpoint let's you modify existing group details within the system. Only Group Managers and above can use this endpoint. Business Managers are restricted from accessing this endpoint. For more information about the group system, see the Groups and Sections description.
⚠️ You need to precise which businesses are part of the group when updating it using the business__in
parameter.
If don't precise any business, the group will be updated with all the businesses. If you want to update a group to be empty, you can just put an empty array in the business__in
parameter.
section_id required | string Section id |
group_id required | integer Group id |
name required | string (GroupV2Name) Name of the group. Cannot include any of the following characters: |
business__in required | Array of strings (business_ids) List of business ids |
{- "name": "France",
- "business__in": [
- "5409c35a97bbc544d8e26737",
- "595badaef348ab6b3530033f",
- "59d53302b12ff6429f262639"
]
}
{- "status": "success",
- "id": 1
}
Get a group and it's associated business IDs.
For more information about the group system, see the Groups and Sections description.
section_id required | string Section id |
group_id required | integer Group id |
{- "id": 1,
- "name": "France",
- "has_puller": true,
- "business_ids": [
- "a1f0e2d3b4c5e6f7a8b9c0d1",
- "3f2e1d4c5b6a7f8e9d0c1a2",
- "0e1d2c3b4a5f6e7d8c9a0b1"
]
}
Delete a group.
This endpoint endpoint let's you delete an existing group. Only Group Managers and above can use this endpoint. Business Managers are restricted from accessing this endpoint. For more information about the group system, see the Groups and Sections description.
section_id required | string Section id |
group_id required | integer Group id |
{- "status": "success",
- "id": 1
}
This endpoint allows you to retrieve a list of upcoming bank holidays for a specified country within the next 365 days. The holidays are ordered based on their occurrence dates.
country required | string Example: FR Country code from ISO 3166 international standard - https://www.iban.com/country-codes |
lang | string Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" Example: lang=fr Preferred language for holiday names. If no language is provided, the user's default language will be used. If the user's default language is unavailable, the country's primary language will be used. |
{- "holidays": [
- {
- "name": "Armistice",
- "date": "2023-11-11"
}, - {
- "name": "Noël",
- "date": "2023-12-25"
}, - {
- "name": "Jour de l'an",
- "date": "2024-01-01"
}, - {
- "name": "Lundi de Pâques",
- "date": "2024-04-01"
}, - {
- "name": "Fête du Travail",
- "date": "2024-05-01"
}, - {
- "name": "Fête de la Victoire",
- "date": "2024-05-08"
}, - {
- "name": "Ascension",
- "date": "2024-05-09"
}, - {
- "name": "Lundi de Pentecôte",
- "date": "2024-05-20"
}, - {
- "name": "Fête nationale",
- "date": "2024-07-14"
}, - {
- "name": "Assomption",
- "date": "2024-08-15"
}, - {
- "name": "Toussaint",
- "date": "2024-11-01"
}, - {
- "name": "Christmas",
- "date": "2024-12-25"
}, - {
- "name": "New Year's Day",
- "date": "2025-01-01"
}
]
}
⚠️ This feature is available only for businesses subscribed to the Messages Product. ⚠️ All the operations you can perform on Messages and Conversations.
Conversations happens between a Business and a consumer that wants to get in touch with the business.
A Consumer can reach out to the business on one of the supported messaging channels (Google, Facebook, Instagram, SMS). It will then create a new Conversation.
⚠️ When dealing with Instagram
conversations, there are some requirements that you have to follow :
This endpoint lets you list all the Conversations you have access to.
You can filter the conversations based on the Organization or the Business that they are related to.
If you want to keep an up-to-date list of ongoing conversations for your businesses, we recommend using the Message Created and Message Deleted Webhooks instead of periodically calling this endpoint.
⚠️ This endpoint is paginated using cursor pagination. This means that in order to get the next page of results, you need to provide the cursor returned in the previous call.
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. |
cursor | string The cursor identifiying the page of data to fetch. If no cursor is provided, the query will return the first page of data. A cursor for the next page of data is provided in the response of this request. |
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
{- "conversations": [
- {
- "id": 0,
- "consumer_name": "John Doe",
- "consumer_phone_number": "+33612345678",
- "last_message": { },
- "is_read": true,
- "status": "Open",
- "created_at": "2023-01-31 16:22:17.327878+00:00",
- "has_one_user_message": true,
- "business": {
- "id": "string",
- "name": "string",
- "city": "string",
- "zipcode": "string",
- "country": "string",
- "formatted_address": "string"
}, - "messaging_partner": "Facebook",
- "issues": [
- "facebook_no_page_linked"
], - "first_message_date": "string",
- "is_expired": false,
- "is_solved": false,
- "assigned_user_id": "62d80fae74e8b11d700302b8",
- "custom_channel": { }
}
], - "count": 1,
- "next_cursor": "string"
}
This endpoint returns all information on a specific Conversation.
conversation_id required | integer The id of the conversation to fetch |
{- "id": 0,
- "consumer_name": "John Doe",
- "consumer_phone_number": "+33612345678",
- "last_message": { },
- "is_read": true,
- "status": "Open",
- "created_at": "2023-01-31 16:22:17.327878+00:00",
- "has_one_user_message": true,
- "business": {
- "id": "string",
- "name": "string",
- "city": "string",
- "zipcode": "string",
- "country": "string",
- "formatted_address": "string"
}, - "messaging_partner": "Facebook",
- "issues": [
- "facebook_no_page_linked"
], - "first_message_date": "string",
- "is_expired": false,
- "is_solved": false,
- "assigned_user_id": "62d80fae74e8b11d700302b8",
- "custom_channel": { }
}
Please use POST /conversations/{conversation_id}/read or PATCH /conversations/{conversation_id} instead.
The only updatable field is "is_read". It will be set for the user that performs the request ("is_read" may have different values for different users).
conversation_id required | integer The id of the conversation to update |
is_read | boolean Whether the last message received was read. This property is scoped to the user who performs the request. Multiple users can have a different is_read status for the same conversation. |
{- "is_read": true
}
{- "status": "success"
}
This endpoint lets you change the status of the conversation to "open" or "closed" and assign it to a user.
conversation_id required | integer The id of the conversation to update |
status | string Enum: "open" "closed" You can close or re-open the conversation. It will change the "is_solved" boolean of the conversation but it won't change the "is_expired". If the conversation is expired we can't re-open it. |
assigned_user_id | string Enum: "USER_ID" "unassigned" Only for enterprise organizations. The user will be assigned to the conversation. You can only assign a conversation to a user that:
|
{- "status": "open",
- "assigned_user_id": "USER_ID"
}
{- "status": "success"
}
This endpoint lets you mark a conversation as read. It will be set for the user that performs the request ("is_read" may have different values for different users).
conversation_id required | integer The id of the conversation to update |
is_read | boolean Whether the last message received was read. This property is scoped to the user who performs the request. Multiple users can have a different "is_read" status for the same conversation. |
{- "is_read": true
}
{- "status": "success"
}
This endpoint lets you retrieve the messages for a specific conversation.
⚠️ This endpoint is paginated using cursor pagination. This means that in order to get the next page of results, you need to provide the cursor returned in the previous call.
conversation_id required | integer The id of the conversation |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. |
cursor | string The cursor identifiying the page of data to fetch. If no cursor is provided, the query will return the first page of data. A cursor for the next page of data is provided in the response of this request. |
{- "messages": [
- {
- "id": 0,
- "conversation_id": 0,
- "date": "2023-01-31 16:22:17.327878+00:00",
- "content_type": "Text",
- "sender_type": "User",
- "sender_label": "Jane Doe",
- "status": "Sending",
- "is_deleted": false,
- "content": "string",
- "user_id": "string"
}
], - "count": 1,
- "next_cursor": "string"
}
This endpoint allows you to send a message as a business, in an existing conversation.
ℹ️ For more information about sending custom channel messages, please refer to this section.
The supported content types when sending messages are :
⚠️ Due to underlying channel limitations, some media content_types are not supported on all channels :
Channel | Image | Video | Audio | Document |
---|---|---|---|---|
✅ | ✅ | ✅ | ✅ | |
✅ | ✅ | ✅ | ❌ | |
SMS | ❌ | ❌ | ❌ | ❌ |
✅ | ✅ | ✅ | ✅ | |
Custom | ❌ | ❌ | ❌ | ❌ |
When dealing with media messages (Image
, Video
, Audio
, Document
), there are some
additionnal file type and file size limitations.
For optimal support, you should target the following file types :
jpeg
, png
.mp4
.aac
, mp4
.xls
, xlsx
, docx
, pdf
, ppt
, pptx
.A successful HTTP response to this endpoint (code 200) does not necessarily mean that the
message has been correctly delivered to the consumer, only that it has been created on
Partoo.
To ensure that the message has been delivered successfully, we recommend subscribing to the
Message Updated Webhook, and checking that the status
field
of the message has switched to Success
.
If the answer has failed to be sent, you can send it again by using the /retry endpoint
conversation_id required | integer The id of the conversation |
content_type required | string Value: "Text" |
content required | string The text to send |
{- "conversation_id": 0,
- "content_type": "Text",
- "content": "string"
}
{- "status": "success",
- "message_id": 0
}
⚠️ This feature is available only for businesses subscribed to the Messages Product. ⚠️
A custom channel allows you to connect your own messaging source (e.g., a chatbot, CRM, or internal tool) directly to Partoo.
In order to integrate a custom channel, you will need to contact the support to configure the channel. We will need the following information:
org_id
: id of your organizationname
: name of your custom channelicon
: optional, url of an image to use as the channel's iconis_readonly
: set to true
if you want the channel to be read-only. If set to false
, you will be able to send replies from Partoo (via the app or send message endpoint). However, since Partoo does not automatically send these messages back to your system, you must subscribe to the Message Created webhook to receive and process those replies on your side. After configuring the custom channel, you will be given a channel_id
that you will need in order to use the custom channel endpoint
This endpoint lets you ingest messages in conversations that use custom channels. When called, it creates a new message in the specified conversation. If the conversation does not exist, the endpoint will automatically create the conversation before adding the message.
You must use an API key with ORG_ADMIN
or PROVIDER
rights for this endpoint.
⚠️ A 200 OK
response does not guarantee that the message was successfully created.
It only means the request was received and accepted for processing. ⚠️
channel_id required | string The id of the custom channel |
business_id required | string The id of the business. |
external_conversation_id required | string The unique id of the conversation in your system. Messages with the same |
external_message_id required | string The unique id of the message in your system. Messages with the same |
content required | string The message content. |
sender_type required | string Enum: "User" "Consumer" |
consumer_name | string or null Default: "null" Display name of the consumer. This property is only used at the creation of the conversation. |
consumer_image | string or null Default: "null" Profile image URL of the consumer. This property is only used at the creation of the conversation. |
{- "business_id": "string",
- "external_conversation_id": "string",
- "external_message_id": "string",
- "content": "string",
- "sender_type": "User",
- "consumer_name": "null",
- "consumer_image": "null"
}
{- "status": "success"
}
⚠️ This feature is available only for businesses subscribed to the Messages Product. ⚠️
↳ Perform all operations on Message Reply Templates setup.
Reply Templates for Messages allow users to send pre-made messages to customers, ensuring quicker responses while maintaining the brand’s tone of voice.
ℹ️ The message content can be dynamically changed using placeholders.
Example: "Hello {{client_full_name}}, how can I help you today?"
Available placeholders are: client_full_name
, client_first_name
, business_name
, my_first_name
, rb_link
, address
, website_url
, and phone_number
.
This endpoint retrieves the list of message templates for the current user's organization.
[- {
- "id": "642bca3d2830e15c6806cc33",
- "title": "Quote request",
- "content": "{\"text\": \"Hello {{client_full_name}}, thank you for your request. For a quote, please contact us at 0123456789.\" \"_version\": \"0.1\"}",
- "icon": "📝",
- "org_id": 123,
- "created_at": "2023-01-31T16:22:17.327878+00:00",
- "updated_at": "2023-02-15T10:00:00.000000+00:00",
- "usage_count": 50
}
]
This endpoint lets you create a new message template.
⚠️ The content should be a valid stringified JSON object. It has to include both the "text"
key with the message content
and the pair "_version": "0.1"
.
title required | string The title of the template |
icon | string The icon linked to the template |
content required | string The template content as a stringified JSON object with |
{- "title": "Quote request",
- "icon": "📝",
- "content": "{\"text\": \"Hello, thank you for your request. For a quote, please contact us at 0123456789.\" \"_version\": \"0.1\"}"
}
{- "id": "642bca3d2830e15c6806cc33",
- "title": "Quote request",
- "content": "{\"text\": \"Hello {{client_full_name}}, thank you for your request. For a quote, please contact us at 0123456789.\" \"_version\": \"0.1\"}",
- "icon": "📝",
- "org_id": 123,
- "created_at": "2023-01-31T16:22:17.327878+00:00",
- "updated_at": "2023-02-15T10:00:00.000000+00:00",
- "usage_count": 50
}
This endpoint allows updating an existing message template by its ID.
template_id required | number Template id |
title | string The new title of the template |
icon | string The new icon linked to the template |
content | string The new template content as a stringified JSON object with |
{- "title": "Quote request",
- "icon": "📝",
- "content": "{\"text\": \"Hello, thank you for your request. For a quote, please contact us at 0123456789.\" \"_version\": \"0.1\"}"
}
{- "id": "642bca3d2830e15c6806cc33",
- "title": "Quote request",
- "content": "{\"text\": \"Hello {{client_full_name}}, thank you for your request. For a quote, please contact us at 0123456789.\" \"_version\": \"0.1\"}",
- "icon": "📝",
- "org_id": 123,
- "created_at": "2023-01-31T16:22:17.327878+00:00",
- "updated_at": "2023-02-15T10:00:00.000000+00:00",
- "usage_count": 50
}
All the operations you can perform on Messaging Settings.
Messaging settings encapsulates all options available to customize the Partoo messaging experience, for a specific Business.
Messaging Settings are automatically created for businesses subscribed to the Messages Product.
⚠️ This feature is available only for businesses subscribed to the Messages product. ⚠️
This endpoint lets you list all the Messaging Settings you have access to.
You can filter the Messaging Settings based on the Organization or the Business that they are related to.
page | integer >= 1 Default: 1 Current page number. |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. |
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
{- "settings": [
- {
- "id": 0,
- "business_id": "string",
- "business_name": "string",
- "business_address": "1 Rue de la Paix, 75000 Paris",
- "welcome_message": "string",
- "offline_message": "string",
- "uses_business_hours": true,
- "custom_chat_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "is_launched": true
}
], - "page": 1,
- "count": 1,
- "max_page": 1
}
This endpoint lets you update a specific Messaging Settings.
setting_id required | integer The id of the Messaging Settings to update |
welcome_message | string or null (MessagingSettingWelcomeMessage) When a consumer first contacts the business, an automated reply is sent. The content of the reply depends on whether the consumer contacted the business during it's chat hours. If it is, the welcome_message is sent as a reply. The welcome_message is mandatory, and can be customized. A default will be set if none is specified. |
offline_message | string or null (MessagingSettingOfflineMessage) When a consumer first contacts the business, an automated reply is sent. The content of the reply depends on whether the consumer contacted the business during it's chat hours. If it is not, the offline_message is sent as a reply. The offline_message is mandatory, and can be customized. A default will be set if none is specified. |
uses_business_hours | boolean or null (MessagingSettingUsesBusinessHours) If set to true, the business' "open_hours" will be used as chat hours. Otherwise, you need to specify "custom_chat_hours". |
object or null (ChatHours) The chat hours of the business (in its timezone). Chat hours are specified per weekday. This is done by supplying an object mapping weekdays ("monday", "tuesday", etc.) to a list of strings. These strings in turn represent time slots during which the business is open. For example, the following value would set the chat hours to between 08:00-15:00 in the afternoon and 18:00-23:00 in the evening on Mondays:
To indicate that a business can be contacted for 24 hours, for a specific
weekday, use the value This field is not mandatory unless "uses_business_hours" is set to false. | |
is_launched | boolean or null (MessagingSettingIsLaunched) Some messaging channels (Google and Facebook) can be temporarily deactivated. This allows the business to close for a period of time without having to answer consumer messages. This is important because consumers will get frustrated if they are able to contact a business and do not get an answer. It is also important to note that for some messaging channels, not responding to messages may lead to decreased visibility of the business, or suspension of the messaging service. The is_launched property indicates whether the business is reachable for those messaging channels. The value can be updated, and the changes will be propagated to the messaging channels, effectively toggling the On or Off the ability for consumers to reach the business. (The change to "is_launched" is made asychronously, and the update will be effective when the messaging channels have finished propagating the information) |
{- "welcome_message": "string",
- "offline_message": "string",
- "uses_business_hours": true,
- "custom_chat_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "is_launched": true
}
{- "id": 0,
- "business_id": "string",
- "business_name": "string",
- "business_address": "1 Rue de la Paix, 75000 Paris",
- "welcome_message": "string",
- "offline_message": "string",
- "uses_business_hours": true,
- "custom_chat_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "is_launched": true
}
All the operations you can perform on organization. An organization is an entreprise that owns businesses.
This endpoint lets you search for organizations using filters. The response is paginated (30 results per page).
org_id | integer Organization id |
query | string Parameter to fuzzy search organizations on name or id |
alias | string Parameter to search an organization by its alias |
page | integer Default: 0 Page number. 30 results per page |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. Currently limited to 100. |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "orgs": [
- {
- "org_id": 42,
- "name": "Fast Retailer",
- "alias": "fast_retailer",
- "provider": "partoo",
- "type": "small_medium_business",
- "has_google_post": true,
- "display_google_post": true,
- "features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages"
], - "org_features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages",
- "review_ai_suggestion"
], - "last_org_api_call": "05-11-2021",
- "max_businesses": 100
}
]
}
This endpoint lets you create an organization. You have WRITE
access on your provider (ie. only possible if you have PROVIDER
role).
name required | string (OrgName) Organization name |
alias | string (OrgAlias) Organization alias (should match regex |
max_businesses | integer or null (OrgMaxBusinesses) Maximum number of local businesses the organization can have. It does not include the global (brand) businesses. If null, there is no limit for the organization. This field can only be set by a provider. |
{- "name": "Fast Retailer",
- "alias": "fast_retailer",
- "max_businesses": 100
}
{- "status": "success",
- "org_id": 42,
- "alias": "fast_retailer",
- "max_businesses": 100
}
This endpoint lets you retrieve all the detail about a specific organization. You need to have READ
access to this organization.
org_id required | integer Organization id |
{- "org_id": 42,
- "name": "Fast Retailer",
- "alias": "fast_retailer",
- "provider": "partoo",
- "type": "small_medium_business",
- "has_google_post": true,
- "display_google_post": true,
- "features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages"
], - "org_features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages",
- "review_ai_suggestion"
], - "last_org_api_call": "05-11-2021",
- "max_businesses": 100
}
This endpoint lets you update the information of an organization. You need to have WRITE
access on the organization.
org_id required | integer Organization id |
name | string (OrgName) Organization name |
alias | string (OrgAlias) Organization alias (should match regex |
max_businesses | integer or null (OrgMaxBusinesses) Maximum number of local businesses the organization can have. It does not include the global (brand) businesses. If null, there is no limit for the organization. This field can only be set by a provider. |
{- "name": "Fast Retailer",
- "alias": "fast_retailer",
- "max_businesses": 100
}
{- "org_id": 42,
- "status": "success"
}
This endpoint lets you delete an organization. You need to have WRITE
access on your provider. When an organization gets deleted all the resources linked to it are deleted (users and businesses). If the organization still has businesses or users, it would raise an error if you do not indicate force="True"
in the JSON body.
org_id required | integer Organization id |
force | boolean (OrganizationForceDeletion) Default: false Force the deletion of organization even if there are still users and business linked to it |
{- "status": "success",
- "org_id": 42
}
This endpoint lets you retrieve the organization's plans.
You need to be a Provider to access this endpoint.
org_id required | integer Organization id |
{- "plans": [
- {
- "name": "presence_management",
- "subscription_date": "2025-01-01",
- "expiration_date": "2026-01-01"
}, - {
- "name": "review_management",
- "subscription_date": "2025-01-01",
- "expiration_date": null
}
]
}
This endpoint lets you update the plans of an organization.
You need to be a Provider to access this endpoint.
⚠️You need to send all the plans, those not sent will be removed. We advise you to call the GET endpoint first. ⚠️
org_id required | integer Organization id |
Array of objects (PlanUpdate) The exhaustive list of the organization's plans. |
{- "plans": [
- {
- "name": "presence_management",
- "expiration_date": "2026-01-01"
}, - {
- "name": "review_management"
}
]
}
{- "org_id": 42,
- "status": "success"
}
Post is a feature that allows businesses to create and share announcements, offers, new or popular items in stock, or event details directly with the customers. The post will appear on the specified partner, which will boost the results for the business.
When a business is connected to a Google location (action performed in Partoo app on Partner Connection page), all the Google Posts will be automatically imported. When a business is disconnected the Google Posts published on Google will be deleted from Partoo database.
⚠️ -- Google Post -- ⚠️
⚠️ Feature only available for small and midsize businesses (SMBs) ⚠️
Google Posts is a feature that allows businesses to create and share announcements, offers, new or popular items in stock, or event details directly with the customers. The post will appear on Google Search and Maps, which will boost the results for the business.
When a business is connected to a Google location (action performed in Partoo app on Partner Connection page), all the Google Posts will be automatically imported. When a business is disconnected the Google Posts published on Google will be deleted from Partoo database.
This endpoint lets you browse through all your posts.
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
start_datetime | string Example: start_datetime=2020-11-06T23:59:59 Filters Posts based on their start datetime. The start datetime represents the moment on which a Post of type event/offer
will become available. In case of Posts of type news, the |
end_datetime | string Example: end_datetime=2020-11-06T23:59:59 Filter Posts based on their end datetime. The end datetime represents the date on which the Post of type event/offer
will expire. In case of Posts of type news, the |
summary | string Filter Posts based on their description. It returns Posts that contain in their description the given string. The text does not have to match perfectly. |
state__in | string Enum: "live" "to_configure" "pending" "scheduled" "error" "expired" "to_validate" Filter Posts based on its state. |
topic_type | string Enum: "standard" "event" "offer" "alert" Filter Posts based on its type. |
topic_type__in | string Enum: "standard" "event" "offer" "alert" Filter Posts based on a list of different types. |
page | integer Default: 1 Page number, Starts at 1. From 1 to 100 results per page (see |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. Currently limited to 100. |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "posts": [
- {
- "id": 34,
- "business_id": "5409c35a97bbc544d8e26737",
- "post_type": "news",
- "summary": "Wonderful post summary !",
- "schedule_time": "2020-01-01T12:00:00+02:00",
- "expiration_time": "2020-01-01T12:00:00+02:00",
- "validation_time": "2020-01-01T12:00:00+02:00",
- "created_at": "2019-08-01T19:15:54.256000+02:00",
- "updated_at": "2019-09-01T15:12:35.256000+02:00",
- "created_on_partoo": false,
- "updated_on_partoo": false,
- "business_info": "Rick - HQ - 157 boulevard Macdonald, Paris",
- "post_insight": [
- {
- "name": "facebook__posts",
- "click_count": 1512,
- "view_count": 2012
}
], - "post_status": [
- {
- "name": "facebook__posts",
- "state": "live",
- "link": "www.partoo.co"
}
], - "offer_terms": "These are the conditions",
- "offer_code": "PROMO25",
- "cta_link": "www.partoo.co",
- "cta_type": "book"
}
]
}
This endpoint lets you create a post or a draft post on Google / Facebook / Instagram.
The creation of a post will not happen in real time and might take a few minutes.
A draft post can only be created by Org Admins and is not immediately published. An expiration date must be specified when creating a draft post. In order to be published, a draft needs to be updated by a BM/GM user before the expiration date.
required | object (PostBusinessSearch) Business to create post |
publishers required | Array of strings (PostPublishers) Items Enum: "google_my_business" "facebook" "instagram" List of publisher to diffuse the post |
required | object (PostData) Information on post to create |
is_draft | boolean Default: false If true, the post will be created as a draft. You must then also specify an |
send_notifications | boolean Default: false If true, a notification email will be sent to all BM/GM users that have access to this draft post |
{- "business_search": {
- "business__in": [
- [
- "5409c35a97bbc544d8e26737",
- "595badaef348ab6b3530033f",
- "59d53302b12ff6429f262639"
]
]
}, - "publishers": [
- "google_my_business",
- "facebook",
- "instagram"
], - "data": {
- "post_type": "news",
- "summary": "Wonderful post summary !",
- "title": "Great post title !",
- "cta_type": "book",
- "link": {
- "use_business_url": true,
- "custom_url": "string"
}, - "schedule_time": "2050-01-01T09:00:00",
- "expiration_time": "2050-01-01T09:00:00",
- "coupon_code": "PROMO25",
- "offer_terms": "These are the conditions",
- "start_at": "2050-01-01T09:00:00",
- "end_at": "2050-01-01T09:00:00"
}, - "is_draft": false,
- "send_notifications": false
}
{- "status": "success",
- "code": 200,
- "message": "2 posts have been created.",
- "ids": "45,46",
- "data": [
- {
- "post_id": 101,
- "business_id": "1234567890"
}, - {
- "post_id": 102,
- "business_id": "1234567891"
}
]
}
This endpoint lets you update a post.
When used by a BM or GM user, this endpoint also serves to validate and publish a draft post.
The update will not happen in real time and might take a few minutes
⚠️ Due to Instagram API limitations, this operation has no effect on Instagram posts.
post_id required | number Post id |
title | string (postTitle) Title of the post. |
summary | string (postSummary) Main text content of the post. |
postImageURL (string) or Array of postImageURL (strings) (postImageURL) URLs of the images displayed with the post. Note:
| |
cta_type | string (postCTAType) Enum: "book" "order" "shop" "learn_more" "sign_up" "call" "no_cta" The type of the post to be created. Some type mig. |
object (postLink) Link displayed in the post to redirect the client clicking on it. Use can only have one of the following parameters ('use_business_url' or 'custom_url'). | |
schedule_time | string (postScheduleTime) Date and time of when the post will be diffused corresponding platforms. It needs to be at least 2 hours after the time of the request. The timezone used is UTC. |
start_at | string (postStartAt) For either event or offer post type. Defined when it start. Timezone is defined by the business timezone. |
end_at | string (postEndAt) For either event or offer post type. Defined when it end. Timezone is defined by the business timezone. |
coupon_code | string (postCouponCode) Offer code that is usable in store or online |
offer_terms | string (postOfferTerms) Terms and conditions of the offer |
{- "title": "Great post title !",
- "summary": "Wonderful post summary !",
- "cta_type": "book",
- "link": {
- "use_business_url": true,
- "custom_url": "string"
}, - "schedule_time": "2050-01-01T09:00:00",
- "start_at": "2050-01-01T09:00:00",
- "end_at": "2050-01-01T09:00:00",
- "coupon_code": "PROMO25",
- "offer_terms": "These are the conditions"
}
{- "id": 34,
- "business_id": "5409c35a97bbc544d8e26737",
- "post_type": "news",
- "summary": "Wonderful post summary !",
- "schedule_time": "2020-01-01T12:00:00+02:00",
- "expiration_time": "2020-01-01T12:00:00+02:00",
- "validation_time": "2020-01-01T12:00:00+02:00",
- "created_at": "2019-08-01T19:15:54.256000+02:00",
- "updated_at": "2019-09-01T15:12:35.256000+02:00",
- "created_on_partoo": false,
- "updated_on_partoo": false,
- "business_info": "Rick - HQ - 157 boulevard Macdonald, Paris",
- "post_insight": [
- {
- "name": "facebook__posts",
- "click_count": 1512,
- "view_count": 2012
}
], - "post_status": [
- {
- "name": "facebook__posts",
- "state": "live",
- "link": "www.partoo.co"
}
], - "offer_terms": "These are the conditions",
- "offer_code": "PROMO25",
- "cta_link": "www.partoo.co",
- "cta_type": "book"
}
This endpoint lets you delete a post.
The deletion will not happen in real time and might take a few minutes.
⚠️ Due to Instagram API limitations, this operation has no effect on Instagram posts.
post_id required | number Post id |
{- "status": "success"
}
Retrieve a list of available place action links.
lang | string (Lang) Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Example: lang=fr Preferred language for place action links. If no language is provided, the user's default language will be used. If the user's default language is unavailable, the country's primary language will be used. |
{- "place_action_links": [
- {
- "gmb_id": "APPOINTMENT",
- "name": "Appointment links"
}, - {
- "gmb_id": "DINING_RESERVATION",
- "name": "Reservations links"
}, - {
- "gmb_id": "FOOD_DELIVERY",
- "name": "Food delivery links"
}, - {
- "gmb_id": "FOOD_ORDERING",
- "name": "Food ordering links"
}, - {
- "gmb_id": "FOOD_TAKEOUT",
- "name": "Food takeout links"
}, - {
- "gmb_id": "ONLINE_APPOINTMENT",
- "name": "Online appointment links"
}, - {
- "gmb_id": "SHOP_ONLINE",
- "name": "Shop Online links"
}
]
}
This endpoint lets you view the Google Business Profile analytics for all your businesses subscribed to Presence Management. The API allows you to select what data you're interested in, and how you want it aggregated (daily, monthly, by business, etc). You can also filter the results to limit it to a certain date range, and to certain business.
Google Business Profile doesn't provide reliable data for the most recent 5 days.
You can choose the analytics you want to get among:
You can use the following filters:
The response can be aggregated by:
The response can be ordered in ascending or descending order by any of the selected dimensions or metrics. See examples for more details.
metrics required | string Enum: "business_impressions_desktop_maps" "business_impressions_desktop_search" "business_impressions_mobile_maps" "business_impressions_mobile_search" "business_direction_requests" "call_clicks" "website_clicks" List of analytics to return. At least one in that list. |
dimensions | string Enum: "business" "day" "week" "month" "year" How the returned data will be aggregated. At most 'business' and one time dimensions of the list. If no dimension is given, the request will return the sum of each metric for all requested days and businesses. |
order_by | string Enum: "<object>" "-<object>" Example: order_by=order_by=-call_clicks Where the object is either a dimension or a metric and is used in the request. At most one in the list.
|
business__in | Array of strings (BusinessID) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
business__notin | Array of strings (BusinessID) Example: business__notin=5409c35a97bbc544d8e26737 Filter by all allowed businesses except
the ones given in |
city | string Filter by city |
query | string Parameter to fuzzy search businesses on city, zipcode and name |
filter_date__gte | string <datetime> Filter by Return all the analytics whose |
filter_date__lte | string <datetime> Filter by Return all the analytics whose |
page | integer >= 1 The page number you want to request. The value defaults to 1, when it is not included. |
per_page | integer <= 500 The maximum number of result items to return in a page. The value defaults to 500, when it is not included. |
{- "page": 1,
- "count": 1,
- "max_page": 1,
- "metrics": [
- {
- "business_impressions_desktop_maps": 123,
- "business_impressions_desktop_search": 123,
- "business_impressions_mobile_maps": 123,
- "business_impressions_mobile_search": 123,
- "business_direction_requests": 123,
- "call_clicks": 123,
- "website_clicks": 123
}
]
}
This endpoint lets you view the monthly Google Business Profile search keywords for all your businesses subscribed to Presence Management.
To access the analytics of a business, you need to:
READ
access on itThe analytics on search keywords are made available by Google Business Profile on a monthly basis.
You will receive the following metrics:
You can use the following filters:
The response can be aggregated by:
The response can be ordered by:
The response can be ordered in ascending or descending order by any of the selected dimensions or metrics.
metrics required | string Enum: "count" "threshold" Example: metrics=metrics=count,threshold List of analytics to return. At least one in that list. |
dimensions | string Enum: "business" "keyword" "month" "year" Example: dimensions=dimensions=keyword,month How the returned data will be aggregated. At most 'business' and one time dimensions of the list. If no dimension is given, the request will return the sum of each metric for all requested days and businesses. |
order_by | string Enum: "<object>" "-<object>" Example: order_by=order_by=-count Where the object is either a dimension or a metric and is used in the request. At most one in the list.
|
business__in | Array of strings (BusinessID) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
filter_date__gte | string <datetime> Filter by date. Return all the analytics whose |
filter_date__lte | string <datetime> Filter by date. Return all the analytics whose |
page | integer >= 1 The page number you want to request. The value defaults to 1, when it is not included. |
per_page | integer <= 500 The maximum number of result items to return in a page. The value defaults to 500, when it is not included. |
{- "page": 1,
- "count": 1,
- "max_page": 1,
- "keywords": [
- {
- "keyword": 123,
- "count": 123,
- "threshold": 123,
- "date": "2019-11-01",
- "bucket": "month",
- "business_id": "5409c35a97bbc544d8e26737"
}
]
}
⚠️ This feature is available only for businesses subscribed to Review Management. ⚠️
Partoo centralises all businesses reviews from Google, Facebook and TripAdvisor platforms.
The reviews are fetched once per day (over night), therefore a it is expected to have a delay of maximum 24h. The Partoo APIs enable a simple way of replying to any new reviews, update an existing reply or delete a reply. A review can have one of the following status:
treated
: has a reply/comment or it was manually marked as treated in the Partoo UInot-treated
: it doesn't have a reply/comment and it was not manually marked as treated in the Partoo UIdeleted
: the review was removed by the user on the original platfrom.Note: the review itself cannot be altered nor deleted via the APIs.
Reply templates allow business managers to gain time in replying to the reviews, via a predefined answer which can be easily selected and sent.
Reply templates are not meant to be used outside the Partoo application. For this reason it is not possible to access a formatted template, with prefilled placeholders from the API.
However it is still possible to browse through, create or delete reply templates from the Partoo API.
This endpoint lets you search for the reviews of your businesses.
To access the reviews of a business you need to have READ
access on it.
The response is paginated (30 results per page).
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
business__notin | Array of strings (BusinessId) Example: business__notin=5409c35a97bbc544d8e26737 Excludes from the request all businesses provided |
content__isnull | string Enum: "true" "false" Example: content__isnull=false Filter by review's content If set to Note: This is the content of the review and not the content of the reply. |
partner__in | Array of strings (ReviewPublisherLabel) Items Enum: "google_my_business" "facebook" "tripadvisor" Example: partner__in=google_my_business,facebook Filter by publisher |
gmb_rating__in | Array of numbers Items Enum: 1 2 3 4 5 Example: gmb_rating__in=4,5 Filter only by Google ratings |
tripadvisor_rating__in | Array of numbers Items Enum: 1 2 3 4 5 Example: tripadvisor_rating__in=1,2 Filter only by Tripadvisor ratings |
recommended__in | Array of booleans Items Enum: true false Example: recommended__in=false Filter only by Facebook recommendation |
update_date__gte | string <datetime> Example: update_date__gte=2017-08-01T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
update_date__lte | string <datetime> Example: update_date__lte=2017-08-02T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
state__in | Array of strings (ReviewState) Items Enum: "treated" "not_treated" "deleted" Example: state__in=treated,not_treated Filter by state |
tag_label__in | Array of strings (TagLabel) Example: tag_label__in=food,drink Filter by Tag label Will partially match given labels (ie |
without_tag | boolean Example: without_tag=true Filter only reviews without tags |
keywords | Array of strings Example: keywords=bonjour,good+service Filter by keywords Return all the reviews with not-nullable content, that contain the provided list of keywords. Note: This is the content of the review and not the content of the reply. The filter accepts both simple and composed words.
To indicate it's a composed keyword, add the |
page | integer Default: 1 Page number, Starts at 1. From 1 to 100 results per page (see |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. Currently limited to 100. |
order_by | string Enum: "update_date" "-update_date" Example: order_by=update_date A |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "reviews": [
- {
- "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",
- "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": 0,
- "user_id": "123456789abcdef2f60c42ff",
- "is_reply_suggestion": true,
- "replies": [
- { }
]
}, - "tags": [
- {
- "id": 25,
- "label": "food",
- "color": "#808080"
}
]
}
]
}
Update the state of a review to treated/not_treated
review_id required | integer (ReviewId) Example: 34 Review id |
state required | string Enum: "treated" "not_treated" Reply state |
{- "state": "treated"
}
{- "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",
- "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": 0,
- "user_id": "123456789abcdef2f60c42ff",
- "is_reply_suggestion": true,
- "replies": [
- { }
]
}, - "tags": [
- {
- "id": 25,
- "label": "food",
- "color": "#808080"
}
]
}
This endpoint lets you reply to a given review.
review_id required | number ID of the review you want to reply |
parent_id | number The id of the parent comment you want to reply Works only for Facebook comments, since it's possible to reply to a comment (depth max is 2). Google and TripAdvisor don't accept this behaviour. |
content required | string <text> Content of your reply |
reply_template_id | number ID of the reply template to use |
object Suggestion details for the reply, check how to retrieve values in the Fetch AI reply suggestion for reviews section. |
{- "review_id": 34,
- "parent_id": 1234,
- "content": "Merci ❤️",
- "reply_template_id": 5678,
- "reply_suggestion": {
- "reply_suggestion_id": 91011,
- "reply_suggestion_modified": true
}
}
{- "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": 0,
- "user_id": "123456789abcdef2f60c42ff",
- "is_reply_suggestion": true,
- "replies": [
- { }
]
}
This endpoint lets you modify a given reply to a review.
comment_id required | integer (CommentId) Example: 82938 Comment id |
content required | string <text> Content of your Reply |
{- "content": "Merci ❤️"
}
{- "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": 0,
- "user_id": "123456789abcdef2f60c42ff",
- "is_reply_suggestion": true,
- "replies": [
- { }
]
}
This endpoint lets you browse through all your reply review templates.
page | integer Default: 0 Page number. 30 results per page |
positive | boolean Filter on templates made to answer positive reviews (ex from 4 to 5 stars on gmb). |
neutral | boolean Filter on templates made to answer neutral reviews (ex 3 stars on gmb). |
negative | boolean Filter on templates made to answer negative reviews (ex from 1 to 2 stars on gmb). |
language__in | Array of strings (Lang) Items Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Example: language__in=fr,it Filter on templates in the specified languages. |
title_query | string Filter on templates based on their title |
text_query | string Filter on templates based on their text |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "reply_templates": [
- {
- "id": 34,
- "org_id": 42,
- "update_date": "2017-08-01T19:15:54.256000+02:00",
- "creation_date": "2017-08-01T19:15:54.256000+02:00",
- "language": "fr",
- "title": "string",
- "text": "hello @[](client_full_name),\nThanks from the team at @[](business_name).\n@[](my_first_name)",
- "negative": true,
- "neutral": true,
- "positive": true
}
]
}
This endpoint lets you access available placeholders for reply review templates. A template placeholder is a dynamically updated word within the Partoo app depending on the context.
Ex: Once used to answer a review, if a template has a client_first_name
placeholder, the placeholder will take the value of the reviewer's first name.
{- "id": 2,
- "value": "my_first_name"
}
This endpoint lets you create a review reply template.
language required | string (Lang) Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Available language in the application |
negative required | boolean (TemplateNegative) Template is made for negative reviews (ex from 1 to 2 stars on gmb) |
neutral required | boolean (TemplateNeutral) Template is made for neutral reviews (ex 3 stars on gmb) |
positive required | boolean (TemplatePositive) Template is made for positive reviews (ex from 4 to 5 stars on gmb) |
text required | string (TemplateText) The content of the reply template. Placeholders are recognisable within the text by this exact markup Example of usable placeholder values: |
title required | string (TemplateTitle) Template title |
{- "language": "fr",
- "negative": true,
- "neutral": true,
- "positive": true,
- "text": "hello @[](client_full_name),\nThanks from the team at @[](business_name).\n@[](my_first_name)",
- "title": "string"
}
{- "id": 34,
- "org_id": 42,
- "update_date": "2017-08-01T19:15:54.256000+02:00",
- "creation_date": "2017-08-01T19:15:54.256000+02:00",
- "language": "fr",
- "title": "string",
- "text": "hello @[](client_full_name),\nThanks from the team at @[](business_name).\n@[](my_first_name)",
- "negative": true,
- "neutral": true,
- "positive": true
}
The AI reply suggestion is a service that generates a response to a review based on the review content.
⚠️ This feature provides reply SUGGESTIONS, NOT AUTOMATIC REPLIES. It is NOT designed for fully automating conversations. Similar to the app, a human reviewer is expected to validate the suggestion before selecting it in order to use reply to a review endpoint ⚠️
How does the AI reply suggestion work?
index
(0, 1, or 2) of the parametersreply_suggestion
request body when calling the reply to a review service to link the response to the suggestion.review_id required | integer (ReviewId) Example: 34 ID of the review for which we want an AI suggestion |
index required | integer [ 0 .. 2 ] Index of the reply suggestion (0, 1, or 2) |
{- "id": 820459,
- "index": 1,
- "review_id": 34,
- "content": "Dear Client, thanks for your kind feedback.",
- "report": {
- "id": 3587,
- "user_id": "52e10f004ee65a020",
- "created_at": "2025-05-12T12:57:21.895170Z"
}
}
⚠️ This feature is available only for businesses subscribed to Review Management. ⚠️
All the operations to perform Reviews analytics.
This endpoint lets you view the statistics related to reviews made to your businesses subscribed to Review Management.
A request is composed of:
metrics
which is the data you want to returndimensions
which defines how the data is grouped byorder_by
to define how the data is sortedHere is the list of all metrics available:
average_rating
: Average ratingrating_distribution
: Breakdown of the ratings (Number of 1-star reviews, 2-star reviews, 3-star reviews, etc...)reviews_count
: Number of reviews receivedreply_time
: Breakdown of the reviews based on how fast (less or more than 48 hours) they have been replied to (or not replied)reply_means
: Breakdown of the review replies based on the reply method used (manual reply, reply template, auto reply or AI suggestion)average_rating_distribution
: Breakdown of your businesses based on their average ratingrank
: Allows you to rank the users, businesses or groups based on their performance on a metric (an order_by is required)Here is the list of all dimensions available, and for each of them, the list of metrics and sort order available:
average_rating
, rating_distribution
, reviews_count
, reply_time
, reply_means
, average_rating_distribution
day
, week
, month
, year
average_rating
, rating_distribution
, reviews_count
, reply_time
, reply_means
business
, group
average_rating
, rating_distribution
, reviews_count
, reply_time
, reply_means
, rank
user
reply_time
, reply_means
, rank
tag
average_rating
, rating_distribution
, reviews_count
Here is the list of all order_by available (Add a minus -
sign before to order by decreasing order):
average_rating
: Sort by average ratingreviews_count
: Sort by review_countreply_time__total
: Sort by number of reviews receivedreply_means__total
: Sort by number of reviews that have been repliedratio__rating_distribution__5
: Sort by the ratio of 5 star reviewsratio__rating_distribution__negative
: Sort by the ratio of negative reviewsratio__reply_time__fast
: Sort by the ratio of reviews replied in less than 2 daysratio__reply_time__slow
: Sort by the ratio of reviews replied in more than 2 daysratio__reply_time__not_replied
: Sort by the ratio of reviews not repliedratio__reply_means__manual
: Sort by the ratio reviews replied manuallyratio__reply_means__ai_suggestion
: Sort by the ratio reviews replied using AI suggestionratio__reply_means__reply_template
: Sort by the ratio reviews replied using reply templateratio__reply_means__auto_reply
: Sort by the ratio reviews replied using auto reply To use an order_by parameter, its corresponding metric must be included in the request.
(i.e.
to order by average_rating
, you must include the average_rating
metric in the metrics
parameter,
to order by ratio__rating_distribution__5
, you must include the rating_distribution
metric in the metrics
parameter,
and so on...)
metrics required | string Enum: "average_rating" "rating_distribution" "reviews_count" "reply_time" "reply_means" "average_rating_distribution" "rank" List of analytics to return. At least one in that list. |
dimensions | string Enum: "day" "week" "month" "year" "business" "group" "user" "tag" How the returned data will be aggregated. If no dimension is given, the request will return the sum of each metric for all requested days and businesses. |
order_by | string Example: order_by=-average_rating See above for the list of all orders available. At most one in the list.
|
business__in | Array of strings (BusinessID) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
business__notin | Array of strings (BusinessID) Example: business__notin=5409c35a97bbc544d8e26737 Filter by all allowed businesses except
the ones given in |
groups | Array of integers (GroupID) Example: groups=12312 Filter by groups ids |
tags | Array of integers (TagID) Example: tags=10,12,44 Restrict the data returned on reviews that have been assigned the specified tags. |
update_date__gte | string <datetime> Restrict the data returned on reviews which |
update_date__lte | string <datetime> Restrict the data returned on reviews which |
page | integer >= 1 Default: 1 The page number you want to request. |
per_page | integer Default: 30 The maximum number of result items to return in a page. |
{- "page": 1,
- "count": 2,
- "max_page": 1,
- "data": [
- {
- "dimension": "59b2645db12ff60643ef832c",
- "dimension_name": "Business 1",
- "dimension_info": {
- "address_full": "190 rue Championnet",
- "city": "Paris",
- "zipcode": "75018",
- "code": "PTOCODE1"
}, - "metrics": {
- "average_rating": 2.31
}
}, - {
- "dimension": "60b2645fb12ff60643ef8344",
- "dimension_name": "Business 2",
- "dimension_info": {
- "address_full": "190 rue Championnet",
- "city": "Paris",
- "zipcode": "75018",
- "code": "PTOCODE2"
}, - "metrics": {
- "average_rating": 4.31
}
}
]
}
This endpoint let you view the global reviews statistics for all your businesses subscribed to Review Management.
You can use the following filters:
The response is aggregated according to the previously selected filters.
In order to get analytics evolution overtime returned by specific time range, please refer to Qualitative Evolution and Quantitative Evolution endpoints.
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids Return the reviews of the businesses given in list. |
keywords | Array of strings Example: keywords=bonjour,good+service Filter by keywords Return all the reviews with not-nullable content, that contain the provided list of keywords. Note: This is the content of the review and not the content of the reply. The filter accepts both simple and composed words.
To indicate it's a composed keyword, add the |
update_date__gte | string <datetime> Example: update_date__gte=2017-08-01T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
update_date__lte | string <datetime> Example: update_date__lte=2017-08-02T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
{- "answer_time": 10493.90997409,
- "average": 3.0394,
- "treated": 9,
- "not_treated": 10,
- "answered": 8,
- "satisfied": 10,
- "neutral": 6,
- "dissatisfied": 3,
- "total": 19
}
This endpoint lets you view the qualitative evolution of the reviews rating for all of your businesses subscribed to Review Management. The API returns the reviews average rating by bucket (time range).
You can use the following filters:
bucket | string Default: "week" Enum: "day" "week" "month" "year" Defining the time range of a data bucket. This will determine the precision of the returned data. For example, if you choose |
cumulative | string Default: "true" Enum: "true" "false" If If |
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids Return the reviews of the businesses given in list. |
keywords | Array of strings Example: keywords=bonjour,good+service Filter by keywords Return all the reviews with not-nullable content, that contain the provided list of keywords. Note: This is the content of the review and not the content of the reply. The filter accepts both simple and composed words.
To indicate it's a composed keyword, add the |
update_date__gte | string <datetime> Example: update_date__gte=2017-08-01T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
update_date__lte | string <datetime> Example: update_date__lte=2017-08-02T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
[- {
- "date": "2019-11-29",
- "average": 4.54,
- "added": 50,
- "cum_sum": 70
}, - {
- "date": "2019-12-05",
- "average": 4.34,
- "added": 34,
- "cum_sum": 104
}, - {
- "date": "2019-12-12",
- "average": 4.41,
- "added": 4,
- "cum_sum": 108
}
]
This endpoint lets you view the quantitative evolution of the number of reviews for all of your businesses subscribed to Review Management. The API returns the cumulative sum of the number of reviews by bucket (time range) selected overtime.
You can use the following filters:
bucket | string Default: "week" Enum: "day" "week" "month" "year" Defining the time range of a data bucket. This will determine the precision of the returned data. For example, if you choose |
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids Return the reviews of the businesses given in list. |
keywords | Array of strings Example: keywords=bonjour,good+service Filter by keywords Return all the reviews with not-nullable content, that contain the provided list of keywords. Note: This is the content of the review and not the content of the reply. The filter accepts both simple and composed words.
To indicate it's a composed keyword, add the |
update_date__gte | string <datetime> Example: update_date__gte=2017-08-01T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
update_date__lte | string <datetime> Example: update_date__lte=2017-08-02T00:00:00 Filter by Return all the reviews whose For example : Note : The update dates are stored in UTC. |
[- {
- "date": "2019-11-29",
- "added": 50,
- "previous_sum": 20,
- "cum_sum": 70
}, - {
- "date": "2019-12-05",
- "added": 34,
- "previous_sum": 70,
- "cum_sum": 104
}, - {
- "date": "2019-12-12",
- "added": 4,
- "previous_sum": 104,
- "cum_sum": 108
}
]
All operations related to the Review Booster product.
⚠️ SMS send functionality cannot be tested in Sandbox env. All operations related to the Review Booster product.
⚠️ SMS send functionality cannot be tested in Sandbox env.
This endpoint lets you send a SMS to a costumer to help him leave a message on Google. You need to have WRITE
access on the business. You can add "invite_content" in your payload to customize the SMS content that will be received by the recipient. Else, the template associated with the user will be used (see /v2/review_booster/template for more info). If no template exist, a new one will be generated.
Your business needs to be connected to a Google location and to be subscribed to Review Booster product. So this cannot be tested in Sandbox Env. To prevent spamming, a new SMS can be sent to a specific phone number only after 10 days since the last SMS sent.
business_id required | string (BusinessId) Business id |
target_phone required | string Customer phone number, with the country calling code. Eg: +33601020304 |
target_name | string <= 255 characters Customer fullname |
template_id | integer Deprecated Id of the SMS template you want to use |
invite_content | string To customize SMS content instead of using the SMS template associated with the user. Cannot be used in combination with template_id. @link must be included in your payload (corresponds to the dynamic link that will allow the SMS recipient to leave a review on the business). Max 286 characters (unicode characters are not accepted - will be removed) |
force | string Default: "False" Enum: "True" "False" To force invitation sending when a SMS has already been sent to the customer |
{- "business_id": "5409c35a97bbc544d8e26737",
- "target_phone": "+33647385968",
- "target_name": "John Doe",
- "template_id": 31
}
{- "invitation_id": "d3d8c966-0356-4ec0-baae-13ec3622ebc2",
- "status": "success"
}
This endpoint allows to fetch previously sent invitations. Your access token must be for an user subscribed to the Review Booster product to access this route. The user must have access to the business. This can be useful to avoid sending multiple invitations to the same user in a defined period.
business_id required | string (BusinessId) Example: business_id=5409c35a97bbc544d8e26737 Business id |
target_phone required | string (TargetPhone) Example: target_phone=0701020304 the exact phone number we would have sent the invitation(s) to |
after | number Example: after=1559148288 |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "review_invitations": [
- {
- "user_name": "Perceval",
- "user_id": "54b6733b9826bf1dd29af128",
- "id": "3d90efec-0d7f-4960-98c0-951d58dc14cb",
- "sent_time": "2019-06-06 11:57:27.274725+00:00"
}
]
}
This endpoint allows to get the status about an invitation sent through the Review Booster. Your access token must be for a user subscribed to the Review Booster. The invitation id must be for a business for which the user has access to.
invitation_id | string (InvitationId) Example: invitation_id=d3d8c966-0356-4ec0-baae-13ec3622ebc2 invitation id |
{- "invitation_id": "d3d8c966-0356-4ec0-baae-13ec3622ebc2",
- "status": "CREATED"
}
This endpoint lets you get your corresponding template. If no template exist for the user, a template is created and send back.
You need to be subscribed to Review Booster product.
{- "template_id": 3462,
- "template": "Hello ${client_name}, please leave a review ${url}",
- "status": "success"
}
This endpoint lets you update the template associated to the user.
3 placeholders are available for the template: ${client_name}, ${business_name} and ${url}
There is 2 mains constraints: ${url}
must be present in the template send and the text should not contains more than 250 characters (without placeholders). The template must exist before the request is send.
You need to be subscribed to Review Booster product.
template required | string the template content, with placeholder(s) not filled |
{- "template": "Hello ${client_name}, please leave a review ${url}"
}
{- "status": "success"
}
This endpoint lets you set the expeditor name of a business.
An expeditor name is the name of the sender used to send the message. It will be seen instead of the phone number on the destination phone.
An expeditor name lenght's must be contain between 3 and 11 characters. No special characters are allowed.
Your business must be subscribed to Review Booster product.
business_id required | string (BusinessId) Business id |
expeditor_name required | string the new expeditor name |
{- "business_id": "5409c35a97bbc544d8e26737",
- "expeditor_name": "Partoo"
}
{- "expeditor_name": "Partoo",
- "status": "success"
}
This endpoint lets you get the expeditor name of a business.
An expeditor name is the name of the sender used to send the message. It will be seen instead of the phone number on the destination phone.
Your business must be subscribed to Review Booster product.
business_id required | string (BusinessId) Example: business_id=5409c35a97bbc544d8e26737 Business id |
{- "expeditor_name": "Partoo",
- "status": "success"
}
This endpoint lets you search for users using filters
string <email> Filter by email | |
org_id | integer Filter by org id |
query | string To perform a fuzzy search on user |
status | string (UserStatus) Enum: "active" "invited" Example: status=active Filter users by status |
display_business_ids | string Default: "True" Enum: "True" "False" The endpoint won’t return the |
business_id | string Example: business_id=5409c35a97bbc544d8e26737u Filter by users having access to the business with the provided id. |
page | integer Default: 1 Page number, Starts at 1. From 1 to 100 results per page (see |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. Currently limited to 100. |
order_by | string Default: "id" Enum: "email" "first_name" "last_name" "role" "org_id" "group_id" "status" "-email" "-first_name" "-last_name" "-role" "-org_id" "-group_id" "-status" Order result by given attribute.
Reverse order can as well be obtained by using a |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "users": [
- {
- "id": "5309c3a237bbc544d8e26737",
- "org_id": 42,
- "first_name": "Perceval",
- "last_name": "de Galles",
- "email": "perceval@kaamelott.com",
- "lang": "fr",
- "phone": "string",
- "sidebar_products": [
- "presence_management"
], - "business_ids": [
- "5409c35a97bbc544d8e26737"
], - "group_id": 42,
- "accesses": [
- [
- 1,
- 2
], - [
- 1,
- 3
]
], - "role": "BUSINESS_MANAGER",
- "provider": "partoo",
- "status": "active",
- "keywords": [
- "string"
], - "created_at": 1615299414,
- "shadow_user_id": "",
- "sso_only": false
}
]
}
This endpoint lets you retrieve all the information about your user
{- "id": "5309c3a237bbc544d8e26737",
- "org_id": 42,
- "first_name": "Perceval",
- "last_name": "de Galles",
- "email": "perceval@kaamelott.com",
- "lang": "fr",
- "phone": "string",
- "sidebar_products": [
- "presence_management"
], - "sidebar_pages": [
- "bulk_modification"
], - "available_features": [
- "diffusion"
], - "business_ids": [
- "5409c35a97bbc544d8e26737"
], - "group_id": 42,
- "accesses": [
- [
- 1,
- 2
], - [
- 1,
- 3
]
], - "role": "BUSINESS_MANAGER",
- "provider": "partoo",
- "status": "active",
- "keywords": [
- "string"
], - "created_at": 1615299414,
- "shadow_user_id": "",
- "sso_only": false
}
This endpoint lets you create a user. If no password given, a password will automatically be generated.
The password will be ignored if send_invitation
is set to True
.
You need to have WRITE
access on the organization of the user you want to create.
If you want to have an invited
user but send the invitation email later, you have to send the send_invitation
parameter as False
and a status
parameter to invited
.
You will then have to call the invitation endpoint to send the invitation email to the user.
email required | string <email> User email (must be unique will return otherwise) |
first_name required | string (UserFirstName) User first name |
last_name required | string (UserLastName) User last name |
org_id | integer Id of the organization to which the user should belong. If no |
accesses | Array of integers (accesses) [ items ] List of (list of Group ID). Accesses of the users for the new groups system, only for |
business_ids | Array of strings The list of business to which the user has access to. Will be taken into account only if user has |
phone | string (UserPhone) Deprecated User phone number |
role | string Default: "ORG_ADMIN" Enum: "ORG_ADMIN" "GROUP_MANAGER" "BUSINESS_MANAGER" User role in the application |
sidebar_products | Array of strings (Product) Deprecated Items Enum: "presence_management" "review_booster" "review_management" "messages" |
sidebar_pages | Array of strings Items Enum: "bulk_modification" "diffusion" "feedback_management" "messages" "posts" "presence_analytics" "review_analytics" "review_invite" "review_management" List of features the user can access from the sidebar.
If not provided in the payload or set to |
send_invitation | boolean Default: false Send an invitation email to the User. If you want to have an |
password | string <password> (Password) >= 8 characters The User password. It should comply with the following rules:
|
lang | string (Lang) Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Available language in the application |
sso_only | boolean (SsoOnly) Prevent the user from connecting directly from Partoo connexion page. This field is available for users which organization has defined an SSO configuration. This field can be edited by a user with role |
{- "email": "user@example.com",
- "first_name": "Perceval",
- "last_name": "de Galles",
- "org_id": 0,
- "accesses": [
- [
- 1,
- 2
], - [
- 1,
- 3
]
], - "business_ids": [
- "string"
], - "phone": "string",
- "role": "ORG_ADMIN",
- "sidebar_products": [
- "presence_management"
], - "sidebar_pages": [
- "bulk_modification"
], - "send_invitation": false,
- "password": "pa$$word",
- "lang": "fr",
- "sso_only": false
}
{- "id": "5309c3a237bbc544d8e26737",
- "status": "success"
}
This endpoint lets you retrieve all the information on a user. You need to have READ
access to this users.
user_id required | string User id |
{- "id": "5309c3a237bbc544d8e26737",
- "org_id": 42,
- "first_name": "Perceval",
- "last_name": "de Galles",
- "email": "perceval@kaamelott.com",
- "lang": "fr",
- "phone": "string",
- "sidebar_products": [
- "presence_management"
], - "sidebar_pages": [
- "bulk_modification"
], - "available_features": [
- "diffusion"
], - "business_ids": [
- "5409c35a97bbc544d8e26737"
], - "group_id": 42,
- "accesses": [
- [
- 1,
- 2
], - [
- 1,
- 3
]
], - "role": "BUSINESS_MANAGER",
- "provider": "partoo",
- "status": "active",
- "keywords": [
- "string"
], - "created_at": 1615299414,
- "shadow_user_id": "",
- "sso_only": false
}
This endpoint lets you update a user. You need to have WRITE
access to this user. It has a patch behaviour which means that only indicated value will be changed.
user_id required | string User id |
string <email> (UserEmail) User email | |
first_name | string (UserFirstName) User first name |
last_name | string (UserLastName) User last name |
org_id | integer Org to which the user should belong |
accesses | Array of integers (accesses) [ items ] List of (list of Group ID). Accesses of the users for the new groups system, only for |
business_ids | Array of strings The list of business to which the user has access to. Will be taken into account only if user has |
phone | string (UserPhone) Deprecated User phone number |
role | string (PublicRole) Enum: "ORG_ADMIN" "GROUP_MANAGER" "BUSINESS_MANAGER" User role in the application |
sidebar_products | Array of strings (Product) Deprecated Items Enum: "presence_management" "review_booster" "review_management" "messages" |
sidebar_pages | Array of strings (SidebarPages) Items Enum: "bulk_modification" "diffusion" "feedback_management" "messages" "posts" "presence_analytics" "review_analytics" "review_invite" "review_management" List of features the user can access from the sidebar. |
password | string <password> (Password) >= 8 characters The User password. It should comply with the following rules:
|
lang | string (Lang) Enum: "fr" "en" "es" "it" "pt-br" "de" "ar" "nl" "pl" "cs" "ca" "sk" "pt" "lv" "ro" "bg" "hu" Available language in the application |
sso_only | boolean (SsoOnly) Prevent the user from connecting directly from Partoo connexion page. This field is available for users which organization has defined an SSO configuration. This field can be edited by a user with role |
keywords | Array of strings (Keywords) <= 12 items Deprecated Array of keywords |
receive_reviews_email_notifications | boolean The parameter decides if the user subscribes to negative reviews email notifications |
{- "email": "perceval@kaamelott.com",
- "first_name": "Perceval",
- "last_name": "de Galles",
- "org_id": 0,
- "accesses": [
- [
- 1,
- 2
], - [
- 1,
- 3
]
], - "business_ids": [
- "string"
], - "phone": "string",
- "role": "BUSINESS_MANAGER",
- "sidebar_products": [
- "presence_management"
], - "sidebar_pages": [
- "bulk_modification"
], - "password": "pa$$word",
- "lang": "fr",
- "sso_only": false,
- "keywords": [
- "string"
], - "receive_reviews_email_notifications": true
}
{- "id": "5309c3a237bbc544d8e26737",
- "status": "success"
}
This endpoint lets you retrieve all the information about a user's preferences on notifications. You need to have READ
access to this user.
Here are the default values for newly created users
{
"reports": {
"review_management_daily": true,
"review_management_weekly": true,
"review_management_monthly": true,
"daily_review_preferences": {
"partners": [
"google_my_business",
"facebook"
],
"review_type": 2
}
},
"receive_negative_reviews_email_notifications": false
}
user_id required | string User id |
{- "reports": {
- "review_management_daily": true,
- "review_management_weekly": true,
- "review_management_monthly": true,
- "daily_review_preferences": {
- "partners": [
- "facebook",
- "google_my_business",
- "tripadvisor"
], - "review_type": 2
}
}, - "receive_negative_reviews_email_notifications": true
}
This endpoint lets you update all the information about a user's preferences on notifications. You need to have WRITE
access to this user.
user_id required | string User id |
object (UserReports) Daily, weekly and monthly reports preferences | |
receive_negative_reviews_email_notifications | boolean (ReceiveNegativeReviewsEmailNotifications) Receive a notification when there is a negative review. |
{- "reports": {
- "review_management_daily": true,
- "review_management_weekly": true,
- "review_management_monthly": true,
- "daily_review_preferences": {
- "partners": [
- "facebook",
- "google_my_business",
- "tripadvisor"
], - "review_type": 2
}
}, - "receive_negative_reviews_email_notifications": true
}
{- "id": "5309c3a237bbc544d8e26737",
- "status": "success"
}
This endpoint lets you trigger a new invitation email to an invited
user. You need to have WRITE
access to this user. The email can only be sent once every 5 minutes.
user_id required | string User id |
{- "status": "success"
}
This endpoint lets you retrieve the list of businesses which the selected user has READ
access to.
user_id required | string User id |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "businesses": [
- {
- "id": "5409c35a97bbc544d8e26737",
- "created": 1409925979.5,
- "modified": 1561335111.681374,
- "code": "CS-75019",
- "status": "open",
- "org_id": 42,
- "group_id": 23,
- "name": "Corner shop",
- "address": "string",
- "address_full": "12 bis rue du coquelicot",
- "address2": "string",
- "city": "Paris",
- "zipcode": "75019",
- "region": "Ile-de-France",
- "country": "FR",
- "default_lang": "fr",
- "open_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "specific_hours": {
- "open": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-20",
- "open_hours": [
- "10:00-14:00"
]
}
], - "close": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-22"
}
]
}, - "description_short": "lorem ipsum",
- "description_long": "lorem ipsum dolor sit amet",
- "google_location_id": "string",
- "facebook_page_id": "string",
- "national_identification_number": "string",
- "contacts": [
- {
- "name": "Hubert Bonisseur de la Bath",
- "email": "hubert@oss117.fr",
- "phone_numbers": [
- "+33302060628"
], - "fax": "+33302060629"
}
], - "photos": {
}, - "lat": -3.585993,
- "long": 47.870341,
- "subscriptions": {
- "presence_management": {
- "active": true
}, - "review_management": {
- "active": true
}, - "review_booster": {
- "active": false
}, - "messages": {
- "active": false
}
}, - "features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages"
], - "siret": "string",
- "completion_rate": 77,
- "news": [
- {
- "description": "string"
}
], - "promos": [
- {
- "title": "string",
- "description": "string",
- "term_of_use": "string",
- "additional_informations": "string",
- "begin": 0,
- "end": 0,
}
]
}
]
}
The webhooks are a way for you to be automatically notified of real-time events.
When a specific event occurs, the webhook is triggered and will send you related data through an url that you provided.
The webhook will trigger for businesses with the same org_id
.
You can also set webhooks on our website in the settings > integrations > webhooks.
You can subscribe to each event independently.
To subscribe to an event, you need to provide the following informations:
org_id
Upon receiving this HTTP request, you must respond with a 200
Success HTTP
code.
If your server fails to treat the incoming request with an Internal error
code (500
range), we will assume that the error is temporary and retry
sending the event.
If after a few attempts the error persists, we will stop retrying and the
event will be lost.
If your server fails with any other error code, we will assume that you cannot treat the request and will not retry sending the event.
A common requirement for webhook subscribers is the security aspect of validation of issuer.
Here are the possible validations that we offer for security
All webhooks contain a header X-Partoo-Signature-<version>
(example: X-Partoo-Signature-v1
)
The value of this header is the base64-encoded hash of payload with asymmetric encryption ed25519 algorithm.
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEA0G9ciHL6XZQXuWq6W4dFLvwNEPWgcdtQgEVlBIwZWBQ=
-----END PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEALsyvX2yVnG3ZKRIFfEvYk2nkzanoNgAqBSqdeNub4sM=
-----END PUBLIC KEY-----
Here are sample snippets
from base64 import b64decode
import binascii
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import ed25519
# load public key from filesystem, you may adapt depending on your secret management framework
public_key = serialization.load_pem_public_key(open("/var/secrets/partoo.pub.pem"))
def validate_signature(request):
if (signature:=request.headers.get("X-Partoo-Signature-v1")) is None:
raise ValueError("Missing signature")
# don't trust your inputs
# will raise a subclass of ValueError if format is invalid
decoded_signature = b64decode(signature, validate=True)
# validate payload's signature
try:
public_key.verify(decoded_signature, request.body.encode())
except Exception as e:
raise ValueError("Invalid signature") from e
const fs = require('fs');
const crypto = require('crypto');
// Load public key from filesystem
const publicKey = fs.readFileSync('/var/secrets/partoo.pub.pem', 'utf8');
function validateSignature(request) {
const signature = sig;
if (!signature) {
throw new Error('Missing signature');
}
// Decode the base64 signature
let decodedSignature;
try {
decodedSignature = Buffer.from(signature, 'base64');
} catch (err) {
throw new Error('Invalid signature format');
}
// Verify the payload's signature
if (!crypto.verify(null, Buffer.from(payload), publicKey, decodedSignature)) {
throw new Error('Invalid signature');
}
}
When configuring the webhook, you may add an additional parameter that may represent some secret that only Partoo and you share.
This parameter can be either in url path, or as query string parameter.
Examples:
https://my.integration.io/webhooks/partoo/9fa91de19/business_update
https://my.integration.io/webhooks/partoo/business_update?key=9fa91de19
You can use the API to subcribe to relevant events using the enpoints described below.
This feature is currently in beta and the API might change before reaching the general availability stage.
PROVIDER
users acting for their customers are required to provide an org_id
query parameter.
This event is triggered when a Business is created in Partoo Database.
The event payload contains the event type and the business contents.
type | string Value: "business_created" |
object |
{- "type": "business_created",
- "payload": {
- "business": {
- "id": "5409c35a97bbc544d8e26737",
- "created": 1409925979.5,
- "modified": 1561335111.681374,
- "code": "CS-75019",
- "status": "open",
- "org_id": 42,
- "group_id": 23,
- "name": "Corner shop",
- "address": "string",
- "address_full": "12 bis rue du coquelicot",
- "address2": "string",
- "city": "Paris",
- "zipcode": "75019",
- "region": "Ile-de-France",
- "country": "FR",
- "default_lang": "fr",
- "open_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "specific_hours": {
- "open": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-20",
- "open_hours": [
- "10:00-14:00"
]
}
], - "close": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-22"
}
]
}, - "description_short": "lorem ipsum",
- "description_long": "lorem ipsum dolor sit amet",
- "google_location_id": "string",
- "facebook_page_id": "string",
- "national_identification_number": "string",
- "contacts": [
- {
- "name": "Hubert Bonisseur de la Bath",
- "email": "hubert@oss117.fr",
- "phone_numbers": [
- "+33302060628"
], - "fax": "+33302060629"
}
], - "photos": {
}, - "lat": -3.585993,
- "long": 47.870341,
- "subscriptions": {
- "presence_management": {
- "active": true
}, - "review_management": {
- "active": true
}, - "review_booster": {
- "active": false
}, - "messages": {
- "active": false
}
}, - "features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages"
], - "siret": "string",
- "completion_rate": 77,
- "news": [
- {
- "description": "string"
}
], - "promos": [
- {
- "title": "string",
- "description": "string",
- "term_of_use": "string",
- "additional_informations": "string",
- "begin": 0,
- "end": 0,
}
]
}
}
}
This event is triggered when a Business is updated in Partoo Database.
The event payload contains the event type and the business contents.
Attention, the hook may be triggered on internal changes that may not reflect on the contents sent.
type | string Value: "business_updated" |
object |
{- "type": "business_updated",
- "payload": {
- "business": {
- "id": "5409c35a97bbc544d8e26737",
- "created": 1409925979.5,
- "modified": 1561335111.681374,
- "code": "CS-75019",
- "status": "open",
- "org_id": 42,
- "group_id": 23,
- "name": "Corner shop",
- "address": "string",
- "address_full": "12 bis rue du coquelicot",
- "address2": "string",
- "city": "Paris",
- "zipcode": "75019",
- "region": "Ile-de-France",
- "country": "FR",
- "default_lang": "fr",
- "open_hours": {
- "monday": [
- "10:00-14:00"
], - "tuesday": [
- "10:00-14:00"
], - "wednesday": [
- "10:00-14:00"
], - "thursday": [
- "10:00-14:00"
], - "friday": [
- "10:00-14:00"
], - "saturday": [
- "10:00-14:00"
], - "sunday": [
- "10:00-14:00"
]
}, - "specific_hours": {
- "open": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-20",
- "open_hours": [
- "10:00-14:00"
]
}
], - "close": [
- {
- "starts_at": "2020-01-20",
- "ends_at": "2020-01-22"
}
]
}, - "description_short": "lorem ipsum",
- "description_long": "lorem ipsum dolor sit amet",
- "google_location_id": "string",
- "facebook_page_id": "string",
- "national_identification_number": "string",
- "contacts": [
- {
- "name": "Hubert Bonisseur de la Bath",
- "email": "hubert@oss117.fr",
- "phone_numbers": [
- "+33302060628"
], - "fax": "+33302060629"
}
], - "photos": {
}, - "lat": -3.585993,
- "long": 47.870341,
- "subscriptions": {
- "presence_management": {
- "active": true
}, - "review_management": {
- "active": true
}, - "review_booster": {
- "active": false
}, - "messages": {
- "active": false
}
}, - "features": [
- "business_edition",
- "diffusion",
- "review_management",
- "review_invite",
- "messages"
], - "siret": "string",
- "completion_rate": 77,
- "news": [
- {
- "description": "string"
}
], - "promos": [
- {
- "title": "string",
- "description": "string",
- "term_of_use": "string",
- "additional_informations": "string",
- "begin": 0,
- "end": 0,
}
]
}
}
}
This event is triggered when a Business is removed from Partoo Database.
The event payload contains the event type and the business id.
type | string Value: "business_deleted" |
object |
{- "type": "business_deleted",
- "payload": {
- "business_id": "5409c35a97bbc544d8e26737"
}
}
This event is triggered when a conversation has a new message.
The event payload contains the event type, the content of the message created, and additional information about the conversation.
type | string Value: "message_created" |
object (MessageCreatedEvent) |
{- "type": "message_created",
- "payload": {
- "message": {
- "id": 0,
- "conversation_id": 0,
- "date": "2023-01-31 16:22:17.327878+00:00",
- "content_type": "Text",
- "sender_type": "User",
- "sender_label": "Jane Doe",
- "status": "Sending",
- "is_deleted": false,
- "content": "string",
- "user_id": "string"
}, - "conversation": {
- "id": 0,
- "consumer_name": "John Doe",
- "business": {
- "id": 0
}, - "messaging_partner": "Facebook",
- "custom_channel": { }
}, - "org_id": 0
}
}
⚠️ Deprecated, please use the Message Created webhook instead, and filter on
sender_type=Consumer
and status=Success
to reproduce this webhook comportement.
This event is triggered when a business receives a new message sent by a Consumer. It is not triggered for messages sent as the business by a User.
The event payload contains the event type, the content of the message received, and additional information about the conversation.
object (MessageReceivedEvent) |
{- "event": {
- "id": 0,
- "conversation_id": 0,
- "date": "2023-01-31 16:22:17.327878+00:00",
- "content_type": "Text",
- "sender_type": "User",
- "sender_label": "Jane Doe",
- "status": "Sending",
- "is_deleted": false,
- "content": "string",
- "user_id": "string",
- "message_id": 0,
- "org_id": 0,
- "business_id": "string",
- "received_at": "2023-01-31T16:22:17.327878+00:00",
- "consumer_name": "John Doe",
- "messaging_partner": "Facebook",
- "event_type": "message_received"
}
}
This event is triggered if the field of a message is updated (example: status
, is_deleted
).
Messages send via Partoo are created with the status Sending
, and
propagated to the messaging channel.
If the message is sent successfully, the status is changed to Success
.
If the messaging channel fails to send the message, the status changed to
Failed
. A failed message can be retried using the /retry endpoint.
The event payload contains the event type, the content of the updated message and additional information about the conversation.
type | string Value: "message_updated" |
object (MessageCreatedEvent) |
{- "type": "message_updated",
- "payload": {
- "message": {
- "id": 0,
- "conversation_id": 0,
- "date": "2023-01-31 16:22:17.327878+00:00",
- "content_type": "Text",
- "sender_type": "User",
- "sender_label": "Jane Doe",
- "status": "Sending",
- "is_deleted": false,
- "content": "string",
- "user_id": "string"
}, - "conversation": {
- "id": 0,
- "consumer_name": "John Doe",
- "business": {
- "id": 0
}, - "messaging_partner": "Facebook",
- "custom_channel": { }
}, - "org_id": 0
}
}
This event is triggered when a Lead is added in Partoo Database.
The event payload contains the event type and the lead contents.
type | string Value: "lead_received" |
object (LeadWebhook) |
{- "type": "lead_received",
- "payload": {
- "id": 1,
- "source": "chatbot",
- "created_at": "2024-11-27T16:10:44.929678Z",
- "chatbot_id": 1,
- "chatbot_name": "Jim",
- "business_name": "Partoo",
- "store_code": "Partoo123",
- "values": [
- {
- "id": 1,
- "type": "TEXT",
- "name": "Your firstname",
- "value": "John"
}
]
}
}
This endpoint returns the list of webhook configurations.
org_id | integer Example: org_id=1 Organization identifier, only required for |
page | integer Default: 1 Page number, Starts at 1. From 1 to 100 results per page (see |
per_page | integer [ 1 .. 100 ] Default: 30 Number of items to return per page. Currently limited to 100. |
{- "page": 1,
- "max_page": 10,
- "count": 287,
- "items": [
- {
- "id": 1,
- "event_type": "business_created",
- "created_at": "2024-11-27T16:10:44.929678Z",
- "updated_at": "2024-11-27T16:10:44.929678Z",
- "org_id": 1
}
]
}
This endpoint create webhook configurations.
org_id | integer Example: org_id=1 Organization identifier, only required for |
required | Array of objects (CreateWebhookPayloadItem) The list of webhook configurations to create. |
{
}
{- "items": [
- {
- "id": 1,
- "event_type": "business_created",
- "created_at": "2024-11-27T16:10:44.929678Z",
- "updated_at": "2024-11-27T16:10:44.929678Z",
- "org_id": 1
}
]
}
This endpoint returns the details of a webhook configuration.
webhook_id required | integer The webhook object identifier. |
org_id | integer Example: org_id=1 Organization identifier, only required for |
{- "id": 1,
- "event_type": "business_created",
- "created_at": "2024-11-27T16:10:44.929678Z",
- "updated_at": "2024-11-27T16:10:44.929678Z",
- "org_id": 1
}
This endpoint updates a webhook configuration.
webhook_id required | integer The webhook object identifier. |
org_id | integer Example: org_id=1 Organization identifier, only required for |
url required | string (webhook_url) The URL receiving the webhook's data. Only HTTPS URLs are supported. |
{
}
{- "id": 1,
- "event_type": "business_created",
- "created_at": "2024-11-27T16:10:44.929678Z",
- "updated_at": "2024-11-27T16:10:44.929678Z",
- "org_id": 1
}
This endpoint deletes a webhook configuration.
webhook_id required | integer The webhook object identifier. |
org_id | integer Example: org_id=1 Organization identifier, only required for |
{- "status": "success"
}
This endpoint let you try webhook configurations by sending test payloads. This currently supports only one webhook configuration per request, entries after the first one will be ignored. Payloads are created by the latest data of the specified event type, or if not available a default payload will be sent. The request is similar to a regular webhook, but also contains an additional X-Partoo-Webhook-Tryout
header.
org_id | integer Example: org_id=1 Organization identifier, only required for |
required | Array of objects (CreateWebhookPayloadItem) The list of webhook configurations to create. |
{
}
{- "items": [
- {
- "payload": { },
- "event_type": "business_created",
- "status": "success"
}
]
}
This endpoint returns the list of the webhook events available to the organization, depending on the subscribed products.
org_id | integer Example: org_id=1 Organization identifier, only required for |
[- "business_created",
- "business_updated",
- "business_deleted",
- "message_updated",
- "message_created",
- "lead_received"
]
To know how to integrate Partoo in a white label mode using our JS SDK, please check our JS SDK documentation.
Single sign-on (SSO) is an authentication method that allows users to access multiple applications with a single set of credentials.
For Partoo, this means users can access the Partoo app directly from your application directory.
SSO involves two parts:
Partoo, as a Service, supports SSO connections using two protocols commonly supported by most Identity Providers (such as Google, Microsoft Azure Active Directory, Okta, etc.):
⚠️ Important: Our SSO functionality only allows connections to existing Partoo accounts. It does not automatically create accounts. You must create users beforehand, either through the Partoo API or the Partoo interface.
To enable SSO for your organization on Partoo, first contact your Customer Success Manager.
After our team enables SSO for your organization, you can access the information needed to configure the connection with your identity provider.
In the Partoo app, navigate to the SSO configuration page: Settings > Integrations > SSO Connection > OIDC or SAML, depending on your chosen protocol.
This page will also be used in Step 4 to enter information from your identity provider.
For the next step, you'll need the following information from this page:
In the endpoints below, {identifier}
is a placeholder for the unique identifier of your SSO configuration. Newer configurations use UUIDs, while older ones may use a name like "your_enterprise_name". The formatted URLs can be found on the configuration page mentioned at the previous step.
You will need to create a Partoo application in your Identity Provider using the following parameters:
https://app.partoo.co/api/v2/saml/{identifier}/acs
https://app.partoo.co/api/v2/saml/{identifier}/metadata/
email
or urn:oid:0.9.2342.19200300.100.1.3
https://app.partoo.co/api/v2/saml/{identifier}/acs
https://app.partoo.co/connection?sso_alias={identifier}
Once you've created the Partoo application in your Identity Provider, you'll need to configure the connection information in Partoo to finalise the setup.
metadata.xml
file. The configuration will be extracted
automatically.
.well-known
URL. Most of the configuration will be
extracted automatically.
client_id
and, if required by your identity provider, your
client_secret
.
Once the configuration is complete on both sides, you can test the login endpoint to initiate the SSO connection:
https://app.partoo.co/api/v2/saml/{identifier}/login
https://app.partoo.co/api/v2/oidc/{identifier}/login
You can also log in via SSO from the Partoo connection page.
sso_only = True
, send_invitation=False
and no password
in the creation call.
Method to retrieve businesses diffusions states on publishers.
Can be filtered by:
business__in | Array of strings (BusinessId) Example: business__in=5409c35a97bbc544d8e26737 Filter by business ids |
publishers | Array of strings Example: publishers=facebook,google_my_business List of requested publisher names |
states | Array of strings (state) Items Enum: "success" "pending" "to_configure" Example: states=success,to_configure,pending List of the requested states |
per_page | integer [ 1 .. 100 ] Default: 5 Number of items to return per page. Currently limited to 100. |
page | integer Example: page=3 Page requested |
{- "businesses": {
- "56465qz56d4q65zd4": {
- "business_formatted_address": "1 Rue du Général de Gaulle, 52330 Colombey-les-Deux-Églises",
- "business_id": "56465qz56d4q65zd4",
- "business_name": "La Boisserie",
- "publishers": {
- "apple_direct": {
- "error_type": null,
- "state": "success",
- "url_on_publisher": null
}, - "facebook": {
- "error_type": "PUBLISHER_CONNEXION",
- "state": "to_configure",
}
}
}
}, - "count": 1
}
This method retrieve a list of known errors associated with a publisher for a business, including detailed descriptions.
The request body is mandatory.
Providing an empty request body will return errors based on the business information stored in the database.
Providing a populated request body will return errors related to the specified fields and their values only.
business_id required | string Business id. |
name | string (BusinessName) non-empty The name of the business (POI) as it will appear on the publishing platforms |
org_id | integer (BusinessOrgId) The organization unique identifier at Partoo. During onboarding, Partoo creates an organization where all your businesses will be aggregated |
country | string (BusinessCountry) Business country - In the ISO 3166 alpha2 code format (i.e. use “FR” for France instead of "fr") |
zipcode | string or null (BusinessZipcode) Zipcode (or postal code) for the business address. Can be empty if the business' country does not require one. |
city | string or null (BusinessCity) The city where the business is located |
region | string or null (BusinessRegion) The region where the business is located. Can be empty, it is only useful for some countries like Italy or Spain among others. |
categories | Array of strings (BusinessCategories) non-empty A list of category ids mapped to the business. At least one category needs to be provided. For more information see Categories section |
code | string (BusinessCode) The unique store code of the business. If not provided, it will be automatically generated |
status | string (BusinessStatus) Enum: "open" "closed" "temporarily_closed" Defines the current status of the business. |
address_full | string or null (AddressFull) Full address of the business. For example : |
address2 | string or null (Address2) Complement of address. Any additional information that could help better find the business location |
manual_lat | number <double> (BusinessLatitude) Latitude. Decimals are separated by a dot and not by a comma. |
manual_long | number <double> (BusinessLongitude) Longitude. Decimals are separated by a dot and not by a comma. |
lat | number <double> (BusinessLatitude) Latitude. Decimals are separated by a dot and not by a comma. |
long | number <double> (BusinessLongitude) Longitude. Decimals are separated by a dot and not by a comma. |
website_url | string <uri> (BusinessWebsite) The business own website url or the main url of the company. |
facebook_url | string <uri> (BusinessFacebookPage) Business Facebook page url |
twitter_url | string <uri> (BusinessTwitter) Business twitter page url |
description_short | string (BusinessShortDescription) A short description of the business. ⚠️It is limited to 80 characters |
description_long | string (BusinessLongDescription) A more detailed description of the business. ⚠️It is limited to 750 characters |
object (OpenHours) The opening hours of the business (in its timezone). Opening hours are specified per weekday. This is done by supplying an object mapping weekdays ("monday", "tuesday", etc.) to a list of of strings. These strings in turn represent time slots during which the business is open. For example, the following value would set the opening hours to between 08:00-15:00 in the afternoon and 18:00-23:00 in the evening on Mondays:
To indicate that a business is open 24 hours for a specific weekday, use the value ❗ This field is not mandatory, but if not provided then the business will not be pushed on some platforms (example: Google). If provided, then a schedule needs to be sent for each day in particular | |
object (SpecificHours) Exceptional opening or closing times for the business (in its timezone). All exceptional days of the year, including temporarily closed, can be specified beforehand or on the go. For example:
Specific hours are defined by two values:
These values in turn, contain:
| |
Array of objects (BusinessContactsCreate) Specify how the clients can reach the persons in charge of the business in case they have questions. | |
object (Photos) Business photos Each business can have one or more photos associated | |
national_identification_number | string (BusinessNationalIdentificationNumber) The National Identification Number of the business It describes a unique number for which the business is registered in a specific country. For example, in France, it's SIRET code or for Ireland it's the CRO |
Providing an empty request body will return errors based on the business information stored in the database.
{ }
{ }