v1Resources/Review Invites

Review Invites

Search and manage the recipients on your review-invite campaigns.

Searches recipients by name, email, or phone across your agency's review-invite campaigns.

Search recipients

get/api/v1/review-invites
review-invite:read
Query parameters
querystringrequired
Search text, matched against name, email, and phone. Required.
limitintegeroptional
Max results to return, 1–100. Defaults to 25.
Response
dataobjectoptional
recipientsarray of objectoptional
The matching recipients.
idstringoptional
Unique identifier for the recipient.
namestringoptional
The recipient's name, or empty if not provided.
emailstringoptional
The recipient's email address, or empty if not provided.
phonestringoptional
The recipient's phone number, or empty if not provided.
sourcestringoptional
Where this recipient came from, e.g. manual, csv, crm.
contactTypestringoptional
One of: Customer, Lead, Prospect, Contact.
statusstringoptional
Current delivery status for this recipient.
campaignIdstringoptional
ID of the campaign this recipient belongs to.
campaignNamestringoptional
Name of the campaign this recipient belongs to.
locationIdstringoptional
ID of the location the campaign is for, or null.
locationLabelstringoptional
Display name of that location, or empty when it can't be resolved.
alreadyMessagedbooleanoptional
Whether a message has already been sent to this recipient. Once true, their email and phone can no longer be changed.
countnumberoptional
Total number of recipients matching the search.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/review-invites
Your API key
query *
limit
{
  "data": {
    "recipients": [
      {
        "id": "cm_recip_1",
        "name": "Jordan Lee",
        "email": "jordan@example.com",
        "phone": "",
        "source": "manual",
        "contactType": "Customer",
        "status": "pending",
        "campaignId": "cm_campaign_1",
        "campaignName": "Spring Checkup Follow-up",
        "locationId": "cm_loc_1",
        "locationLabel": "Acme Dental — Downtown · Austin",
        "alreadyMessaged": false
      }
    ],
    "count": 1
  }
}
v1Resources/Review Invites/postAdd recipients to a campaign

Adds one or more recipients to a review-invite campaign, deduplicated against the batch itself and against everyone already on the campaign. Warning — this can trigger a real message send: if the target campaign is already launched with auto-send on, the newly added recipients are queued and sent to immediately, on their real email address or phone number.

Add recipients to a campaign

post/api/v1/review-invites
review-invite:write
Request body
campaignIdstringrequired
The campaign to add recipients to. Required.
recipientsarray of objectrequired
The recipients to add. Required, non-empty.
namestringoptional
Recipient's name.
emailstringoptional
Recipient's email address.
phonestringoptional
Recipient's phone number.
sourcestringoptional
Where this recipient came from. Defaults to manual.
contactTypestring (Customer | Lead | Prospect | Contact)optional
One of: Customer, Lead, Prospect, Contact. Defaults to Customer.
channelstringoptional
Which channel to message this recipient on (e.g. email, sms), or omit to use the campaign's default mix.
smsConsentobjectoptional
SMS consent attestation for this batch. Required for any recipient in the batch to be messaged by SMS — rows added without it are skipped for SMS sending.
bystringoptional
Name or identifier of the person who attests consent was obtained for this batch.
Response
dataobjectoptional
countnumberoptional
Number of recipients actually added.
duplicatesnumberoptional
Number of rows in the request batch itself that duplicated another row in the same batch.
alreadyPresentnumberoptional
Number of rows that were skipped because that email or phone was already on this campaign.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/review-invites
Your API key
Request body*
{
  "data": {
    "count": 1,
    "duplicates": 0,
    "alreadyPresent": 0
  }
}
v1Resources/Review Invites/postUpdate a recipient

Corrects a recipient's name, email, phone, or contact type. Email and phone are frozen once a message has gone out to that recipient — changing either after a send returns a 409, since delivery receipts and replies are tied to the address actually used.

Update a recipient

