Summary and recommendation
ProofHub exposes a REST API at `https://{account}.proofhub.com/api/v3` authenticated via Bearer token generated in Account Settings → API.
The People endpoints cover full CRUD: `GET /people` (paginated, 25 per page, max 100), `POST /people` (triggers invitation email immediately), `PUT /people/{id}` (full-replacement semantics - omitted fields may be cleared), and `DELETE /people/{id}` (permanent, irreversible, removes user from all projects).
Project-level membership is managed separately via `/projects/{project_id}/people`, and account-level roles differ from project-level roles - both contexts must be checked when building an identity graph across the account. No SCIM 2.0 endpoint is documented; no native webhooks exist, so any external directory sync must rely on scheduled polling of `/people`.
API quick reference
| Has user API | Yes |
| Auth method | API Key (Bearer Token) |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Ultimate Control |
Authentication
Auth method: API Key (Bearer Token)
Setup steps
- Log in to ProofHub as an Administrator.
- Navigate to Account Settings → API.
- Generate a personal API token.
- Include the token in all requests as an HTTP header: 'Authorization: Bearer {api_token}'.
- Also set 'Content-Type: application/json' and 'User-Agent: {YourAppName}' headers.
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | integer | Unique user identifier | auto-assigned | read-only | |
| name | string | Full display name | required | optional | |
| string | User email address | required | optional | Must be unique within the account | |
| username | string | Login username | optional | optional | |
| role | string | Account-level role (admin, member, etc.) | optional | optional | Custom roles available on Ultimate Control plan |
| company | string | Company or organization name | optional | optional | |
| phone | string | Phone number | optional | optional | |
| timezone | string | User's timezone string | optional | optional | |
| avatar_url | string | URL to user avatar image | read-only | read-only | |
| status | string | Active/inactive status | auto | optional | |
| created_at | datetime | ISO 8601 timestamp of account creation | auto-assigned | read-only | |
| updated_at | datetime | ISO 8601 timestamp of last update | auto-assigned | auto-assigned |
Core endpoints
List all people (users)
- Method: GET
- URL:
https://{account}.proofhub.com/api/v3/people - Watch out for: Returns all account members. Paginate using ?page= for accounts with many users.
Request example
GET /api/v3/people
Authorization: Bearer {api_token}
User-Agent: MyApp
Response example
[
{
"id": 101,
"name": "Jane Doe",
"email": "jane@example.com",
"role": "admin",
"created_at": "2024-01-10T08:00:00Z"
}
]
Get a single person
- Method: GET
- URL:
https://{account}.proofhub.com/api/v3/people/{person_id} - Watch out for: Returns 404 if the person_id does not exist or belongs to a different account.
Request example
GET /api/v3/people/101
Authorization: Bearer {api_token}
User-Agent: MyApp
Response example
{
"id": 101,
"name": "Jane Doe",
"email": "jane@example.com",
"role": "admin"
}
Invite a person (create user)
- Method: POST
- URL:
https://{account}.proofhub.com/api/v3/people - Watch out for: An invitation email is sent automatically. Duplicate email addresses return a 422 error.
Request example
POST /api/v3/people
Authorization: Bearer {api_token}
Content-Type: application/json
{"name":"John Smith","email":"john@example.com","role":"member"}
Response example
{
"id": 202,
"name": "John Smith",
"email": "john@example.com",
"role": "member",
"created_at": "2025-06-01T10:00:00Z"
}
Update a person
- Method: PUT
- URL:
https://{account}.proofhub.com/api/v3/people/{person_id} - Watch out for: Full PUT semantics; omitted optional fields may be cleared. Verify field behavior before bulk updates.
Request example
PUT /api/v3/people/202
Authorization: Bearer {api_token}
Content-Type: application/json
{"name":"John A. Smith","phone":"+1-555-0100"}
Response example
{
"id": 202,
"name": "John A. Smith",
"phone": "+1-555-0100"
}
Remove a person
- Method: DELETE
- URL:
https://{account}.proofhub.com/api/v3/people/{person_id} - Watch out for: Deletion is permanent and removes the user from all projects. Cannot be undone via API.
Request example
DELETE /api/v3/people/202
Authorization: Bearer {api_token}
User-Agent: MyApp
Response example
HTTP 204 No Content
List project members
- Method: GET
- URL:
https://{account}.proofhub.com/api/v3/projects/{project_id}/people - Watch out for: Project-level roles differ from account-level roles. Check both contexts when auditing permissions.
Request example
GET /api/v3/projects/55/people
Authorization: Bearer {api_token}
User-Agent: MyApp
Response example
[
{"id": 101, "name": "Jane Doe", "role": "manager"},
{"id": 202, "name": "John Smith", "role": "member"}
]
Add person to project
- Method: POST
- URL:
https://{account}.proofhub.com/api/v3/projects/{project_id}/people - Watch out for: User must already exist as an account member before being added to a project.
Request example
POST /api/v3/projects/55/people
Authorization: Bearer {api_token}
Content-Type: application/json
{"person_id": 202}
Response example
{
"id": 202,
"name": "John Smith",
"role": "member"
}
Remove person from project
- Method: DELETE
- URL:
https://{account}.proofhub.com/api/v3/projects/{project_id}/people/{person_id} - Watch out for: Removes project access only; does not delete the account-level user record.
Request example
DELETE /api/v3/projects/55/people/202
Authorization: Bearer {api_token}
User-Agent: MyApp
Response example
HTTP 204 No Content
Rate limits, pagination, and events
- Rate limits: ProofHub enforces a rate limit of 30 requests per 10 seconds per API token.
- Rate-limit headers: Yes
- Retry-After header: No
- Rate-limit notes: When the limit is exceeded, the API returns HTTP 429. The response includes rate-limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset). Retry after the reset timestamp.
- Pagination method: offset
- Default page size: 25
- Max page size: 100
- Pagination pointer: page
| Plan | Limit | Concurrent |
|---|---|---|
| All plans | 30 requests per 10 seconds | 0 |
- Webhooks available: No
- Webhook notes: ProofHub does not document a native outbound webhook system in its official API documentation as of the research date.
- Alternative event strategy: Poll the /people endpoint periodically to detect user additions, updates, or removals.
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Ultimate Control
- Endpoint: Not documented
Limitations:
- No SCIM 2.0 endpoint is documented or available in ProofHub's official API or help documentation.
- SSO via Okta is supported but automated SCIM provisioning/deprovisioning is not natively available.
- Ultimate Control plan is required for SSO; SCIM support status remains undocumented.
Common scenarios
Three core automation scenarios are supported by the API. Onboarding: POST /people to create the account record and trigger the invite email, then POST /projects/{project_id}/people for each project assignment using the returned id.
Offboarding: GET /people to resolve the user's id by email, optionally enumerate project memberships via /projects/{project_id}/people for an audit trail, then DELETE /people/{person_id} - this call is permanent and cannot be undone via API, so person_id must be verified before execution.
Directory sync: paginate GET /people? page=N to retrieve the full user list, diff against the external source by email, and apply POST/PUT/DELETE as needed.
Because there are no webhooks, sync jobs must be scheduled; large accounts will issue many paginated requests, increasing exposure to the 30-requests-per-10-seconds rate limit. Implement exponential backoff on HTTP 429 and respect the X-RateLimit-Reset header.
Onboard a new employee
- POST /api/v3/people with name, email, and role to create the account-level user (invitation email sent automatically).
- Retrieve the new user's id from the POST response.
- POST /api/v3/projects/{project_id}/people with the new person_id for each project they should join.
Watch out for: The invited user must accept the email invitation before they can actively use ProofHub, but the API record is created immediately.
Offboard a departing employee
- GET /api/v3/people to locate the user's id by email.
- GET /api/v3/projects to enumerate all projects, then GET /api/v3/projects/{project_id}/people to confirm project memberships (optional audit step).
- DELETE /api/v3/people/{person_id} to permanently remove the user from the account and all projects.
Watch out for: Deletion is irreversible via API. Verify the correct person_id before issuing the DELETE request.
Sync account users to an external directory
- GET /api/v3/people?page=1 and paginate through all pages (default 25 per page) to retrieve the full user list.
- Compare returned records against the external directory by email field.
- POST new users, PUT changed fields for existing users, and DELETE removed users as needed.
- Implement exponential backoff when HTTP 429 is received, respecting X-RateLimit-Reset.
Watch out for: No webhook support means sync must be scheduled (e.g., hourly polling). Large accounts may require many paginated requests, increasing rate-limit exposure.
Why building this yourself is a trap
Several non-obvious constraints affect production integrations. The API token is bound to the generating user - if that user is removed, every downstream call using their token fails silently from the perspective of dependent systems; token ownership should be assigned to a dedicated service account.
PUT /people/{id} uses full-replacement semantics for at least some fields, meaning a partial update payload can clear data; test against a non-critical record before running bulk updates. Inviting a user via POST /people dispatches the invitation email immediately with no dry-run or suppression option, which matters in staging environments.
The User-Agent header is required on every request; omitting it may result in rejected calls. No official SDK is published, so all integrations require raw HTTP.
For teams building a unified identity graph across their SaaS stack, the absence of SCIM and webhooks means ProofHub user state must be inferred from periodic API snapshots rather than event-driven signals - a meaningful architectural gap when ProofHub is one node in a broader identity graph that includes HR systems, IdPs, and other SaaS tools.
Automate ProofHub 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.