← Back home
Go live page for the API

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.

What the product already supports
Sync reply generation
Async ingest + jobs
Approval before callback
Dashboard-issued API keys
Start here in 3 steps

One launch path instead of abstract docs

01

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 free
02

Run the sync request

First confirm that `POST /api/v1/reviews/respond` returns `200` and a ready reply.

Open dashboard
03

Move the flow into async + approval

Send ingest, take the `jobId`, wait for `approvalStatus: pending`, then approve the reply in the dashboard.

Request setup
API surface

Three routes are enough for the first go-live

POST
/api/v1/reviews/respond
The sync endpoint for the first live reply and direct backend calls.
POST
/api/v1/reviews/ingest
The async intake route for jobs, approval, and callback delivery.
GET
/api/v1/jobs/:id
Check that the job reached `completed` and is waiting for approval.
POST /api/v1/reviews/respond
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"
  }'
POST /api/v1/reviews/ingest
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"
  }'
GET /api/v1/jobs/:id
curl https://reviewreplyapi.com/api/v1/jobs/JOB_ID \
  -H "X-API-Key: rra_live_your_key"
Expected sync response
{
  "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"
  }
}
Expected ingest response
{
  "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"
}
Expected job status
{
  "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
    }
  }
}
Integration readiness

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.

For operator-first automations

n8n

The best fit when reviews already live in sheets, webhook intake, or simple automation flows.

Request n8n setup
For no-code ops teams

Make

A strong fit when you want a fast sync draft and then route it into CRM, Airtable, or a task manager.

Open quickstart
For webhook-driven handoff

Zapier / webhooks

If you want a lightweight handoff through Webhooks by Zapier and a callback back into your process.

Set up the webhook path
For dev teams and custom rollout

Internal backend / CRM

The right path when reply generation should live directly in your backend, CRM worker, or internal service.

Open dashboard
n8n

The best fit when reviews already live in sheets, webhook intake, or simple automation flows.

Request n8n setup
1. Watch a new review from the source.
2. Send it into `/api/v1/reviews/ingest` with an HTTP Request node.
3. Wait for the callback or open the approval queue in the dashboard.
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"
}
Make

A strong fit when you want a fast sync draft and then route it into CRM, Airtable, or a task manager.

Open quickstart
1. Collect the review event from the source.
2. Test `/respond` first, then move the flow into `/ingest` if needed.
3. Save the reply or `jobId` in your ops system.
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 / ClickUp
Zapier / webhooks

If you want a lightweight handoff through Webhooks by Zapier and a callback back into your process.

Set up the webhook path
1. Send async ingest through Webhooks by Zapier.
2. Store `jobId` and `externalReviewId`.
3. Receive the callback and update your queue, CRM, or Slack.
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.
Internal backend / CRM

The right path when reply generation should live directly in your backend, CRM worker, or internal service.

Open dashboard
1. Start with the sync route for the first signal.
2. Then add async jobs for approval and callback delivery.
3. Verify the signature and keep `externalReviewId` as the idempotency key.
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");
}
Plan limits

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.

PlanPriceReplies / moWorkspacesAPI keysApprovalCallback
Free
Lead magnet
$0/mo1010NoNo
Starter
For first integrations
$30/mo25011NoNo
Growth
Most teams choose this
$79/mo150035IncludedIncluded
Scale
For agencies and multi-location teams
$149/mo50001020IncludedIncluded
Callback signature verification

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,
  });
}
Operational contours

Rate limit, duplicate protection, and approval flow

401 · Unauthorized
The key is missing or invalid. Supported options are `X-API-Key` and `Authorization: Bearer <key>`.
402 · Limit reached
The workspace has reached its monthly reply limit or active API key limit. This is where upgrade or manual activation starts.
429 · Rate limit
The public API is currently limited to 60 requests per minute per key and fingerprint. Read `Retry-After`.
Duplicate protection
The same `externalReviewId` or `Idempotency-Key` does not create a duplicate. Sync returns the existing response, async returns the existing job.
Approval flow
An async job first lands in `approvalStatus: pending`. The callback is sent only after dashboard approval.
VIP Setup from $500

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.

Scope: review source, CRM, webhook, approval path
First live integration: backend, n8n, Zapier, custom webhook
Test run, approval handoff, and launch for the team