Vendor App Auth & Credentials
How a marketplace vendor app authenticates to the ROLLER Platform API: the OAuth2 client-credentials flow, the per-venue client key ROLLER delivers on install, and the scoped-permission model that governs every request.
This page explains how your marketplace app authenticates to the ROLLER
Platform API and how the scope model decides which endpoints your key may
call. It is vendor-focused; the generic reference pages it links to
(Authentication, Scoped Permissions)
carry the full detail.
Credential handling. Every credential shown here โ the delivered
client_id/client_secretpair and the bearer token โ is a live secret. Store them
encrypted at rest, never log them, and never embed them in client-side code.
All values in this guide are illustrative placeholders, not real keys.
1. Where your credentials come from
A live marketplace app does not generate its own key. When an operator
installs your app, ROLLER mints a per-venue client key โ a client_id and
client_secret pair, scoped to the permissions your app declared and was approved
for โ and delivers it once in the venue.connect webhook body. Your app
stores that pair against the venue and uses it to authenticate every subsequent
request for that venue. These are the exact client_id / client_secret values
you exchange for a bearer token in ยง2 below.
- The
client_secretis delivered exactly once and is never re-sent. Persist both
values encrypted; if you lose the secret, the operator must reconnect (which
rotates the credential). - A credential is scoped to a single venue, per environment โ a client key
minted in Playground will not work in Live, and vice-versa.
For the full connect/disconnect delivery contract, see
Integration Apps. For manual key generation while testing
before your app is live, see Getting API Access.
2. The OAuth2 client-credentials flow
The Platform API uses the OAuth2 client-credentials grant. You exchange a
client_id / client_secret pair for a short-lived bearer token, then send
that token on every API request.
Request a token โ POST https://api.roller.app/token with a JSON body:
Content-Type: application/json{
"client_id": "your-client-id",
"client_secret": "your-client-secret"
}
ROLLER's/tokentakes a JSON body with justclient_idand
client_secretโ there is nogrant_typeform parameter and the request is
notapplication/x-www-form-urlencoded. Both fields are required; omitting
either returns400.
Response:
{
"access_token": "<bearer-token>",
"token_type": "Bearer",
"expires_in": 86400
}Call the API with the token:
Authorization: Bearer <access_token>
Accept: application/json
- Tokens are short-lived (
expires_in, typically 24 hours). Reuse the
current token until it is near expiry. For production traffic, refresh
proactively โ request a new token when fewer than ~60 seconds of lifetime
remain โ so you avoid a live-traffic401. As a fallback, always re-request on
a401and retry the call once. - Do not request a new token per call โ repeated token requests can return
429 (Too Many Requests)and lead to suspension of your credentials. - The
/tokenendpoint itself requires no scope โ any enabled key can request
a token. Scope is enforced on the resource endpoints, not on token issuance.
See Authentication for expiry, caching, and rate guidance.
3. The scope model
Every key carries a scope: the set of endpoints it is allowed to call. When
your app calls an endpoint outside its scope, the API responds:
HTTP 403 Forbidden
{ "Message": "Invalid scope" }A key holds one of three access models:
| Model | What it grants |
|---|---|
| REST API full access | Every REST API endpoint โ except restricted endpoints |
| Reporting API full access | Every Data API / reporting endpoint (/data/*, /reporting/*) |
| Granular scopes | An explicit list of endpoint scopes โ nothing else |
There are 81 grantable scopes in the catalog, each mapping one operation to
one scope identifier (e.g. Booking_Get, ProductAvailability_Get,
Payment_Create). Scope identifiers are case-sensitive. The full catalog,
grouped by resource, is on the Scoped Permissions page,
and every operation in the API Reference
declares its required scope in its OAuth2 security requirement.
Restricted endpoints. All Staff endpoints are restricted: they arenever covered by full access, must be explicitly granted on the key, and the
venue must additionally be enabled for the Staff Management API.
4. Requesting the right scopes (least privilege)
Because operators see and approve exactly what your key can do, request only
the scopes your integration needs. A typical marketplace checkout integration
declares:
ProductAvailability_Get Product_Get
BookingDraft_Create BookingDraft_Costs BookingDraft_Publish
Booking_Get Booking_Cancel
Payment_Create
Webhook_Create Webhook_Get Webhook_GetFailedMessagesAdd Data_* / Reporting_* scopes (or Reporting API full access) only if you
reconcile sales via the Data API. The scope set your app declares becomes part of
what ROLLER reviews before approval and what the operator consents to at install.
5. Key rotation on reconnect
Your granted scopes are fixed to what your app declared and was approved for. If
that approved scope set later changes, the operator is prompted to reconnect;
ROLLER mints a fresh key and sends a new venue.connect for the venue. Treat
a venue.connect for a venue you already hold as a key rotation: replace the
stored key with the new one. See Integration Apps ยง6.
Next
- API Surface & Support Policy โ what
you may call and the breaking-change commitments. - Sandbox & Non-Prod Testing โ exercise auth against
Playground before going live.
Updated about 1 month ago
