Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/prismareviews:prismareviews-locations-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Prisma Reviews Locations API
version: 1.0.0
summary: One REST API to read and reply to reviews on the App Store, Google Play, Yelp, Tripadvisor and more.
description: 'Read the reviews of the businesses and apps you own or manage on the App Store, Google Play, Judge.me, eBay, Trusted Shops, eKomi, Yelp, Tripadvisor, Booking.com, G2 and 50+ more platforms, all in one normalized JSON shape, and reply through each platform''s official API where it has one (read-only platforms return the link where a review is answered). Google Business Profile, Trustpilot, Allegro, Etsy, Angi and Mercado Libre are coming soon: `GET /v1/platforms` says which platforms are ready (`live_ready`).
- **Auth:** `Authorization: Bearer `. Live keys (`pk_live_…`) work with real accounts; test keys (`pk_test_…`) connect any platform with sample locations and reviews and never publish replies. Test and live data never mix.
- **Format:** JSON in and out; timestamps are ISO 8601 in UTC; IDs are prefixed (`rev_`, `loc_`, `con_`, `we_`, `evt_`, `req_`).
- **Pagination:** `GET /v1/reviews` is cursor paginated (`data` + `next_cursor`).
- **Rate limits:** per key and per minute, set by the plan (Spark 60, Beam 120, Spectrum 600, Aurora 1,200), reported in `X-RateLimit-Limit` and `X-RateLimit-Remaining`.
- **Errors:** one shape, `{ "error": { "type", "code", "message", "retryable", "request_id", "docs_url" } }`; codes on https://prismareviews.com/docs/errors.
- **Webhooks:** signed `POST`s for new and updated reviews, published or failed replies and connection changes.
Get a free API key at https://app.prismareviews.com/signup.'
termsOfService: https://prismareviews.com/terms
contact:
name: Prisma Reviews
url: https://prismareviews.com
email: hello@prismareviews.com
x-logo:
url: https://prismareviews.com/favicon.svg
altText: Prisma Reviews
servers:
- url: https://api.prismareviews.com
description: Production (live and test keys)
security:
- apiKey: []
tags:
- name: Locations
description: The places, apps, shops and listings that receive reviews.
externalDocs:
description: Docs
url: https://prismareviews.com/docs/api-reference/locations
paths:
/v1/locations:
get:
operationId: listLocations
tags:
- Locations
summary: List locations
description: 'Every location of your workspace in the mode of your key, oldest first, without disconnected ones. Not paginated: `next_cursor` is always `null`.'
responses:
'200':
description: All locations.
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
content:
application/json:
schema:
$ref: '#/components/schemas/LocationList'
example:
data:
- id: loc_01KJ8P9W2C4D6F8G0H2J4K6M8N
platform: google
connection_id: con_01KJ8P7R5S3T1V9W7X5Y3Z1A2B
name: Café Ruzafa
address: Carrer de Sueca 10, Valencia
url: https://maps.google.com/?cid=1234567890
external_id: accounts/1234567890/locations/9876543210
status: active
last_synced_at: '2026-10-23T08:00:12.000Z'
next_sync_at: '2026-10-24T08:00:12.000Z'
review_link:
url: https://maps.google.com/?cid=1234567890
type: listing
next_cursor: null
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/Maintenance'
externalDocs:
description: Docs
url: https://prismareviews.com/docs/api-reference/locations
/v1/locations/{id}:
get:
operationId: getLocation
tags:
- Locations
summary: Get a location
description: One location by ID, disconnected ones included until their data is deleted.
parameters:
- name: id
in: path
required: true
description: Location ID (`loc_…`).
schema:
type: string
example: loc_01KJ8P9W2C4D6F8G0H2J4K6M8N
responses:
'200':
description: The location.
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
content:
application/json:
schema:
$ref: '#/components/schemas/Location'
example:
id: loc_01KJ8P9W2C4D6F8G0H2J4K6M8N
platform: google
connection_id: con_01KJ8P7R5S3T1V9W7X5Y3Z1A2B
name: Café Ruzafa
address: Carrer de Sueca 10, Valencia
url: https://maps.google.com/?cid=1234567890
external_id: accounts/1234567890/locations/9876543210
status: active
last_synced_at: '2026-10-23T08:00:12.000Z'
next_sync_at: '2026-10-24T08:00:12.000Z'
review_link:
url: https://maps.google.com/?cid=1234567890
type: listing
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
description: No location with that ID in this workspace and mode (`resource_not_found`).
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
resource_not_found:
value:
error:
type: not_found_error
code: resource_not_found
message: No location with that id in this workspace.
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#resource_not_found
'429':
$ref: '#/components/responses/RateLimited'
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/Maintenance'
externalDocs:
description: Docs
url: https://prismareviews.com/docs/api-reference/locations
/v1/locations/{id}/refresh:
post:
operationId: refreshLocation
tags:
- Locations
summary: Refresh a location
description: Checks one location for new reviews now instead of waiting for its next scheduled check ("Refresh now"). From the Beam plan; at most once every 15 minutes per location. New reviews arrive as usual, in `GET /v1/reviews` and as `review.created` webhooks.
parameters:
- name: id
in: path
required: true
description: Location ID (`loc_…`).
schema:
type: string
example: loc_01KJ8P9W2C4D6F8G0H2J4K6M8N
responses:
'202':
description: 'Check queued. The body is the location plus `refresh: "queued"`.'
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
content:
application/json:
schema:
$ref: '#/components/schemas/LocationRefresh'
example:
id: loc_01KJ8P9W2C4D6F8G0H2J4K6M8N
platform: google
connection_id: con_01KJ8P7R5S3T1V9W7X5Y3Z1A2B
name: Café Ruzafa
address: Carrer de Sueca 10, Valencia
url: https://maps.google.com/?cid=1234567890
external_id: accounts/1234567890/locations/9876543210
status: active
last_synced_at: '2026-10-23T08:00:12.000Z'
next_sync_at: '2026-10-24T08:00:12.000Z'
review_link:
url: https://maps.google.com/?cid=1234567890
type: listing
refresh: queued
'401':
$ref: '#/components/responses/Unauthorized'
'403':
description: 'The plan has no Refresh now (Spark, `feature: "refresh_now"`) or doesn''t include the location''s platform (`feature: "platform"`), both `plan_feature_unavailable` with `upgrade_url`; or the account is suspended (`account_suspended`).'
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
plan_feature_unavailable:
value:
error:
type: permission_error
code: plan_feature_unavailable
message: 'Refresh now isn''t included in the free Spark plan: it starts at Beam. Spark locations are checked on their regular schedule.'
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#plan_feature_unavailable
feature: refresh_now
upgrade_url: https://app.prismareviews.com/plan
account_suspended:
value:
error:
type: permission_error
code: account_suspended
message: This account is suspended. Write to hello@prismareviews.com.
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#account_suspended
'404':
description: No location with that ID in this workspace and mode (`resource_not_found`).
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
resource_not_found:
value:
error:
type: not_found_error
code: resource_not_found
message: No location with that id in this workspace.
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#resource_not_found
'409':
description: The location is not active (disconnected).
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
location_inactive:
value:
error:
type: conflict_error
code: location_inactive
message: This location is not active.
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#location_inactive
'429':
description: Over the API rate limit (`rate_limited`), or the location was checked less than 15 minutes ago (`refresh_too_soon`). `Retry-After` says when to try again.
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
Retry-After:
$ref: '#/components/headers/Retry-After'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
refresh_too_soon:
value:
error:
type: rate_limit_error
code: refresh_too_soon
message: This location was checked less than 15 minutes ago. Try again in 540 s.
retryable: true
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#refresh_too_soon
rate_limited:
value:
error:
type: rate_limit_error
code: rate_limited
message: Rate limit of 60 requests per minute exceeded. Retry in 12 s. Requests over the limit are never billed.
retryable: true
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#rate_limited
'500':
$ref: '#/components/responses/InternalError'
'503':
$ref: '#/components/responses/Maintenance'
externalDocs:
description: Docs
url: https://prismareviews.com/docs/api-reference/locations
components:
responses:
InternalError:
description: Something failed on Prisma's side. Retryable.
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
internal_error:
value:
error:
type: api_error
code: internal_error
message: Something went wrong on our side. It has been logged; try again.
retryable: true
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#internal_error
RateLimited:
description: More requests this minute than the plan allows for this key. Not counted in usage.
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
Retry-After:
$ref: '#/components/headers/Retry-After'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
rate_limited:
value:
error:
type: rate_limit_error
code: rate_limited
message: Rate limit of 60 requests per minute exceeded. Retry in 12 s. Requests over the limit are never billed.
retryable: true
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#rate_limited
Unauthorized:
description: No API key or one not shaped like a Prisma key (`missing_api_key`), or a key that doesn't exist or was revoked (`invalid_api_key`).
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
missing_api_key:
value:
error:
type: authentication_error
code: missing_api_key
message: 'Send your API key as "Authorization: Bearer pk_live_…".'
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#missing_api_key
invalid_api_key:
value:
error:
type: authentication_error
code: invalid_api_key
message: This API key does not exist or was revoked.
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#invalid_api_key
Forbidden:
description: The account is suspended.
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
account_suspended:
value:
error:
type: permission_error
code: account_suspended
message: This account is suspended. Write to hello@prismareviews.com.
retryable: false
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#account_suspended
Maintenance:
description: Prisma is under maintenance and the API is paused. Retryable.
headers:
Request-Id:
$ref: '#/components/headers/Request-Id'
Retry-After:
$ref: '#/components/headers/Retry-After'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
examples:
maintenance:
value:
error:
type: api_error
code: maintenance
message: Prisma is under maintenance. Try again in a few minutes; see https://prismareviews.com/status.
retryable: true
request_id: req_01KJ8T3C5D7E9F1G3H5J7K9M1N
docs_url: https://prismareviews.com/docs/errors#maintenance
headers:
X-RateLimit-Remaining:
description: Requests left in the current one-minute window.
schema:
type: integer
Request-Id:
description: The `req_…` ID of the request. Include it when you contact support.
schema:
type: string
X-RateLimit-Limit:
description: Requests allowed per minute for this key.
schema:
type: integer
Retry-After:
description: Seconds to wait before retrying.
schema:
type: integer
schemas:
LocationRefresh:
allOf:
- $ref: '#/components/schemas/Location'
- type: object
required:
- refresh
properties:
refresh:
type: string
const: queued
PlatformId:
type: string
enum:
- google
- app_store
- google_play
- judge_me
- trustpilot
- google_maps
- yelp
- tripadvisor
- booking
- yotpo
- reviews_io
- g2
- ebay
- etsy
- steam
- okendo
- feefo
- trusted_shops
- ekomi
- loox
- proven_expert
- shopper_approved
- wordpress
- appexchange
- facebook
- opentable
- doordash
- angi
- checkatrade
- avvo
- capterra
- apartments
- gartner
- healthgrades
- vitals
- classpass
description: 'Platform ID.
| ID | Platform | Connects with | Replies |
| --- | --- | --- | --- |
| `google` | Google Business Profile | oauth | by API |
| `app_store` | App Store | credentials | by API |
| `google_play` | Google Play | credentials | by API |
| `judge_me` | Judge.me | credentials | by API |
| `trustpilot` | Trustpilot | oauth | by API |
| `google_maps` | Google Maps | listing_url | read only |
| `yelp` | Yelp | listing_url | read only |
| `tripadvisor` | Tripadvisor | listing_url | read only |
| `booking` | Booking.com | listing_url | read only |
| `yotpo` | Yotpo | credentials | read only |
| `reviews_io` | REVIEWS.io | credentials | read only |
| `g2` | G2 | credentials | read only |
| `ebay` | eBay | oauth | by API |
| `etsy` | Etsy | listing_url | read only |
| `steam` | Steam | listing_url | read only |
| `okendo` | Okendo | credentials | read only |
| `feefo` | Feefo | credentials | read only |
| `trusted_shops` | Trusted Shops | credentials | by API |
| `ekomi` | eKomi | credentials | by API |
| `loox` | Loox | credentials | read only |
| `proven_expert` | ProvenExpert | credentials | read only |
| `shopper_approved` | Shopper Approved | credentials | read only |
| `wordpress` | WordPress.org | listing_url | read only |
| `appexchange` | Salesforce AppExchange | listing_url | read only |
| `facebook` | Facebook | listing_url | read only |
| `opentable` | OpenTable | listing_url | read only |
| `doordash` | DoorDash | listing_url | read only |
| `angi` | Angi | listing_url | read only |
| `checkatrade` | Checkatrade | listing_url | read only |
| `avvo` | Avvo | listing_url | read only |
| `capterra` | Capterra | listing_url | read only |
| `apartments` | Apartments.com | listing_url | read only |
| `gartner` | Gartner Peer Insights | listing_url | read only |
| `healthgrades` | Healthgrades | listing_url | read only |
| `vitals` | Vitals | listing_url | read only |
| `classpass` | ClassPass | listing_url | read only |'
Error:
type: object
required:
- error
description: Every error has this shape. Some codes add fields (for example `platform`, `url`, `max_length`, `connection_id`, `upgrade_url`, `required_fields`).
properties:
error:
type: object
required:
- type
- code
- message
- retryable
- request_id
- docs_url
additionalProperties: true
properties:
type:
type: string
enum:
- authentication_error
- permission_error
- not_found_error
- conflict_error
- invalid_request_error
- rate_limit_error
- api_error
description: Family of the error, from the HTTP status.
code:
type: string
description: Stable, machine-readable code. Branch on this, not on `message`.
message:
type: string
description: Human-readable explanation. It can change.
retryable:
type: boolean
description: '`true` for 429 and 5xx: the same request can succeed later.'
request_id:
type: string
description: The `req_…` ID, also in the `Request-Id` header.
docs_url:
type: string
description: Description of this code.
format: uri
Location:
type: object
required:
- id
- platform
- connection_id
- name
- address
- url
- external_id
- status
- last_synced_at
- next_sync_at
- review_link
- sync
description: 'One thing that receives reviews on one platform: a place, an app, a shop, a listing.'
properties:
id:
type: string
description: Location ID (`loc_…`).
example: loc_01KJ8P9W2C4D6F8G0H2J4K6M8N
platform:
$ref: '#/components/schemas/PlatformId'
connection_id:
type: string
description: The connection that created it (`con_…`).
name:
type: string
description: Name on the platform. For listing URL platforms, the listing URL.
address:
type:
- string
- 'null'
description: Address for places. For App Store apps, the bundle ID.
url:
type:
- string
- 'null'
description: Public page of the location, app or listing, when known.
external_id:
type: string
description: The platform's own ID.
status:
type: string
enum:
- active
- disconnected
last_synced_at:
type:
- string
- 'null'
format: date-time
description: Last time Prisma checked it for reviews. `null` until the first sync finishes.
next_sync_at:
type:
- string
- 'null'
format: date-time
description: When the next check is scheduled. `null` once disconnected.
review_link:
description: 'The link to send customers to ask for a review (email, SMS, QR code). `type: "write_review"` opens the platform''s review form; `listing` is the public page with its review button. `null` where only verified buyers or guests can review (Booking.com, eBay, Etsy, shop-review apps).'
anyOf:
- type: object
required:
- url
- type
properties:
url:
type: string
description: The link.
type:
type: string
enum:
- write_review
- listing
- type: 'null'
sync:
type: object
required:
- consecutive_failures
- last_error
- last_error_at
description: 'Sync health: tells "no new reviews" apart from "the check failed". After 3 failed checks in a row Prisma sends `location.sync_failed`, and `location.sync_recovered` on the next successful one.'
properties:
consecutive_failures:
type: integer
description: Checks in a row that failed. `0` after a successful check.
last_error:
type:
- string
- 'null'
description: The last failed check's error (up to 300 characters, never keys or tokens). Kept after a recovery, as history.
last_error_at:
type:
- string
- 'null'
format: date-time
description: When the last check failed.
LocationList:
type: object
required:
- data
- next_cursor
properties:
data:
type: array
items:
$ref: '#/components/schemas/Location'
next_cursor:
type: 'null'
description: 'Always `null`: not paginated.'
securitySchemes:
apiKey:
type: http
scheme: bearer
bearerFormat: pk_live_… / pk_test_…
description: 'Your secret API key as a Bearer token: `pk_live_…` for real accounts, `pk_test_…` for sample data. Keep it on your server.'
externalDocs:
description: Prisma Reviews API reference
url: https://prismareviews.com/docs/api-reference