Review Invites
Busque y gestione los destinatarios de sus campañas de invitación a reseñas.
Busca destinatarios por nombre, correo electrónico o teléfono en las campañas de invitación a reseñas de su agencia.
Buscar destinatarios
/api/v1/review-invites{
"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
}
}Agrega uno o más destinatarios a una campaña de invitación a reseñas, deduplicados tanto dentro del propio lote como frente a todos los que ya están en la campaña. Advertencia — esto puede desencadenar un envío real de mensajes: si la campaña de destino ya está lanzada con el envío automático activado, los destinatarios recién agregados se encolan y se les envía de inmediato, a su dirección de correo electrónico o número de teléfono real.
Agregar destinatarios a una campaña
/api/v1/review-invites{
"data": {
"count": 1,
"duplicates": 0,
"alreadyPresent": 0
}
}Corrige el nombre, correo electrónico, teléfono o tipo de contacto de un destinatario. El correo electrónico y el teléfono quedan bloqueados una vez que se ha enviado un mensaje a ese destinatario — cambiar cualquiera de los dos después de un envío devuelve un 409, ya que los acuses de recibo y las respuestas están vinculados a la dirección realmente usada.
Actualizar un destinatario
/api/v1/review-invites/update{
"data": {
"id": "cm_recip_1",
"name": "Jordan Lee",
"email": "jordan@example.com",
"phone": null,
"contactType": "Customer",
"status": "pending"
}
}Enumera las campañas de invitación a reseñas de una ubicación, de la más reciente a la más antigua.
Listar campañas
/api/v1/review-invites/campaigns{
"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
}
}Crea una nueva campaña de invitación a reseñas como borrador. locationId es obligatorio; el resto se puede configurar ahora o más tarde con el endpoint de actualización. Use el endpoint de acción para publicarla una vez configurada — esto por sí solo no envía nada.
Crear una campaña
/api/v1/review-invites/campaigns{
"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
}
}Devuelve una única campaña por su id.
Obtener una campaña
/api/v1/review-invites/campaigns/{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
}
}Edita la configuración de una campaña. Indique solo los campos que desea cambiar. Para cambiar el estado del ciclo de vida (publish, stop, clone, archive, unarchive) use el endpoint de acción en lugar de establecer status directamente aquí.
Actualizar una campaña
/api/v1/review-invites/campaigns/{id}{
"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
}
}Ejecuta una acción del ciclo de vida sobre una campaña. publish la lanza — si autoSend está activado, esto empieza a enviar correos o SMS reales de inmediato, y está condicionado por canal: una campaña que incluya EMAIL necesita un dominio de envío verificado para el cliente, y una que incluya SMS necesita un número verificado por el operador para la ubicación. Si alguna de estas condiciones falla, se devuelve un 422 explicativo; aprovisionar un dominio o un número de teléfono es un paso solo disponible en la interfaz, no algo que esta API pueda hacer por usted. stop detiene una campaña activa. clone la duplica como un nuevo borrador. autoSend activa o desactiva el envío automático para los nuevos destinatarios — indique on. archive archiva una campaña detenida; en una que sigue activa esto es un no-op, no un error — la respuesta es {id, skipped: true} en lugar de la campaña completa, así que compruebe skipped en vez de asumir que data siempre es una Campaign. unarchive restaura una campaña archivada.
Ejecutar una acción del ciclo de vida de la campaña
/api/v1/review-invites/campaigns/{id}/action{
"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
}
}Enumera las plantillas de mensajes de invitación a reseñas guardadas por la agencia — contenido reutilizable de correo electrónico/SMS para campañas.
Listar plantillas de mensajes
/api/v1/review-invites/templates{
"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"
}
]
}Crea una plantilla de mensaje de invitación a reseñas reutilizable. content es el formato JSON de texto enriquecido que produce el editor del creador de campañas.
Crear una plantilla de mensaje
/api/v1/review-invites/templates{
"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"
}
}Edita una plantilla. Indique solo los campos que desea cambiar.
Actualizar una plantilla de mensaje
/api/v1/review-invites/templates/{id}{
"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"
}
}Elimina una plantilla de forma permanente. Esto no afecta a las campañas que ya usan su contenido — solo elimina la plantilla reutilizable.
Eliminar una plantilla de mensaje
/api/v1/review-invites/templates/{id}{
"data": {
"ok": true
}
}