API Documentation
Testimonials ¶
Overview
Testimonials are user-submitted reviews or endorsements that belong to a brand. They can optionally be linked to email threads (when captured from email conversations). Each testimonial is connected to a contact.
Testimonial
A Testimonial's data model is described in the table below:
| Field | Type | Association | Description |
|---|---|---|---|
| id | uuid | Internal identifier of the object | |
| created_at | number | Unix timestamp of creation | |
| updated_at | number | Unix timestamp of last update | |
| brand | uuid | The brand this testimonial belongs to | |
| user | User | testimonial.user |
The user associated with this testimonial |
| email_thread | EmailThread | testimonial.email_thread |
Optional email thread this was captured from |
| contact | Contact | testimonial.contact |
The contact who gave the testimonial |
| content | string | The testimonial text content | |
| rating | integer | Rating from 1-5 (optional) | |
| published_at | number | Unix timestamp of when the testimonial was published, or null if it has not been published |
|
| testimonialtree_review | uuid | Linked Testimonial Tree review, when imported from Testimonial Tree | |
| created_by | uuid | User who created this record | |
| updated_by | uuid | User who last updated this record |
TestimonialSettings
A TestimonialSettings's data model is described in the table below:
| Field | Type | Association | Description |
|---|---|---|---|
| id | uuid | Internal identifier of the object | |
| created_at | number | Unix timestamp of creation | |
| updated_at | number | Unix timestamp of last update | |
| brand | uuid | The brand these settings belong to | |
| template_instance | TemplateInstance | testimonial_settings.template_instance |
The template instance used for the Rechat capture form |
| collection_method | string | Preferred collection destination — Rechat, Google, Zillow, or TestimonialTree. Always set; defaults to Rechat, and connecting Google, Zillow or Testimonial Tree sets it to that source. |
|
| zillow_reviewee | uuid | Linked Zillow reviewee, when Zillow is connected | |
| google_business_account | string | GBP account resource name, when Google is connected | |
| google_business_location | string | GBP location resource name (drives the review redirect on the capture page) | |
| testimonialtree_credential | TestimonialTreeCredential | testimonial_settings.testimonialtree_credential |
Linked Testimonial Tree agent, when Testimonial Tree is connected |
TestimonialTreeCredential
A TestimonialTreeCredential represents a Testimonial Tree agent that a user of the brand connected through the Testimonial Tree authorization flow. Its data model is described in the table below:
| Field | Type | Description |
|---|---|---|
| id | uuid | Internal identifier of the object |
| created_at | number | Unix timestamp of creation |
| updated_at | number | Unix timestamp of last update |
| brand | uuid | The brand this connection belongs to |
| user | uuid | The user this connection belongs to |
| subject | string | Stable Testimonial Tree agent identifier (sub) |
| tt_user_id | string | Testimonial Tree user id |
| username | string | Testimonial Tree username |
| name | string | Agent’s full name |
| string | Agent’s email address | |
| company_name | string | Agent’s company name |
| parent_username | string | Username of the agent’s parent (brokerage) account |
| collection_link | string | The agent’s unique Testimonial Tree collection URL. Accepts the prefill parameters name, email, company and s (a 1-5 star rating). |
| revoked | boolean | Whether the connection was disconnected |
Access and refresh tokens are stored encrypted and are never returned by the API.
Endpoints
Get all testimonials for a brand ¶
Get all testimonials for a brandGET/brands/:id/testimonials
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
200Body
{
"code": "OK",
"data": [
{
"id": "1fe4e62f-48bc-4feb-a286-2906c5ce9833",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"content": "This is an amazing real estate service! They helped us find our dream home.",
"rating": 5,
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"updated_by": null,
"captured_at": 1791656559.69392,
"tags": [],
"source": "Manual",
"zillow_review": null,
"google_review": null,
"published_at": null,
"testimonialtree_review": null,
"type": "testimonial"
},
{
"id": "d83cef5e-6b2e-4c6f-a5e5-c349fd4ee8dd",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"content": "This is an amazing real estate service! They helped us find our dream home.",
"rating": 5,
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"updated_by": null,
"captured_at": 1791656559.69392,
"tags": [],
"source": "Manual",
"zillow_review": null,
"google_review": null,
"published_at": null,
"testimonialtree_review": null,
"type": "testimonial"
},
{
"id": "1538aac1-bb39-4b53-ac15-776b22b2d691",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"content": "Great service!",
"rating": null,
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"updated_by": null,
"captured_at": 1791656559.69392,
"tags": [],
"source": "Manual",
"zillow_review": null,
"google_review": null,
"published_at": null,
"testimonialtree_review": null,
"type": "testimonial"
}
],
"info": {
"count": 3,
"total": 3
}
}Get a specific testimonial ¶
Get a specific testimonialGET/brands/:id/testimonials/:testimonial
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- testimonial
string(required) Example: 1fe4e62f-48bc-4feb-a286-2906c5ce9833- associations
string(required) Example: testimonial.contact
200Body
{
"code": "OK",
"data": {
"id": "1fe4e62f-48bc-4feb-a286-2906c5ce9833",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"contact": {
"id": "c77cb07d-9d27-4e23-b512-2a418fb27e8b",
"display_name": "Johnny",
"partner_name": "Jane Doe",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"brand_id": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"user_id": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"sort_field": "Johnny",
"last_touch": null,
"last_touch_action": null,
"next_touch": null,
"touch_freq": null,
"ios_address_book_id": null,
"android_address_book_id": null,
"created_at": 1791656560.147586,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_for": "direct_request",
"updated_for": "direct_request",
"deleted_for": null,
"title": null,
"first_name": "John",
"partner_first_name": "Jane",
"middle_name": "M.",
"last_name": "Doe",
"partner_last_name": "Doe",
"marketing_name": null,
"nickname": "Johnny",
"email": "[email protected]",
"primary_email": "[email protected]",
"emails": [
"[email protected]"
],
"parked": false,
"partner_email": "[email protected]",
"phone_number": "+989124834198",
"primary_phone_number": "+989124834198",
"phone_numbers": [
"+989124834198"
],
"company": "Rechat",
"birthday": "1970-01-12T00:00:00.000Z",
"profile_image_url": "https://inomics.com/sites/default/files/pictures/picture-95970-1460131169.png",
"cover_image_url": "https://inomics.com/sites/default/files/pictures/picture-95970-1460131169.png",
"job_title": "Contact Test Subject",
"source_type": "ExplicitlyCreated",
"source": null,
"website": [
"http://www.gholi.com"
],
"tags": [
"poo",
"foo",
"New"
],
"address": [
{
"city": "Dallas",
"full": "Street, Dallas Texas 72890",
"name": "Street",
"type": "stdaddr",
"extra": "Office",
"line1": "Street",
"line2": "Dallas Texas 72890",
"state": "Texas",
"country": "US",
"postcode": "72890"
}
],
"type": "contact"
},
"content": "This is an amazing real estate service! They helped us find our dream home.",
"rating": 5,
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"updated_by": null,
"captured_at": 1791656559.69392,
"tags": [],
"source": "Manual",
"zillow_review": null,
"google_review": null,
"published_at": null,
"testimonialtree_review": null,
"type": "testimonial"
}
}Create a testimonial ¶
Create a testimonialPOST/brands/:id/testimonials
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- associations
string(required) Example: testimonial.contact
Body
{
"content": "This is an amazing real estate service! They helped us find our dream home.",
"contact": "c77cb07d-9d27-4e23-b512-2a418fb27e8b",
"rating": 5
}200Body
{
"code": "OK",
"data": {
"id": "1fe4e62f-48bc-4feb-a286-2906c5ce9833",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"contact": {
"id": "c77cb07d-9d27-4e23-b512-2a418fb27e8b",
"display_name": "Johnny",
"partner_name": "Jane Doe",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"brand_id": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"user_id": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"sort_field": "Johnny",
"last_touch": null,
"last_touch_action": null,
"next_touch": null,
"touch_freq": null,
"ios_address_book_id": null,
"android_address_book_id": null,
"created_at": 1791656560.147586,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_for": "direct_request",
"updated_for": "direct_request",
"deleted_for": null,
"title": null,
"first_name": "John",
"partner_first_name": "Jane",
"middle_name": "M.",
"last_name": "Doe",
"partner_last_name": "Doe",
"marketing_name": null,
"nickname": "Johnny",
"email": "[email protected]",
"primary_email": "[email protected]",
"emails": [
"[email protected]"
],
"parked": false,
"partner_email": "[email protected]",
"phone_number": "+989124834198",
"primary_phone_number": "+989124834198",
"phone_numbers": [
"+989124834198"
],
"company": "Rechat",
"birthday": "1970-01-12T00:00:00.000Z",
"profile_image_url": "https://inomics.com/sites/default/files/pictures/picture-95970-1460131169.png",
"cover_image_url": "https://inomics.com/sites/default/files/pictures/picture-95970-1460131169.png",
"job_title": "Contact Test Subject",
"source_type": "ExplicitlyCreated",
"source": null,
"website": [
"http://www.gholi.com"
],
"tags": [
"poo",
"foo",
"New"
],
"address": [
{
"city": "Dallas",
"full": "Street, Dallas Texas 72890",
"name": "Street",
"type": "stdaddr",
"extra": "Office",
"line1": "Street",
"line2": "Dallas Texas 72890",
"state": "Texas",
"country": "US",
"postcode": "72890"
}
],
"type": "contact"
},
"content": "This is an amazing real estate service! They helped us find our dream home.",
"rating": 5,
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"updated_by": null,
"captured_at": 1791656559.69392,
"tags": [],
"source": "Manual",
"zillow_review": null,
"google_review": null,
"published_at": null,
"testimonialtree_review": null,
"type": "testimonial"
}
}Update a testimonial ¶
Update a testimonialPUT/brands/:id/testimonials/:testimonial
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- testimonial
string(required) Example: 1fe4e62f-48bc-4feb-a286-2906c5ce9833- associations
string(required) Example: testimonial.contact
Body
{
"content": "Updated testimonial content - even better service!",
"contact": "c77cb07d-9d27-4e23-b512-2a418fb27e8b",
"rating": 4
}200Body
{
"code": "OK",
"data": {
"id": "1fe4e62f-48bc-4feb-a286-2906c5ce9833",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"contact": {
"id": "c77cb07d-9d27-4e23-b512-2a418fb27e8b",
"display_name": "Johnny",
"partner_name": "Jane Doe",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"brand_id": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"user_id": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"sort_field": "Johnny",
"last_touch": null,
"last_touch_action": null,
"next_touch": null,
"touch_freq": null,
"ios_address_book_id": null,
"android_address_book_id": null,
"created_at": 1791656560.147586,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_for": "direct_request",
"updated_for": "direct_request",
"deleted_for": null,
"title": null,
"first_name": "John",
"partner_first_name": "Jane",
"middle_name": "M.",
"last_name": "Doe",
"partner_last_name": "Doe",
"marketing_name": null,
"nickname": "Johnny",
"email": "[email protected]",
"primary_email": "[email protected]",
"emails": [
"[email protected]"
],
"parked": false,
"partner_email": "[email protected]",
"phone_number": "+989124834198",
"primary_phone_number": "+989124834198",
"phone_numbers": [
"+989124834198"
],
"company": "Rechat",
"birthday": "1970-01-12T00:00:00.000Z",
"profile_image_url": "https://inomics.com/sites/default/files/pictures/picture-95970-1460131169.png",
"cover_image_url": "https://inomics.com/sites/default/files/pictures/picture-95970-1460131169.png",
"job_title": "Contact Test Subject",
"source_type": "ExplicitlyCreated",
"source": null,
"website": [
"http://www.gholi.com"
],
"tags": [
"poo",
"foo",
"New"
],
"address": [
{
"city": "Dallas",
"full": "Street, Dallas Texas 72890",
"name": "Street",
"type": "stdaddr",
"extra": "Office",
"line1": "Street",
"line2": "Dallas Texas 72890",
"state": "Texas",
"country": "US",
"postcode": "72890"
}
],
"type": "contact"
},
"content": "Updated testimonial content - even better service!",
"rating": 4,
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"updated_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"captured_at": 1791656559.69392,
"tags": [],
"source": "Manual",
"zillow_review": null,
"google_review": null,
"published_at": null,
"testimonialtree_review": null,
"type": "testimonial"
}
}Delete a testimonial ¶
Delete a testimonialDELETE/brands/:id/testimonials/:testimonial
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- testimonial
string(required) Example: 1fe4e62f-48bc-4feb-a286-2906c5ce9833
204Get testimonial settings ¶
Get testimonial settingsGET/brands/:id/testimonials/settings
Returns the testimonial capture settings for a brand, including the template instance used for the capture form.
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- associations
string(required) Example: testimonial_settings.template_instance
200Body
{
"code": "OK",
"data": {
"id": "7020ccef-2a93-416a-9e7b-184b2e143910",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"template_instance": {
"id": "9dbdd2b4-4129-427e-857c-d74d53f9a24f",
"created_at": 1791656559.69392,
"html": "SOME HTML",
"file": {
"id": "a1671b77-3f49-47fc-857c-9b29f52c9cad",
"created_at": 1791656560.600387,
"updated_at": 1791656560.600387,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"path": "templates/instances/940b7e70-c4d7-11f1-89da-fb554657817f.png",
"name": "image.png",
"public": true,
"type": "file",
"url": "https://test.cloudfront.net/templates/instances/940b7e70-c4d7-11f1-89da-fb554657817f.png",
"preview_url": "https://test.cloudfront.net/templates/instances/940b7e70-c4d7-11f1-89da-fb554657817f.png",
"mime": "image/png"
},
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"branch": "http://mock-branch-url",
"updated_at": 1791656559.69392,
"deleted_at": null,
"type": "template_instance"
},
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"collection_method": "Rechat",
"user": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"google_business_account": null,
"google_business_location": null,
"type": "testimonial_settings"
}
}Upsert testimonial settings ¶
Upsert testimonial settingsPUT/brands/:id/testimonials/settings
Creates or updates the testimonial capture settings for the authenticated user. At least one of template_instance or collection_method must be provided.
Body fields:
| Field | Type | Required | Description |
|---|---|---|---|
| template_instance | uuid | no* | Template instance for the Rechat capture form |
| collection_method | string | no* | One of Rechat, Google, or Zillow. Defaults to Rechat when omitted — required dependencies are enforced (e.g. Google needs both google_business_account and google_business_location). |
* one of the two is required.
TestimonialTree cannot be set here: it is only set by GET /testimonialtree/auth/done when an agent connects their Testimonial Tree account.
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- associations
string(required) Example: testimonial_settings.template_instance
Body
{
"template_instance": "9dbdd2b4-4129-427e-857c-d74d53f9a24f"
}200Body
{
"code": "OK",
"data": {
"id": "7020ccef-2a93-416a-9e7b-184b2e143910",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"template_instance": {
"id": "9dbdd2b4-4129-427e-857c-d74d53f9a24f",
"created_at": 1791656559.69392,
"html": "SOME HTML",
"file": {
"id": "a1671b77-3f49-47fc-857c-9b29f52c9cad",
"created_at": 1791656560.600387,
"updated_at": 1791656560.600387,
"deleted_at": null,
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"path": "templates/instances/940b7e70-c4d7-11f1-89da-fb554657817f.png",
"name": "image.png",
"public": true,
"type": "file",
"url": "https://test.cloudfront.net/templates/instances/940b7e70-c4d7-11f1-89da-fb554657817f.png",
"preview_url": "https://test.cloudfront.net/templates/instances/940b7e70-c4d7-11f1-89da-fb554657817f.png",
"mime": "image/png"
},
"created_by": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"branch": "http://mock-branch-url",
"updated_at": 1791656559.69392,
"deleted_at": null,
"type": "template_instance"
},
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"collection_method": "Rechat",
"user": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"google_business_account": null,
"google_business_location": null,
"type": "testimonial_settings"
}
}Search Zillow reviewees ¶
Search Zillow revieweesGET/zillow/reviewees/search{?q}
Searches the global Zillow reviewees catalog. Used by the web client to populate the picker UI before calling [PUT /brands/:id/testimonials/zillow]. The match is a case-insensitive substring (ILIKE '%q%') OR’d across screen_name, full_name, business_name, and email.
Query parameters:
| Field | Type | Required | Description |
|---|---|---|---|
| q | string | yes | Search term — minimum 2 characters |
| limit | integer | no | Max results (default 20, capped at 50) |
Example URI
- q
string(required) Example: testagent
200Body
{
"code": "OK",
"data": [
{
"id": "d5e91494-28a1-4f42-ad85-e79e6ba7df0d",
"reviewee_key": "test-reviewee-key-1",
"account_id": "test-account-1",
"screen_name": "testagent",
"full_name": "Test Agent",
"title": "Real Estate Agent",
"email": "[email protected]",
"business_name": "Test Realty",
"profile_url": "https://www.zillow.com/profile/testagent",
"review_request_url": "https://www.zillow.com/profile/testagent/review",
"review_count": 0,
"average_review_rating": null,
"bridge_modification_timestamp": "2026-01-01T00:00:00.000Z",
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"type": "zillow_reviewee"
}
],
"info": {
"count": 1,
"total": 0
}
}Connect Zillow ¶
Connect ZillowPUT/brands/:id/testimonials/zillow
Links a Zillow reviewee to the authenticated user’s testimonial settings for the brand, sets collection_method to Zillow, and, by default, imports existing reviews as testimonials.
Body fields:
| Field | Type | Required | Description |
|---|---|---|---|
| zillow_reviewee | uuid | yes | The Zillow reviewee to associate with the user’s settings |
| import | boolean | no | Whether to import existing Zillow reviews (defaults to true) |
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
Body
{
"zillow_reviewee": "d5e91494-28a1-4f42-ad85-e79e6ba7df0d",
"import": false
}200Body
{
"code": "OK",
"data": {
"id": "7020ccef-2a93-416a-9e7b-184b2e143910",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"collection_method": "Zillow",
"user": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"google_business_account": null,
"google_business_location": null,
"type": "testimonial_settings"
}
}Disconnect Zillow ¶
Disconnect ZillowDELETE/brands/:id/testimonials/zillow
Clears the Zillow reviewee from the authenticated user’s testimonial settings for the brand. If collection_method was Zillow, it is reset to Rechat. Idempotent — returns 204 even if no settings row exists or Zillow was never connected. Previously imported testimonials are kept.
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
204Connect Google Business Profile ¶
Connect Google Business ProfilePUT/brands/:id/testimonials/google
Links a Google Business Profile account to the authenticated user’s testimonial settings for the brand, sets collection_method to Google, and, by default, imports existing reviews as testimonials. Reviews from every location under the selected account are pulled. A recurring background sync job is also scheduled.
The caller identifies which Google credential to use via gcid. Use [GET /users/self/google] to list the user’s connected Google accounts, and [GET /users/google/:gcid/business-profile-accounts] to list the GBP accounts available under a given credential.
Returns 412 GoogleBusinessProfileAuthenticationRequired when the credential does not include the business_profile scope.
Body fields:
| Field | Type | Required | Description |
|---|---|---|---|
| gcid | uuid | yes | The Google credential to use. Must belong to the authenticated user and have the business_profile scope. |
| google_business_account | string | yes | Resource name of the GBP account (e.g. accounts/12345). Must be one of the accounts returned by the picker endpoint. |
| google_business_location | string | no | Resource name of a location under the account (e.g. locations/67890). Required to redirect the public capture page to Google — its metadata.newReviewUri is what users are redirected to. |
| import | boolean | no | Whether to pull and import existing reviews now (defaults to true). When false, only the recurring sync job is scheduled. |
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
Body
{
"gcid": "5ccf8eb7-a27e-477e-aec5-d3d1b165f217",
"google_business_account": "accounts/111",
"google_business_location": "locations/222"
}200Body
{
"code": "OK",
"data": {
"id": "7020ccef-2a93-416a-9e7b-184b2e143910",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"collection_method": "Google",
"user": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"google_business_account": "accounts/111",
"google_business_location": "locations/222",
"type": "testimonial_settings"
}
}Disconnect Google Business Profile ¶
Disconnect Google Business ProfileDELETE/brands/:id/testimonials/google
Clears the Google Business Profile account and location from the authenticated user’s testimonial settings for the brand. If collection_method was Google, it is reset to Rechat. Idempotent — returns 204 even if no settings row exists or Google was never connected. Previously imported testimonials and the recurring sync job are kept.
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
204Request Testimonial Tree connect link ¶
Request Testimonial Tree connect linkGET/brands/:id/testimonials/testimonialtree/auth
Returns the URL of the Testimonial Tree authorization screen for the authenticated user, to be opened in a popup. The flow is OpenID Connect authorization code with PKCE (S256) — the verifier and the user/brand the connection is for are carried in a signed state, so the callback does not need a session.
Testimonial Tree’s consent screen is only shown on the first connect; after that the agent goes straight through. Requested scopes are openid profile email offline_access tt:testimonials.read — offline_access is required to receive a refresh token.
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
200Body
{
"code": "OK",
"data": {
"url": "https://dev-auth.testimonialtree.com/application/o/authorize/?response_type=code&client_id=test_client_id&redirect_uri=http%3A%2F%2Flocalhost%3A3079%2Ftestimonialtree%2Fauth%2Fdone&scope=openid+profile+email+offline_access+tt%3Atestimonials.read&state=eyJzaWduYXR1cmUiOiIwVDJWb0VZdnFxRkVkVjZacWdxTnlTQlJlZVVCQTZhczIyaHk3M1g0Z2ErYUh2a2srQmhiYzl2NUQxbTM5TUpvV0xCN0hGMmJIMVUrbUFJRHBMaktBaUg1cnpuSFRUTG5od3BnTUpsQ0hnT1k4Tk83T2xudlo3UEhWMTZES2NFc1lTcmpzT1RTbnBMNHNPa1ZsWms4NGhhM1RBU0o0Wms4eFU1ZFdJdFRFQ2NTK2ovVmp6aVJ3U25teEk1R3JIU2xyNDZsNGV6Z0dlTTBrQzdub08zbmdyZkx3OFM2UzdMNmxvYndza0RveXM0QVNQVkx4RHNJWXIxOTl5Q3FLeTl3QzB6by8zMXJGSUVOMWVJSDN0dGw0Mmw0TUlmWHlqTnp5bkJlZjhJRkdNdHZnZjVoMENVWDFtNHo3Lys3Q05WVFZWUWRuYk4yWmUvakFaN29YbUUwcVE9PSIsInZlcmlmaWVyIjoic3gvcDhHTlZmV3U1dnR6akN4VXVWWmwyMWQ2ZGNFN1NKM3dIRDR0WFZpQ0NlRFIvS05MY2s1b3gvQT09IiwidXNlciI6IjVkNjVhNTgyLTA0ZGQtNDQxZi04ZmMxLTRiMjRmZmIzOWZlOSIsImJyYW5kIjoiZWJjMDI0YjEtYjlhZS00NDgwLTk4ZWMtYjg1NGVkYTI4Y2Q0In0&code_challenge=HIVcjaVdQvsiOLizQFejd1UMT2rvO7hKbEXA3reaJ4U&code_challenge_method=S256",
"type": "testimonialtree_auth_link"
}
}Complete Testimonial Tree connection ¶
Complete Testimonial Tree connectionGET/testimonialtree/auth/done{?code,state}
Public callback of the Testimonial Tree authorization flow, registered with Testimonial Tree as https://api.rechat.com/testimonialtree/auth/done. It exchanges the code for tokens, reads the connected agent from GET /api/v1/partner/me, stores the connection on the user’s testimonial settings and sets their collection_method to TestimonialTree.
On success the response is an HTML page that posts success to the window that opened the popup, with a rechat://testimonialtree-authenticated redirect as fallback. Failures (a refused consent screen, an invalid state, a failed token exchange) return an error response instead.
Tokens are stored encrypted; access tokens last 15 minutes, refresh tokens 30 days. Connecting also pulls the agent’s existing testimonials — see Sync Testimonial Tree testimonials for what gets imported.
Example URI
- code
string(required) Example: test-authorization-code- state
string(required) Example: not-a-valid-state
200400Body
{
"trace": true,
"http": 400,
"message": "TestimonialTree state is invalid",
"code": "BadRequest"
}Sync Testimonial Tree testimonials ¶
Sync Testimonial Tree testimonialsPOST/brands/:id/testimonials/testimonialtree/sync
Pulls the connected agent’s testimonials from GET /api/v1/partner/testimonials and imports them as testimonials with source TestimonialTree. This runs automatically when the agent connects, and every 4 hours afterwards for each connected agent (a full pass once a day); this endpoint is for a “sync now” action. It returns the caller’s testimonial settings.
What is imported:
-
Every testimonial the agent has, public and private. Testimonials deleted or pending/blocked in moderation never come back from their API.
-
Public ones (
isPublic: true) are imported published:published_atis set to the testimonial’s date. -
Private ones are imported unpublished:
published_atstaysnull, so they only come back when the listing is fetched withoutpublished_only. They are the agent’s own material to pick from. -
Each testimonial is linked to a contact for its reviewer. Testimonial Tree never sends reviewer emails, so the contact is matched on the reviewer’s display name and, when there is no match, created with a
source_typeofTestimonialTreeReviews.
Syncs are idempotent — their testimonial id is the dedupe key — and incremental runs only ask for testimonials updated since the last pass. A testimonial deleted or unpublished on their side simply drops out of the results, so a full pass (daily) is what notices that; a removal on their side does not delete the testimonial here.
Returns 412 TestimonialTreeAuthenticationRequired when the stored refresh token no longer works; the agent has to connect again.
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
200Body
{
"code": "OK",
"data": {
"id": "7020ccef-2a93-416a-9e7b-184b2e143910",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"collection_method": "TestimonialTree",
"user": "5d65a582-04dd-441f-8fc1-4b24ffb39fe9",
"google_business_account": null,
"google_business_location": null,
"type": "testimonial_settings"
}
}Disconnect Testimonial Tree ¶
Disconnect Testimonial TreeDELETE/brands/:id/testimonials/testimonialtree
Clears the Testimonial Tree connection from the authenticated user’s testimonial settings for the brand and revokes the stored credential. If collection_method was TestimonialTree, it is reset to Rechat. Idempotent — returns 204 even if no settings row exists or Testimonial Tree was never connected. Previously imported testimonials are kept.
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4
204Testimonial capture form ¶
Testimonial capture formGET/brands/:id/testimonials/:user/capture{?contact,s}
Public endpoint (no authentication required). Routes based on the user’s collection_method:
-
Zillow—302redirect to the Zillow reviewee’sreview_request_url. -
Google— looks up the connected location’smetadata.newReviewUrivia the Business Information API (using the user’s stored credential) and302redirects to it. -
TestimonialTree—302redirect to the connected agent’s Testimonial Tree collection link, prefilled with the contact’s name, email and company. -
Rechat(default) — renders the Rechat capture form HTML (uses the stored template instance, or falls back to the brand’sTestimonialCapturetemplate).
Optional query parameter contact (uuid) can be passed to pre-populate contact data in the Rechat form, and to prefill the Testimonial Tree collection link. Optional query parameter s (integer between 1 and 5) is passed on to Testimonial Tree as the star rating.
Example URI
- s
string(required) Example: 5- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- user
string(required) Example: 5d65a582-04dd-441f-8fc1-4b24ffb39fe9- contact
string(required) Example: c77cb07d-9d27-4e23-b512-2a418fb27e8b
302302302200Body
SOME HTMLCapture a testimonial ¶
Capture a testimonialPOST/brands/:id/testimonials/:user
Public endpoint (no authentication required). Submits a testimonial from a client on behalf of the agent identified by :user. On success, the created testimonial is returned and the agent is notified via email asynchronously.
Body fields:
| Field | Type | Required | Description |
|---|---|---|---|
| contact | uuid | yes | The contact who is giving the testimonial |
| content | string | yes | The testimonial text content |
| rating | integer | no | Rating from 1-5 |
Example URI
- id
string(required) Example: ebc024b1-b9ae-4480-98ec-b854eda28cd4- user
string(required) Example: 5d65a582-04dd-441f-8fc1-4b24ffb39fe9
Body
{
"contact": "c77cb07d-9d27-4e23-b512-2a418fb27e8b",
"content": "Best agent ever — highly recommend!",
"rating": 5
}200Body
{
"code": "OK",
"data": {
"id": "75a66560-524d-4108-80bf-e44025664588",
"brand": "ebc024b1-b9ae-4480-98ec-b854eda28cd4",
"content": "Best agent ever — highly recommend!",
"rating": 5,
"created_at": 1791656559.69392,
"updated_at": 1791656559.69392,
"deleted_at": null,
"created_by": null,
"updated_by": null,
"captured_at": 1791656559.69392,
"tags": [],
"source": "Rechat",
"zillow_review": null,
"google_review": null,
"published_at": null,
"testimonialtree_review": null,
"type": "testimonial"
}
}