Summary and recommendation
Elastic Path exposes a REST API for managing storefront-side account members, authenticated via OAuth 2.0 client_credentials or implicit grant. The base URL is region-specific - useast.api.elasticpath.com or euwest.api.elasticpath.com - and using the wrong region returns 401 or 404. All write operations on account members require a client_credentials token; implicit tokens are read-only and buyer-scoped.
Tokens expire at default 1 hour; implement refresh logic and do not cache tokens across sessions.
A critical architectural distinction: the Account Members API manages buyer-side storefront users only. Commerce Manager admin users are managed exclusively via the Commerce Manager UI or SSO - there is no API surface for admin user provisioning. Any identity graph that conflates these two user populations will produce incorrect provisioning behavior.
Pagination uses page[limit] (max 100) and page[offset]; cursor-based pagination is not available on account member endpoints. Rate limits are not publicly documented and are communicated contractually.
API quick reference
| Has user API | Yes |
| Auth method | OAuth 2.0 (client_credentials and implicit grant types); Bearer token passed in Authorization header |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Enterprise |
Authentication
Auth method: OAuth 2.0 (client_credentials and implicit grant types); Bearer token passed in Authorization header
Setup steps
- Create a store in Elastic Path Commerce Manager and obtain the Client ID and Client Secret from the store's API keys section.
- POST to /oauth/access_token with grant_type=client_credentials plus client_id and client_secret to receive a Bearer token (server-side operations).
- For buyer-facing flows, use grant_type=implicit with client_id only to receive a limited-scope token.
- Include the token in all subsequent requests as: Authorization: Bearer
. - Tokens expire; re-request before expiry (expiry returned in the token response as 'expires_in' seconds).
Required scopes
| Scope | Description | Required for |
|---|---|---|
| implicit | Read-only, buyer-facing token with limited access to public catalog and account member self-service. | Storefront / buyer authentication flows |
| client_credentials | Full administrative access token using Client ID + Secret. Required for all user/account management write operations. | Creating, updating, and deleting account members and authentication settings |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | string (UUID) | Unique identifier for the account member. | system-generated | immutable | Assigned by the API on creation. |
| type | string | Always 'account_member'. | required | required | Must be set to 'account_member' in request body. |
| name | string | Full name of the account member. | required | optional | |
| string | Email address of the account member. | required | optional | Used as the login identifier in account management authentication. | |
| meta.timestamps.created_at | string (ISO 8601) | Timestamp when the account member was created. | system-generated | immutable | |
| meta.timestamps.updated_at | string (ISO 8601) | Timestamp of the last update. | system-generated | system-generated | |
| links.self | string (URL) | Self-referencing URL for the account member resource. | system-generated | system-generated |
Core endpoints
List Account Members
- Method: GET
- URL:
https://useast.api.elasticpath.com/v2/account-members - Watch out for: Requires client_credentials token. Implicit tokens cannot list all members.
Request example
GET /v2/account-members?page[limit]=25&page[offset]=0
Authorization: Bearer <token>
Response example
{
"data": [
{"id":"abc-123","type":"account_member","name":"Jane Doe","email":"jane@example.com"}
],
"meta":{"page":{"limit":25,"offset":0,"current":1,"total":1}}
}
Get Account Member
- Method: GET
- URL:
https://useast.api.elasticpath.com/v2/account-members/{memberID} - Watch out for: Member ID must be a valid UUID; 404 returned if not found.
Request example
GET /v2/account-members/abc-123
Authorization: Bearer <token>
Response example
{
"data": {
"id":"abc-123",
"type":"account_member",
"name":"Jane Doe",
"email":"jane@example.com"
}
}
Create Account Membership (associate member to account)
- Method: POST
- URL:
https://useast.api.elasticpath.com/v2/accounts/{accountID}/account-memberships - Watch out for: Account members are global; memberships link them to specific accounts. Creating a member and creating a membership are separate operations.
Request example
POST /v2/accounts/{accountID}/account-memberships
Authorization: Bearer <token>
Content-Type: application/json
{
"data":{"type":"account_membership","account_member_id":"abc-123"}
}
Response example
{
"data": {
"id":"mem-456",
"type":"account_membership",
"account_member_id":"abc-123"
}
}
Delete Account Membership
- Method: DELETE
- URL:
https://useast.api.elasticpath.com/v2/accounts/{accountID}/account-memberships/{membershipID} - Watch out for: Deletes the membership (association), not the account member record itself.
Request example
DELETE /v2/accounts/{accountID}/account-memberships/mem-456
Authorization: Bearer <token>
Response example
HTTP 204 No Content
List Account Memberships for an Account
- Method: GET
- URL:
https://useast.api.elasticpath.com/v2/accounts/{accountID}/account-memberships - Watch out for: Pagination applies; use page[limit] and page[offset].
Request example
GET /v2/accounts/{accountID}/account-memberships
Authorization: Bearer <token>
Response example
{
"data": [
{"id":"mem-456","type":"account_membership","account_member_id":"abc-123"}
]
}
Generate Account Management Authentication Token
- Method: POST
- URL:
https://useast.api.elasticpath.com/v2/account-members/tokens - Watch out for: Requires a configured Account Authentication Settings resource with an OIDC provider. The token is scoped to the authenticated account member.
Request example
POST /v2/account-members/tokens
Authorization: Bearer <implicit_token>
Content-Type: application/json
{
"data":{"type":"account_management_authentication_token","authentication_mechanism":"oidc","oauth_authorization_code":"<code>","oauth_redirect_uri":"https://example.com/callback","oauth_code_verifier":"<verifier>"}
}
Response example
{
"data": {
"type":"account_management_authentication_token",
"token":"<jwt>",
"expires":"2024-01-01T00:00:00Z"
}
}
Get Account Authentication Settings
- Method: GET
- URL:
https://useast.api.elasticpath.com/v2/settings/account-authentication - Watch out for: Settings are store-scoped. Changes affect all account member authentication for that store.
Request example
GET /v2/settings/account-authentication
Authorization: Bearer <token>
Response example
{
"data": {
"type":"account_authentication_settings",
"enable_self_signup":true,
"auto_create_account_for_account_members":true
}
}
Update Account Authentication Settings
- Method: PUT
- URL:
https://useast.api.elasticpath.com/v2/settings/account-authentication - Watch out for: Uses PUT (full replacement semantics), not PATCH.
Request example
PUT /v2/settings/account-authentication
Authorization: Bearer <token>
Content-Type: application/json
{
"data":{"type":"account_authentication_settings","enable_self_signup":false}
}
Response example
{
"data": {
"type":"account_authentication_settings",
"enable_self_signup":false
}
}
Rate limits, pagination, and events
- Rate limits: Elastic Path does not publicly document specific numeric rate limits in its developer docs. Rate limiting is enforced at the infrastructure level; limits vary by plan and are communicated via contract.
- Rate-limit headers: Unknown
- Retry-After header: Unknown
- Rate-limit notes: No public rate limit figures found in official documentation as of research date. Contact Elastic Path support for contractual limits.
- Pagination method: offset
- Default page size: 25
- Max page size: 100
- Pagination pointer: page[limit] and page[offset]
| Plan | Limit | Concurrent |
|---|---|---|
| Enterprise (custom) | Not publicly documented | 0 |
- Webhooks available: Yes
- Webhook notes: Elastic Path supports webhooks (called 'integrations' or 'events') via its Observable Events system. Webhooks can be configured to fire on resource lifecycle events including account and order changes.
- Alternative event strategy: Elastic Path Composer (iPaaS) can be used for event-driven integrations where native webhooks are insufficient.
- Webhook events: account.created, account.updated, account.deleted, account-membership.created, account-membership.deleted, customer.created, customer.updated, customer.deleted
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Enterprise
- Endpoint: Not documented
Limitations:
- SCIM provisioning is not documented in official Elastic Path developer documentation.
- SSO access is managed via access@elasticpath.com for Commerce Manager (admin portal) users.
- Okta and Entra ID SSO are supported for Commerce Manager login but automated SCIM provisioning is not confirmed.
- Account member provisioning for storefront users must be done via the Account Members REST API.
Common scenarios
Three scenarios cover the primary lifecycle operations. First, provisioning a new buyer: obtain a client_credentials token, confirm or create the target account via GET/POST /v2/accounts, then retrieve the member ID via GET /v2/account-members?
filter=eq(email,... ) after the member authenticates via OIDC.
Associate them to the account via POST /v2/accounts/{accountID}/account-memberships. Account member records are created by the OIDC authentication flow, not by a direct admin POST - pre-provisioning without an auth flow is not supported in the standard API.
Second, deprovisioning: list memberships via GET /v2/accounts/{accountID}/account-memberships, then DELETE /v2/accounts/{accountID}/account-memberships/{membershipID}. This removes account-level access but does not delete the global account_member record; the member may retain memberships in other accounts. No explicit token revocation endpoint is documented.
Third, configuring OIDC SSO: create an authentication realm via POST /v2/authentication-realms, attach an OIDC profile via POST /v2/authentication-realms/{realmID}/oidc-profiles, then update Account Authentication Settings via PUT /v2/settings/account-authentication. PUT semantics apply - this is full replacement, not PATCH; omitting fields resets them to defaults. Multi-store setups require separate OIDC profile configurations per store.
Provision a new buyer account member and associate with an account
- Obtain a client_credentials Bearer token via POST /oauth/access_token.
- Check if the account exists via GET /v2/accounts; create it via POST /v2/accounts if not.
- The account member record is created automatically upon first successful OIDC authentication, OR can be pre-created if self-signup is disabled by configuring the OIDC provider and directing the user through the authentication flow.
- After the member record exists, retrieve their member ID via GET /v2/account-members?filter=eq(email,user@example.com).
- Associate the member to the account via POST /v2/accounts/{accountID}/account-memberships with the account_member_id.
Watch out for: Account member records are created by the authentication flow (OIDC), not by a direct admin POST. Pre-provisioning without an auth flow is not supported in the standard API.
Deprovision a user (remove from account)
- Obtain a client_credentials Bearer token.
- List memberships for the account via GET /v2/accounts/{accountID}/account-memberships to find the membership ID.
- Delete the membership via DELETE /v2/accounts/{accountID}/account-memberships/{membershipID}.
- Optionally revoke any active account management authentication tokens by expiry (no explicit token revocation endpoint documented).
Watch out for: Deleting a membership removes the user's access to that account but does not delete the account_member record globally. The member may still have memberships in other accounts.
Configure OIDC SSO for account member authentication (Okta/Entra)
- In your IdP (Okta or Entra ID), create an OIDC application and note the Client ID, Client Secret, and Discovery URL.
- POST to /v2/authentication-realms to create an authentication realm for your store.
- POST to /v2/authentication-realms/{realmID}/oidc-profiles with the IdP Client ID, Client Secret, and discovery_url.
- Update Account Authentication Settings via PUT /v2/settings/account-authentication to reference the realm and set enable_self_signup as appropriate.
- Direct storefront users to authenticate via the OIDC flow; on success, an account_member record is created and a token is returned.
Watch out for: Each store has its own authentication realm. Multi-store setups require separate OIDC profile configurations per store. The discovery_url must be publicly accessible.
Why building this yourself is a trap
The most common integration trap is treating account member creation as a direct API operation. Member records are generated by the OIDC authentication flow; attempting to pre-provision members without routing them through the auth flow will fail or produce orphaned records.
A second trap is the member/membership distinction: creating a member and associating them to an account are separate API calls - skipping the membership POST leaves the member with no account-level access despite having a valid record.
For teams building an identity graph that spans Elastic Path alongside other SaaS tools, the buyer/admin split is the highest-risk modeling error. Admin users have no API representation; any automated sync must treat Commerce Manager admin access as out-of-band.
Integrations built on an MCP server with 60+ deep IT/identity integrations should map Elastic Path's account_member object exclusively to buyer personas and handle admin lifecycle through SSO or manual processes.
SCIM is not confirmed as available, so any identity graph node representing Elastic Path admin users cannot be kept in sync programmatically without direct vendor engagement.
Automate Elastic Path 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.