Connect ReviewReplyAPI without extra friction and take the first request to a live signal
This page is not abstract documentation. It is here so a team can issue a key, make a sync request, send an async ingest, and see the approval flow without manual guidance.
One launch path instead of abstract docs
Choose the plan and issue an API key
Starter is enough for the first live run. Growth is the minimum for the approval queue and callback flow.
Start freeRun the sync request
First confirm that `POST /api/v1/reviews/respond` returns `200` and a ready reply.
Open dashboardMove the flow into async + approval
Send ingest, take the `jobId`, wait for `approvalStatus: pending`, then approve the reply in the dashboard.
Request setupThree routes are enough for the first go-live
curl -X POST https://reviewreplyapi.com/api/v1/reviews/respond \
-H "Content-Type: application/json" \
-H "X-API-Key: rra_live_your_key" \
-H "Idempotency-Key: review-123-sync" \
-d '{
"review": "Terrible service, waiter was rude, food was cold. 1 star.",
"tone": "apologetic",
"platform": "google",
"businessName": "North Street Bistro",
"externalReviewId": "google-review-123"
}'curl -X POST https://reviewreplyapi.com/api/v1/reviews/ingest \
-H "Content-Type: application/json" \
-H "X-API-Key: rra_live_your_key" \
-H "Idempotency-Key: review-456-async" \
-d '{
"review": "Package arrived 2 weeks late. Nobody communicated with me.",
"tone": "professional",
"platform": "google",
"businessName": "Northline Dental",
"customerName": "Anna K.",
"externalReviewId": "google-review-456",
"callbackUrl": "https://your-app.com/reviewreplyapi/callback",
"callbackSecret": "replace-with-your-secret"
}'curl https://reviewreplyapi.com/api/v1/jobs/JOB_ID \
-H "X-API-Key: rra_live_your_key"{
"id": "84f1c09e-5f2f-4fe5-9ea8-7f1452f421d9",
"response": "Thank you for your feedback. We are sorry your visit fell short...",
"tone": "apologetic",
"platform": "google",
"demo": false,
"provider": "openrouter",
"model": "meta-llama/llama-3.2-3b-instruct:free",
"apiClient": {
"id": "launch-env-key",
"label": "Launch API key",
"type": "user"
}
}{
"jobId": "f3231968-3a87-4f06-8194-4773e1c8e9fd",
"status": "queued",
"externalReviewId": "google-review-456",
"createdAt": "2026-04-10T10:15:20.000Z",
"pollUrl": "/api/v1/jobs/f3231968-3a87-4f06-8194-4773e1c8e9fd"
}{
"id": "f3231968-3a87-4f06-8194-4773e1c8e9fd",
"status": "completed",
"approvalStatus": "pending",
"attempts": 1,
"createdAt": "2026-04-10T10:15:20.000Z",
"completedAt": "2026-04-10T10:15:22.000Z",
"result": {
"response": "Thank you for the feedback. We are sorry the delivery took longer than expected...",
"tone": "professional",
"callback": {
"pending": true
}
}
}Choose your integration path and launch the first working scenario
This is not another generic note. Below are four concrete playbooks for n8n, Make, Zapier / webhooks, and an internal backend / CRM path.
n8n
The best fit when reviews already live in sheets, webhook intake, or simple automation flows.
Request n8n setupMake
A strong fit when you want a fast sync draft and then route it into CRM, Airtable, or a task manager.
Open quickstartZapier / webhooks
If you want a lightweight handoff through Webhooks by Zapier and a callback back into your process.
Set up the webhook pathInternal backend / CRM
The right path when reply generation should live directly in your backend, CRM worker, or internal service.
Open dashboardThe best fit when reviews already live in sheets, webhook intake, or simple automation flows.
Trigger: New review in Google Business / Sheets / webhook
↓
HTTP Request node
POST https://reviewreplyapi.com/api/v1/reviews/ingest
Headers:
X-API-Key: rra_live_your_key
Idempotency-Key: {{$json.externalReviewId}}
Body:
{
"review": "{{$json.reviewText}}",
"tone": "professional",
"platform": "google",
"businessName": "{{$json.businessName}}",
"customerName": "{{$json.customerName}}",
"externalReviewId": "{{$json.externalReviewId}}",
"callbackUrl": "https://your-n8n.example/webhook/reviewreplyapi",
"callbackSecret": "replace-with-your-secret"
}A strong fit when you want a fast sync draft and then route it into CRM, Airtable, or a task manager.
Module 1: Watch reviews from source app
Module 2: HTTP Make a request
POST https://reviewreplyapi.com/api/v1/reviews/respond
X-API-Key: rra_live_your_key
Idempotency-Key: {{externalReviewId}}-sync
Module 3: Router
Good enough instantly? Save draft
Needs ops review? Send to /api/v1/reviews/ingest instead
Module 4: Store reply or jobId in Airtable / CRM / ClickUpIf you want a lightweight handoff through Webhooks by Zapier and a callback back into your process.
Zap 1:
Trigger: New review in source app
Action: Webhooks by Zapier -> POST https://reviewreplyapi.com/api/v1/reviews/ingest
Save: jobId + externalReviewId
Zap 2:
Trigger: Catch Hook or your backend endpoint
Verify callback signature
Action: Update CRM / Slack / support queue
Use Growth or higher if the flow must wait for approval before callback delivery.The right path when reply generation should live directly in your backend, CRM worker, or internal service.
const response = await fetch("https://reviewreplyapi.com/api/v1/reviews/respond", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-API-Key": process.env.REVIEW_REPLY_API_KEY!,
"Idempotency-Key": externalReviewId,
},
body: JSON.stringify({
review,
tone: "professional",
platform: "google",
businessName,
customerName,
externalReviewId,
}),
});
const payload = await response.json();
if (!response.ok) {
throw new Error(payload.error ?? "ReviewReplyAPI request failed");
}The limits that actually apply in the API
This is not a marketing table. The rows below reflect the actual contours that affect replies, API keys, the approval queue, and callback support.
| Plan | Price | Replies / mo | Workspaces | API keys | Approval | Callback |
|---|---|---|---|---|---|---|
Free Lead magnet | $0/mo | 10 | 1 | 0 | No | No |
Starter For first integrations | $30/mo | 250 | 1 | 1 | No | No |
Growth Most teams choose this | $79/mo | 1500 | 3 | 5 | Included | Included |
Scale For agencies and multi-location teams | $149/mo | 5000 | 10 | 20 | Included | Included |
Verify the callback as strictly as any inbound webhook
After approval the service sends `X-ReviewReplyAPI-Event`, `X-ReviewReplyAPI-Timestamp`, and `X-ReviewReplyAPI-Signature`. The raw body is signed with HMAC SHA-256.
import { createHmac, timingSafeEqual } from "node:crypto";
export async function POST(request: Request) {
const rawBody = await request.text();
const signature = request.headers.get("x-reviewreplyapi-signature") ?? "";
const timestamp = request.headers.get("x-reviewreplyapi-timestamp");
const secret = process.env.REVIEW_REPLY_CALLBACK_SECRET ?? "";
const expected = createHmac("sha256", secret).update(rawBody).digest("hex");
if (
signature.length !== expected.length ||
!timingSafeEqual(Buffer.from(signature), Buffer.from(expected))
) {
return new Response("Invalid signature", { status: 401 });
}
const payload = JSON.parse(rawBody);
return Response.json({
ok: true,
event: request.headers.get("x-reviewreplyapi-event"),
timestamp,
jobId: payload.jobId,
approvalStatus: payload.approvalStatus,
});
}Rate limit, duplicate protection, and approval flow
If you need implementation, not just docs
This is a separate service lane. We take your review source, webhook path, approval contour, and the first callback delivery, then bring the workflow to a usable handoff.