post/api/v1/review-invites/update
review-invite:write
Request body
recipientIdstringrequired
The recipient to update. Required.
namestringoptional
New name.
emailstringoptional
New email address. Rejected with a 409 if this recipient has already been sent a message.
phonestringoptional
New phone number. Rejected with a 409 if this recipient has already been sent a message.
contactTypestring (Customer | Lead | Prospect | Contact)optional
New contact type: Customer, Lead, Prospect, or Contact.
Response
dataobjectoptional
idstringoptional
Unique identifier for the recipient.
namestringoptional
The recipient's name, or empty if not provided.
emailstringoptional
The recipient's email address, or empty if not provided.
phonestringoptional
The recipient's phone number, or empty if not provided.
contactTypestringoptional
One of: Customer, Lead, Prospect, Contact.
statusstringoptional
Current delivery status for this recipient.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
409The request conflicts with the current state of the resource — for example, changing the email or phone of a recipient who has already been messaged, or a team invite that was already accepted (or hasn't been accepted yet).
422The request is missing a required parameter or is otherwise malformed.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/review-invites/update
Your API key
Request body*
{
  "data": {
    "id": "cm_recip_1",
    "name": "Jordan Lee",
    "email": "jordan@example.com",
    "phone": null,
    "contactType": "Customer",
    "status": "pending"
  }
}
v1Resources/Review Invites/getList campaigns

Lists a location's review-invite campaigns, newest first.

List campaigns

get/api/v1/review-invites/campaigns
review-invite:read
Query parameters
locationIdstringrequired
The location to list campaigns for. Required.
pageintegeroptional
Zero-indexed page number. Defaults to 0.
statusstring (all | draft | launched | stopped | archived)optional
Filter by status. Defaults to all.
Response
dataobjectoptional
campaignsarray of unknownoptional
The matching campaigns.
totalnumberoptional
Total number of campaigns matching the filters.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/review-invites/campaigns
Your API key
locationId *
page
status
{
  "data": {
    "rows": [
      {
        "id": "cm_campaign_1",
        "name": "Spring Checkup Follow-up",
        "type": "email_sms",
        "collectMode": "directory",
        "status": "draft",
        "archived": false,
        "locationLabel": "Acme Dental — Downtown · Austin",
        "emailsSent": 0,
        "smsSent": 0,
        "repliesCount": 0,
        "clickRate": null,
        "followUpSent": 0,
        "autoSend": true,
        "yelpCompliant": true,
        "staticUrl": null
      }
    ],
    "total": 1
  }
}
v1Resources/Review Invites/postCreate a campaign

Creates a new review-invite campaign as a draft. locationId is required; everything else can be set now or later with the update endpoint. Use the action endpoint to publish it once configured — this never sends anything on its own.

Create a campaign

post/api/v1/review-invites/campaigns
review-invite:write
Response
dataobjectoptional
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/review-invites/campaigns
Your API key
{
  "data": {
    "id": "cm_campaign_1",
    "agencyId": "cm_agency_1",
    "locationId": "cm_loc_1",
    "clientLocationId": "cm_loc_1",
    "name": "Spring Checkup Follow-up",
    "campaignType": "email_sms",
    "channels": "EMAIL",
    "status": "draft",
    "fromEmail": null,
    "replyToEmail": null,
    "emailSubject": null,
    "emailBody": null,
    "smsBody": null,
    "smsReviewSite": null,
    "reviewSites": null,
    "screeningEnabled": false,
    "landingTitle": null,
    "landingContent": null,
    "hideAddress": false,
    "hideBusinessName": false,
    "followups": null,
    "stopFollowupOnClick": false,
    "scheduleAt": null,
    "timezone": null,
    "autoSend": true,
    "staticUrl": null,
    "launchedAt": null,
    "emailHtml": null,
    "thankYouEnabled": false,
    "thankYouSubject": null,
    "thankYouBody": null,
    "thankYouDelayHours": 12,
    "funnelThreshold": 4,
    "funnelStyle": null,
    "lowRankContent": null,
    "hideFeedbackBox": false,
    "ratingMechanism": null,
    "askName": true,
    "askFeedback": true,
    "archivedAt": null,
    "hideImage": false,
    "clientId": "cm_client_1",
    "createdAt": "2026-01-20T09:00:00.000Z",
    "updatedAt": "2026-01-20T09:00:00.000Z",
    "createdByUserId": null,
    "createdByType": "user",
    "archived": false
  }
}
v1Resources/Review Invites/getGet a campaign

Returns a single campaign by id.

Get a campaign

get/api/v1/review-invites/campaigns/{id}
review-invite:read
Query parameters
idstringrequired
The campaign's id. Required.
Response
dataobjectoptional
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/review-invites/campaigns/{id}
Your API key
id *
{
  "data": {
    "id": "cm_campaign_1",
    "agencyId": "cm_agency_1",
    "locationId": "cm_loc_1",
    "clientLocationId": "cm_loc_1",
    "name": "Spring Checkup Follow-up",
    "campaignType": "email_sms",
    "channels": "EMAIL",
    "status": "draft",
    "fromEmail": null,
    "replyToEmail": null,
    "emailSubject": "How was your visit?",
    "emailBody": null,
    "smsBody": null,
    "smsReviewSite": null,
    "reviewSites": null,
    "screeningEnabled": false,
    "landingTitle": null,
    "landingContent": null,
    "hideAddress": false,
    "hideBusinessName": false,
    "followups": null,
    "stopFollowupOnClick": false,
    "scheduleAt": null,
    "timezone": null,
    "autoSend": true,
    "staticUrl": null,
    "launchedAt": null,
    "emailHtml": null,
    "thankYouEnabled": false,
    "thankYouSubject": null,
    "thankYouBody": null,
    "thankYouDelayHours": 12,
    "funnelThreshold": 4,
    "funnelStyle": null,
    "lowRankContent": null,
    "hideFeedbackBox": false,
    "ratingMechanism": null,
    "askName": true,
    "askFeedback": true,
    "archivedAt": null,
    "hideImage": false,
    "clientId": "cm_client_1",
    "createdAt": "2026-01-20T09:00:00.000Z",
    "updatedAt": "2026-01-20T09:00:00.000Z",
    "createdByUserId": null,
    "createdByType": "user",
    "archived": false
  }
}
v1Resources/Review Invites/patchUpdate a campaign

Edits a campaign's configuration. Pass only the fields you want to change. To change lifecycle status (publish, stop, clone, archive, unarchive) use the action endpoint instead of setting status directly here.

Update a campaign

patch/api/v1/review-invites/campaigns/{id}
review-invite:write
Query parameters
idstringrequired
The campaign to update. Required.
Request body
namestringoptional
The campaign's display name.
locationIdstringoptional
The location this campaign sends invites for. Required on create.
campaignTypestringoptional
The channel mix, e.g. email, sms, email_sms.
channelsstringoptional
Which channels the campaign sends on: EMAIL, SMS, or SMS_AND_EMAIL. Email requirements (a from address, a verified sending domain) only apply when EMAIL is included; an SMS-only campaign instead needs a carrier-verified number for its location.
fromEmailstringoptional
The sending "from" email address. Requires a verified sending domain to actually send.
replyToEmailstringoptional
The reply-to email address.
emailSubjectstringoptional
The email's subject line.
emailBodyobjectoptional
The email body, as the rich-text JSON the campaign builder's editor produces.
emailHtmlstringoptional
Rendered HTML fallback of the email body.
smsBodystringoptional
The SMS message text.
smsReviewSitestringoptional
Which review site the SMS link points to.
reviewSitesobjectoptional
The review site(s) offered to happy customers, as the builder's JSON shape.
screeningEnabledbooleanoptional
Whether to screen customers by star rating before directing them to a public review site.
landingTitlestringoptional
Title shown on the campaign's landing page.
landingContentstringoptional
Body content shown on the campaign's landing page.
hideAddressbooleanoptional
Hide the business address on the landing page.
hideBusinessNamebooleanoptional
Hide the business name on the landing page.
hideImagebooleanoptional
Hide the business image on the landing page.
followupsobjectoptional
Follow-up reminder schedule, as the builder's JSON shape.
stopFollowupOnClickbooleanoptional
Stop sending follow-ups once the recipient clicks through.
scheduleAtstringoptional
ISO datetime to schedule the campaign launch for. Leave empty to send immediately on publish.
timezonestringoptional
IANA timezone for scheduling, e.g. America/New_York.
autoSendbooleanoptional
Whether new recipients are sent to automatically once the campaign is launched.
staticUrlstringoptional
A static/QR review-request URL slug for this campaign, if used instead of or alongside email/SMS sends.
thankYouEnabledbooleanoptional
Whether to show a thank-you follow-up after a positive review.
thankYouSubjectstringoptional
Thank-you email subject.
thankYouBodystringoptional
Thank-you email body.
thankYouDelayHoursnumberoptional
Hours to wait before sending the thank-you follow-up.
funnelThresholdnumberoptional
Star-rating threshold that routes a respondent to the public review site vs. private feedback.
funnelStyleobjectoptional
Funnel presentation style, as the builder's JSON shape.
lowRankContentstringoptional
Content shown to respondents who rate below funnelThreshold.
hideFeedbackBoxbooleanoptional
Hide the free-text feedback box on the landing page.
collectModestringoptional
How feedback is collected on the landing page.
ratingMechanismobjectoptional
The star/rating widget configuration, as the builder's JSON shape.
askNamebooleanoptional
Ask the respondent for their name.
askFeedbackbooleanoptional
Ask the respondent for free-text feedback.
Response
dataobjectoptional
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
patch/api/v1/review-invites/campaigns/{id}
Your API key
id *
Request body
{
  "data": {
    "id": "cm_campaign_1",
    "agencyId": "cm_agency_1",
    "locationId": "cm_loc_1",
    "clientLocationId": "cm_loc_1",
    "name": "Spring Checkup Follow-up (updated)",
    "campaignType": "email_sms",
    "channels": "EMAIL",
    "status": "draft",
    "fromEmail": null,
    "replyToEmail": null,
    "emailSubject": "How was your visit?",
    "emailBody": null,
    "smsBody": null,
    "smsReviewSite": null,
    "reviewSites": null,
    "screeningEnabled": false,
    "landingTitle": null,
    "landingContent": null,
    "hideAddress": false,
    "hideBusinessName": false,
    "followups": null,
    "stopFollowupOnClick": false,
    "scheduleAt": null,
    "timezone": null,
    "autoSend": true,
    "staticUrl": null,
    "launchedAt": null,
    "emailHtml": null,
    "thankYouEnabled": false,
    "thankYouSubject": null,
    "thankYouBody": null,
    "thankYouDelayHours": 12,
    "funnelThreshold": 4,
    "funnelStyle": null,
    "lowRankContent": null,
    "hideFeedbackBox": false,
    "ratingMechanism": null,
    "askName": true,
    "askFeedback": true,
    "archivedAt": null,
    "hideImage": false,
    "clientId": "cm_client_1",
    "createdAt": "2026-01-20T09:00:00.000Z",
    "updatedAt": "2026-01-21T10:00:00.000Z",
    "createdByUserId": null,
    "createdByType": "user",
    "archived": false
  }
}
v1Resources/Review Invites/postRun a campaign lifecycle action

Runs one lifecycle action on a campaign. publish launches it — if autoSend is on this starts sending real emails or texts immediately, and it's gated per channel: a campaign that includes EMAIL needs a verified sending domain for the client, and one that includes SMS needs a carrier-verified number for the location. Either gate failing returns an explanatory 422; provisioning a domain or phone number is a UI-only step, not something this API can do on your behalf. stop halts an active campaign. clone duplicates it as a new draft. autoSend turns automatic sending on or off for new recipients — pass on. archive archives a stopped campaign; on a still-active one this is a no-op, not an error — the response is {id, skipped: true} instead of the full campaign, so check for skipped rather than assuming data is always a Campaign. unarchive restores an archived campaign.

Run a campaign lifecycle action

post/api/v1/review-invites/campaigns/{id}/action
review-invite:write
Query parameters
idstringrequired
The campaign to act on. Required.
Request body
opstring (publish | stop | clone | autoSend | archive | unarchive)required
apiDocs.resources.review-invites.action.paramsOp
onbooleanoptional
apiDocs.resources.review-invites.action.paramsOn
Response
dataobjectoptional
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
422The request is missing a required parameter or is otherwise malformed.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/review-invites/campaigns/{id}/action
Your API key
id *
Request body*
{
  "data": {
    "id": "cm_campaign_1",
    "agencyId": "cm_agency_1",
    "locationId": "cm_loc_1",
    "clientLocationId": "cm_loc_1",
    "name": "Spring Checkup Follow-up (copy)",
    "campaignType": "email_sms",
    "channels": "EMAIL",
    "status": "draft",
    "fromEmail": null,
    "replyToEmail": null,
    "emailSubject": "How was your visit?",
    "emailBody": null,
    "smsBody": null,
    "smsReviewSite": null,
    "reviewSites": null,
    "screeningEnabled": false,
    "landingTitle": null,
    "landingContent": null,
    "hideAddress": false,
    "hideBusinessName": false,
    "followups": null,
    "stopFollowupOnClick": false,
    "scheduleAt": null,
    "timezone": null,
    "autoSend": false,
    "staticUrl": null,
    "launchedAt": null,
    "emailHtml": null,
    "thankYouEnabled": false,
    "thankYouSubject": null,
    "thankYouBody": null,
    "thankYouDelayHours": 12,
    "funnelThreshold": 4,
    "funnelStyle": null,
    "lowRankContent": null,
    "hideFeedbackBox": false,
    "ratingMechanism": null,
    "askName": true,
    "askFeedback": true,
    "archivedAt": null,
    "hideImage": false,
    "clientId": "cm_client_1",
    "createdAt": "2026-01-21T10:05:00.000Z",
    "updatedAt": "2026-01-21T10:05:00.000Z",
    "createdByUserId": null,
    "createdByType": "user",
    "archived": false
  }
}
v1Resources/Review Invites/getList message templates

Lists the agency's saved review-invite message templates — reusable email/SMS content for campaigns.

List message templates

get/api/v1/review-invites/templates
review-invite:read
Response
dataarray of unknownoptional
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/review-invites/templates
Your API key
{
  "data": [
    {
      "id": "cm_tmpl_1",
      "name": "Standard follow-up",
      "description": "Default post-visit email template",
      "content": null,
      "assignedLocationIds": [],
      "createdAt": "2026-01-15T09:00:00.000Z"
    }
  ]
}
v1Resources/Review Invites/postCreate a message template

Creates a reusable review-invite message template. content is the rich-text JSON shape the campaign builder's editor produces.

Create a message template

post/api/v1/review-invites/templates
review-invite:write
Response
dataobjectoptional
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
post/api/v1/review-invites/templates
Your API key
{
  "data": {
    "id": "cm_tmpl_1",
    "agencyId": "cm_agency_1",
    "name": "Standard follow-up",
    "description": "Default post-visit email template",
    "content": null,
    "assignedLocationIds": [],
    "createdAt": "2026-01-15T09:00:00.000Z",
    "updatedAt": "2026-01-15T09:00:00.000Z"
  }
}
v1Resources/Review Invites/patchUpdate a message template

Edits a template. Pass only the fields you want to change.

Update a message template

patch/api/v1/review-invites/templates/{id}
review-invite:write
Query parameters
idstringrequired
The template to update. Required.
Request body
namestringoptional
The template's display name.
descriptionstringoptional
A short description of when to use this template.
contentobjectoptional
The template content, as the builder's rich-text JSON shape.
assignedLocationIdsarray of stringoptional
Location ids this template is suggested for. Omit to make it available agency-wide.
Response
dataobjectoptional
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
patch/api/v1/review-invites/templates/{id}
Your API key
id *
Request body
{
  "data": {
    "id": "cm_tmpl_1",
    "agencyId": "cm_agency_1",
    "name": "Standard follow-up",
    "description": "Default post-visit email template (updated)",
    "content": null,
    "assignedLocationIds": [
      "cm_loc_1"
    ],
    "createdAt": "2026-01-15T09:00:00.000Z",
    "updatedAt": "2026-01-16T09:00:00.000Z"
  }
}
v1Resources/Review Invites/deleteDelete a message template

Permanently deletes a template. This doesn't affect campaigns already using its content — it only removes the reusable template.

Delete a message template

delete/api/v1/review-invites/templates/{id}
review-invite:write
Query parameters
idstringrequired
The template to delete. Required.
Response
dataobjectoptional
deletedbooleanoptional
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
delete/api/v1/review-invites/templates/{id}
Your API key
id *
{
  "data": {
    "ok": true
  }
}