Summary and recommendation
Podio's REST API authenticates via OAuth 2.0 (Authorization Code, Client Credentials, or Password grant) against https://api.podio.com. There are no named OAuth scopes - access control is entirely role-based, meaning org-admin operations require a token obtained by an account that holds org admin rights.
Rate limits are enforced per client_id at 250 authenticated requests per hour; the non-standard HTTP 420 status (not 429) is returned on breach, with a Retry-After header and X-Rate-Limit-Remaining for quota tracking.
Pagination is offset/limit-based (default 20, max 100 per page). There is no cursor pagination, which creates a risk of missed or duplicated records if membership changes during iteration - a relevant caveat for any identity graph sync that pages through GET /org/{org_id}/member/.
API quick reference
| Has user API | Yes |
| Auth method | OAuth 2.0 |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Enterprise |
Authentication
Auth method: OAuth 2.0
Setup steps
- Register an API application at https://podio.com/settings/api to obtain a client_id and client_secret.
- Choose an OAuth 2.0 grant type: Authorization Code (user-facing apps), Client Credentials (server-to-server), or Password (trusted apps).
- Exchange credentials for an access_token and refresh_token via POST https://podio.com/oauth/token.
- Include the access token in all API requests as an Authorization header: 'Authorization: OAuth2 {access_token}'.
- Refresh the access token using the refresh_token before expiry (tokens expire after a set period).
Required scopes
| Scope | Description | Required for |
|---|---|---|
| Podio OAuth 2.0 does not use named permission scopes in the traditional sense; access is governed by the authenticated user's role and the API client's granted access level. | All API operations |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| user_id | integer | Unique Podio user identifier | system-assigned | immutable | |
| string | Primary email address of the user | required | updatable | Array of mail objects with type and value | |
| name | string | Full display name of the user | required | updatable | |
| profile | object | Contact/profile details (name, title, avatar, etc.) | optional | updatable | Nested object with profile_id, name, avatar, title, location, etc. |
| status | string | Account status (active, inactive, deleted) | system-assigned | read-only via user API | |
| locale | string | User's locale/language preference | optional | updatable | e.g. 'en_US' |
| timezone | string | User's timezone setting | optional | updatable | e.g. 'America/New_York' |
| avatar | integer | File ID of the user's avatar image | optional | updatable | |
| created_on | datetime | Timestamp when the user account was created | system-assigned | immutable | ISO 8601 format |
| last_seen_on | datetime | Timestamp of the user's last activity | system-assigned | system-managed | |
| type | string | User type (e.g. 'full', 'guest') | system-assigned | read-only | |
| flags | array | Feature flags or settings enabled for the user | system-assigned | partially updatable |
Core endpoints
Get current authenticated user
- Method: GET
- URL:
https://api.podio.com/user/ - Watch out for: Returns data for the token owner only; cannot retrieve arbitrary users without org-admin privileges.
Request example
GET /user/ HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Response example
{
"user_id": 12345,
"mail": [{"type":"primary","mail":"user@example.com"}],
"status": "active",
"locale": "en_US",
"timezone": "UTC"
}
Get user by ID
- Method: GET
- URL:
https://api.podio.com/user/{user_id} - Watch out for: Access may be restricted based on the requesting user's relationship to the target user (same org/space required).
Request example
GET /user/12345 HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Response example
{
"user_id": 12345,
"profile": {"name": "Jane Doe", "title": "Engineer"},
"status": "active"
}
Update current user properties
- Method: PUT
- URL:
https://api.podio.com/user/ - Watch out for: Only updates the authenticated user's own properties; no admin endpoint to update arbitrary users via this path.
Request example
PUT /user/ HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Content-Type: application/json
{"locale":"en_GB","timezone":"Europe/London"}
Response example
HTTP/1.1 204 No Content
Get organization members
- Method: GET
- URL:
https://api.podio.com/org/{org_id}/member/ - Watch out for: Requires the authenticated user to be an org admin. Supports offset/limit pagination.
Request example
GET /org/678/member/ HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Response example
[
{"user_id":12345,"role":"admin","profile":{"name":"Jane Doe"}},
{"user_id":12346,"role":"regular","profile":{"name":"John Smith"}}
]
Get organization member by user ID
- Method: GET
- URL:
https://api.podio.com/org/{org_id}/member/{user_id} - Watch out for: Org admin token required.
Request example
GET /org/678/member/12345 HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Response example
{
"user_id": 12345,
"role": "admin",
"profile": {"name": "Jane Doe", "title": "Engineer"}
}
Remove member from organization
- Method: DELETE
- URL:
https://api.podio.com/org/{org_id}/member/{user_id} - Watch out for: Permanently removes the user from the org. Cannot remove the last admin. Action is irreversible via API.
Request example
DELETE /org/678/member/12345 HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Response example
HTTP/1.1 204 No Content
Get space members
- Method: GET
- URL:
https://api.podio.com/space/{space_id}/member/ - Watch out for: Space admin or org admin token required. Pagination via offset/limit.
Request example
GET /space/999/member/ HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Response example
[
{"user_id":12345,"role":"admin"},
{"user_id":12346,"role":"regular"}
]
Add member to space
- Method: POST
- URL:
https://api.podio.com/space/{space_id}/member/ - Watch out for: Users must already exist in the org. Cannot create net-new Podio accounts via API; user provisioning requires the user to self-register or be invited via email.
Request example
POST /space/999/member/ HTTP/1.1
Host: api.podio.com
Authorization: OAuth2 {access_token}
Content-Type: application/json
{"users":[12346],"role":"regular"}
Response example
HTTP/1.1 204 No Content
Rate limits, pagination, and events
- Rate limits: Podio enforces rate limits per API client (client_id). Exceeding limits returns HTTP 420 with a Retry-After header.
- Rate-limit headers: Yes
- Retry-After header: Yes
- Rate-limit notes: HTTP 420 is returned when rate limited. The X-Rate-Limit-Limit and X-Rate-Limit-Remaining headers indicate current quota. Retry-After header specifies seconds to wait. Limits are per OAuth client_id, not per user.
- Pagination method: offset
- Default page size: 20
- Max page size: 100
- Pagination pointer: offset / limit
| Plan | Limit | Concurrent |
|---|---|---|
| All plans (per client_id) | 250 requests per hour (authenticated); lower limits may apply for unauthenticated requests | 0 |
- Webhooks available: Yes
- Webhook notes: Podio supports webhooks (called 'hooks') that can be registered on organizations, spaces, apps, and items. User-related events are limited; hooks are primarily item/app-centric.
- Alternative event strategy: No dedicated user.created or user.deactivated webhook events are documented. Poll GET /org/{org_id}/member/ for membership changes.
- Webhook events: hook.verify, item.create, item.update, item.delete, comment.create, app.create, app.update, space.create, space.update
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Enterprise
- Endpoint: Not documented
Limitations:
- SCIM provisioning is not documented in official Podio developer or help center documentation.
- SSO via SAML is supported (Okta, Entra ID, OneLogin) but automated SCIM user lifecycle management is not confirmed.
- User provisioning must be handled via Podio's native API or manual invitation flows.
Common scenarios
Three API scenarios cover the core identity lifecycle for Podio. For org-wide auditing to populate an identity graph, paginate GET /org/{org_id}/member/?
limit=100&offset=0, collecting user_id, status, last_seen_on, profile. name, and role fields; increment offset until the response array length falls below the requested limit.
For offboarding, there is no bulk-remove endpoint - each space requires a discrete DELETE /space/{space_id}/member/{user_id} call before the final DELETE /org/{org_id}/member/{user_id}; confirm removal with a GET that returns 404.
For HR-driven profile sync, PUT /user/profile/ updates profile fields but requires the target user's own OAuth token - an admin cannot update another user's profile on their behalf, making bulk sync impractical without per-user password grant authentication.
Critically, there is no API endpoint to create a net-new Podio account programmatically. User provisioning always requires a UI-initiated email invitation or self-registration, which is a hard constraint for any automated onboarding pipeline.
Audit all members of an organization
- Obtain an OAuth 2.0 access token using client credentials or password grant for an org admin account.
- GET https://api.podio.com/org/{org_id}/member/?limit=100&offset=0 to retrieve the first page of members.
- Increment offset by 100 and repeat until the returned array length is less than the requested limit.
- Collect user_id, role, profile.name, and status fields from each member object for the audit report.
Watch out for: The authenticated account must be an org admin. Offset-based pagination can miss users added/removed mid-iteration.
Remove a departed employee from all spaces and the organization
- Identify the user's user_id via GET /org/{org_id}/member/ filtered by email or name.
- Enumerate spaces via GET /org/{org_id}/space/ and for each space call DELETE /space/{space_id}/member/{user_id} to remove the user.
- Finally, call DELETE /org/{org_id}/member/{user_id} to remove the user from the organization entirely.
- Verify removal by attempting GET /org/{org_id}/member/{user_id} and confirming a 404 response.
Watch out for: There is no bulk-remove endpoint; each space removal is a separate API call. Removing from the org does not guarantee immediate space removal in all cases - explicit space removal is recommended first.
Sync user profile updates from an HR system
- Authenticate as the target user (password grant) or use an admin token with delegated access.
- PUT https://api.podio.com/user/ with updated fields (locale, timezone) for self-updates.
- For profile fields (title, location), use PUT /user/profile/ with the relevant profile fields.
- Handle HTTP 420 rate limit responses by reading the Retry-After header and pausing before retrying.
Watch out for: Podio does not allow an admin to update another user's profile via API on their behalf without that user's OAuth token. Bulk profile sync requires per-user authentication, which is impractical at scale without the password grant flow.
Why building this yourself is a trap
The most significant integration trap is the absence of SCIM. Podio supports SAML 2.0 SSO (Okta, Entra ID, OneLogin) on Premium, but automated user lifecycle management - provisioning, deprovisioning, attribute sync - is not available through any documented SCIM endpoint.
IdP-connected environments cannot rely on standard push provisioning; all lifecycle events must be handled via Podio's native API or manual flows.
For teams building identity graph coverage across their SaaS stack, Podio surfaces last_seen_on and status fields on the user object as the primary signals for detecting stale accounts. Without webhook events for user.created or user.deactivated, the only reliable detection method is polling GET /org/{org_id}/member/ on a schedule, adding latency to any real-time deprovisioning workflow.
The 420 rate limit and offset pagination constraints compound this for orgs with large member counts.
Automate Podio 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.