API reference

The ReputeMap REST API: pull Google reviews and stats, trigger review-request emails from your CRM or scripts. Key auth, 1,000 credits/month on every paid plan.

The ReputeMap API

The API lets you automate everything ReputeMap does with your Google reviews: read reviews and stats for every location you manage, and trigger honest review-request emails from your CRM, your billing system, or a cron job.

Included with every paid plan — and it works during the 14-day trial. No extra “API tier”, no per-call pricing: each org gets 1,000 API credits per month (details below).

Prefer talking to your reviews from Claude or Cursor instead of writing code? Use the MCP server — same data, zero code. Ready-made scripts live in the reputemap-examples repo on GitHub.

Base URL

https://api.reputemap.com

Authentication

Create an API key in the app under Settings → API keys (owners and admins only). Keys look like rmk_… and are shown once at creation — store them like a password. Revoking a key kills it immediately.

Send the key with every request, whichever way is easiest for your tool:

# preferred
curl https://api.reputemap.com/api/v1/me \
  -H "Authorization: Bearer rmk_YOUR_KEY"

# also accepted
curl https://api.reputemap.com/api/v1/me -H "X-API-Key: rmk_YOUR_KEY"
curl "https://api.reputemap.com/api/v1/me?api_key=rmk_YOUR_KEY"   # Zapier-style fallback

Credits and rate limits

WhatLimit
Monthly credits1,000 per org — one credit per billable call, resets on the 1st
Free callsGET /api/v1/me and GET /api/v1/usage never consume credits
Rate limit60 requests per minute per org

Every billable response carries X-Credits-Limit, X-Credits-Used and X-Credits-Remaining headers. When the month’s credits are spent you get HTTP 429 with a clear message; /me and /usage keep working so your integration can see exactly where it stands. Credits are shared between the REST API and the MCP server.

Need more than 1,000 calls a month? Email the founder — higher allowances are a conversation, not a hidden enterprise tier.

Endpoints

GET /api/v1/me — identity check (free)

Validates the key with no side effects (this is what Zapier’s “Test Authentication” hits).

{ "organization": "Bright Local Agency", "plan": "growth", "locations_count": 7 }

GET /api/v1/usage — credit usage (free)

{
  "period": "2026-07",
  "credits_used": 112,
  "credits_limit": 1000,
  "credits_remaining": 888,
  "rate_limit_per_minute": 60
}

GET /api/v1/locations

Every location the key’s org manages — use the id values in the calls below.

[{ "id": "8b1f…", "label": "Joe's Plumbing — Downtown" }]

GET /api/v1/reviews

Reviews across the org (or one location), newest first, with the published owner reply inlined when there is one.

Query paramTypeMeaning
location_idUUIDlimit to one location
rating_min / rating_max1–5star-rating range
has_replyboolfalse = unanswered reviews only
since_days1–365only reviews from the last N days
limit / offsetintpagination — limit max 100, default 25
# unanswered 1–2★ reviews from the last 7 days
curl "https://api.reputemap.com/api/v1/reviews?has_reply=false&rating_max=2&since_days=7" \
  -H "Authorization: Bearer rmk_YOUR_KEY"
{
  "items": [
    {
      "id": "c41a…",
      "location_id": "8b1f…",
      "location_label": "Joe's Plumbing — Downtown",
      "source": "google",
      "reviewer_name": "Jane D.",
      "star_rating": 2,
      "comment": "Showed up late…",
      "created_at": "2026-07-11T08:14:00Z",
      "has_reply": false,
      "reply_text": null,
      "sentiment": "negative",
      "topics": ["punctuality"]
    }
  ],
  "total": 3,
  "limit": 25,
  "offset": 0
}

GET /api/v1/stats

Per-location and org-wide review stats: totals, average rating, 1–5 breakdown, unanswered count, and activity inside a trailing window.

Query paramTypeMeaning
location_idUUIDlimit to one location
days1–365trailing window for the “recent” numbers (default 30)
{
  "days": 30,
  "totals": {
    "locations": 7,
    "total_reviews": 412,
    "average_rating": 4.6,
    "unanswered": 9,
    "reviews_in_window": 38
  },
  "locations": [
    {
      "location_id": "8b1f…",
      "label": "Joe's Plumbing — Downtown",
      "total_reviews": 86,
      "average_rating": 4.7,
      "unanswered": 2,
      "rating_breakdown": { "1": 3, "2": 2, "3": 6, "4": 21, "5": 54 },
      "reviews_in_window": 9,
      "average_rating_in_window": 4.8
    }
  ]
}

POST /api/v1/review-requests

Send one review-request email to a real customer, through the same engine as in-app campaigns: it respects unsubscribes and the suppression list, and it’s idempotent per location — asking twice won’t spam anyone.

curl -X POST https://api.reputemap.com/api/v1/review-requests \
  -H "Authorization: Bearer rmk_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"location_id": "8b1f…", "email": "customer@example.com", "name": "Sam"}'
{ "status": "sent" }

status is sent, skipped (opted out / suppressed — this is a feature, not an error), or failed.

Errors

CodeMeaning
401Missing, invalid or revoked API key
403The org has no active plan — API access is a paid feature (the 14-day trial counts)
404Location not found (or belongs to another org)
422Validation error — the body explains which field
429Rate limit (retry in a minute) or monthly credits spent (resets on the 1st)

Error bodies are JSON: { "detail": "human-readable explanation" }.

Recipes

  • Zapier / Make: use the API-key auth (?api_key=) and POST /review-requests after a “deal won” or “job completed” trigger.
  • Weekly digest: cron a script over GET /reviews?has_reply=false and post to Slack — a ready one is in the examples repo.
  • Claude / Cursor: skip the code entirely with the MCP server.