Bring the data your cards collect into your own reporting, BI tool or CRM. The API is read-only, works with any language that can make an HTTPS request, and returns plain JSON.
Locations, cards and links — the structure of your account.
Clicks — every tap on a button after a guest scans a card, per card, location and platform, raw or as daily totals.
Review Guard — every smiley rating (happy / neutral / unhappy) and the private comments guests left.
Surveys — your surveys, their questions and every response.
Online reviews — your Google and Tripadvisor reviews and ratings, plus the competitors you track.
Getting your API key
API access is switched on per account by the Review Advisor team. Once it's on:
Sign in to the Review Advisor app (web or mobile).
Open Account settings → API Access.
Click Generate key and copy it straight away.
For your security the full key is shown only once. Store it like a password — in a secrets manager or an environment variable on your server, never in a website or mobile app. If you lose it or think it leaked, generate a new one: the old key stops working immediately.
A key reads every location you can see in the app — the ones you own and the ones shared with you — and nothing else. Keys look like ra_live_ followed by 40 characters.
Authentication
Send the key in the Authorization header of every request:
Every endpoint is a GET request; filters go in the query string.
Responses are JSON. Field names are snake_case; the result is always under data.
Timestamps are ISO-8601 in UTC, e.g. 2026-10-26T09:24:50.648Z.
from and to take a date or a full datetime and are both inclusive: from=2026-10-01&to=2026-10-31 is the whole of October (UTC). Use datetimes with an offset for local days, e.g. from=2026-10-26T00:00:00+01:00.
Ids are stable integers — use them to link records together (a click's card.id matches an id from List cards).
Fields may be added to responses over time; your integration should ignore fields it doesn't know.
Pagination
List endpoints marked Paginated return up to limit items (default 100, max 500), oldest first, together with a pagination object:
To get the next page, repeat the same request with cursor=<next_cursor>. When has_more is false you have everything.
Tip for incremental syncs: the cursor is the id of the last item, and new items always get higher ids. Save the last next_cursor(or the id of the last row) you processed, and next time start from it — you'll receive only what arrived since.
Errors
Errors use standard HTTP status codes and always have the same body, so you can branch on code:
{
"error": {
"code":"invalid_parameter",
"message":"\"from\" must be a date (YYYY-MM-DD) or an ISO-8601 datetime."
}
}
Status
code
Meaning
400
invalid_parameter
A query parameter has the wrong format or value. The message says which one.
401
missing_api_key
No key was sent. Add the Authorization header.
401
invalid_api_key
The key is wrong, or it was replaced by a newer one.
403
api_access_disabled
API access is switched off for your account. Contact us.
404
not_found
The endpoint doesn't exist, or the location / survey isn't one of yours.
429
rate_limited
More than 120 requests in a minute. Wait the number of seconds in the Retry-After header.
500
server_error
Something went wrong on our side. Retry later; if it keeps happening, contact us.
Rate limits
Each key can make 120 requests per minute. Every response tells you where you stand:
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 117
X-RateLimit-Reset: 1793011260 (Unix time when the window resets)
Over the limit you get 429 rate_limited with a Retry-After header (seconds). A nightly export with limit=500needs only a handful of requests. Data is available in the API the moment it's collected, so there's no need to poll more often than you report.
Recipe: daily export
Most integrations run once a day — for example at 03:00 — and copy the previous day into a database or reporting tool. This script fetches all of yesterday's survey responses, Review Guard feedback and clicks, following every page and waiting when rate-limited:
Daily export
# First page of yesterday's survey responses
curl "https://api.review-advisor.com/api/v1/survey-responses?from=2026-10-26&to=2026-10-26&limit=500" \
-H "Authorization: Bearer $REVIEW_ADVISOR_API_KEY"
# While pagination.has_more is true, ask for the next page
curl "https://api.review-advisor.com/api/v1/survey-responses?from=2026-10-26&to=2026-10-26&limit=500&cursor=5120" \
-H "Authorization: Bearer $REVIEW_ADVISOR_API_KEY"
For totals rather than raw rows, add Click statistics and Feedback summary for the same day. Online reviews are collected by our monitoring with a delay, so for reviews use the cursor (see Pagination) instead of a date window.
Endpoints
Account
The account the API key belongs to.
Get your account
GET/account
Returns the company the key belongs to and how many locations it can read. Handy as a first call to check that your key works.
A location is one venue with its own license — a hotel, a restaurant, a museum. Every location has NFC cards (or stands, stickers) that guests tap, and links: the buttons guests see after tapping, such as “Review us on Google”.
List locations
GET/locations
All locations you can see in the app — the ones you own and the ones shared with you.
A click is recorded every time a guest taps a button on the page that opens when they scan a card — for example “Review us on Google”. Use the raw list to copy every event into your own system, or the stats endpoint for ready-made totals.
List clicksPaginated
GET/clicks
Every click, one row per tap, oldest first.
Clicks count toward the location the card belongs to now. If you move a card to another location in the app, its earlier clicks move with it.
Parameters
location_idinteger
Only data of this location. Leave out for all your locations.
card_idinteger
Only data collected through this card.
link_idinteger
Only clicks on this link (button).
fromdate
Start of the period, inclusive. A date (2026-10-01, from midnight UTC) or an ISO-8601 datetime.
todate
End of the period, inclusive. A date (2026-10-31, until 23:59:59 UTC) or an ISO-8601 datetime.
limitintegerdefault 100
Items per page, 1–500.
cursorstring
The next_cursor from the previous page. Leave out for the first page.
With Review Guard on, guests first rate their visit with a smiley. Happy guests go on to the review platforms; neutral and unhappy guests can leave a private comment for you instead. Every rating is stored as feedback.
List feedbackPaginated
GET/review-guard/feedback
Every smiley rating, with the guest's comment when they left one. Oldest first.
Parameters
location_idinteger
Only data of this location. Leave out for all your locations.
card_idinteger
Only data collected through this card.
moodstring
Only ratings with this mood.
happyneutralunhappy
fromdate
Start of the period, inclusive. A date (2026-10-01, from midnight UTC) or an ISO-8601 datetime.
todate
End of the period, inclusive. A date (2026-10-31, until 23:59:59 UTC) or an ISO-8601 datetime.
limitintegerdefault 100
Items per page, 1–500.
cursorstring
The next_cursor from the previous page. Leave out for the first page.
Ratings per location for a period: how many guests were happy, neutral and unhappy, and the share of happy guests. happy_percent is null when a location has no ratings.
Parameters
location_idinteger
Only data of this location. Leave out for all your locations.
fromdate
Start of the period, inclusive. A date (2026-10-01, from midnight UTC) or an ISO-8601 datetime.
todate
End of the period, inclusive. A date (2026-10-31, until 23:59:59 UTC) or an ISO-8601 datetime.
{
"data": [
{
"id":3,
"location_id":1,
"title":"Visitor experience",
"description":null,
"is_active":true,
"is_review_guard_survey":false,
"responses_count":418,
"questions": [
{
"id":21,
"text":"How would you rate your visit?",
"type":"rating",
"required":true,
"position":0,
"options":null
},
{
"id":22,
"text":"How likely are you to recommend us to a friend?",
"type":"scale",
"required":true,
"position":1,
"options":null,
"scale": {
"min":0,
"max":10,
"allow_na":false,
"min_label":"Not likely",
"max_label":"Very likely"
}
},
{
"id":23,
"text":"Which rooms did you enjoy most?",
"type":"multi",
"required":false,
"position":2,
"options": [
"Vortex Tunnel",
"Ames Room",
"Infinity Room"
],
"allow_other":true,
"max_select":null
},
{
"id":24,
"text":"Anything we could do better?",
"type":"text",
"required":false,
"position":3,
"options":null
}
],
"created_at":"2026-09-25T08:12:44.120Z"
}
]
}
List survey responsesPaginated
GET/survey-responses
Every submitted response with its answers, oldest first. Answers come typed: a number for rating and scale questions, an array of strings for multi, a string for choice and text.
An “Other” answer the guest typed in is returned as "Other: <their text>". A scale question that allows it can be answered "N/A". card is null when the guest opened the survey link directly instead of tapping a card.
Parameters
survey_idinteger
Only responses to this survey.
location_idinteger
Only data of this location. Leave out for all your locations.
card_idinteger
Only data collected through this card.
fromdate
Start of the period, inclusive. A date (2026-10-01, from midnight UTC) or an ISO-8601 datetime.
todate
End of the period, inclusive. A date (2026-10-31, until 23:59:59 UTC) or an ISO-8601 datetime.
limitintegerdefault 100
Items per page, 1–500.
cursorstring
The next_cursor from the previous page. Leave out for the first page.
{
"data": [
{
"id":5120,
"survey_id":3,
"survey_title":"Visitor experience",
"location_id":1,
"card": {
"id":15,
"label":"Exit"
},
"submitted_at":"2026-10-26T14:03:27.551Z",
"answers": [
{
"question_id":21,
"question":"How would you rate your visit?",
"type":"rating",
"value":5
},
{
"question_id":22,
"question":"How likely are you to recommend us to a friend?",
"type":"scale",
"value":9
},
{
"question_id":23,
"question":"Which rooms did you enjoy most?",
"type":"multi",
"value": [
"Vortex Tunnel",
"Other: The gift shop"
]
},
{
"question_id":24,
"question":"Anything we could do better?",
"type":"text",
"value":"More benches in the last room."
}
]
}
],
"pagination": {
"has_more":false,
"next_cursor":null
}
}
Endpoints
Online reviews
Public reviews of your locations on Google and Tripadvisor, and the ratings of the competitors you track — as collected by Review Advisor's competitor monitoring. A location appears here once its own business profile is connected in the Competitors screen.
List reviewsPaginated
GET/reviews
Reviews of your own locations, in the order we collected them. from and to filter on the date the review was published.
Parameters
location_idinteger
Only data of this location. Leave out for all your locations.
sourcestring
Only reviews from this platform.
googletripadvisor
fromdate
Start of the period, inclusive. A date (2026-10-01, from midnight UTC) or an ISO-8601 datetime.
todate
End of the period, inclusive. A date (2026-10-31, until 23:59:59 UTC) or an ISO-8601 datetime.
limitintegerdefault 100
Items per page, 1–500.
cursorstring
The next_cursor from the previous page. Leave out for the first page.
This is version 1 of the API. We only add to it — new endpoints, new fields, new filters — without breaking what you've built. If we ever need a breaking change, it will come as /v2and we'll let you know well in advance.
Prefer to explore in a tool? Download the OpenAPI file and import it into Postman, Insomnia or your code generator.
Need a field or endpoint that isn't here?
Tell us what you're building — we're happy to help with your integration.