Summary and recommendation
Showpad exposes a REST API at `https://{organization}.showpad.biz/api/v3` authenticated via OAuth 2.0 (authorization code or client credentials flow).
All v3 endpoint paths require a `.json` suffix (e.g., `GET /api/v3/users.json`), and all responses are wrapped in a `response` envelope containing `status` and `data` keys.
Three OAuth scopes are relevant to user lifecycle operations: `read` for GET calls, `write` for POST/PATCH, and `admin` for DELETE and role management.
Rate limit thresholds are not publicly documented;
implement exponential backoff on 429 responses.
Pagination is offset-based with a default page size of 10 and a maximum of 100 (`offset` and `limit` query params).
For teams building an identity graph across their SaaS stack, Showpad's `externalId` field on the user object is the correct anchor for correlating Showpad identities with IdP records or HRIS data.
The `divisions` array on each user object maps to content access groups and must be resolved separately via `GET /api/v3/divisions.json` before provisioning - division IDs are not inferrable from user data alone.
Webhooks are not available;
user lifecycle event detection requires polling `GET /users.json` filtered by `updatedAt`, or relying on SCIM provisioning events from the IdP.
API quick reference
| Has user API | Yes |
| Auth method | OAuth 2.0 |
| Base URL | Official docs |
| SCIM available | Yes |
| SCIM plan required | Expert (Enterprise) |
Authentication
Auth method: OAuth 2.0
Setup steps
- Register an API application in the Showpad Admin portal under Settings > API.
- Obtain a client_id and client_secret for your registered application.
- Use the OAuth 2.0 authorization code flow (for user-delegated access) or client credentials flow (for server-to-server) to obtain an access token.
- Request token from: https://{organization}.showpad.biz/oauth2/token
- Include the access token as a Bearer token in the Authorization header of all API requests.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| read | Read access to resources including users and divisions. | GET user list, GET user by ID |
| write | Write access to create and update resources. | POST create user, PATCH update user |
| admin | Administrative access required for user deletion and role management. | DELETE user, manage roles and divisions |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | string | Unique Showpad user identifier. | auto-generated | immutable | UUID format. |
| username | string | User's login username (typically email). | required | optional | Must be unique within the organization. |
| string | User's email address. | required | optional | Used for login and notifications. | |
| firstname | string | User's first name. | required | optional | |
| lastname | string | User's last name. | required | optional | |
| status | string | Account status: active or inactive. | optional | optional | Defaults to active on creation. |
| role | string | User role: admin, user, or manager. | optional | optional | Defaults to 'user' if not specified. |
| divisions | array | List of division IDs the user belongs to. | optional | optional | Divisions control content access. |
| language | string | Preferred language code (e.g., en, fr). | optional | optional | |
| externalId | string | External identifier for IdP or SCIM provisioning. | optional | optional | Used for SCIM correlation. |
| createdAt | datetime | ISO 8601 timestamp of user creation. | auto-generated | immutable | |
| updatedAt | datetime | ISO 8601 timestamp of last update. | auto-generated | auto-updated |
Core endpoints
List users
- Method: GET
- URL:
https://{organization}.showpad.biz/api/v3/users.json - Watch out for: Pagination uses offset/limit query params. Total count is returned in the response envelope.
Request example
GET /api/v3/users.json?limit=10&offset=0
Authorization: Bearer {access_token}
Response example
{
"response": {
"status": 200,
"data": {
"items": [{"id":"abc123","email":"user@example.com","firstname":"Jane"}],
"total": 50,
"limit": 10,
"offset": 0
}
}
}
Get user by ID
- Method: GET
- URL:
https://{organization}.showpad.biz/api/v3/users/{id}.json - Watch out for: Returns 404 if user does not exist or is not accessible with the current token's scope.
Request example
GET /api/v3/users/abc123.json
Authorization: Bearer {access_token}
Response example
{
"response": {
"status": 200,
"data": {
"id": "abc123",
"email": "user@example.com",
"firstname": "Jane",
"lastname": "Doe",
"status": "active"
}
}
}
Create user
- Method: POST
- URL:
https://{organization}.showpad.biz/api/v3/users.json - Watch out for: Username must be unique. Duplicate email/username returns a 409 conflict error.
Request example
POST /api/v3/users.json
Authorization: Bearer {access_token}
Content-Type: application/json
{"email":"new@example.com","firstname":"John","lastname":"Smith","username":"new@example.com"}
Response example
{
"response": {
"status": 201,
"data": {
"id": "xyz789",
"email": "new@example.com",
"status": "active"
}
}
}
Update user
- Method: PUT
- URL:
https://{organization}.showpad.biz/api/v3/users/{id}.json - Watch out for: Showpad v3 uses PUT (full or partial update behavior may vary); verify field behavior against current docs.
Request example
PUT /api/v3/users/abc123.json
Authorization: Bearer {access_token}
Content-Type: application/json
{"firstname":"Jane","status":"inactive"}
Response example
{
"response": {
"status": 200,
"data": {
"id": "abc123",
"status": "inactive"
}
}
}
Delete user
- Method: DELETE
- URL:
https://{organization}.showpad.biz/api/v3/users/{id}.json - Watch out for: Deletion is permanent. Requires admin scope. Consider deactivating (status=inactive) instead of deleting to preserve audit history.
Request example
DELETE /api/v3/users/abc123.json
Authorization: Bearer {access_token}
Response example
{
"response": {
"status": 200,
"data": {}
}
}
List divisions
- Method: GET
- URL:
https://{organization}.showpad.biz/api/v3/divisions.json - Watch out for: Division IDs are required when assigning users to content groups. Fetch divisions before user creation if assigning.
Request example
GET /api/v3/divisions.json
Authorization: Bearer {access_token}
Response example
{
"response": {
"status": 200,
"data": {
"items": [{"id":"div1","name":"Sales EMEA"}]
}
}
}
Add user to division
- Method: POST
- URL:
https://{organization}.showpad.biz/api/v3/divisions/{divisionId}/users.json - Watch out for: Users must exist before being added to a division. Division membership controls content visibility.
Request example
POST /api/v3/divisions/div1/users.json
Authorization: Bearer {access_token}
Content-Type: application/json
{"userId":"abc123"}
Response example
{
"response": {
"status": 200,
"data": {}
}
}
Get SCIM Users (SCIM 2.0)
- Method: GET
- URL:
https://{organization}.showpad.biz/scim/v2/Users - Watch out for: SCIM endpoint requires a dedicated SCIM token generated in the Admin portal, separate from OAuth tokens. Requires Enterprise plan and SSO configured.
Request example
GET /scim/v2/Users?startIndex=1&count=10
Authorization: Bearer {scim_token}
Response example
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"totalResults": 50,
"Resources": [{"id":"abc123","userName":"user@example.com"}]
}
Rate limits, pagination, and events
Rate limits: Showpad enforces API rate limits but does not publicly document specific numeric thresholds in official docs.
Rate-limit headers: Unknown
Retry-After header: Unknown
Rate-limit notes: Official documentation does not specify rate limit values, headers, or Retry-After behavior. Contact Showpad support for current limits.
Pagination method: offset
Default page size: 10
Max page size: 100
Pagination pointer: offset and limit
Webhooks available: No
Webhook notes: Showpad's official developer documentation does not describe a native outbound webhook system for user lifecycle events.
Alternative event strategy: Use polling against the REST API (GET /users.json with updatedAt filtering) or rely on SCIM provisioning events from your IdP for user lifecycle automation.
SCIM API status
SCIM available: Yes
SCIM version: 2.0
Plan required: Expert (Enterprise)
Endpoint: https://{organization}.showpad.biz/scim/v2
Supported operations: GET /Users – list users, GET /Users/{id} – get user by ID, POST /Users – create user, PUT /Users/{id} – replace user, PATCH /Users/{id} – update user attributes, DELETE /Users/{id} – deprovision user, GET /Groups – list groups/divisions, POST /Groups – create group, PATCH /Groups/{id} – update group membership
Limitations:
- Requires SSO (SAML) to be configured before SCIM provisioning can be enabled.
- SCIM token is generated separately from OAuth tokens in the Admin portal.
- Only available on the Expert (Enterprise) plan tier.
- Officially documented IdP integrations are Okta and Microsoft Entra ID (Azure AD); other IdPs may work but are not officially supported.
- Group provisioning maps to Showpad Divisions; not all Division attributes may be settable via SCIM.
Common scenarios
Three automation scenarios are well-supported by the API.
First, provisioning a new sales rep requires a two-step sequence: POST /api/v3/users.json to create the account, then a separate POST /api/v3/divisions/{divisionId}/users.json to assign content access
skipping the second call leaves the user with no visible content.
Second, deprovisioning should use PUT /api/v3/users/{id}.json with {"status": "inactive"} rather than DELETE;
deletion is permanent, removes content sharing history, and requires admin scope.
Third, SCIM 2.0 auto-provisioning via Okta or Microsoft Entra ID is available on the Expert plan, using a dedicated SCIM bearer token generated separately from OAuth tokens in Admin > Integrations > SCIM
this token must be regenerated and re-entered in the IdP if rotated.
SSO (SAML) must remain active for SCIM to function;
disabling SSO breaks provisioning silently.
Provision a new sales rep and assign to a division
- Authenticate via OAuth 2.0 client credentials to obtain an access token.
- GET /api/v3/divisions.json to retrieve the target division ID (e.g., 'Sales EMEA').
- POST /api/v3/users.json with email, firstname, lastname, username, and role='user'.
- Extract the new user's id from the 201 response.
- POST /api/v3/divisions/{divisionId}/users.json with the new userId to assign content access.
Watch out for: Division assignment is a separate API call after user creation. Skipping it leaves the user with no content access.
Deprovision a user when they leave the organization
- Authenticate via OAuth 2.0 to obtain an access token with admin scope.
- GET /api/v3/users.json?username={email} to look up the user's Showpad ID.
- PUT /api/v3/users/{id}.json with {"status": "inactive"} to deactivate without data loss.
- Optionally DELETE /api/v3/users/{id}.json for full removal if data retention is not required.
Watch out for: Deletion is irreversible and removes the user's content sharing history. Prefer deactivation for audit trail preservation.
Set up SCIM auto-provisioning via Okta
- Confirm the Showpad account is on the Expert (Enterprise) plan.
- Configure SAML SSO in Showpad Admin > Integrations > SSO and verify it is active.
- In Showpad Admin > Integrations > SCIM, generate a SCIM bearer token and copy the SCIM base URL.
- In Okta, add the Showpad application from the Okta Integration Network.
- In the Okta app's Provisioning tab, enter the Showpad SCIM base URL and bearer token.
- Enable Create Users, Update User Attributes, and Deactivate Users in Okta provisioning settings.
- Assign users or groups in Okta to trigger initial provisioning to Showpad.
Watch out for: The SCIM token is separate from OAuth tokens and must be regenerated in Showpad if rotated. SSO must remain active; disabling SSO will break SCIM provisioning.
Why building this yourself is a trap
The primary integration trap in Showpad's API is the assumption that user creation completes provisioning. Division assignment is a fully separate API call with its own endpoint and failure mode - a user created without a subsequent division assignment is active but content-blind, and the API returns no warning.
A second trap: the v3 API uses PUT for user updates (PUT /api/v3/users/{id}.json), but full versus partial update behavior is not explicitly guaranteed in public documentation; validate field-level behavior against your specific plan's API version before building update logic.
A third caveat applies to teams using Stitchflow or any MCP server with 60+ deep IT/identity integrations: the absence of native webhooks means any real-time identity graph sync must be driven by the IdP's SCIM events (Expert plan only) or by scheduled polling
there is no push-based notification path for user lifecycle changes on lower tiers.
Automate Showpad 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.