REST API, Webhooks & MCP
Build custom integrations with the EmbedMyReviews API. Send contacts, trigger campaigns, pull Google Business Profile performance data, run Local Search Grid scans, and receive real-time webhook events. Plus a Model Context Protocol server for Claude Desktop, Cursor, and ChatGPT so AI clients can read the same data without a single line of integration code.
API documentation is fully white-labelled and hosted on your custom domain at app.yourdomain.com/docs/api. Your clients and developers never see EmbedMyReviews.
curl -X POST https://app.your-white-label.com/api/v1/request-reviews/campaigns/a1b2c3d4/invite \
-H "Authorization: Bearer your-api-token" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"email": "sarah@example.com",
"first_name": "Sarah",
"last_name": "Johnson",
"send_after_hours": 0
}'Full API Access Included
Every EmbedMyReviews plan includes complete API access. No enterprise tier required, no per-request fees.
Reviews API
List, get, create, update, and delete reviews across all connected sources. Filter by rating, organisation, location, or source.
Organisations API
Create, update, list, and delete organisations programmatically.
Send Invites API
Send review request invites via email, SMS, or WhatsApp through campaign endpoints. Wire it straight into your CRM, POS, or booking system.
GBP Performance API
Pull Google Business Profile impressions, calls, direction requests, and website clicks for any location, plus the search query terms shoppers typed to find it. Includes the previous period totals for instant trend deltas.
Local Search Grid API
AgencyAgency-only. Trigger new scans, re-run existing ones, schedule recurring runs at business hours, browse snapshot history, and pull the same deep insights the dashboard renders. Customers can never see these endpoints.
AI Hub (MCP)
NewSame data, exposed as Model Context Protocol tools. Connect Claude Desktop, Cursor, or ChatGPT in under a minute. The AI runs the right query for the question.
Real-Time Webhooks
Receive instant notifications when events occur in EmbedMyReviews. Build reactive systems that respond to new reviews, finished Local Search Grid scans, organisation changes, and more.
review-created & review-updated
Fired when a new review lands or an existing one is modified (reply added, rating changed).
organization-* & location-*
Created, updated, and deleted events for organisations and locations. Useful for syncing your CRM or billing system.
scan-completed
AgencyFires once a Local Search Grid snapshot finishes. Payload includes the summary stats and the report URL, so you can post a Slack/Teams update or kick off a Looker refresh without polling.
scan-failed
AgencyFires when a scan run errors out. The short error_message is safe to surface to your team or to alert on, so you catch DataForSEO credential issues before clients notice.
{
"webhook_event": "review-created",
"id": 142,
"organization_id": 1,
"location_id": 3,
"source_name": "google",
"author": "Sarah Johnson",
"rating": 5,
"message": "Outstanding service!",
"replied": false,
"published_on": "2026-01-15T10:30:00+00:00"
}What Agencies Build with the API
Custom integrations that go beyond out-of-the-box connectors. Build exactly what your clients need.
Cron-driven LSG scans
Agency Trigger a Local Search Grid scan every month during business hours when rankings actually matter. Subscribe to scan-completed to push the snapshot into your reporting stack. No clicking through the dashboard for each client.
GBP performance in Looker / Sheets
Pull impressions, calls, direction requests, and search query terms into your existing reporting tool. The endpoint returns the previous period totals too, so trend deltas show up in one query.
Claude / Cursor / ChatGPT direct access
Skip the REST API entirely for ad-hoc questions. Wire Claude Desktop, Cursor, or ChatGPT to the MCP endpoint and ask "which client had the biggest drop in 5-star reviews this month?" The AI runs the right query for you.
Custom Dashboards
Pull review data into your own reporting dashboards. Build unified views across multiple clients and data sources.
CRM Sync
Two-way sync between your CRM and EmbedMyReviews. Keep customer records updated with review status and history.
Slack/Teams Alerts
Post new reviews to Slack or Teams channels. Get instant team notifications for negative reviews requiring attention.
Custom Reports
Generate branded PDF reports for clients with review trends, response rates, and competitive benchmarks.
Billing Integration
Track client usage and automatically update billing systems. Bill clients based on reviews collected or messages sent.
White-Label Portals
Build fully custom client portals using the API. Complete design freedom while leveraging EMR's backend.
Code Examples
Get started quickly with examples in popular languages.
const response = await fetch(
'https://app.your-white-label.com/api/v1/request-reviews/campaigns/a1b2c3d4/invite',
{
method: 'POST',
headers: {
'Authorization': 'Bearer your-api-token',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: 'sarah@example.com',
first_name: 'Sarah',
last_name: 'Johnson',
send_after_hours: 0,
}),
}
);
const result = await response.json();import requests
response = requests.post(
'https://app.your-white-label.com/api/v1/request-reviews/campaigns/a1b2c3d4/invite',
headers={
'Authorization': 'Bearer your-api-token',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
json={
'email': 'sarah@example.com',
'first_name': 'Sarah',
'last_name': 'Johnson',
'send_after_hours': 0,
}
)
result = response.json()$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => 'https://app.your-white-label.com/api/v1/request-reviews/campaigns/a1b2c3d4/invite',
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $apiToken,
'Accept: application/json',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'email' => 'sarah@example.com',
'first_name' => 'Sarah',
'last_name' => 'Johnson',
'send_after_hours' => 0,
]),
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);require 'net/http'
require 'json'
uri = URI('https://app.your-white-label.com/api/v1/request-reviews/campaigns/a1b2c3d4/invite')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Authorization'] = 'Bearer your-api-token'
request['Accept'] = 'application/json'
request['Content-Type'] = 'application/json'
request.body = {
email: 'sarah@example.com',
first_name: 'Sarah',
last_name: 'Johnson',
send_after_hours: 0
}.to_json
response = http.request(request)Rate Limits
Generous limits designed for real agency workflows. Most agencies never hit them.
Need higher limits? Get in touch and we'll work with you on high-volume access.
Security
Enterprise-grade security for API access and webhook delivery.
Bearer Token Authentication
API tokens scoped to specific permissions. Revoke compromised tokens from account settings.
Webhook Retries
Up to 10 retries over 5 minutes with exponential backoff. 30-second timeout per attempt.
TLS Encryption
All API traffic encrypted with TLS 1.3. We don't accept unencrypted requests.
Token Permissions
Scope tokens to specific permissions: reviews:read, organizations:create, request:create, and more.
Your providers. Wholesale rates.
The API creates contacts and triggers campaigns. Messages are sent via your own Twilio (SMS) or SMTP (email) accounts. You pay wholesale rates directly to your providers, with no EMR markup on messaging costs.
Build custom integrations today.
Full API access included with every plan. No enterprise tier required, no per-request fees. Start building in minutes.
No credit card required. Explore the platform for 14 days.