CallRail - Calls
๐ Overviewโ
The CallRail calls module provides comprehensive call tracking and analytics capabilities. It supports retrieving call lists with advanced filtering, accessing call recordings, generating summary analytics, and timeline-based analytics for tracking call volume patterns. This is the core functionality for monitoring and analyzing inbound call data.
Source Files:
- Controller:
external/Integrations/Callrail/Controllers/calls.js - Provider:
external/Integrations/Callrail/Providers/calls-api.js - Routes:
external/Integrations/Callrail/Routes/calls.js
External APIs:
- CallRail API v3 -
/calls,/calls/summary,/calls/timeseries
๐๏ธ Collections Usedโ
integrations.callrail.keyโ
- Operations: Read
- Usage: Retrieve API key for authentication
- See Authentication for full schema
analytics.callrail.userconfigโ
- Operations: Read
- Usage: Get configured account/company IDs
- See Authentication for full schema
๐ Data Flowโ
Call Listing Flowโ
sequenceDiagram
participant Client as DashClicks Frontend
participant Controller as Calls Controller
participant Provider as Calls API Provider
participant CallRail as CallRail API v3
participant KeysDB as MongoDB (keys)
Client->>Controller: GET /v1/e/callrail/calls?company_id=com_abc123
Controller->>KeysDB: Find API key for account
KeysDB-->>Controller: Return api_key
Controller->>Provider: getCalls(api_key, accountId, params)
Provider->>CallRail: GET /v3/a/{account}/calls.json
CallRail-->>Provider: Call list with pagination
Provider-->>Controller: Formatted call data
Controller-->>Client: {calls: [...], total_pages, total_records}
Call Recording Flowโ
sequenceDiagram
participant Client as DashClicks Frontend
participant Controller as Calls Controller
participant Provider as Calls API Provider
participant CallRail as CallRail API v3
participant KeysDB as MongoDB (keys)
Client->>Controller: GET /v1/e/callrail/calls/recording?id=call_12345
Controller->>KeysDB: Find API key for account
KeysDB-->>Controller: Return api_key
Controller->>Provider: getRecording(api_key, accountId, callId)
Provider->>CallRail: GET /v3/a/{account}/calls/{call_id}/recording.json
CallRail-->>Provider: Recording URL and details
Provider-->>Controller: Recording metadata
Controller-->>Client: {recording_url, duration, transcription}
Summary Analytics Flowโ
sequenceDiagram
participant Client as DashClicks Frontend
participant Controller as Calls Controller
participant Provider as Calls API Provider
participant CallRail as CallRail API v3
participant KeysDB as MongoDB (keys)
Client->>Controller: GET /v1/e/callrail/calls/summary?start_date=2023-10-01
Controller->>KeysDB: Find API key for account
KeysDB-->>Controller: Return api_key
Controller->>Provider: getSummary(api_key, accountId, params)
Provider->>CallRail: GET /v3/a/{account}/calls/summary.json
CallRail-->>Provider: Aggregated call statistics
Provider-->>Controller: Summary data
Controller-->>Client: {total_calls, missed_calls, average_duration, ...}
๐ง Business Logic & Functionsโ
Call Listing Functionsโ
getCalls(req, res, next)โ
Purpose: Retrieve paginated list of calls with advanced filtering
Source: Controllers/calls.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls.json
Authentication: Bearer token (API key)
Parameters:
req.query.company_id(String, required) - CallRail company IDreq.query.page(Number, optional) - Page number (default: 1)req.query.per_page(Number, optional) - Results per page (default: 10, max: 250)req.query.start_date(String, optional) - Filter by date range start (ISO 8601)req.query.end_date(String, optional) - Filter by date range end (ISO 8601)req.query.tracking_number(String, optional) - Filter by tracking numberreq.query.source(String, optional) - Filter by traffic sourcereq.query.answered(Boolean, optional) - Filter answered/unanswered callsreq.query.first_call(Boolean, optional) - Filter first-time callersreq.query.sort(String, optional) - Sort field (e.g., "start_time", "-duration")req.auth.account_id(ObjectId) - DashClicks account ID
Returns: JSON response with calls array
{
"success": true,
"message": "SUCCESS",
"data": {
"calls": [
{
"id": "call_12345",
"company_id": "com_abc123",
"customer_phone_number": "+15551234567",
"customer_name": "John Doe",
"tracking_phone_number": "+15559876543",
"duration": 180,
"start_time": "2023-10-01T14:30:00Z",
"answered": true,
"first_call": true,
"recording": "https://api.callrail.com/recordings/rec_12345.mp3",
"source": "google",
"keywords": "plumber near me",
"lead_status": "good_lead",
"value": "high"
}
],
"page": 1,
"per_page": 10,
"total_pages": 25,
"total_records": 245
}
}
Business Logic Flow:
-
Validate Account Access
- Call
checkAccountAccess(req)to verify account permissions
- Call
-
Retrieve Configuration
- Query database for CallRail API key
- Get user config to retrieve account_id
-
Validate Required Fields
- Check that
company_idquery parameter provided - Return 400 if missing
- Check that
-
Build Query Parameters
- Extract all filter parameters from query string
- Apply defaults (page: 1, per_page: 10)
- Format date parameters for API
-
Call CallRail API
- Provider makes GET request to
/v3/a/{account}/calls.json - Pass all query parameters for filtering
- Provider makes GET request to
-
Format Response
- Extract calls array and pagination metadata
- Include call details (customer info, duration, source, etc.)
- Return formatted data
Request Example:
GET /v1/e/callrail/calls?company_id=com_abc123&start_date=2023-10-01&end_date=2023-10-31&answered=true&page=1&per_page=20
Authorization: Bearer {jwt_token}
Success Response:
{
"success": true,
"message": "SUCCESS",
"data": {
"calls": [
{
"id": "call_12345",
"company_id": "com_abc123",
"customer_phone_number": "+15551234567",
"customer_name": "John Doe",
"tracking_phone_number": "+15559876543",
"duration": 180,
"start_time": "2023-10-01T14:30:00Z",
"answered": true,
"first_call": true,
"recording": "https://api.callrail.com/recordings/rec_12345.mp3",
"recording_duration": "00:03:00",
"recording_player": "https://app.callrail.com/calls/call_12345",
"source": "google",
"medium": "cpc",
"campaign": "fall-promotion",
"keywords": "plumber near me",
"referring_url": "https://google.com",
"landing_page_url": "https://example.com/services/plumbing",
"lead_status": "good_lead",
"value": "high",
"note": "Customer needs emergency service",
"tags": ["urgent", "residential"]
}
],
"page": 1,
"per_page": 20,
"total_pages": 13,
"total_records": 245
}
}
Error Response (Missing company_id):
{
"success": false,
"errno": 400,
"message": "Company ID is required to fetch calls."
}
Filtering Options:
| Parameter | Type | Description | Example |
|---|---|---|---|
start_date | ISO 8601 | Filter calls after this date | 2023-10-01T00:00:00Z |
end_date | ISO 8601 | Filter calls before this date | 2023-10-31T23:59:59Z |
tracking_number | String | Filter by specific tracking number | +15559876543 |
source | String | Filter by traffic source | google, facebook, direct |
answered | Boolean | Filter answered/missed calls | true, false |
first_call | Boolean | Filter first-time callers | true, false |
lead_status | String | Filter by lead quality | good_lead, qualified |
sort | String | Sort field (prefix with - for desc) | start_time, -duration |
Error Handling:
- Invalid Account: Returns 400 with
INVALID_ACCOUNT_ID - No API Key: Returns 400 with descriptive message
- Missing company_id: Returns 400 with specific message
- Invalid Date Format: CallRail returns validation error
- CallRail API Error: Propagated to error middleware
Example Usage:
// Fetch answered calls for October 2023
const response = await fetch(
'/v1/e/callrail/calls?company_id=com_abc123&start_date=2023-10-01&end_date=2023-10-31&answered=true',
{ headers: { Authorization: `Bearer ${token}` } },
);
const { calls, total_records } = await response.json();
// Fetch first-time callers
const firstTimers = await fetch('/v1/e/callrail/calls?company_id=com_abc123&first_call=true', {
headers: { Authorization: `Bearer ${token}` },
});
Side Effects:
- โน๏ธ Database Read: Queries API key and config
- โน๏ธ External API Call: CallRail API usage
Call Recording Functionsโ
getRecording(req, res, next)โ
Purpose: Retrieve call recording URL and metadata
Source: Controllers/calls.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls/{call_id}/recording.json
Authentication: Bearer token (API key)
Parameters:
req.query.id(String, required) - CallRail call IDreq.auth.account_id(ObjectId) - DashClicks account ID
Returns: JSON response with recording details
{
"success": true,
"message": "SUCCESS",
"data": {
"id": "call_12345",
"recording": "https://api.callrail.com/recordings/rec_12345.mp3",
"recording_duration": "00:03:00",
"recording_player": "https://app.callrail.com/calls/call_12345",
"transcription": "Hello, this is John from...",
"transcription_available": true
}
}
Business Logic Flow:
-
Validate Account Access
- Verify account permissions
-
Retrieve Configuration
- Query database for CallRail API key
- Get user config for account_id
-
Validate Required Fields
- Check that
idquery parameter provided - Return 400 if missing
- Check that
-
Call CallRail API
- Provider makes GET request to recording endpoint
- Include call ID in path
-
Return Recording Details
- Include recording URL (MP3 file)
- Include duration and player URL
- Include transcription if available
Request Example:
GET /v1/e/callrail/calls/recording?id=call_12345
Authorization: Bearer {jwt_token}
Success Response:
{
"success": true,
"message": "SUCCESS",
"data": {
"id": "call_12345",
"recording": "https://api.callrail.com/recordings/rec_12345.mp3",
"recording_duration": "00:03:00",
"recording_player": "https://app.callrail.com/calls/call_12345",
"transcription": "Hello, this is John from Acme Services. How can I help you today?...",
"transcription_available": true,
"formatted_tracking_phone_number": "(555) 987-6543",
"formatted_customer_phone_number": "(555) 123-4567"
}
}
Error Response (Missing call ID):
{
"success": false,
"errno": 400,
"message": "Call ID is required to fetch recording."
}
Recording Availability:
- Recordings available if account has recording enabled
- Recording may take up to 5 minutes after call ends to process
- CallRail returns 404 if recording doesn't exist
- Transcription requires additional CallRail feature
Error Handling:
- Invalid Account: Returns 400 with
INVALID_ACCOUNT_ID - No API Key: Returns 400 with descriptive message
- Missing call ID: Returns 400 with specific message
- Recording Not Found: CallRail returns 404 error
- Recording Not Available: Returns null recording field
Example Usage:
// Get recording for call
const response = await fetch('/v1/e/callrail/calls/recording?id=call_12345', {
headers: { Authorization: `Bearer ${token}` },
});
const { recording, transcription } = await response.json();
// Play recording in browser
const audio = new Audio(recording);
audio.play();
Side Effects:
- โน๏ธ Database Read: Queries API key and config
- โน๏ธ External API Call: CallRail API usage
- โน๏ธ Recording Access: Generates temporary access URL
Analytics Functionsโ
getSummary(req, res, next)โ
Purpose: Retrieve aggregated call statistics for date range
Source: Controllers/calls.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls/summary.json
Authentication: Bearer token (API key)
Parameters:
req.query.company_id(String, optional) - Filter by companyreq.query.start_date(String, required) - Summary start date (ISO 8601)req.query.end_date(String, required) - Summary end date (ISO 8601)req.query.group_by(String, optional) - Group results by fieldreq.auth.account_id(ObjectId) - DashClicks account ID
Returns: JSON response with summary statistics
{
"success": true,
"message": "SUCCESS",
"data": {
"total_calls": 245,
"missed_calls": 12,
"answered_calls": 233,
"first_time_callers": 89,
"average_duration": 180,
"leads": 156,
"good_leads": 134,
"qualified_leads": 98,
"total_talk_time": 41940,
"by_source": {
"google": 145,
"facebook": 56,
"direct": 44
}
}
}
Business Logic Flow:
-
Validate Account Access
- Verify account permissions
-
Retrieve Configuration
- Query database for CallRail API key
- Get user config for account_id
-
Validate Required Fields
- Check that
start_dateandend_dateprovided - Return 400 if missing
- Check that
-
Build Query Parameters
- Extract date range and grouping options
- Format dates for API
-
Call CallRail API
- Provider makes GET request to summary endpoint
- Pass date range and filters
-
Format Response
- Include aggregated statistics
- Include grouping breakdowns if requested
- Return formatted data
Request Example:
GET /v1/e/callrail/calls/summary?company_id=com_abc123&start_date=2023-10-01&end_date=2023-10-31&group_by=source
Authorization: Bearer {jwt_token}
Success Response:
{
"success": true,
"message": "SUCCESS",
"data": {
"total_calls": 245,
"missed_calls": 12,
"answered_calls": 233,
"first_time_callers": 89,
"average_duration": 180,
"total_duration": 41940,
"leads": 156,
"good_leads": 134,
"qualified_leads": 98,
"by_source": {
"google": {
"total_calls": 145,
"leads": 92,
"average_duration": 195
},
"facebook": {
"total_calls": 56,
"leads": 38,
"average_duration": 165
},
"direct": {
"total_calls": 44,
"leads": 26,
"average_duration": 210
}
}
}
}
Error Response (Missing dates):
{
"success": false,
"errno": 400,
"message": "Start date and end date are required for summary analytics."
}
Grouping Options:
source- Group by traffic source (google, facebook, etc.)campaign- Group by campaign namemedium- Group by marketing medium (cpc, organic, etc.)tracking_number- Group by tracking phone number
Metrics Included:
| Metric | Description |
|---|---|
total_calls | Total number of calls in date range |
missed_calls | Calls not answered |
answered_calls | Calls answered |
first_time_callers | Unique first-time callers |
average_duration | Average call duration in seconds |
total_duration | Total talk time in seconds |
leads | Calls marked as leads |
good_leads | Calls marked as good quality leads |
qualified_leads | Calls marked as qualified for sales |
Error Handling:
- Invalid Account: Returns 400 with
INVALID_ACCOUNT_ID - No API Key: Returns 400 with descriptive message
- Missing Dates: Returns 400 with specific message
- Invalid Date Format: CallRail returns validation error
- Date Range Too Large: CallRail may limit max range
Example Usage:
// Get summary for October 2023
const response = await fetch(
'/v1/e/callrail/calls/summary?company_id=com_abc123&start_date=2023-10-01&end_date=2023-10-31',
{ headers: { Authorization: `Bearer ${token}` } },
);
const { total_calls, good_leads, average_duration } = await response.json();
// Get summary grouped by source
const sourceBreakdown = await fetch(
'/v1/e/callrail/calls/summary?company_id=com_abc123&start_date=2023-10-01&end_date=2023-10-31&group_by=source',
{ headers: { Authorization: `Bearer ${token}` } },
);
Side Effects:
- โน๏ธ Database Read: Queries API key and config
- โน๏ธ External API Call: CallRail API usage
getTimeline(req, res, next)โ
Purpose: Retrieve time-series call analytics for trend visualization
Source: Controllers/calls.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls/timeseries.json
Authentication: Bearer token (API key)
Parameters:
req.query.company_id(String, optional) - Filter by companyreq.query.start_date(String, required) - Timeline start date (ISO 8601)req.query.end_date(String, required) - Timeline end date (ISO 8601)req.query.group_by(String, optional) - Time interval (hour, day, week, month)req.auth.account_id(ObjectId) - DashClicks account ID
Returns: JSON response with time-series data
{
"success": true,
"message": "SUCCESS",
"data": {
"timeseries": [
{
"date": "2023-10-01",
"total_calls": 12,
"answered_calls": 11,
"missed_calls": 1,
"leads": 8
},
{
"date": "2023-10-02",
"total_calls": 15,
"answered_calls": 14,
"missed_calls": 1,
"leads": 10
}
],
"start_date": "2023-10-01",
"end_date": "2023-10-31",
"group_by": "day"
}
}
Business Logic Flow:
-
Validate Account Access
- Verify account permissions
-
Retrieve Configuration
- Query database for CallRail API key
- Get user config for account_id
-
Validate Required Fields
- Check that
start_dateandend_dateprovided - Return 400 if missing
- Check that
-
Build Query Parameters
- Extract date range and grouping interval
- Default group_by to "day"
- Format dates for API
-
Call CallRail API
- Provider makes GET request to timeseries endpoint
- Pass date range and interval
-
Format Response
- Return array of data points with timestamps
- Include metrics for each time interval
- Return formatted data
Request Example:
GET /v1/e/callrail/calls/timeline?company_id=com_abc123&start_date=2023-10-01&end_date=2023-10-31&group_by=day
Authorization: Bearer {jwt_token}
Success Response:
{
"success": true,
"message": "SUCCESS",
"data": {
"timeseries": [
{
"date": "2023-10-01T00:00:00Z",
"total_calls": 12,
"answered_calls": 11,
"missed_calls": 1,
"first_time_callers": 4,
"leads": 8,
"average_duration": 185
},
{
"date": "2023-10-02T00:00:00Z",
"total_calls": 15,
"answered_calls": 14,
"missed_calls": 1,
"first_time_callers": 6,
"leads": 10,
"average_duration": 192
}
],
"start_date": "2023-10-01T00:00:00Z",
"end_date": "2023-10-31T23:59:59Z",
"group_by": "day",
"total_intervals": 31
}
}
Error Response (Missing dates):
{
"success": false,
"errno": 400,
"message": "Start date and end date are required for timeline analytics."
}
Grouping Intervals:
hour- Hourly breakdown (for short date ranges)day- Daily breakdown (default)week- Weekly breakdownmonth- Monthly breakdown
Use Cases:
- Trend Visualization: Chart call volume over time
- Peak Hour Analysis: Identify busiest call times (hourly)
- Monthly Comparison: Compare month-over-month performance
- Seasonal Trends: Identify patterns across months
Error Handling:
- Invalid Account: Returns 400 with
INVALID_ACCOUNT_ID - No API Key: Returns 400 with descriptive message
- Missing Dates: Returns 400 with specific message
- Invalid Date Format: CallRail returns validation error
- Invalid Interval: CallRail returns validation error
Example Usage:
// Get daily call timeline for October
const response = await fetch(
'/v1/e/callrail/calls/timeline?company_id=com_abc123&start_date=2023-10-01&end_date=2023-10-31&group_by=day',
{ headers: { Authorization: `Bearer ${token}` } },
);
const { timeseries } = await response.json();
// Create chart
const chartData = timeseries.map(point => ({
date: point.date,
calls: point.total_calls,
leads: point.leads,
}));
// Get hourly breakdown for one day
const hourly = await fetch(
'/v1/e/callrail/calls/timeline?company_id=com_abc123&start_date=2023-10-01T00:00:00Z&end_date=2023-10-01T23:59:59Z&group_by=hour',
{ headers: { Authorization: `Bearer ${token}` } },
);
Side Effects:
- โน๏ธ Database Read: Queries API key and config
- โน๏ธ External API Call: CallRail API usage
Provider Functionsโ
getCalls(apiKey, accountId, params)โ
Purpose: Call CallRail API to retrieve calls
Source: Providers/calls-api.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls.json
Parameters:
apiKey(String) - CallRail API keyaccountId(String) - CallRail account IDparams(Object) - Query parameters (filters, pagination)
Returns: Promise<Object> - API response data
HTTP Request:
GET /v3/a/470306151/calls.json?company_id=com_abc123&start_date=2023-10-01&page=1&per_page=20
Host: api.callrail.com
Authorization: Bearer {api_key}
Example Usage:
const calls = await callsApi.getCalls(apiKey, '470306151', {
company_id: 'com_abc123',
start_date: '2023-10-01',
end_date: '2023-10-31',
answered: true,
page: 1,
per_page: 20,
});
Side Effects:
- โน๏ธ External API Call: CallRail API request
getRecording(apiKey, accountId, callId)โ
Purpose: Call CallRail API to retrieve recording
Source: Providers/calls-api.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls/{call_id}/recording.json
Parameters:
apiKey(String) - CallRail API keyaccountId(String) - CallRail account IDcallId(String) - CallRail call ID
Returns: Promise<Object> - Recording details
HTTP Request:
GET /v3/a/470306151/calls/call_12345/recording.json
Host: api.callrail.com
Authorization: Bearer {api_key}
Example Usage:
const recording = await callsApi.getRecording(apiKey, '470306151', 'call_12345');
// Returns: { recording: 'https://...', transcription: '...' }
Side Effects:
- โน๏ธ External API Call: CallRail API request
getSummary(apiKey, accountId, params)โ
Purpose: Call CallRail API to retrieve summary analytics
Source: Providers/calls-api.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls/summary.json
Parameters:
apiKey(String) - CallRail API keyaccountId(String) - CallRail account IDparams(Object) - Query parameters (date range, filters)
Returns: Promise<Object> - Summary statistics
HTTP Request:
GET /v3/a/470306151/calls/summary.json?start_date=2023-10-01&end_date=2023-10-31&group_by=source
Host: api.callrail.com
Authorization: Bearer {api_key}
Example Usage:
const summary = await callsApi.getSummary(apiKey, '470306151', {
start_date: '2023-10-01',
end_date: '2023-10-31',
group_by: 'source',
});
Side Effects:
- โน๏ธ External API Call: CallRail API request
getTimeline(apiKey, accountId, params)โ
Purpose: Call CallRail API to retrieve time-series analytics
Source: Providers/calls-api.js
External API: GET https://api.callrail.com/v3/a/{account_id}/calls/timeseries.json
Parameters:
apiKey(String) - CallRail API keyaccountId(String) - CallRail account IDparams(Object) - Query parameters (date range, interval)
Returns: Promise<Object> - Time-series data
HTTP Request:
GET /v3/a/470306151/calls/timeseries.json?start_date=2023-10-01&end_date=2023-10-31&group_by=day
Host: api.callrail.com
Authorization: Bearer {api_key}
Example Usage:
const timeline = await callsApi.getTimeline(apiKey, '470306151', {
start_date: '2023-10-01',
end_date: '2023-10-31',
group_by: 'day',
});
Side Effects:
- โน๏ธ External API Call: CallRail API request
๐ Integration Pointsโ
Campaign Attributionโ
Call Source Tracking:
- Calls include source, medium, campaign, keywords
- Links calls to marketing campaigns automatically
- Enables ROI calculation for paid advertising
Attribution Data:
{
"source": "google",
"medium": "cpc",
"campaign": "fall-promotion",
"keywords": "plumber near me",
"referring_url": "https://google.com/search?q=...",
"landing_page_url": "https://example.com/services/plumbing"
}
Lead Scoringโ
Automatic Lead Classification:
- CallRail uses AI to classify call quality
- Lead statuses:
not_lead,lead,good_lead,qualified - Value ratings:
low,medium,high
Integration with CRM:
- Lead status used for filtering and reporting
- High-value leads can trigger automated workflows
- Lead data synced to DashClicks campaigns
๐งช Edge Cases & Special Handlingโ
Recording Availabilityโ
Issue: Recordings may not be immediately available
Handling:
- Check
recordingfield for null value - Recording processing takes up to 5 minutes
- Retry logic recommended for automation
Date Range Limitsโ
Issue: CallRail limits max date range for performance
Handling:
- Use pagination for large date ranges
- Break queries into smaller time windows
- Monitor API response times
First-Time Caller Trackingโ
Issue: Identifying unique callers across numbers
Handling:
- CallRail tracks callers by phone number
first_callflag indicates first interaction- Use for new customer acquisition metrics
Call Duration Filteringโ
Issue: Short calls may not be meaningful
Handling:
- Filter by minimum duration (e.g., >30 seconds)
- Combine with
answeredfilter - Use for quality lead analysis
โ ๏ธ Important Notesโ
- ๐ Call Data: Comprehensive information including customer details, source, duration
- ๐๏ธ Recordings: MP3 format with optional transcription
- ๐ Analytics: Summary and timeline data for reporting
- ๐ Filtering: Advanced filtering by date, source, status, caller type
- ๐ Attribution: Full marketing attribution data (source, medium, campaign)
- ๐ท๏ธ Lead Scoring: AI-powered lead quality classification
- ๐ Time Series: Hourly, daily, weekly, monthly grouping options
- ๐ API Key: Required for all operations (Bearer token)
- โฑ๏ธ Recording Delay: Recordings available 5 minutes after call ends
- ๐ Transcription: Optional feature requiring additional CallRail plan
๐ Related Documentationโ
- Integration Overview: CallRail Integration
- Authentication: API Key Management
- Accounts & Companies: Organization Hierarchy
- Trackers: Phone Number Tracking
- CallRail API: CallRail API Documentation