Stitchflow
JustCall logo

JustCall User Management API Guide

API workflow

How to automate user lifecycle operations through APIs with caveats that matter in production.

UpdatedMar 11, 2026

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 APIYes
Auth methodAPI Key + Secret (HTTP Basic-style header: Authorization: Basic base64(api_key:api_secret))
Base URLOfficial docs
SCIM availableNo
SCIM plan requiredBusiness

Authentication

Auth method: API Key + Secret (HTTP Basic-style header: Authorization: Basic base64(api_key:api_secret))

Setup steps

  1. Log in to JustCall dashboard and navigate to Settings > Developer > API.
  2. Click 'Generate API Key' to create an API Key and API Secret pair.
  3. Base64-encode the string 'api_key:api_secret'.
  4. Include the encoded value in the Authorization header as: Authorization: Basic .
  5. 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
email 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

  1. POST /v1/agents with firstname, lastname, email, role to create the agent (invitation email sent automatically).
  2. Capture the returned agent id from the response.
  3. GET /v1/teams to find the target team_id.
  4. POST /v1/teams/{team_id}/agents with {agent_id: } to add the agent to the team.
  5. 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

  1. GET /v1/agents to locate the agent's id by email.
  2. GET /v1/phone-numbers?assigned_to={agent_id} to identify numbers assigned to the agent.
  3. Reassign or release those numbers via the phone-numbers update endpoint before deletion.
  4. 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

  1. GET /v1/agents?per_page=100&page=1 (paginate through all pages) to retrieve the current agent list.
  2. Compare against the HR system's active employee list by email.
  3. For new employees not in JustCall: POST /v1/agents to create them.
  4. For terminated employees still in JustCall: DELETE /v1/agents/{agent_id} to remove them.
  5. 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.

Every app coverage, including apps without APIs
60+ app integrations plus browser automation for apps without APIs
IT graph reconciliation across apps and your IdP
Less than a week to launch, maintained as APIs and admin consoles change
SOC 2 Type II. ~2 hours of your team's time

UpdatedMar 11, 2026

* Details sourced from official product documentation and admin references.

Keep exploring

Related apps

Abnormal Security logo

Abnormal Security

API Only
AutomationAPI only
Last updatedMar 2026

Abnormal Security is an enterprise email security platform focused on detecting and investigating threats such as phishing, account takeover (ATO), and vendor email compromise. It does not support SCIM provisioning, which means every app in your stack

ActiveCampaign logo

ActiveCampaign

API Only
AutomationAPI only
Last updatedFeb 2026

ActiveCampaign uses a group-based permission model: every user belongs to exactly one group, and all feature-area access (Contacts, Campaigns, Automations, Deals, Reports, Templates) is configured at the group level, not per individual. The default Adm

ADP logo

ADP

API Only
AutomationAPI only
Last updatedFeb 2026

ADP Workforce Now is a mid-market to enterprise HCM platform that serves as the HR source of record for employee data — payroll, benefits, time, and talent. User access is governed by a hybrid permission model: predefined security roles (Security Maste