Summary and recommendation
PandaDoc exposes a REST API at https://api.pandadoc.com/public/v1 supporting API Key and OAuth 2.0 (Authorization Code flow) authentication. API access requires at minimum a Business plan; Starter plan accounts cannot register OAuth applications or use the API.
The member object surfaces `user_id`, `membership_id`, `email`, `role`, `is_admin`, `status`, `workspace_id`, and `avatar` fields - note that `membership_id` (not `user_id`) is the required path parameter for all single-member operations.
The API is workspace-scoped: there is no org-wide user management surface. Multi-workspace organizations must maintain separate API keys or OAuth tokens per workspace, which complicates identity graph construction across the full PandaDoc footprint. Rate limits are not fully published; HTTP 429 responses should be handled with exponential backoff.
API quick reference
| Has user API | Yes |
| Auth method | API Key (header) or OAuth 2.0 (Authorization Code flow) |
| Base URL | Official docs |
| SCIM available | Yes |
| SCIM plan required | Enterprise (SSO prerequisite required) |
Authentication
Auth method: API Key (header) or OAuth 2.0 (Authorization Code flow)
Setup steps
- Log in to PandaDoc and navigate to Settings > Integrations > API.
- Generate an API key for server-to-server use, or register an OAuth 2.0 application to obtain client_id and client_secret.
- For OAuth 2.0: redirect users to https://app.pandadoc.com/oauth2/authorize with required scopes, exchange the returned code for an access token at https://api.pandadoc.com/oauth2/access_token.
- Pass the API key as header 'Authorization: API-Key
' or the OAuth token as 'Authorization: Bearer ' on all requests. - API access (including OAuth app creation) requires at minimum a Business plan.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| read+write | Full read and write access to documents, templates, and workspace resources. | Creating, updating, and reading documents and members |
| read | Read-only access to workspace resources. | Listing workspace members and documents |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| user_id | string | Unique PandaDoc user identifier. | system-assigned | immutable | UUID format. |
| string | User's email address. | required | not updatable via API | Primary identifier for invitations. | |
| first_name | string | User's first name. | optional | not exposed in member API | Returned in member list responses. |
| last_name | string | User's last name. | optional | not exposed in member API | Returned in member list responses. |
| role | string | Workspace role assigned to the member (e.g., 'Manager', 'User'). | optional | supported | Role names are workspace-defined. |
| membership_id | string | Unique identifier for the user's workspace membership record. | system-assigned | immutable | Used in member-specific endpoint paths. |
| workspace_id | string | Identifier of the workspace the member belongs to. | system-assigned | immutable | |
| status | string | Membership status (e.g., 'active', 'pending'). | system-assigned | read-only | Pending until invitation is accepted. |
| avatar | string (URL) | URL to the user's avatar image. | not applicable | not applicable | Read-only; set by user in profile. |
| is_admin | boolean | Whether the user has workspace admin privileges. | optional | supported |
Core endpoints
List workspace members
- Method: GET
- URL:
https://api.pandadoc.com/public/v1/members - Watch out for: Returns members of the authenticated user's current workspace only. Pagination uses 'page' and 'count' query params.
Request example
GET /public/v1/members?page=1&count=50
Authorization: API-Key <key>
Response example
{
"results": [
{"user_id": "abc123", "email": "user@example.com",
"first_name": "Jane", "last_name": "Doe",
"role": "User", "status": "active"}
]
}
Get a workspace member
- Method: GET
- URL:
https://api.pandadoc.com/public/v1/members/{membership_id} - Watch out for: Requires membership_id, not user_id. Obtain membership_id from the list endpoint.
Request example
GET /public/v1/members/mem_abc123
Authorization: API-Key <key>
Response example
{
"user_id": "abc123",
"email": "user@example.com",
"first_name": "Jane",
"role": "Manager",
"status": "active"
}
Invite a new member to workspace
- Method: POST
- URL:
https://api.pandadoc.com/public/v1/members - Watch out for: Sends an email invitation; user status remains 'pending' until accepted. Cannot pre-set password via API.
Request example
POST /public/v1/members
Authorization: API-Key <key>
Content-Type: application/json
{"email": "newuser@example.com", "role": "User"}
Response example
{
"membership_id": "mem_xyz789",
"email": "newuser@example.com",
"status": "pending"
}
Update a workspace member's role
- Method: PATCH
- URL:
https://api.pandadoc.com/public/v1/members/{membership_id} - Watch out for: Only role and is_admin fields are updatable via this endpoint. Email and name changes are not supported.
Request example
PATCH /public/v1/members/mem_xyz789
Authorization: API-Key <key>
Content-Type: application/json
{"role": "Manager"}
Response example
{
"membership_id": "mem_xyz789",
"role": "Manager",
"status": "active"
}
Delete (remove) a workspace member
- Method: DELETE
- URL:
https://api.pandadoc.com/public/v1/members/{membership_id} - Watch out for: Removes the user from the workspace; does not delete the PandaDoc account itself. Documents owned by the user are retained.
Request example
DELETE /public/v1/members/mem_xyz789
Authorization: API-Key <key>
Response example
HTTP 204 No Content
List workspaces
- Method: GET
- URL:
https://api.pandadoc.com/public/v1/workspaces - Watch out for: Only workspaces the authenticated user belongs to are returned. Multi-workspace management requires separate API keys per workspace.
Request example
GET /public/v1/workspaces
Authorization: API-Key <key>
Response example
{
"results": [
{"id": "ws_001", "name": "Acme Corp", "is_default": true}
]
}
Get current authenticated user
- Method: GET
- URL:
https://api.pandadoc.com/public/v1/members/current - Watch out for: Useful for validating API key identity and confirming workspace context before performing member operations.
Request example
GET /public/v1/members/current
Authorization: API-Key <key>
Response example
{
"user_id": "abc123",
"email": "admin@example.com",
"is_admin": true,
"workspace_id": "ws_001"
}
Rate limits, pagination, and events
- Rate limits: PandaDoc enforces per-minute and per-day request limits. Exact limits are not fully published in official docs; the developer portal notes limits vary by plan.
- Rate-limit headers: Yes
- Retry-After header: No
- Rate-limit notes: HTTP 429 is returned when limits are exceeded. Official per-plan rate limit values are not publicly documented. Retry with exponential backoff on 429 responses.
- Pagination method: offset
- Default page size: 50
- Max page size: 100
- Pagination pointer: page / count
| Plan | Limit | Concurrent |
|---|---|---|
| Business | ~2,000 requests/day (unofficial community reports); official limit not published | 0 |
| Enterprise | Higher limits; contact PandaDoc for specifics | 0 |
- Webhooks available: Yes
- Webhook notes: PandaDoc supports webhooks for document lifecycle events. Webhooks are configured in the PandaDoc dashboard under Settings > Integrations > Webhooks. There are no dedicated user/member lifecycle webhook events (e.g., member added/removed).
- Alternative event strategy: Poll GET /public/v1/members on a schedule to detect membership changes, as no member-lifecycle webhook events are available.
- Webhook events: document_state_changed, document_updated, document_deleted, recipient_completed, document_viewed
SCIM API status
SCIM available: Yes
SCIM version: 2.0
Plan required: Enterprise (SSO prerequisite required)
Endpoint: https://app.pandadoc.com/scim/v2
Supported operations: Create user (POST /Users), Deactivate/delete user (DELETE /Users/{id} or PATCH active=false), List users (GET /Users), Get user (GET /Users/{id})
Limitations:
- SSO must be configured and active before SCIM can be enabled.
- Enterprise plan required; not available on Starter or Business.
- User attribute updates (name, email changes) via SCIM PATCH may have limited support - community sources indicate create and deactivate are the primary supported operations.
- Group/team provisioning support is limited; verify with PandaDoc support for current group SCIM support.
- Supported IdPs: Okta, Microsoft Entra ID (Azure AD), OneLogin.
- Google Workspace SSO/SCIM is not officially supported.
- Pricing seed notes indicate SCIM 1.1 behavior in some contexts - confirm current SCIM 2.0 endpoint availability with PandaDoc support.
Common scenarios
Three primary automation scenarios are supported by the current API surface:
Onboard via REST (Business+): POST to
/public/v1/memberswithemailandrole. The response returnsmembership_idandstatus: pending. The user must accept the email invitation before status transitions toactive- poll GET/public/v1/members/{membership_id}to detect activation. There is no way to bypass the invitation flow via REST; for zero-touch provisioning, SCIM (Enterprise only) is required.Deprovision via SCIM (Enterprise): Configure SCIM at https://app.pandadoc.com/scim/v2 with a supported IdP (Okta, Microsoft Entra ID, or OneLogin - Google Workspace is not officially supported). Deactivating the user in the IdP triggers a SCIM PATCH (
active=false) or DELETE. If SSO is disabled, SCIM provisioning stops functioning entirely. Documents owned by the deprovisioned user are retained.Membership audit: Paginate GET
/public/v1/members?page=1&count=100(max page size 100, offset-based) to retrieve all members with role,is_admin, and status fields. Cross-reference against your HR system or identity graph to surface orphaned active accounts. Repeat per workspace; no cross-workspace aggregation endpoint exists.
Onboard a new employee to a PandaDoc workspace
- POST https://api.pandadoc.com/public/v1/members with {"email": "newuser@company.com", "role": "User"} using an admin API key.
- Receive a 201 response with membership_id and status='pending'.
- Poll GET /public/v1/members/{membership_id} until status changes to 'active' (user has accepted the invitation).
- Optionally PATCH /public/v1/members/{membership_id} to update role after activation.
Watch out for: The user must manually accept the email invitation before they can use PandaDoc. There is no way to bypass the invitation flow via the REST API. For automated provisioning without manual acceptance, use SCIM (Enterprise only).
Deprovision a departing employee via SCIM (Enterprise)
- Ensure SCIM is configured in PandaDoc under Settings > Security > SCIM with your IdP (Okta, Entra ID, or OneLogin).
- Deactivate or remove the user in your IdP.
- The IdP sends a SCIM PATCH (active=false) or DELETE to https://app.pandadoc.com/scim/v2/Users/{id}.
- PandaDoc deactivates the user's workspace access automatically.
- Verify removal by calling GET https://api.pandadoc.com/public/v1/members and confirming the user is no longer listed as active.
Watch out for: SCIM requires Enterprise plan and active SSO. If SSO is disabled, SCIM provisioning will also stop functioning. Documents owned by the deprovisioned user are retained in the workspace.
Audit all workspace members and their roles
- GET https://api.pandadoc.com/public/v1/members?page=1&count=100 with admin API key.
- Iterate through paginated results (increment 'page' until results array is empty or fewer than 'count' items returned).
- For each member, record user_id, email, role, is_admin, and status fields.
- Cross-reference against your HR system or IdP to identify orphaned accounts (status='active' but user no longer employed).
- Call DELETE /public/v1/members/{membership_id} for any accounts to be removed.
Watch out for: The member list API is scoped to a single workspace. If your organization uses multiple PandaDoc workspaces, repeat this process with the API key for each workspace. There is no cross-workspace admin API.
Why building this yourself is a trap
The most significant integration caveat is the gap between what SCIM advertises and what it reliably delivers: community sources indicate that user attribute updates (name, email changes) via SCIM PATCH have limited support, making PandaDoc's SCIM implementation closer to create/deactivate-only in practice.
Email addresses cannot be updated via the member REST API either - users must change their own email through profile settings, breaking any automated identity graph sync that depends on canonical email as a join key.
OAuth 2.0 access tokens expire and require refresh token handling; API keys do not expire but carry no automatic rotation. The PATCH /public/v1/members/{membership_id} endpoint only accepts role and is_admin updates - it cannot be used to correct name or contact data pushed from an upstream identity source.
Teams building a full identity graph against PandaDoc should treat it as a write-limited node: reliable for provisioning and deprovisioning, unreliable for ongoing attribute synchronization without manual fallback.
Automate PandaDoc 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.