Summary and recommendation
The Follow Up Boss REST API (base URL: https://api.followupboss.com/v1) authenticates via HTTP Basic Auth using the API key as the username and an empty string as the password not a Bearer token.
The key is account-scoped and admin-level;
there is no per-user OAuth or granular scope system.
Core user lifecycle operations are available: GET, POST, PUT, and DELETE on /v1/users, with offset/limit pagination (default 20, max 100 per page) and a rate limit of 1,000 requests per 10-minute window per API key (HTTP 429 on breach).
No SCIM 2.0 endpoint exists, meaning any IdP-driven provisioning against Okta, Entra ID, Google Workspace, or OneLogin requires a custom integration built on top of this REST API
a consideration for teams building an identity graph that expects standardized provisioning contracts.
API quick reference
| Has user API | Yes |
| Auth method | HTTP Basic Auth (API key as username, empty password) |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | N/A |
Authentication
Auth method: HTTP Basic Auth (API key as username, empty password)
Setup steps
- Log in to Follow Up Boss as an admin.
- Navigate to Admin > API in account settings.
- Generate or copy the API key.
- Use the API key as the HTTP Basic Auth username with an empty password in all requests.
- Include the header: Authorization: Basic base64(apiKey:)
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | integer | Unique user identifier | auto-assigned | read-only | |
| name | string | Full name of the user | required | optional | |
| string | Primary email address | required | optional | Must be unique within the account | |
| phone | string | Primary phone number | optional | optional | |
| role | string | User role within the account (e.g., Admin, Agent) | optional | optional | |
| isAdmin | boolean | Whether the user has admin privileges | optional | optional | |
| teamId | integer | ID of the team the user belongs to | optional | optional | |
| created | datetime | ISO 8601 timestamp of user creation | auto-assigned | read-only | |
| updated | datetime | ISO 8601 timestamp of last update | auto-assigned | auto-assigned | |
| avatar | string (URL) | URL of the user's profile avatar | optional | optional | |
| timezone | string | User's timezone (e.g., America/New_York) | optional | optional | |
| activeFlag | boolean | Whether the user account is active | optional | optional | Deactivated users cannot log in |
Core endpoints
List Users
- Method: GET
- URL:
https://api.followupboss.com/v1/users - Watch out for: Returns only users belonging to the authenticated API key's account. Deleted/deactivated users may not appear.
Request example
GET /v1/users?limit=20&offset=0
Authorization: Basic <base64(apiKey:)>
Response example
{
"users": [
{"id": 1, "name": "Jane Smith", "email": "jane@example.com", "role": "Admin"}
],
"_metadata": {"total": 45, "limit": 20, "offset": 0}
}
Get User by ID
- Method: GET
- URL:
https://api.followupboss.com/v1/users/{id} - Watch out for: Returns 404 if the user ID does not exist in the account.
Request example
GET /v1/users/42
Authorization: Basic <base64(apiKey:)>
Response example
{
"id": 42,
"name": "John Doe",
"email": "john@example.com",
"role": "Agent",
"isAdmin": false
}
Create User
- Method: POST
- URL:
https://api.followupboss.com/v1/users - Watch out for: Creating a user counts against the account's seat limit. Duplicate email addresses return a 422 error.
Request example
POST /v1/users
Content-Type: application/json
{"name": "Alice Brown", "email": "alice@example.com", "role": "Agent"}
Response example
{
"id": 99,
"name": "Alice Brown",
"email": "alice@example.com",
"role": "Agent",
"created": "2024-01-15T10:00:00Z"
}
Update User
- Method: PUT
- URL:
https://api.followupboss.com/v1/users/{id} - Watch out for: Uses PUT (full or partial update accepted in practice). Omitting fields may not clear them; verify behavior against current docs.
Request example
PUT /v1/users/99
Content-Type: application/json
{"name": "Alice B. Brown", "phone": "+15551234567"}
Response example
{
"id": 99,
"name": "Alice B. Brown",
"phone": "+15551234567",
"updated": "2024-01-16T08:30:00Z"
}
Delete User
- Method: DELETE
- URL:
https://api.followupboss.com/v1/users/{id} - Watch out for: Deleting a user is irreversible via API. Leads assigned to the deleted user may need reassignment beforehand.
Request example
DELETE /v1/users/99
Authorization: Basic <base64(apiKey:)>
Response example
HTTP 204 No Content
List Teams
- Method: GET
- URL:
https://api.followupboss.com/v1/teams - Watch out for: Team membership is managed at the user level via teamId; there is no separate team-member assignment endpoint documented.
Request example
GET /v1/teams
Authorization: Basic <base64(apiKey:)>
Response example
{
"teams": [
{"id": 5, "name": "East Coast Team", "memberCount": 8}
]
}
Rate limits, pagination, and events
- Rate limits: Follow Up Boss enforces rate limits per API key. The official docs state a limit of 1,000 requests per 10 minutes per API key.
- Rate-limit headers: Yes
- Retry-After header: No
- Rate-limit notes: When the limit is exceeded the API returns HTTP 429. The docs mention rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) but do not explicitly document a Retry-After header.
- Pagination method: offset
- Default page size: 20
- Max page size: 100
- Pagination pointer: offset / limit
| Plan | Limit | Concurrent |
|---|---|---|
| All plans | 1,000 requests per 10 minutes | 0 |
- Webhooks available: Yes
- Webhook notes: Follow Up Boss supports outbound webhooks that fire on CRM events. Webhooks are configured in the admin UI or via the API under /webhooks. They deliver JSON payloads via HTTP POST to a configured URL.
- Alternative event strategy: No dedicated user-lifecycle webhook events (e.g., user.created, user.deactivated) are documented. Polling the /users endpoint is the recommended approach for user-change detection.
- Webhook events: lead.created, lead.updated, lead.deleted, appointment.created, appointment.updated, note.created, task.created, task.updated
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: N/A
- Endpoint: Not documented
Limitations:
- Follow Up Boss does not offer a native SCIM 2.0 endpoint.
- No IdP connectors (Okta, Entra ID, Google Workspace, OneLogin) are officially supported for SCIM provisioning.
- User provisioning must be performed via the REST API or manually through the admin UI.
Common scenarios
Three integration scenarios are well-supported by the documented endpoints.
First, provisioning a new agent to a team: GET /v1/teams to retrieve the target teamId, then POST /v1/users with role='Agent' and the resolved teamId;
a 201 response confirms the record.
Second, deprovisioning a departing user: list their assigned leads via GET /v1/people?userId={id}, issue individual PUT /v1/people/{leadId} calls to reassign each lead's ownerId, then DELETE /v1/users/{id}
there is no bulk-reassign endpoint, so large lead counts require batching within the rate limit.
Third, syncing from an external HR system: paginate GET /v1/users exhausting _metadata.total, diff against the HR roster by email, then POST/PUT/DELETE accordingly;
because no user-lifecycle webhooks exist, this sync must be scheduled (e.g., nightly polling).
Provision a new agent and assign to a team
- GET /v1/teams to retrieve the target team ID.
- POST /v1/users with name, email, role='Agent', and teamId set to the retrieved team ID.
- Verify the response returns HTTP 201 with the new user's id.
- Optionally GET /v1/users/{id} to confirm the user record is correct.
Watch out for: If the account has reached its seat limit, the POST will fail. Verify seat availability in the admin UI or by checking the current user count against the plan limit before provisioning.
Deprovision a departing user and reassign their leads
- GET /v1/users to identify the departing user's id.
- GET /v1/people?userId={id} to list leads assigned to that user.
- PUT /v1/people/{leadId} for each lead to reassign ownerId to a replacement agent.
- DELETE /v1/users/{id} to remove the user from the account.
Watch out for: Lead reassignment must be done before deletion; there is no bulk-reassign endpoint, so this may require multiple PUT calls. Deletion is permanent and cannot be undone via API.
Sync user roster from an external HR system
- GET /v1/users?limit=100&offset=0 (paginate until _metadata.total is exhausted) to build a current user list.
- Compare against the HR system's active employee list by email.
- POST /v1/users for net-new employees not present in Follow Up Boss.
- PUT /v1/users/{id} to update changed fields (name, phone, role) for existing users.
- DELETE /v1/users/{id} for users present in Follow Up Boss but terminated in the HR system.
Watch out for: No webhook fires on user changes, so this sync must be scheduled (e.g., nightly). Rate limit of 1,000 req/10 min may require batching for large rosters.
Why building this yourself is a trap
The absence of SCIM and user-lifecycle webhooks is the primary integration trap. Without SCIM, every IdP connector that expects a /scim/v2/Users endpoint will fail silently or require a middleware translation layer, adding surface area to the identity graph that must be maintained independently.
Without user.created or user.deactivated webhook events, any downstream system relying on real-time deprovisioning signals must fall back to polling - introducing a latency window where a terminated user's access may persist until the next scheduled sync cycle. Additionally, the PUT /v1/users/{id} endpoint uses full-or-partial update semantics that are not precisely documented;
field-clearing behavior should be validated against live responses before relying on it in automated workflows. Creating users via API consumes paid seats, so provisioning logic must gate on seat availability or handle 4xx errors gracefully to avoid silent provisioning failures.
Automate Follow Up Boss 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.