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
| What | Limit |
|---|---|
| Monthly credits | 1,000 per org — one credit per billable call, resets on the 1st |
| Free calls | GET /api/v1/me and GET /api/v1/usage never consume credits |
| Rate limit | 60 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 param | Type | Meaning |
|---|---|---|
location_id | UUID | limit to one location |
rating_min / rating_max | 1–5 | star-rating range |
has_reply | bool | false = unanswered reviews only |
since_days | 1–365 | only reviews from the last N days |
limit / offset | int | pagination — 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 param | Type | Meaning |
|---|---|---|
location_id | UUID | limit to one location |
days | 1–365 | trailing 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
| Code | Meaning |
|---|---|
401 | Missing, invalid or revoked API key |
403 | The org has no active plan — API access is a paid feature (the 14-day trial counts) |
404 | Location not found (or belongs to another org) |
422 | Validation error — the body explains which field |
429 | Rate 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=) andPOST /review-requestsafter a “deal won” or “job completed” trigger. - Weekly digest: cron a script over
GET /reviews?has_reply=falseand post to Slack — a ready one is in the examples repo. - Claude / Cursor: skip the code entirely with the MCP server.