Summary and recommendation
Yotpo's REST API exposes full CRUD on account users via the `/apps/{app_key}/account_users` resource at `https://api.yotpo.com`.
Authentication uses an OAuth2 client-credentials flow: POST your `app_key` and `secret` to `/oauth/token` to receive a short-lived `utoken`, which must be passed on all subsequent requests.
The `app_key` is also required as a path parameter on every account_users endpoint - not just during auth.
The API supports listing, fetching, creating, updating (PUT, full-object semantics unconfirmed), and deleting users.
There is no SCIM 2.0 endpoint.
For teams building an identity graph across SaaS tools, Yotpo user records expose `id`, `email`, `role`, `created_at`, and `updated_at`
sufficient for join operations against a central directory, but role enum values are not enumerated in public documentation and must be discovered by inspecting existing users.
API quick reference
| Has user API | Yes |
| Auth method | API key + secret (app_key / secret pair exchanged for a short-lived utoken via POST /oauth/token) |
| Base URL | Official docs |
| SCIM available | No |
Authentication
Auth method: API key + secret (app_key / secret pair exchanged for a short-lived utoken via POST /oauth/token)
Setup steps
- Log in to the Yotpo dashboard and navigate to Settings > Store Settings > API Credentials.
- Copy your app_key and secret.
- POST to https://api.yotpo.com/oauth/token with {"client_id": "
", "client_secret": " ", "grant_type": "client_credentials"} to receive an access token (utoken). - Include the utoken as a query parameter or in the request body on subsequent API calls.
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | integer | Unique internal Yotpo user ID | auto-assigned | immutable | Used as path parameter for user-specific operations |
| string | User's email address; used as login identifier | required | optional | Must be unique within the account | |
| name | string | Display name of the user | optional | optional | |
| role | string | User role within the account (e.g., admin, viewer) | optional | optional | Role values are account-defined; exact enum not publicly documented |
| created_at | datetime (ISO 8601) | Timestamp when the user record was created | auto-assigned | immutable | |
| updated_at | datetime (ISO 8601) | Timestamp of last update to the user record | auto-assigned | auto-updated |
Core endpoints
Get access token
- Method: POST
- URL:
https://api.yotpo.com/oauth/token - Watch out for: Tokens are short-lived; cache and refresh before expiry. Expiry duration is not explicitly documented.
Request example
POST /oauth/token
Content-Type: application/json
{
"client_id": "<app_key>",
"client_secret": "<secret>",
"grant_type": "client_credentials"
}
Response example
{
"access_token": "<utoken>",
"token_type": "bearer"
}
List account users
- Method: GET
- URL:
https://api.yotpo.com/apps/{app_key}/account_users - Watch out for: Requires a valid utoken. Returns only users associated with the authenticated app_key's account.
Request example
GET /apps/{app_key}/account_users?utoken=<utoken>&page=1&count=10
Response example
{
"status": {"code": 200},
"response": {
"account_users": [
{"id": 123, "email": "user@example.com", "role": "admin"}
]
}
}
Get single account user
- Method: GET
- URL:
https://api.yotpo.com/apps/{app_key}/account_users/{user_id} - Watch out for: Returns 404 if user_id does not belong to the authenticated account.
Request example
GET /apps/{app_key}/account_users/123?utoken=<utoken>
Response example
{
"status": {"code": 200},
"response": {
"account_user": {"id": 123, "email": "user@example.com"}
}
}
Create account user
- Method: POST
- URL:
https://api.yotpo.com/apps/{app_key}/account_users - Watch out for: Exact writable fields and role enum values are not fully enumerated in public docs; test against sandbox first.
Request example
POST /apps/{app_key}/account_users
{
"utoken": "<utoken>",
"account_user": {
"email": "newuser@example.com",
"role": "viewer"
}
}
Response example
{
"status": {"code": 200},
"response": {
"account_user": {"id": 456, "email": "newuser@example.com"}
}
}
Update account user
- Method: PUT
- URL:
https://api.yotpo.com/apps/{app_key}/account_users/{user_id} - Watch out for: Full object replacement semantics vs. partial update not explicitly documented; send all desired fields to be safe.
Request example
PUT /apps/{app_key}/account_users/456
{
"utoken": "<utoken>",
"account_user": {"role": "admin"}
}
Response example
{
"status": {"code": 200},
"response": {
"account_user": {"id": 456, "role": "admin"}
}
}
Delete account user
- Method: DELETE
- URL:
https://api.yotpo.com/apps/{app_key}/account_users/{user_id} - Watch out for: Deletion is immediate and irreversible. No soft-delete or deactivation state documented.
Request example
DELETE /apps/{app_key}/account_users/456?utoken=<utoken>
Response example
{
"status": {"code": 200},
"response": {}
}
Rate limits, pagination, and events
Rate limits: Yotpo does not publicly document specific numeric rate limits or per-plan tiers in their developer docs. Requests that exceed undisclosed limits return HTTP 429.
Rate-limit headers: No
Retry-After header: No
Rate-limit notes: No official documentation of rate-limit headers or Retry-After behavior found. Contact Yotpo support for enterprise rate-limit details.
Pagination method: offset
Default page size: 10
Max page size: 100
Pagination pointer: page / count
Webhooks available: Yes
Webhook notes: Yotpo supports webhooks for review and UGC events (e.g., new review submitted, review published). Webhooks are configured in the Yotpo dashboard under Settings > Webhooks. There are no documented webhooks specifically for user/account management events.
Alternative event strategy: Poll the account_users endpoints periodically to detect user changes, as no user-lifecycle webhooks are documented.
Webhook events: review_created, review_published, question_created, answer_created
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Not documented
- Endpoint: Not documented
Limitations:
- Yotpo does not document a native SCIM 2.0 provisioning endpoint.
- SAML SSO is available for enterprise plans (Okta, Entra ID, OneLogin supported) but automated user provisioning/deprovisioning via SCIM is not documented.
- User lifecycle management must be performed via the REST account_users API or manually through the dashboard.
Common scenarios
Three primary automation scenarios are supported by the API:
Provision a new team member: POST to
/oauth/tokenfor a freshutoken, then POST to/apps/{app_key}/account_userswithemailandrole. Store the returnedidfor future operations. Role values are undocumented - retrieve existing users first to identify valid strings in your account.Deprovision a departing employee: GET
/apps/{app_key}/account_usersto resolveidby email, then DELETE/apps/{app_key}/account_users/{user_id}. Deletion is immediate and irreversible - no soft-delete state exists. If SAML SSO is active, also disable the user in your IdP; SSO session tokens may remain valid until natural expiry even after API deletion.Audit all account users: Paginate GET
/apps/{app_key}/account_users?page=1&count=100, incrementingpageuntil the returned array is empty. Collectid,email,role, andcreated_atper user. Note: offset pagination can return inconsistent results if users are added or removed mid-audit.
Provision a new team member via API
- POST to /oauth/token with client_id and client_secret to obtain a utoken.
- POST to /apps/{app_key}/account_users with the new user's email and desired role in the request body.
- Store the returned user id for future update or deletion operations.
- Optionally verify by GET /apps/{app_key}/account_users/{user_id}.
Watch out for: Role enum values are undocumented; retrieve existing users first to identify valid role strings in your account.
Deprovision a departing employee
- Obtain a fresh utoken via POST /oauth/token.
- GET /apps/{app_key}/account_users to find the target user's id by email.
- DELETE /apps/{app_key}/account_users/{user_id} to remove the user.
- If SAML SSO is in use, also disable the user in your IdP (Okta/Entra/OneLogin) to revoke SSO access.
Watch out for: Deleting via API removes the user immediately with no recovery option. SAML SSO session tokens may remain valid until expiry even after API deletion; IdP-side deactivation is required for immediate access revocation.
Audit all account users
- Obtain a utoken via POST /oauth/token.
- GET /apps/{app_key}/account_users?page=1&count=100 to retrieve the first page.
- Increment page parameter and repeat until the returned account_users array is empty or fewer than count.
- Collect id, email, role, and created_at fields for each user for your audit log.
Watch out for: No cursor-based pagination; offset pagination with large datasets may return inconsistent results if users are added/removed mid-audit.
Why building this yourself is a trap
The primary integration trap is token lifecycle management. The utoken is short-lived with no publicly documented expiry duration - failing to refresh before a batch operation will produce auth failures mid-run. Implement refresh logic defensively before every significant API call sequence.
Rate limits are entirely undocumented. There are no rate-limit headers, no Retry-After guidance, and no per-plan tiers published. Aggressive polling - for example, continuous user-change detection in the absence of user-lifecycle webhooks - risks silent throttling or 429 responses with no recovery signal.
Webhooks exist for review/UGC events only; there are no webhooks for user creation, update, or deletion, so polling /account_users is the only available change-detection mechanism.
For teams using an MCP server with 60+ deep IT/identity integrations to maintain a unified identity graph, Yotpo's lack of SCIM and undocumented role schema means the integration layer must handle role normalization and token refresh explicitly - these are not abstracted by the API itself.
Automate Yotpo workflows without one-off scripts
Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.