Summary and recommendation
JustCall's REST API (base URL: https://api.justcall.io/v1) supports full agent lifecycle management: create, read, update, and delete. Authentication is API Key + Secret encoded as Base64 in a standard Authorization: Basic header - not OAuth 2.0 or bearer tokens. API keys are account-scoped with no per-key permission restrictions documented.
Rate limiting is enforced at 100 requests per minute per API key. HTTP 429 is returned on breach; a Retry-After header signals when to resume. Pagination uses 1-based page and per_page parameters with a maximum of 100 records per page.
There is no SCIM endpoint; all provisioning must go through the REST API or the dashboard UI.
For teams maintaining an identity graph across SaaS tools, JustCall agent records expose id, email, role, status, numbers (assigned phone numbers), and created_at - sufficient to join against HR system records and detect drift. Agent lifecycle webhooks are not confirmed in official documentation, so real-time identity graph accuracy requires polling rather than event-driven updates.
API quick reference
| Has user API | Yes |
| Auth method | API Key + Secret (HTTP Basic-style header: Authorization: Basic base64(api_key:api_secret)) |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Business |
Authentication
Auth method: API Key + Secret (HTTP Basic-style header: Authorization: Basic base64(api_key:api_secret))
Setup steps
- Log in to JustCall dashboard and navigate to Settings > Developer > API.
- Click 'Generate API Key' to create an API Key and API Secret pair.
- Base64-encode the string 'api_key:api_secret'.
- Include the encoded value in the Authorization header as: Authorization: Basic
. - Optionally whitelist IP addresses in the API settings for additional security.
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | integer | Unique JustCall agent/user ID | system-assigned | immutable | Used as path parameter in agent-specific requests |
| firstname | string | Agent's first name | required | optional | |
| lastname | string | Agent's last name | required | optional | |
| string | Agent's email address; used as login identifier | required | optional | Must be unique within the account | |
| phone | string | Agent's personal phone number (E.164 format) | optional | optional | |
| timezone | string | Agent's timezone (e.g., 'America/New_York') | optional | optional | |
| status | string | Agent availability status (e.g., 'Online', 'Offline', 'Busy') | system-assigned | read-only via API | Reflects real-time availability; not directly settable via REST API |
| role | string | Agent role within the account (e.g., 'admin', 'agent') | optional | optional | |
| agent_id | integer | Alias for id in some response payloads | system-assigned | immutable | May appear interchangeably with 'id' depending on endpoint |
| created_at | string (ISO 8601) | Timestamp when the agent record was created | system-assigned | immutable | |
| numbers | array | List of JustCall phone numbers assigned to the agent | not applicable | managed via separate number-assignment endpoints | Each element contains number, country, type fields |
Core endpoints
List Agents
- Method: GET
- URL:
https://api.justcall.io/v1/agents - Watch out for: Returns all agents including inactive ones; filter by status client-side if needed.
Request example
GET /v1/agents?page=1&per_page=25
Authorization: Basic <base64_key_secret>
Response example
{
"status": "success",
"data": [
{"id":101,"firstname":"Jane","lastname":"Doe","email":"jane@example.com","role":"agent"}
],
"total": 50,
"page": 1
}
Get Agent
- Method: GET
- URL:
https://api.justcall.io/v1/agents/{agent_id} - Watch out for: Returns 404 if agent_id does not belong to the authenticated account.
Request example
GET /v1/agents/101
Authorization: Basic <base64_key_secret>
Response example
{
"status": "success",
"data": {
"id":101,"firstname":"Jane","lastname":"Doe",
"email":"jane@example.com","timezone":"America/New_York"
}
}
Create Agent (Invite User)
- Method: POST
- URL:
https://api.justcall.io/v1/agents - Watch out for: Creates the agent and sends an invitation email. The agent must accept the invite to activate the account. Duplicate email returns an error.
Request example
POST /v1/agents
Content-Type: application/json
{"firstname":"John","lastname":"Smith","email":"john@example.com","role":"agent"}
Response example
{
"status": "success",
"data": {
"id":202,"firstname":"John","lastname":"Smith",
"email":"john@example.com"
}
}
Update Agent
- Method: POST
- URL:
https://api.justcall.io/v1/agents/{agent_id} - Watch out for: JustCall uses POST (not PATCH/PUT) for updates on this endpoint. Only include fields to be changed.
Request example
POST /v1/agents/202
Content-Type: application/json
{"firstname":"Jonathan","timezone":"Europe/London"}
Response example
{
"status": "success",
"data": {
"id":202,"firstname":"Jonathan","timezone":"Europe/London"
}
}
Delete / Deactivate Agent
- Method: DELETE
- URL:
https://api.justcall.io/v1/agents/{agent_id} - Watch out for: Deletion is permanent and removes the agent from the account. Call recordings and logs associated with the agent are retained per account data-retention settings.
Request example
DELETE /v1/agents/202
Authorization: Basic <base64_key_secret>
Response example
{
"status": "success",
"message": "Agent deleted successfully"
}
List Teams
- Method: GET
- URL:
https://api.justcall.io/v1/teams - Watch out for: Team membership is returned as an array of agent IDs; resolve agent details with separate GET /agents/{id} calls.
Request example
GET /v1/teams?page=1&per_page=25
Authorization: Basic <base64_key_secret>
Response example
{
"status": "success",
"data": [
{"id":10,"name":"Support Team","agents":[101,202]}
]
}
Add Agent to Team
- Method: POST
- URL:
https://api.justcall.io/v1/teams/{team_id}/agents - Watch out for: Agent must already exist in the account before being added to a team.
Request example
POST /v1/teams/10/agents
Content-Type: application/json
{"agent_id":202}
Response example
{
"status": "success",
"message": "Agent added to team"
}
List Phone Numbers
- Method: GET
- URL:
https://api.justcall.io/v1/phone-numbers - Watch out for: Number assignment to agents is managed here; use the number ID to reassign via a separate update call.
Request example
GET /v1/phone-numbers?page=1&per_page=25
Authorization: Basic <base64_key_secret>
Response example
{
"status": "success",
"data": [
{"id":5,"number":"+14155550100","assigned_to":101,"type":"local"}
]
}
Rate limits, pagination, and events
- Rate limits: JustCall enforces rate limits per API key. The documented limit is 100 requests per minute per API key. Exceeding the limit returns HTTP 429.
- Rate-limit headers: Yes
- Retry-After header: Yes
- Rate-limit notes: HTTP 429 is returned when the limit is exceeded. Retry-After header indicates when requests can resume. Exact header names (X-RateLimit-Limit, X-RateLimit-Remaining) are referenced in the developer docs but full header spec is not exhaustively published.
- Pagination method: offset
- Default page size: 10
- Max page size: 100
- Pagination pointer: page (1-based) and per_page
| Plan | Limit | Concurrent |
|---|---|---|
| All paid plans | 100 requests/minute per API key | 0 |
- Webhooks available: Yes
- Webhook notes: JustCall supports outbound webhooks configured in the dashboard under Settings > Developer > Webhooks. Webhooks fire on call and SMS events; user/agent lifecycle events (create, delete) are not explicitly documented as webhook triggers.
- Alternative event strategy: Poll GET /v1/agents on a schedule to detect user changes, as agent lifecycle webhooks are not confirmed in official docs.
- Webhook events: call.initiated, call.ringing, call.answered, call.completed, call.missed, sms.received, sms.sent, voicemail.received
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Business
- Endpoint: Not documented
Limitations:
- No SCIM provisioning is documented in JustCall's official developer or help center documentation as of the policy date.
- SAML SSO is available on the Business (custom pricing) plan via Okta, Microsoft Entra ID, and OneLogin, but automated SCIM provisioning/deprovisioning is not supported.
- User provisioning must be performed via the REST API or manually through the dashboard.
Common scenarios
Provision a new agent by posting firstname, lastname, email, and role to POST /v1/agents. The API immediately sends an invitation email - there is no silent provisioning option.
Capture the returned agent_id, then call POST /v1/teams/{team_id}/agents to assign team membership. Phone number assignment is a separate step via GET /v1/phone-numbers followed by a number-update call; the agent cannot make or receive calls until they accept the invitation regardless of API state.
Deprovision a departing agent by first calling GET /v1/phone-numbers?assigned_to={agent_id} to identify assigned numbers, reassigning them before deletion, then issuing DELETE /v1/agents/{agent_id}. Deletion via API is permanent and irreversible - there is no soft-delete or deactivation-only endpoint documented.
For HR-driven roster sync, paginate GET /v1/agents?per_page=100&page=1 through all pages, diff against the HR system by email, create missing agents, and delete terminated ones. Implement exponential backoff on HTTP 429. Because no SCIM and no agent lifecycle webhooks exist, this sync loop must be built and maintained as a custom integration with no platform-native trigger mechanism.
Provision a new agent and assign to a team
- POST /v1/agents with firstname, lastname, email, role to create the agent (invitation email sent automatically).
- Capture the returned agent id from the response.
- GET /v1/teams to find the target team_id.
- POST /v1/teams/{team_id}/agents with {agent_id:
} to add the agent to the team. - Optionally GET /v1/phone-numbers to find an unassigned number and assign it to the agent.
Watch out for: The agent cannot make or receive calls until they accept the invitation email and complete account setup, regardless of API provisioning state.
Deprovision a departing agent
- GET /v1/agents to locate the agent's id by email.
- GET /v1/phone-numbers?assigned_to={agent_id} to identify numbers assigned to the agent.
- Reassign or release those numbers via the phone-numbers update endpoint before deletion.
- DELETE /v1/agents/{agent_id} to remove the agent from the account.
Watch out for: Deletion is permanent. Confirm number reassignment before deleting to avoid losing access to active phone numbers.
Sync agent roster from an external HR system
- GET /v1/agents?per_page=100&page=1 (paginate through all pages) to retrieve the current agent list.
- Compare against the HR system's active employee list by email.
- For new employees not in JustCall: POST /v1/agents to create them.
- For terminated employees still in JustCall: DELETE /v1/agents/{agent_id} to remove them.
- Implement exponential backoff on HTTP 429 responses to respect the 100 req/min rate limit.
Watch out for: No SCIM support means this sync must be built and maintained as a custom integration. There are no agent lifecycle webhooks to trigger real-time deprovisioning.
Why building this yourself is a trap
The most significant API caveat is the update verb: JustCall uses POST to /v1/agents/{agent_id} for updates, not PATCH or PUT. Clients that assume standard REST conventions will silently fail or hit unexpected behavior.
DELETE /v1/agents/{agent_id} is destructive and permanent - there is no deactivation-only API path, which means any automation that calls delete must have number-reassignment logic upstream or risk losing access to active numbers.
API keys carry no scope restrictions, so a compromised key has full account-level access. IP whitelisting is available in the API settings and should be treated as a required control, not optional.
A v2 API is referenced in community posts but is not fully documented for user management as of the policy date; build against v1 only.
For teams using an identity graph to maintain a canonical view of user access across systems, the absence of SCIM and agent lifecycle webhooks means JustCall will always be a polling-dependent node. Plan for eventual consistency rather than real-time state accuracy.
Automate JustCall 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.