AlmaTalkDEVELOPER REFERENCE
Build with AlmaTalk · API v1

Your workspace.
Your integrations.

Connect the calls, contacts and workflows your business relies on. Each operation lists its authentication, required scopes and request contract.

Introduction

Welcome to AlmaTalk API

AlmaTalk provides a powerful REST API for automating AI-powered voice calls. Whether you're building customer outreach, appointment reminders, lead qualification, or interactive voice applications, the API exposes the account operations listed in this reference.


Getting Started

Step 1: Generate an API Key

Navigate to your AlmaTalk dashboard → Settings → API and webhooks to create an API key.

A key is scoped, not all-powerful. You choose the scopes when you create it, and the key can do exactly those things and nothing else. A key holding only calls:read can list calls and cannot place one. Give each integration its own key with the smallest set of scopes it needs, and keep the secret out of client-side code: it is shown once, at creation, and is stored only as a hash afterwards.

Step 2: Make Your First Request

Test your connection with a simple health check:

curl -X GET "https://almatalk.ca/api/v1/health"

Step 3: Authenticate Requests

Include your API key in every request using one of these methods:

curl -H "Authorization: Bearer YOUR_API_KEY" ...

curl -H "X-API-Key: YOUR_API_KEY" ...

Core Concepts

ConceptDescription
AgentsAI voice agents that handle conversations. Two types: Flow (visual conversation builder) and Incoming (for inbound calls).
CampaignsBulk calling operations targeting multiple contacts with the same agent.
CallsIndividual voice call records with transcripts, recordings, and analytics.
ContactsLead records with phone numbers, custom fields, and AI-enriched data. See Contact identity below: /contacts is not the same store as the caller profiles the phone system builds.
CreditsTalk time, metered by the second. See Credits and metering below.
WebhooksEvent notifications delivered to your endpoints.

Credits and Metering

Credits are metered per second of answered conversation, not per minute and not rounded up to one. On the standard model tier one second of talk time costs one credit, so a minute costs 60 and a 70-second call costs 70.

A higher AI model tier costs more per second: the effective rate is the base rate multiplied by that tier's multiplier, both read live from your account. Your dashboard's model picker shows the exact credits per minute for every tier you can select, and the pricing page shows what each plan includes. Do not hard-code a rate; read GET /credits/balance for the balance and take the rate from the dashboard or the pricing page.

For reference, the Starter plan includes 9,000 credits, which is about 150 minutes of answered conversation on the standard tier.

GET /credits/usage reports minutes as a copy of credits, not as measured call duration. Treat credits as the truth and derive time from it with the rate above. Measured duration lives in GET /analytics/calls (totalDurationMinutes, averageDurationSeconds), which sums the recorded call length.


Telephony Engines

AlmaTalk supports two telephony engines for different use cases:

EngineBest For
AlmaTalk Voice (almatalk-voice)Conversational voice agents
Alma realtime (alma-realtime)Realtime voice connection

Authentication

The v1 discovery root and /health are public. Other v1 operations require an API key; dashboard and embed operations use the separate authentication shown on their cards. For API-key operations:

Authorization Header: Authorization: Bearer YOUR_API_KEY

X-API-Key Header: X-API-Key: YOUR_API_KEY

Requests handled by API-key authentication receive an X-Request-ID header. Quote it when you report a problem.


Scopes

A key carries a list of scopes and is refused with 403 INSUFFICIENT_SCOPES on anything outside them. These are the scopes enforced by mounted v1 routes. The ALMA CRM section lists its additional connected scopes:

ScopeUnlocks
calls:readGET /calls, GET /calls/{id}
calls:writePOST /calls, POST /calls/{id}/hangup
campaigns:readGET /campaigns, GET /campaigns/{id}
campaigns:writeCreate, start and pause campaigns, and add or upload contacts to them
agents:readGET /agents, GET /agents/{id}, GET /agents/{id}/flow
agents:writePUT /agents/{id}/flow
contacts:readGET /contacts, GET /contacts/{id}
contacts:writeCreate, update, delete and bulk-import contacts
appointments:readList and read appointments, check availability
appointments:writeCreate, reschedule and cancel appointments
credits:readGET /credits/balance, GET /credits/usage
analytics:readEverything under /analytics, plus /credits/calls and /credits/campaigns
webhooks:readGET /webhooks, GET /webhooks/events
webhooks:writeCreate, update, delete and test webhook subscriptions
adminA super-scope that satisfies every check above. It cannot be granted through self-service key creation or updates. Account-owner sessions manage keys; team sessions cannot.

403 INSUFFICIENT_SCOPES names the scope that was missing and lists the scopes the key does hold, so you can fix it without guessing.


Rate Limiting

The limit is per key, not per plan. Each key carries its own request ceiling and window, and both are visible on the key in your dashboard. A new key is created with a ceiling of 100 requests per 60 seconds; the account owner can set the ceiling from 10 to 10,000 requests when creating or editing a key. The server controls the time window.

Over the ceiling the API answers 429 RATE_LIMIT_EXCEEDED with details.retryAfter in seconds. Responses that pass key and IP validation carry the current state (including a rate-limit rejection). Authentication failures need not include these headers:

X-RateLimit-Limit - this key's maximum requests per window

X-RateLimit-Remaining - requests left in the current window

X-RateLimit-Reset - Unix timestamp (seconds) when the window resets

A key may also carry an IP allowlist. When it is set, a request from any other address is refused with 403 IP_NOT_WHITELISTED. An empty allowlist means any address is accepted.


Contact Identity

AlmaTalk keeps two stores of people, and they are not the same identity. Nothing merges them automatically, and you should not merge them on a phone number alone.

GET /contacts (this API)Caller profiles
Tableleadscaller_profiles
Created byYou, through this API, or by lead captureThe phone system, the first time a number reaches one of your agents
Identifierid, a lead id. This is the id /contacts/{id} takesid, a caller-profile id. Not interchangeable with a lead id
Fieldsphone, firstName, lastName, email, company, tags, customFields, stage, leadScore, aiSummary, sentimentphone_number, caller_name, caller_email, caller_company, plus what the agent learned on the call
Written byPOST /contacts, PUT /contacts/{id}, POST /contacts/bulk-importThe dashboard's manual-contact and caller-profile routes, and the agent after a call

Mapping between them, when you need one: the only shared field is the phone number, compared on the last 10 digits after every non-digit is stripped, which is how the dashboard's own manual-contact route matches. That is a heuristic, not a key: two people sharing a line, or an extension, will collide. Keep your own external id in customFields on the lead if you need a stable join, and do not assume a lead id and a caller-profile id ever refer to the same row.

Campaign contacts are a third thing. POST /campaigns/{id}/contacts writes rows in a campaign's own contact list, keyed to that campaign, not to leads.


Response Format

Success Response

{
  "success": true,
  "data": { ... },
  "meta": {
    "requestId": "uuid",
    "timestamp": "2024-01-01T00:00:00.000Z"
  }
}

Error Response

{
  "success": false,
  "error": {
    "code": "ERROR_CODE",
    "message": "Human readable message",
    "details": { ... }
  },
  "meta": { ... }
}

Common Error Codes

CodeHTTP StatusDescription
VALIDATION_ERROR400Invalid request parameters
UNAUTHORIZED401Missing or invalid API key
FORBIDDEN403Insufficient permissions
NOT_FOUND404Resource not found
INSUFFICIENT_CREDITS402Not enough credits
RATE_LIMIT_EXCEEDED429Too many requests

Which authentication applies?

The primary integration API is /api/v1. Use an API key owned by the account and holding the scope shown on each operation. All records are account-scoped. A scope enables a route; it does not bypass available credits, trial restrictions, agent ownership, number ownership, or connected-service configuration. New keys default to calls:read, calls:write, campaigns:read, and contacts:read if scopes are omitted.

The ALMA CRM section uses /api/plugins/crm-bridge, with its own documented response shapes. Some connected CRM scopes are provisioned by the ALMA CRM connection and are not selectable in the ordinary API-key form. The key-management section requires an account-owner dashboard session. Existing dashboard actions are explicitly marked as session-only and use /api; an API key cannot authenticate those actions. Team permissions and feature availability still apply. Session APIs are for the signed-in application, not unattended API-key integrations.

Knowledge scopes offered by the key form do not currently have a standalone /api/v1 resource. Agent read and flow import/export are supported; creating or updating an agent prompt through an API key is not a published operation. Internal administration endpoints are not customer APIs.

Pagination and safe retries

REST list endpoints use page and pageSize, with pagination in meta.pagination; check each operation for its actual defaults and limits. CRM exports use opaque cursors and has_more. Keep a cursor unchanged between requests and stop when there is no next page. Incremental CRM call exports overlap by 24 hours so updated call results can be included; deduplicate by call id. Do not treat call ids as a UUID-only format.

Read requests may be retried after a temporary error. Calls, messages, purchases, invitations and campaign starts can have side effects. Unless an operation explicitly describes idempotency, a retry after a timeout may duplicate the action. A successful submission does not prove a call was answered or a message delivered. Use the returned status, later reads and supported webhooks to reconcile outcomes. The reference examples do not execute requests; the interactive explorer does execute requests when you submit them.

GET/api/v1/health

Health Check

Public

Verify the API is operational. This endpoint does not require authentication and is useful for monitoring and uptime checks.

Use Case: Add this endpoint to your monitoring tools to detect API outages.

Request example
curl -X GET "https://almatalk.ca/api/v1/health"

Responses

200 API is healthy and ready to accept requests

application/json

Schema: HealthResponse

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "example": "healthy"
        },
        "version": {
          "type": "string",
          "example": "v1"
        },
        "timestamp": {
          "type": "string",
          "format": "date-time"
        }
      }
    }
  }
}

Calls

Voice Call Management

The Calls API allows you to trigger outbound calls, monitor active calls, and retrieve call history with transcripts and recordings.

Common Use Cases:

Trigger individual calls to leads

Check call status and duration

Retrieve transcripts and AI summaries

Hang up active calls

Credit Usage: Each call consumes credits for the seconds it is answered. On the standard model tier that is 1 credit a second, so 60 a minute; a higher model tier costs more per second. See Credits and Metering in the introduction.

GET/api/v1/calls

List Calls

API keycalls:read

Retrieve a paginated list of all calls made from your account. Results include calls from all telephony engines (AlmaTalk Voice, AlmaTalk Global).

Tip: Use the page and pageSize parameters to navigate through large result sets efficiently.

Required Scope: calls:read

Parameters

NameInTypeDescription
pagequeryinteger

Page number (1-indexed)

Default: 1

pageSizequeryinteger

Items per page (max 100)

Default: 20

Request example
curl -X GET "https://almatalk.ca/api/v1/calls" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 List of calls with pagination metadata

application/json

Schema: CallListResponse

FieldTypeDescription
successboolean
dataarray<Call>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Call"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
403 Insufficient permissions

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/calls

Trigger Call

API keycalls:write

Initiate an outbound call using a specified AI agent. The call will be placed immediately unless scheduled for a future time.

Prerequisites:

An active AI agent (flow or incoming type)

Sufficient credits in your account

An active phone number (or provide fromNumber)

Telephony Engines:

almatalk-voice: AlmaTalk Voice engine, 29 languages

alma-realtime: Alma realtime voice engine

Required Scope: calls:write

This action places a call immediately. Trial accounts can be refused with 403 DEMO_OUTBOUND_DISABLED. Sufficient credits, an owned agent and an active owned phone number are required. success: true records request processing; inspect data.status for a failed attempt and do not equate submission with an answered call.

Request body Required

application/json

Schema: TriggerCallRequest

FieldTypeDescription
agentIdRequiredstring

ID of the agent to use for the call

toNumberRequiredstring

Phone number to call (E.164 format recommended)

fromNumberstring

An active number owned by this account; if omitted the account default is selected. A number must be configured for the chosen agent and route.

enginestring

Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice engine.

Values: almatalk-voice, alma-realtime

metadataobject

Custom metadata to attach to the call

scheduledAtstring

Compatibility field accepted by validation but not used to defer a call. POST /calls starts immediately; do not use this field for scheduling.

dynamicVariablesobject

String variables for the standard AlmaTalk Voice conversation. These override matching metadata keys. They are not applied by the alternate realtime route.

Complete schema
{
  "type": "object",
  "required": [
    "agentId",
    "toNumber"
  ],
  "properties": {
    "agentId": {
      "type": "string",
      "format": "uuid",
      "description": "ID of the agent to use for the call"
    },
    "toNumber": {
      "type": "string",
      "description": "Phone number to call (E.164 format recommended)",
      "example": "+14155551234"
    },
    "fromNumber": {
      "type": "string",
      "description": "An active number owned by this account; if omitted the account default is selected. A number\nmust be configured for the chosen agent and route."
    },
    "engine": {
      "type": "string",
      "enum": [
        "almatalk-voice",
        "alma-realtime"
      ],
      "description": "Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice\nengine."
    },
    "metadata": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Custom metadata to attach to the call"
    },
    "scheduledAt": {
      "type": "string",
      "format": "date-time",
      "description": "Compatibility field accepted by validation but not used to defer a call. POST /calls starts\nimmediately; do not use this field for scheduling."
    },
    "dynamicVariables": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "String variables for the standard AlmaTalk Voice conversation. These override matching metadata\nkeys. They are not applied by the alternate realtime route."
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/calls" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"agentId\":\"YOUR_VALUE\",\"toNumber\":\"+14155551234\"}"

Responses

201 Call initiated successfully. Returns call ID and initial status.

application/json

Schema: TriggerCallResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "callId": {
          "type": "string",
          "description": "Opaque call identifier. Preserve the returned value; it is not necessarily a UUID."
        },
        "status": {
          "type": "string",
          "example": "queued"
        },
        "agentId": {
          "type": "string",
          "format": "uuid"
        },
        "toNumber": {
          "type": "string"
        },
        "fromNumber": {
          "type": "string"
        },
        "engine": {
          "type": "string"
        },
        "createdAt": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
402 Insufficient credits

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/calls/{id}

Get Call Details

API keycalls:read

Retrieve detailed information about a specific call including:

Call status and duration

Full conversation transcript

AI-generated summary

Sentiment analysis

Recording URL (if available)

Tip: Poll this endpoint to track call progress. Status will transition from queued → ringing → in-progress → completed.

Required Scope: calls:read

Parameters

NameInTypeDescription
idRequiredpathstring

Call identifier exactly as returned by the calls API. Accepts an opaque ALMA call reference or an internal call ID; it is not restricted to UUID format.

Request example
curl -X GET "https://almatalk.ca/api/v1/calls/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Complete call details with transcript and analytics

application/json

Schema: CallDetailResponse

FieldTypeDescription
successboolean
dataCall
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Call"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/calls/{id}/hangup

Compatibility hangup acknowledgment (no call control)

API keycalls:writeCompatibility alias

This compatibility endpoint returns an acknowledgment only. It does not look up the call, check its status, or terminate it.

Do not use the success response or hangup_requested value as evidence that a call ended. Active call termination is not supported through this operation.

Required Scope: calls:write

Parameters

NameInTypeDescription
idRequiredpathstring

Call identifier exactly as returned by the calls API. Accepts an opaque ALMA call reference or an internal call ID; it is not restricted to UUID format.

Request example
curl -X POST "https://almatalk.ca/api/v1/calls/{id}/hangup" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Compatibility acknowledgment only. No call termination is performed.

application/json

Schema: HangupResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "callId": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "example": "hangup_requested"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}

Campaigns

Bulk Calling Campaigns

Campaigns enable you to call multiple contacts automatically using a single AI agent. Perfect for outreach, reminders, and surveys.

Campaign Lifecycle: 1. Create a campaign (status: draft) 2. Add contacts to the campaign 3. Start the campaign (status: running) 4. Monitor progress or pause if needed 5. Campaign completes when all contacts are called

Features:

Schedule campaigns for specific times

Set calling windows (e.g., 9 AM - 6 PM)

Configure retry attempts for unanswered calls

Limit concurrent calls

GET/api/v1/campaigns

List Campaigns

API keycampaigns:read

Retrieve all campaigns with their current status and progress metrics.

Campaign Statuses:

draft - Created but not started

scheduled - Waiting for scheduled start time

running - Actively making calls

paused - Temporarily stopped

completed - All contacts processed

cancelled - Permanently stopped

Required Scope: campaigns:read

Parameters

NameInTypeDescription
pagequeryinteger

Page number (1-indexed)

Default: 1

pageSizequeryinteger

Items per page (max 100)

Default: 20

Request example
curl -X GET "https://almatalk.ca/api/v1/campaigns" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 List of campaigns with progress metrics

application/json

Schema: CampaignListResponse

FieldTypeDescription
successboolean
dataarray<Campaign>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Campaign"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/campaigns

Create Campaign

API keycampaigns:write

Create a new bulk calling campaign with optional contacts CSV upload. The campaign starts in draft status and won't execute until you start it.

Simplified Workflow: 1. Create campaign with contacts CSV → 2. Start campaign

Request Format: This endpoint accepts multipart/form-data to allow simultaneous campaign creation and contact import.

Campaign Data Options:

Send as JSON string in data field, OR

Send as individual form fields (name, agentId, etc.)

CSV Upload (Optional): Include a contacts field with your CSV file. Recognized columns:

phone or phone_number - Required

firstName, lastName, name, email

Any other columns become custom fields

Configuration Options:

Calling Windows: Restrict calls to business hours

Concurrent Calls: Control call volume (1-100)

Retry Logic: Automatically retry unanswered calls

Scheduling: Start immediately or at a future time

Required Scope: campaigns:write

Request body Required

multipart/form-data

FieldTypeDescription
datastring

Campaign data as JSON string (alternative to individual fields)

nameRequiredstring

Campaign name (use either this or data field)

agentIdRequiredstring

Agent to use for calls

phoneNumberIdstring

Phone number to call from

enginestring

Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice engine.

Values: almatalk-voice, alma-realtime

scheduledStartTimestring

When to start the campaign

timezonestring
callWindowStartstring
callWindowEndstring
maxConcurrentCallsinteger
contactsstring

Optional CSV file with contacts

Complete schema
{
  "type": "object",
  "required": [
    "name",
    "agentId"
  ],
  "properties": {
    "data": {
      "type": "string",
      "description": "Campaign data as JSON string (alternative to individual fields)",
      "example": "{\"name\": \"Q1 Outreach\", \"agentId\": \"550e8400-e29b-41d4-a716-446655440000\"}"
    },
    "name": {
      "type": "string",
      "description": "Campaign name (use either this or data field)",
      "example": "Q1 Lead Outreach"
    },
    "agentId": {
      "type": "string",
      "format": "uuid",
      "description": "Agent to use for calls"
    },
    "phoneNumberId": {
      "type": "string",
      "format": "uuid",
      "description": "Phone number to call from"
    },
    "engine": {
      "type": "string",
      "enum": [
        "almatalk-voice",
        "alma-realtime"
      ],
      "description": "Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime\nvoice engine."
    },
    "scheduledStartTime": {
      "type": "string",
      "format": "date-time",
      "description": "When to start the campaign"
    },
    "timezone": {
      "type": "string",
      "example": "America/New_York"
    },
    "callWindowStart": {
      "type": "string",
      "pattern": "^\\d{2}:\\d{2}$",
      "example": "09:00"
    },
    "callWindowEnd": {
      "type": "string",
      "pattern": "^\\d{2}:\\d{2}$",
      "example": "18:00"
    },
    "maxConcurrentCalls": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "example": 10
    },
    "contacts": {
      "type": "string",
      "format": "binary",
      "description": "Optional CSV file with contacts"
    }
  }
}

application/json

Schema: CreateCampaignRequest

FieldTypeDescription
nameRequiredstring
agentIdRequiredstring
phoneNumberIdstring
enginestring

Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice engine.

Values: almatalk-voice, alma-realtime

scheduledStartTimestring
timezonestring
callWindowStartstring
callWindowEndstring
maxConcurrentCallsinteger

Default: 5

retryAttemptsinteger

Default: 2

retryDelayMinutesinteger

Default: 30

Complete schema
{
  "type": "object",
  "required": [
    "name",
    "agentId"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 255
    },
    "agentId": {
      "type": "string",
      "format": "uuid"
    },
    "phoneNumberId": {
      "type": "string",
      "format": "uuid"
    },
    "engine": {
      "type": "string",
      "enum": [
        "almatalk-voice",
        "alma-realtime"
      ],
      "description": "Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice\nengine."
    },
    "scheduledStartTime": {
      "type": "string",
      "format": "date-time"
    },
    "timezone": {
      "type": "string",
      "example": "America/New_York"
    },
    "callWindowStart": {
      "type": "string",
      "pattern": "^\\d{2}:\\d{2}$",
      "example": "09:00"
    },
    "callWindowEnd": {
      "type": "string",
      "pattern": "^\\d{2}:\\d{2}$",
      "example": "18:00"
    },
    "maxConcurrentCalls": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 5
    },
    "retryAttempts": {
      "type": "integer",
      "minimum": 0,
      "maximum": 5,
      "default": 2
    },
    "retryDelayMinutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1440,
      "default": 30
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/campaigns" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"YOUR_VALUE\",\"agentId\":\"YOUR_VALUE\"}"

Responses

201 Campaign created with optional contact import results

application/json

Complete schema
{
  "allOf": [
    {
      "$ref": "#/components/schemas/CampaignResponse"
    },
    {
      "type": "object",
      "properties": {
        "data": {
          "type": "object",
          "properties": {
            "contacts": {
              "type": "object",
              "description": "Present only if CSV was uploaded",
              "properties": {
                "fileName": {
                  "type": "string"
                },
                "totalRows": {
                  "type": "integer"
                },
                "contactsAdded": {
                  "type": "integer"
                },
                "contactsSkipped": {
                  "type": "integer"
                },
                "invalidRows": {
                  "type": "integer"
                }
              }
            }
          }
        }
      }
    }
  ]
}
{
  "success": true,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "Q1 Lead Outreach",
    "status": "draft",
    "agentId": "550e8400-e29b-41d4-a716-446655440001",
    "contacts": {
      "fileName": "leads.csv",
      "totalRows": 150,
      "contactsAdded": 145,
      "contactsSkipped": 3,
      "invalidRows": 2
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/campaigns/{id}

Get Campaign Details

API keycampaigns:read

Retrieve detailed information about a campaign including:

Current status and progress

Contact counts (total, called, remaining)

Schedule and timing information

Configuration settings

Required Scope: campaigns:read

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X GET "https://almatalk.ca/api/v1/campaigns/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Campaign details with progress metrics

application/json

Schema: CampaignResponse

FieldTypeDescription
successboolean
dataCampaign
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Campaign"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/campaigns/{id}/contacts

Add Campaign Contacts

API keycampaigns:write

Add contacts to a campaign's call list. You can add up to 10,000 contacts per request.

Important: Contacts can only be added when the campaign status is draft or paused. Running campaigns will reject new contacts.

Contact Fields:

phoneNumber (required) - Phone number in E.164 format

firstName, lastName, email - Optional contact info

customFields - Key-value pairs for personalization in agent scripts

Tip: Use customFields to pass data like appointment times or account numbers that your agent can reference during the call.

Required Scope: campaigns:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request body Required

application/json

Schema: AddCampaignContactsRequest

FieldTypeDescription
contactsRequiredarray<object>
Complete schema
{
  "type": "object",
  "required": [
    "contacts"
  ],
  "properties": {
    "contacts": {
      "type": "array",
      "minItems": 1,
      "maxItems": 10000,
      "items": {
        "type": "object",
        "required": [
          "phoneNumber"
        ],
        "properties": {
          "phoneNumber": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "customFields": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/campaigns/{id}/contacts" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"contacts\":[{\"phoneNumber\":\"YOUR_VALUE\"}]}"

Responses

201 Contacts added with success/skip counts

application/json

Schema: AddContactsResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "campaignId": {
          "type": "string"
        },
        "contactsAdded": {
          "type": "integer"
        },
        "contactsSkipped": {
          "type": "integer"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
409 Resource conflict

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/campaigns/{id}/contacts-upload

Upload CSV Contacts

API keycampaigns:write

Upload a CSV file to add contacts to a campaign. This is the recommended method for bulk contact imports.

CSV Format: The CSV must include a header row. Recognized columns:

phone or phone_number - Required, contact phone number

firstName or first_name - First name

lastName or last_name - Last name

name - Full name (splits into first/last automatically)

email - Email address

Any other columns become custom fields

AlmaTalk Voice Format Support: Columns prefixed with dynamic_data. are automatically converted to custom fields.

Example CSV:

phone,firstName,lastName,appointmentTime
+14155551234,John,Doe,2:00 PM
+14155555678,Jane,Smith,3:30 PM

Limits:

Maximum file size: 10MB

Maximum contacts: 10,000 per upload

Required Scope: campaigns:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request body Required

multipart/form-data

FieldTypeDescription
fileRequiredstring

CSV file containing contacts

Complete schema
{
  "type": "object",
  "required": [
    "file"
  ],
  "properties": {
    "file": {
      "type": "string",
      "format": "binary",
      "description": "CSV file containing contacts"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/campaigns/{id}/contacts-upload" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

201 CSV processed successfully

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "campaignId": {
          "type": "string",
          "format": "uuid"
        },
        "fileName": {
          "type": "string",
          "example": "contacts.csv"
        },
        "totalRows": {
          "type": "integer",
          "description": "Total rows parsed from CSV",
          "example": 150
        },
        "contactsAdded": {
          "type": "integer",
          "description": "New contacts added",
          "example": 145
        },
        "contactsSkipped": {
          "type": "integer",
          "description": "Duplicate contacts skipped",
          "example": 3
        },
        "invalidRows": {
          "type": "integer",
          "description": "Rows with invalid phone numbers",
          "example": 2
        }
      }
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
409 Resource conflict

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/campaigns/{id}/start

Start Campaign

API keycampaigns:write

Begin executing a campaign. The system will start placing calls to contacts according to your configuration.

Prerequisites:

Campaign must have at least one contact

Sufficient credits for estimated calls

Associated agent must be active

Behavior:

Calls are placed respecting maxConcurrentCalls limit

Calling windows are honored (no calls outside configured hours)

Failed calls are retried based on retryAttempts setting

Required Scope: campaigns:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X POST "https://almatalk.ca/api/v1/campaigns/{id}/start" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Campaign started successfully

application/json

Schema: CampaignActionResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "campaignId": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
402 Insufficient credits

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
409 Resource conflict

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/campaigns/{id}/pause

Pause Campaign

API keycampaigns:write

Temporarily pause a running campaign. Active calls will complete, but no new calls will be initiated.

Resume: Use the Start Campaign endpoint to resume a paused campaign.

Use Cases:

Credit running low

Need to add more contacts

Business hours ended

Required Scope: campaigns:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X POST "https://almatalk.ca/api/v1/campaigns/{id}/pause" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Campaign paused. Active calls will complete.

application/json

Schema: CampaignActionResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "campaignId": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
409 Resource conflict

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}

Agents

AI Voice Agents

Agents are your AI-powered conversational assistants. They handle voice interactions using advanced conversation flows.

Agent Types:

TypeDescription
flowVisual conversation builder with decision trees and LLM-powered responses
incomingHandles inbound calls on purchased phone numbers

Note: Agents must be active (isActive: true) before they can be used in calls or campaigns.

GET/api/v1/agents

List Agents

API keyagents:read

Retrieve all AI agents in your account. Each agent represents a configured voice assistant with its own personality, language, and behavior.

Agent Status:

isActive: true - Agent is ready for calls

isActive: false - Agent is disabled

Required Scope: agents:read

Parameters

NameInTypeDescription
pagequeryinteger

Page number (1-indexed)

Default: 1

pageSizequeryinteger

Items per page (max 100)

Default: 20

Request example
curl -X GET "https://almatalk.ca/api/v1/agents" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 List of agents with basic information

application/json

Schema: AgentListResponse

FieldTypeDescription
successboolean
dataarray<Agent>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Agent"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/agents/{id}

Get Agent Details

API keyagents:read

Retrieve complete configuration for an agent including:

System prompt and first message

Voice and LLM settings

Transfer configuration

Language and personality settings

Use Case: Inspect agent settings before using in campaigns or calls.

Required Scope: agents:read

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X GET "https://almatalk.ca/api/v1/agents/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Complete agent configuration

application/json

Schema: AgentDetailResponse

FieldTypeDescription
successboolean
dataAgentDetail
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/AgentDetail"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/agents/{id}/flow

Export Agent Flow

API keyagents:read

Export the visual conversation flow for a Flow-type agent. Returns the flow nodes and edges, including captured-variable configuration on individual steps.

Use Cases:

Backup agent configurations

Clone flows to other agents

Version control flow designs

Share flows between accounts

Note: Only works for agents with type: flow. Incoming agents don't have exportable flows.

Required Scope: agents:read

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X GET "https://almatalk.ca/api/v1/agents/{id}/flow" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Complete flow definition with nodes and edges

application/json

Schema: FlowExportResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "version": {
          "type": "string"
        },
        "agentId": {
          "type": "string"
        },
        "agentName": {
          "type": "string"
        },
        "exportedAt": {
          "type": "string",
          "format": "date-time"
        },
        "flow": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "name": {
              "type": "string"
            },
            "nodes": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "edges": {
              "type": "array",
              "items": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
PUT/api/v1/agents/{id}/flow

Import Agent Flow

API keyagents:write

Save a validated flow definition for an owned agent. New flows are inactive drafts. Review and publish the result in Flow Builder to update the connected agent.

Warning: This replaces the existing flow entirely. Export the current flow first if you want to preserve it.

Flow Structure:

nodes - Array of flow nodes (message, question, condition, etc.)

edges - Connections between nodes

Capture variables inside question and form node configuration. Top-level variables are not supported.

Required Scope: agents:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request body Required

application/json

Schema: FlowImportRequest

FieldTypeDescription
flowRequiredobject
Complete schema
{
  "type": "object",
  "required": [
    "flow"
  ],
  "properties": {
    "flow": {
      "type": "object",
      "required": [
        "nodes",
        "edges"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "nodes": {
          "type": "array",
          "items": {
            "type": "object"
          }
        },
        "edges": {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      }
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/v1/agents/{id}/flow" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"flow\":{\"nodes\":[{}],\"edges\":[{}]}}"

Responses

200 Flow definition saved; publish in Flow Builder to update the connected agent

application/json

Schema: FlowImportResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "agentId": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}

Contacts

Lead Records

Manage your lead records with full CRUD operations. Leads can be enriched with AI-generated summaries and sentiment analysis after calls.

These are lead records, not caller profiles. Every id on this tag is a lead id from the leads table. The phone system keeps a separate store of caller profiles, with its own ids, and the two are only ever matched on the last 10 digits of a phone number. Read Contact identity in the introduction before you build a sync.

Features:

Store custom fields for personalization

Tag contacts for segmentation

Track lead stages through your funnel

Bulk import up to 10,000 leads at once

AI Enrichment: After a call, lead records are updated with:

Conversation summary

Sentiment analysis

Lead score adjustments

GET/api/v1/contacts

List Contacts

API keycontacts:read

Retrieve all contacts from your CRM. Contacts are enriched with AI-generated data after calls.

Contact Data Includes:

Basic info (name, phone, email, company)

Custom fields for personalization

Tags for segmentation

Lead stage and score

AI summary and sentiment (post-call)

Required Scope: contacts:read

Parameters

NameInTypeDescription
pagequeryinteger

Page number (1-indexed)

Default: 1

pageSizequeryinteger

Items per page (default 50, max 100).

Default: 50

Request example
curl -X GET "https://almatalk.ca/api/v1/contacts" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 List of contacts with enriched data

application/json

Schema: ContactListResponse

FieldTypeDescription
successboolean
dataarray<Contact>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Contact"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/contacts

Create Contact

API keycontacts:write

Add a new contact to your CRM. The phone number is required; all other fields are optional.

Best Practices:

Use E.164 format for phone numbers (+1234567890)

Add custom fields that your agents can reference

Use tags for easy filtering and segmentation

Required Scope: contacts:write

Request body Required

application/json

Schema: CreateContactRequest

FieldTypeDescription
phoneRequiredstring
firstNamestring
lastNamestring
emailstring
companystring
tagsarray<string>
customFieldsobject
Complete schema
{
  "type": "object",
  "required": [
    "phone"
  ],
  "properties": {
    "phone": {
      "type": "string",
      "minLength": 10
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "company": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "customFields": {
      "type": "object",
      "additionalProperties": true
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/contacts" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"phone\":\"YOUR_VALUE\"}"

Responses

201 Contact created successfully

application/json

Schema: ContactResponse

FieldTypeDescription
successboolean
dataContact
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Contact"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
409 Resource conflict

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/contacts/{id}

Get Contact Details

API keycontacts:read

Retrieve complete information about a contact including call history and AI enrichment.

AI Enrichment (after calls):

aiSummary - AI-generated summary of conversations

sentiment - Detected sentiment (positive, neutral, negative)

leadScore - Automatically calculated lead score

Required Scope: contacts:read

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X GET "https://almatalk.ca/api/v1/contacts/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Complete contact details with AI enrichment

application/json

Schema: ContactResponse

FieldTypeDescription
successboolean
dataContact
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Contact"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
PUT/api/v1/contacts/{id}

Update Contact

API keycontacts:write

Update contact information. Only include fields you want to change.

Tip: Update the stage field to move contacts through your sales funnel.

Required Scope: contacts:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request body Required

application/json

Schema: UpdateContactRequest

FieldTypeDescription
phonestring
firstNamestring
lastNamestring
emailstring
companystring
tagsarray<string>
customFieldsobject
stagestring
Complete schema
{
  "type": "object",
  "properties": {
    "phone": {
      "type": "string"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "company": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "customFields": {
      "type": "object"
    },
    "stage": {
      "type": "string"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/v1/contacts/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Contact updated successfully

application/json

Schema: ContactResponse

FieldTypeDescription
successboolean
dataContact
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Contact"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
DELETE/api/v1/contacts/{id}

Delete Contact

API keycontacts:write

Permanently delete a contact and all associated data.

Warning: This action cannot be undone. Call history remains but will no longer be linked to this contact.

Required Scope: contacts:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X DELETE "https://almatalk.ca/api/v1/contacts/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Contact permanently deleted

application/json

Schema: DeleteResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "deleted": {
          "type": "boolean",
          "example": true
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/contacts/bulk-import

Bulk Import Contacts

API keycontacts:write

Import up to 10,000 contacts in a single request. Ideal for syncing from external CRMs or uploading lists.

Behavior:

Duplicate phone numbers are skipped

Invalid records are counted in failed response field

Import is atomic: all succeed or detailed errors returned

Performance Tip: For very large imports, batch into multiple requests of 5,000 contacts each.

Required Scope: contacts:write

Request body Required

application/json

Schema: BulkImportRequest

FieldTypeDescription
contactsRequiredarray<CreateContactRequest>
skipDuplicatesboolean

Default: true

Complete schema
{
  "type": "object",
  "required": [
    "contacts"
  ],
  "properties": {
    "contacts": {
      "type": "array",
      "minItems": 1,
      "maxItems": 10000,
      "items": {
        "$ref": "#/components/schemas/CreateContactRequest"
      }
    },
    "skipDuplicates": {
      "type": "boolean",
      "default": true
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/contacts/bulk-import" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"contacts\":[{\"phone\":\"YOUR_VALUE\"}]}"

Responses

201 Import completed with success/failure counts

application/json

Schema: BulkImportResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "imported": {
          "type": "integer"
        },
        "skipped": {
          "type": "integer"
        },
        "errors": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "row": {
                "type": "integer"
              },
              "phoneNumber": {
                "type": "string"
              },
              "error": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/contacts/manual

Add contact manually

Dashboard session

Add a contact either to a campaign (with campaignId) or standalone (to caller_profiles).

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Request body Required

application/json

FieldTypeDescription
campaignIdstring

Optional campaign to add to

phoneNumberRequiredstring
firstNamestring
lastNamestring
emailstring
companystring
Complete schema
{
  "type": "object",
  "required": [
    "phoneNumber"
  ],
  "properties": {
    "campaignId": {
      "type": "string",
      "description": "Optional campaign to add to"
    },
    "phoneNumber": {
      "type": "string",
      "example": "+15145550142"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "company": {
      "type": "string"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/contacts/manual" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"phoneNumber\":\"+15145550142\"}"

Responses

201 Contact created

application/json

FieldTypeDescription
successRequiredboolean
contactRequiredobject · nullable
Complete schema
{
  "type": "object",
  "required": [
    "success",
    "contact"
  ],
  "properties": {
    "success": {
      "type": "boolean"
    },
    "contact": {
      "type": "object",
      "nullable": true,
      "additionalProperties": true
    }
  }
}

Credits

Credit Balance and Usage

Monitor your credit balance and usage history. Credits are metered per second of answered conversation: on the standard model tier, 1 credit a second, so 60 a minute. A higher model tier costs more per second.

Understanding Credits:

Credits are deducted in real time during calls, by the second, with no rounding up to a whole minute

The rate depends on the AI model tier the agent runs; your dashboard's model picker shows the exact credits per minute for each tier

Campaigns pause automatically when credits run low

GET /credits/usage reports minutes as a copy of credits, not as measured call duration. Use credits, or read measured duration from GET /analytics/calls

GET/api/v1/credits/balance

Get Credit Balance

API keycredits:read

Check your current credit balance. Use this to verify you have sufficient credits before starting campaigns.

Credit System:

Credits are metered by the second of answered conversation, with no rounding up to a whole minute

On the standard model tier that is 1 credit a second, so 60 a minute; a higher model tier costs more per second

Balance updates in real time during calls

available and total are the same number today, and reserved is always 0. Nothing is held back for a running campaign, so do not treat available as a commitment.

Required Scope: credits:read

Request example
curl -X GET "https://almatalk.ca/api/v1/credits/balance" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Current credit balance

application/json

Schema: CreditBalanceResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "available": {
          "type": "number"
        },
        "reserved": {
          "type": "number"
        },
        "total": {
          "type": "number"
        },
        "currency": {
          "type": "string",
          "example": "credits"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/credits/usage

Get Credit Usage

API keycredits:read

Retrieve credit usage history for budgeting and analysis. Shows daily usage breakdown.

Use Cases:

Track spending over time

Identify high-usage periods

Plan credit purchases

Generate billing reports

minutes is a copy of credits, not measured call duration. Each day's row sums the deduction amounts, and the same sum is reported under both names. Read credits and convert with the rate in Credits and Metering, or read measured duration from GET /analytics/calls.

calls counts credit deductions, not calls. A call billed in more than one deduction counts more than once.

At most 1,000 transactions are read per request, newest first, so a very busy account over a long window can under-report the oldest days.

Required Scope: credits:read

Parameters

NameInTypeDescription
daysqueryinteger

Number of days to include in the report. Defaults to 30. A non-numeric value falls back to 30.

Default: 30

Request example
curl -X GET "https://almatalk.ca/api/v1/credits/usage" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Daily credit usage breakdown

application/json

Schema: CreditUsageResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "period": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string",
              "format": "date-time"
            },
            "end": {
              "type": "string",
              "format": "date-time"
            }
          }
        },
        "usage": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "format": "date"
              },
              "calls": {
                "type": "integer",
                "description": "Number of credit deductions on this date, not distinct calls."
              },
              "minutes": {
                "type": "integer",
                "description": "A copy of `credits`, not measured call duration. Kept for backward compatibility.\nUse `credits`, or `GET /analytics/calls` for real duration."
              },
              "credits": {
                "type": "number",
                "description": "Credits deducted on this date."
              }
            }
          }
        },
        "total": {
          "type": "object",
          "properties": {
            "calls": {
              "type": "integer"
            },
            "minutes": {
              "type": "integer"
            },
            "credits": {
              "type": "number"
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/credits/calls

Read call totals for a recent period

API keyanalytics:read

Summarizes calls for this account over the requested number of days. Use a positive integer for days. Duration totals are rounded to minutes; averages are seconds.

Parameters

NameInTypeDescription
daysqueryinteger

Lookback in days

Default: 30

Request example
curl -X GET "https://almatalk.ca/api/v1/credits/calls" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
metaobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "totalCalls": {
          "type": "integer"
        },
        "completedCalls": {
          "type": "integer"
        },
        "failedCalls": {
          "type": "integer"
        },
        "totalDurationMinutes": {
          "type": "number"
        },
        "averageDurationSeconds": {
          "type": "number"
        },
        "creditsUsed": {
          "type": "number"
        },
        "period": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string"
            },
            "end": {
              "type": "string"
            }
          }
        }
      }
    },
    "meta": {
      "type": "object"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/v1/credits/campaigns

Read campaign progress estimates

API keyanalytics:read

Lists campaign contact counts. connected currently mirrors the called count and failed is a placeholder zero; these are progress estimates, not verified connection or failure outcomes. Use call records for actual outcomes.

Parameters

NameInTypeDescription
pagequeryinteger

Page number

Default: 1

pageSizequeryinteger

Maximum 100

Default: 50

Request example
curl -X GET "https://almatalk.ca/api/v1/credits/campaigns" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataarray<object>
metaobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "campaignId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "totalContacts": {
            "type": "integer"
          },
          "called": {
            "type": "integer"
          },
          "connected": {
            "type": "integer"
          },
          "completed": {
            "type": "integer"
          },
          "failed": {
            "type": "integer"
          },
          "pending": {
            "type": "integer"
          },
          "successRate": {
            "type": "number"
          }
        }
      }
    },
    "meta": {
      "type": "object"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}

Analytics

Call and Campaign Analytics

Access aggregated statistics and insights about your calling activity. Use this data to optimize campaigns and measure ROI.

Available Metrics:

Total calls and minutes

Answer rates and outcomes

Average call duration

Campaign performance comparisons

Daily/weekly/monthly trends

GET/api/v1/analytics/calls

Get Call Analytics

API keyanalytics:read

Retrieve aggregated call statistics. Useful for dashboards and performance monitoring.

Metrics Included:

Total, completed and failed call counts

Total duration in minutes and average duration in seconds

Credits used

Start and end of the aggregate reporting period

Required Scope: analytics:read

Parameters

NameInTypeDescription
daysqueryinteger

Number of days to analyze (default 30). No upper limit is enforced by this endpoint.

Default: 30

Request example
curl -X GET "https://almatalk.ca/api/v1/analytics/calls" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Call analytics

application/json

Schema: CallAnalyticsResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "totalCalls": {
          "type": "integer"
        },
        "completedCalls": {
          "type": "integer"
        },
        "failedCalls": {
          "type": "integer"
        },
        "totalDurationMinutes": {
          "type": "integer"
        },
        "averageDurationSeconds": {
          "type": "integer"
        },
        "creditsUsed": {
          "type": "number"
        },
        "period": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string",
              "format": "date-time"
            },
            "end": {
              "type": "string",
              "format": "date-time"
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/analytics/campaigns

Get Campaign Analytics

API keyanalytics:read

Retrieve performance analytics for all campaigns. Compare effectiveness across different campaigns.

Metrics Per Campaign:

Campaign name, status and total contacts

Completed, successful, failed and pending counts

Success rate, calculated against total contacts

Start, completion and creation timestamps

Pagination metadata

Required Scope: analytics:read

Parameters

NameInTypeDescription
pagequeryinteger

Page number (1-indexed)

Default: 1

pageSizequeryinteger

Items per page (default 50, max 100).

Default: 50

Request example
curl -X GET "https://almatalk.ca/api/v1/analytics/campaigns" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Performance metrics for all campaigns

application/json

Schema: CampaignAnalyticsResponse

FieldTypeDescription
successboolean
dataarray<object>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "campaignId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "totalContacts": {
            "type": "integer"
          },
          "completed": {
            "type": "integer"
          },
          "successful": {
            "type": "integer"
          },
          "failed": {
            "type": "integer"
          },
          "pending": {
            "type": "integer"
          },
          "successRate": {
            "type": "integer"
          },
          "startedAt": {
            "type": "string",
            "format": "date-time"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/analytics/summary

Get Analytics Summary

API keyanalytics:read

Get a high-level summary of all activity. Perfect for executive dashboards and quick status checks.

Summary Includes:

Selected reporting period

Total and completed calls within that period

Total, running and completed campaigns across the account

Required Scope: analytics:read

Parameters

NameInTypeDescription
daysqueryinteger

Time period to summarize (default 30 days)

Default: 30

Request example
curl -X GET "https://almatalk.ca/api/v1/analytics/summary" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 High-level analytics summary

application/json

Schema: AnalyticsSummaryResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "period": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string",
              "format": "date-time"
            },
            "end": {
              "type": "string",
              "format": "date-time"
            },
            "days": {
              "type": "integer"
            }
          }
        },
        "calls": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "completed": {
              "type": "integer"
            }
          }
        },
        "campaigns": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "running": {
              "type": "integer"
            },
            "completed": {
              "type": "integer"
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}

Webhooks

Event Notifications

Webhooks deliver notifications to your server when events occur. Use them to sync data, trigger workflows, or build integrations.

Supported events

This is the complete list POST /webhooks and PUT /webhooks/{id} accept. Anything else is refused with 400 VALIDATION_ERROR and the response lists these names back to you. GET /webhooks/events returns the same list at runtime.

EventMeaningEmitted today
call.startedTriggered when a call beginsyes
call.ringingTriggered when an outbound destination is ringingyes
call.answeredTriggered when an outbound call is answeredyes
call.completedTriggered when a call ends successfullyyes
call.failedTriggered when a call failsyes
call.transferredTriggered when a call is transferredyes
call.no_answerTriggered when an outbound call is not answeredyes
call.busyTriggered when an outbound destination is busyyes
call.voicemailTriggered when an outbound call reaches voicemailyes
inbound_call.receivedTriggered when an inbound call reaches the platformyes
inbound_call.answeredTriggered when an inbound call is answeredyes
inbound_call.completedTriggered when an answered inbound call completesyes
inbound_call.missedTriggered when an inbound call is missedyes
campaign.startedTriggered when a campaign startsyes
campaign.completedTriggered when a campaign finishesyes
campaign.pausedTriggered when a campaign is pausedyes
campaign.resumedTriggered when a paused campaign resumesyes
campaign.failedTriggered when a campaign failsyes
campaign.cancelledTriggered when a campaign is cancelledyes
flow.startedTriggered when a compiled call flow startsyes
flow.completedTriggered when a compiled call flow completesyes
flow.failedTriggered when a compiled call flow failsyes
appointment.bookedTriggered when an appointment is bookedyes
appointment.confirmedTriggered when an appointment is confirmedyes
appointment.cancelledTriggered when an appointment is cancelledyes
appointment.rescheduledTriggered when an appointment is rescheduledyes
appointment.completedTriggered when an appointment is marked completeyes
appointment.no_showTriggered when an appointment is marked as a no-showyes
form.submittedTriggered when a voice flow saves a form submissionyes
contact.createdReserved for contact creationno
contact.updatedReserved for contact updatesno
credits.lowReserved for a low credit balanceno
credits.depletedReserved for an exhausted credit balanceno

Read the last column. The four marked no are accepted on a subscription and are fired by nothing in this deployment, so a subscriber waiting on one waits for ever. They are listed because the API accepts them, not because they arrive. GET /webhooks/events carries the same flag as emitted.


Signature verification

Every delivery is signed with HMAC-SHA256 over the exact request body bytes, using the subscription secret returned once when the webhook was created, and the digest is lowercase hexadecimal.

Two senders reach your endpoint, and their headers differ. Both are listed exactly as they go out:

Real eventsThe test ping from POST /webhooks/{id}/test
Signature headerX-Webhook-Signature: sha256=<hex>X-Webhook-Signature: <hex> and X-AlmaTalk-Signature: <hex>, same value under both names
Prefixedyes, sha256=no, bare hex
Event headerX-Webhook-Event: <event name>X-AlmaTalk-Event: test.ping
Delivery idX-Webhook-Delivery: <uuid>none
User agentPlatform-Webhook/1.0default
Timeout30 seconds10 seconds
Retriesup to 3 attempts, at 0s, 60s and 300snone, a single attempt

Write one verifier that strips an optional sha256= prefix and it handles both. Compare in constant time, and hash the raw body, not a re-serialized object:

import crypto from "crypto";

function verify(secret, rawBody, header) {
  const received = String(header || "").trim().replace(/^sha256=/i, "");
  if (!/^[0-9a-f]{64}$/i.test(received)) return false;
  const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(expected, "hex");
  const b = Buffer.from(received.toLowerCase(), "hex");
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

// Express: capture the raw body, then
//   verify(secret, req.rawBody, req.get("X-Webhook-Signature"))

Delivery behaviour

https is strongly recommended. http is accepted; a destination that resolves to a loopback, private, link-local or cloud-metadata address is refused before anything is sent.

Redirects are not followed on a real event delivery. Point the subscription at the final URL.

Answer 2xx within the timeout above. Retries for real events are held in memory, so a platform restart ends them.

There is no replay endpoint. Store the delivery you received.

GET/api/v1/webhooks

List Webhooks

API keywebhooks:read

Retrieve all webhook subscriptions. Each webhook listens for specific events and delivers payloads to your endpoint.

Reading the state of a subscription. There is no single status field. Each row carries:

isActive - true while the subscription receives events, false while it is paused. Set it with PUT /webhooks/{id}.

lastDeliveryAt and lastDeliveryStatus - when the last delivery was attempted and how it went.

A subscription is never disabled automatically by failed deliveries. If deliveries are failing, lastDeliveryStatus says so and isActive stays as you left it.

The signing secret is not returned here. It is shown once, in the create response.

Required Scope: webhooks:read

Request example
curl -X GET "https://almatalk.ca/api/v1/webhooks" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 List of webhook subscriptions

application/json

Schema: WebhookListResponse

FieldTypeDescription
successboolean
dataarray<Webhook>
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Webhook"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/webhooks

Create Webhook

API keywebhooks:write

Subscribe to events with a new webhook. Your endpoint will receive HTTP POST requests when events occur.

Setup Requirements:

A publicly reachable endpoint. https is strongly recommended; http is accepted. A destination resolving to a loopback, private, link-local or cloud-metadata address is refused before anything is sent.

Respond 2xx within 30 seconds on a real event, within 10 seconds on the test ping.

A failed real-event delivery is retried up to 3 times in total, at 0s, 60s and 300s. Those timers live in memory, so a platform restart ends them. The test ping is a single attempt and is never retried.

Signature Verification: The payload is signed with HMAC-SHA256 over the exact body bytes. Real events arrive as X-Webhook-Signature: sha256=<hex>; the test ping arrives as X-Webhook-Signature: <hex> and X-AlmaTalk-Signature: <hex>, the same value under both names and with no prefix. Strip an optional sha256= prefix and one verifier handles both. The full table and a working verifier are in the Webhooks section above.

The secret is shown once, in this response, and is not retrievable afterwards. Store it before you close the connection.

Required Scope: webhooks:write

Request body Required

application/json

Schema: CreateWebhookRequest

FieldTypeDescription
urlRequiredstring

HTTPS endpoint to receive webhook payloads

eventsRequiredarray<string>
secretstring

Custom signing secret (auto-generated if not provided)

descriptionstring
Complete schema
{
  "type": "object",
  "required": [
    "url",
    "events"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "description": "HTTPS endpoint to receive webhook payloads"
    },
    "events": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "string",
        "enum": [
          "call.started",
          "call.ringing",
          "call.answered",
          "call.completed",
          "call.failed",
          "call.transferred",
          "call.no_answer",
          "call.busy",
          "call.voicemail",
          "inbound_call.received",
          "inbound_call.answered",
          "inbound_call.completed",
          "inbound_call.missed",
          "campaign.started",
          "campaign.completed",
          "campaign.paused",
          "campaign.resumed",
          "campaign.failed",
          "campaign.cancelled",
          "flow.started",
          "flow.completed",
          "flow.failed",
          "appointment.booked",
          "appointment.confirmed",
          "appointment.cancelled",
          "appointment.rescheduled",
          "appointment.completed",
          "appointment.no_show",
          "form.submitted",
          "contact.created",
          "contact.updated",
          "credits.low",
          "credits.depleted"
        ]
      }
    },
    "secret": {
      "type": "string",
      "description": "Custom signing secret (auto-generated if not provided)"
    },
    "description": {
      "type": "string"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/webhooks" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"url\":\"YOUR_VALUE\",\"events\":[\"call.started\"]}"

Responses

201 Webhook created with signing secret

application/json

Schema: WebhookResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "allOf": [
        {
          "$ref": "#/components/schemas/Webhook"
        },
        {
          "type": "object",
          "properties": {
            "secret": {
              "type": "string",
              "description": "Only returned on creation"
            }
          }
        }
      ]
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/webhooks/events

List Supported Events

API keywebhooks:read

Get a list of all event types you can subscribe to. Use these event names when creating webhooks. This endpoint and the table in the Webhooks section above are generated from the same list in code, so they cannot disagree.

Event Categories:

call.* - call lifecycle events

campaign.* - campaign lifecycle events

contact.* - reserved for contact changes, accepted but not emitted yet

credits.* - reserved for balance thresholds, accepted but not emitted yet

There is no subscription.* family. Earlier versions of this reference listed one; the API has never accepted it.

Each row carries emitted: false means the name can be subscribed to and nothing in this deployment fires it.

Required Scope: webhooks:read

Request example
curl -X GET "https://almatalk.ca/api/v1/webhooks/events" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 List of available event types

application/json

Schema: WebhookEventsResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "events": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "example": "call.completed"
              },
              "description": {
                "type": "string"
              },
              "emitted": {
                "type": "boolean",
                "description": "Whether anything in this deployment currently fires the event. `false` means the\nname is accepted on a subscription and never delivered.",
                "example": true
              }
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
PUT/api/v1/webhooks/{id}

Update Webhook

API keywebhooks:write

Modify a webhook's configuration. You can change the URL, events, or active status.

Tip: Set active: false to temporarily pause a webhook without deleting it.

Required Scope: webhooks:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request body Required

application/json

Schema: UpdateWebhookRequest

FieldTypeDescription
urlstring
eventsarray<string>

Replaces the subscription's event list. Same accepted names as on create.

isActiveboolean
descriptionstring
Complete schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    },
    "events": {
      "type": "array",
      "minItems": 1,
      "description": "Replaces the subscription's event list. Same accepted names as on create.",
      "items": {
        "type": "string",
        "enum": [
          "call.started",
          "call.ringing",
          "call.answered",
          "call.completed",
          "call.failed",
          "call.transferred",
          "call.no_answer",
          "call.busy",
          "call.voicemail",
          "inbound_call.received",
          "inbound_call.answered",
          "inbound_call.completed",
          "inbound_call.missed",
          "campaign.started",
          "campaign.completed",
          "campaign.paused",
          "campaign.resumed",
          "campaign.failed",
          "campaign.cancelled",
          "flow.started",
          "flow.completed",
          "flow.failed",
          "appointment.booked",
          "appointment.confirmed",
          "appointment.cancelled",
          "appointment.rescheduled",
          "appointment.completed",
          "appointment.no_show",
          "form.submitted",
          "contact.created",
          "contact.updated",
          "credits.low",
          "credits.depleted"
        ]
      }
    },
    "isActive": {
      "type": "boolean"
    },
    "description": {
      "type": "string"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/v1/webhooks/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Webhook configuration updated

application/json

Schema: WebhookResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "allOf": [
        {
          "$ref": "#/components/schemas/Webhook"
        },
        {
          "type": "object",
          "properties": {
            "secret": {
              "type": "string",
              "description": "Only returned on creation"
            }
          }
        }
      ]
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
DELETE/api/v1/webhooks/{id}

Delete Webhook

API keywebhooks:write

Permanently delete a webhook subscription. No further events will be delivered to this endpoint.

Required Scope: webhooks:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X DELETE "https://almatalk.ca/api/v1/webhooks/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Webhook deleted successfully

application/json

Schema: DeleteResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "deleted": {
          "type": "boolean",
          "example": true
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/webhooks/{id}/test

Test Webhook

API keywebhooks:write

Send a test payload to verify your webhook endpoint is configured correctly. The test payload mimics a real event.

Test Process: 1. AlmaTalk sends a test.ping payload to your URL, signed with your subscription secret 2. Your server should return a 2xx status 3. The response tells you whether it was delivered and with what status code

The test ping is not byte-identical to a real event. It carries X-AlmaTalk-Event: test.ping, it signs with X-Webhook-Signature: <hex> and X-AlmaTalk-Signature: <hex> with no sha256= prefix (a real event prefixes it), it has no X-Webhook-Delivery header, it times out at 10 seconds rather than 30, and it is never retried. Build your verifier to strip an optional sha256= prefix and both deliveries verify.

Troubleshooting:

Ensure your endpoint is publicly accessible

Respond within 10 seconds, or this call answers 504 TIMEOUT

Verify the TLS certificate is valid

Required Scope: webhooks:write

Parameters

NameInTypeDescription
idRequiredpathstring

Resource UUID

Request example
curl -X POST "https://almatalk.ca/api/v1/webhooks/{id}/test" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Test results with timing and response info

application/json

Schema: WebhookTestResponse

FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "delivered": {
          "type": "boolean"
        },
        "statusCode": {
          "type": "integer"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}

Campaign Types

Campaign types (dashboard endpoint)

These are not API-key endpoints. They are mounted under /api, not /api/v1, and authenticate with a dashboard session token. An API key is refused. They are documented here because integrators ask about them.

GET/api/campaign-types

List campaign types

Dashboard session

Returns global (admin-created) + user's own custom campaign types.

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Request example
curl -X GET "https://almatalk.ca/api/campaign-types" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Array of campaign types
POST/api/campaign-types

Create custom campaign type

Dashboard session

Create a user-scoped custom campaign type.

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Request body Required

application/json

FieldTypeDescription
nameRequiredstring
Complete schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "example": "Reactivation Campaign"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/campaign-types" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"Reactivation Campaign\"}"

Responses

200 Created type
DELETE/api/campaign-types/{id}

Delete custom campaign type

Dashboard session

Only custom types owned by the user can be deleted.

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Parameters

NameInTypeDescription
idRequiredpathinteger

Numeric record identifier returned by this resource.

Request example
curl -X DELETE "https://almatalk.ca/api/campaign-types/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Deleted

Follow-Ups

Follow-ups (dashboard endpoints)

These are not API-key endpoints. They are mounted under /api/plugins/follow-ups with a dashboard session token, and an API key is refused. They are documented here because integrators ask about them.

Follow-up contacts are addressed by phone number, not by a lead id or a caller-profile id. See Contact Identity in the introduction for why those are three different things.

GET/api/plugins/follow-ups/rules

List follow-up rules

Dashboard session

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/rules" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 List of rules
POST/api/plugins/follow-ups/rules

Create follow-up rule

Dashboard session

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Request body Required

application/json

FieldTypeDescription
nameRequiredstring
trigger_eventRequiredstring

Values: call.completed, call.no_answer, appointment.booked, appointment.completed, appointment.no_show, appointment.reminder, meeting.reminder

action_typeRequiredstring

Values: send_email, send_sms, send_whatsapp, schedule_callback, ai_suggest

delay_minutesinteger

For "after event" triggers, delay after event. For "reminder" triggers, time before the appointment.

template_idinteger
Complete schema
{
  "type": "object",
  "required": [
    "name",
    "trigger_event",
    "action_type"
  ],
  "properties": {
    "name": {
      "type": "string"
    },
    "trigger_event": {
      "type": "string",
      "enum": [
        "call.completed",
        "call.no_answer",
        "appointment.booked",
        "appointment.completed",
        "appointment.no_show",
        "appointment.reminder",
        "meeting.reminder"
      ]
    },
    "action_type": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "schedule_callback",
        "ai_suggest"
      ]
    },
    "delay_minutes": {
      "type": "integer",
      "description": "For \"after event\" triggers, delay after event. For \"reminder\" triggers, time before\nthe appointment."
    },
    "template_id": {
      "type": "integer"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/rules" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"YOUR_VALUE\",\"trigger_event\":\"call.completed\",\"action_type\":\"send_email\"}"

Responses

201 Rule created

application/json

FieldTypeDescription
successRequiredboolean
ruleRequiredobject · nullable
Complete schema
{
  "type": "object",
  "required": [
    "success",
    "rule"
  ],
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rule": {
      "type": "object",
      "nullable": true,
      "additionalProperties": true
    }
  }
}
GET/api/plugins/follow-ups/queue

List follow-up queue items

Dashboard session

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Parameters

NameInTypeDescription
statusquerystring

Values: pending, completed, failed, cancelled, all

typequerystring

Values: send_email, send_sms, send_whatsapp, schedule_callback

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/queue" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Queue items with reason + editable message/prompt
PUT/api/plugins/follow-ups/queue/{id}

Update a queue item (message, prompt, or action)

Dashboard session

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Parameters

NameInTypeDescription
idRequiredpathinteger

Numeric record identifier returned by this resource.

Request body Required

application/json

FieldTypeDescription
customMessagestring
customPromptstring
actionTypestring
Complete schema
{
  "type": "object",
  "properties": {
    "customMessage": {
      "type": "string"
    },
    "customPrompt": {
      "type": "string"
    },
    "actionType": {
      "type": "string"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/queue/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Updated
DELETE/api/plugins/follow-ups/queue/{id}

Cancel a queue item

Dashboard session

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Parameters

NameInTypeDescription
idRequiredpathinteger

Numeric record identifier returned by this resource.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/follow-ups/queue/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Cancelled
GET/api/plugins/follow-ups/queue/{id}/preview

Preview the stored queue message and prompt

Dashboard session

Returns the reason for the follow-up and the stored messagePreview and promptPreview strings. This read does not generate a new AI message.

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Parameters

NameInTypeDescription
idRequiredpathinteger

Numeric record identifier returned by this resource.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/preview" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Preview with reason, messagePreview, promptPreview

application/json

FieldTypeDescription
successRequiredboolean
itemRequiredobject
Complete schema
{
  "type": "object",
  "required": [
    "success",
    "item"
  ],
  "properties": {
    "success": {
      "type": "boolean"
    },
    "item": {
      "type": "object",
      "additionalProperties": true,
      "properties": {
        "reason": {
          "type": "string",
          "nullable": true
        },
        "messagePreview": {
          "type": "string"
        },
        "promptPreview": {
          "type": "string"
        }
      }
    }
  }
}
GET/api/plugins/follow-ups/contacts/{phone}

Get contact profile

Dashboard session

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Parameters

NameInTypeDescription
phoneRequiredpathstring
Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Profile with name, email, company, total_calls, sentiment, timezone, city
GET/api/plugins/follow-ups/contacts/{phone}/timeline

Get contact timeline

Dashboard session

Returns calls, SMS, WhatsApp, appointments, follow-ups, and notes for this contact.

Dashboard session only. This operation does not accept API keys; account or team permissions and feature availability apply.

Parameters

NameInTypeDescription
phoneRequiredpathstring
typequerystring

Values: call, sms, appointment, follow_up, note

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}/timeline" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Timeline items merged and sorted by date

Manual follow-ups

Use the authenticated account or member session, not an integration API key. Current follow-up read/create/update permissions and task visibility apply. Preview before creating. Approval and scheduling gates may hold a task; completing a workflow row is not proof of a message being delivered. Requested callbacks remain controlled by their separate workflow.

POST/api/plugins/follow-ups/queue

Create a manual follow-up (alias)

Dashboard session

Use the same requestId for readback after a lost response. The version 1 manual policy path is idempotent for identical input. Automatic approval requires update permission. Scheduling, quiet hours, plan, recipient and expiry gates can hold the task. Human task mentions may notify teammates. This response does not prove delivery.

Request body Required

application/json

Schema: ClientManualFollowup

FieldTypeDescription
requestIdRequiredstring
handledBystring

Values: human, automated

actionTypestring

Values: send_email, send_sms, send_whatsapp, human_task

contactPhonestring
contactEmailstring
contactNamestring
sourceCallIdstring
appointmentIdstring
scheduledLocalRequiredstring

Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused.

manualPolicyRequiredClientManualPolicy
messagestring
subjectstring
templateIdinteger
aiGuidancestring
customMessagestring
visibilitystring

Values: shared, internal

contextobject
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "handledBy": {
      "type": "string",
      "enum": [
        "human",
        "automated"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "human_task"
      ]
    },
    "contactPhone": {
      "type": "string",
      "example": "+15555550123"
    },
    "contactEmail": {
      "type": "string",
      "example": "[email protected]"
    },
    "contactName": {
      "type": "string"
    },
    "sourceCallId": {
      "type": "string"
    },
    "appointmentId": {
      "type": "string"
    },
    "scheduledLocal": {
      "type": "string",
      "example": "2026-12-01T10:30",
      "description": "Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused."
    },
    "manualPolicy": {
      "$ref": "#/components/schemas/ClientManualPolicy"
    },
    "message": {
      "type": "string"
    },
    "subject": {
      "type": "string"
    },
    "templateId": {
      "type": "integer",
      "minimum": 1
    },
    "aiGuidance": {
      "type": "string"
    },
    "customMessage": {
      "type": "string"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "shared",
        "internal"
      ]
    },
    "context": {
      "type": "object",
      "properties": {
        "contactId": {
          "type": "string"
        },
        "attachments": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ClientTaskAttachment"
          },
          "maxItems": 20
        },
        "title": {
          "type": "string"
        },
        "category": {
          "type": "string",
          "enum": [
            "task",
            "call",
            "sms",
            "email",
            "file",
            "other"
          ]
        },
        "deliveryMethod": {
          "type": "string",
          "enum": [
            "none",
            "sms",
            "email",
            "whatsapp",
            "call",
            "in_person"
          ]
        }
      }
    }
  },
  "required": [
    "requestId",
    "scheduledLocal",
    "manualPolicy"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"requestId\":\"YOUR_VALUE\",\"scheduledLocal\":\"2026-12-01T10:30\",\"manualPolicy\":{\"version\":1,\"timezone\":\"YOUR_VALUE\"}}"

Responses

200 Existing identical request returned without creating another task.

application/json

FieldTypeDescription
successboolean
createdboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "created": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
201 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
createdboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "created": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/queue/{id}

Read a follow-up task

Dashboard session

Requires current read access and current task visibility. Read this after an uncertain create or execution result before taking another action.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/queue/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/manual/options

Read manual follow-up options

Dashboard session

Returns the current account timezone, eligible channels, templates and execution permission. Callback creation is unavailable through this manual composer.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/manual/options" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
timezonestring
canExecuteboolean
channelsobject
templatesarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "timezone": {
      "type": "string"
    },
    "canExecute": {
      "type": "boolean"
    },
    "channels": {
      "type": "object"
    },
    "templates": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/manual/preview

Preview a manual follow-up

Dashboard session

Validates the proposed task and account-local schedule without sending or creating a task. Read/create permission and owned contact, source and attachments are checked. Human tasks use handledBy: human; mode and approval must match the selected action.

Request body Required

application/json

FieldTypeDescription
requestIdstring
handledBystring

Values: human, automated

actionTypestring

Values: send_email, send_sms, send_whatsapp, human_task

contactPhonestring
contactEmailstring
contactNamestring
sourceCallIdstring
appointmentIdstring
scheduledLocalRequiredstring

Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused.

manualPolicyRequiredClientManualPolicy
messagestring
subjectstring
templateIdinteger
aiGuidancestring
customMessagestring
visibilitystring

Values: shared, internal

contextobject
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "handledBy": {
      "type": "string",
      "enum": [
        "human",
        "automated"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "human_task"
      ]
    },
    "contactPhone": {
      "type": "string",
      "example": "+15555550123"
    },
    "contactEmail": {
      "type": "string",
      "example": "[email protected]"
    },
    "contactName": {
      "type": "string"
    },
    "sourceCallId": {
      "type": "string"
    },
    "appointmentId": {
      "type": "string"
    },
    "scheduledLocal": {
      "type": "string",
      "example": "2026-12-01T10:30",
      "description": "Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused."
    },
    "manualPolicy": {
      "$ref": "#/components/schemas/ClientManualPolicy"
    },
    "message": {
      "type": "string"
    },
    "subject": {
      "type": "string"
    },
    "templateId": {
      "type": "integer",
      "minimum": 1
    },
    "aiGuidance": {
      "type": "string"
    },
    "customMessage": {
      "type": "string"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "shared",
        "internal"
      ]
    },
    "context": {
      "type": "object",
      "properties": {
        "contactId": {
          "type": "string"
        },
        "attachments": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ClientTaskAttachment"
          },
          "maxItems": 20
        },
        "title": {
          "type": "string"
        },
        "category": {
          "type": "string",
          "enum": [
            "task",
            "call",
            "sms",
            "email",
            "file",
            "other"
          ]
        },
        "deliveryMethod": {
          "type": "string",
          "enum": [
            "none",
            "sms",
            "email",
            "whatsapp",
            "call",
            "in_person"
          ]
        }
      }
    }
  },
  "required": [
    "scheduledLocal",
    "manualPolicy"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/manual/preview" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"scheduledLocal\":\"2026-12-01T10:30\",\"manualPolicy\":{\"version\":1,\"timezone\":\"YOUR_VALUE\"}}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
noSendboolean

Values: true

itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/manual

Create a manual follow-up

Dashboard session

Use the same requestId for readback after a lost response. The version 1 manual policy path is idempotent for identical input. Automatic approval requires update permission. Scheduling, quiet hours, plan, recipient and expiry gates can hold the task. Human task mentions may notify teammates. This response does not prove delivery.

Request body Required

application/json

Schema: ClientManualFollowup

FieldTypeDescription
requestIdRequiredstring
handledBystring

Values: human, automated

actionTypestring

Values: send_email, send_sms, send_whatsapp, human_task

contactPhonestring
contactEmailstring
contactNamestring
sourceCallIdstring
appointmentIdstring
scheduledLocalRequiredstring

Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused.

manualPolicyRequiredClientManualPolicy
messagestring
subjectstring
templateIdinteger
aiGuidancestring
customMessagestring
visibilitystring

Values: shared, internal

contextobject
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "handledBy": {
      "type": "string",
      "enum": [
        "human",
        "automated"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "human_task"
      ]
    },
    "contactPhone": {
      "type": "string",
      "example": "+15555550123"
    },
    "contactEmail": {
      "type": "string",
      "example": "[email protected]"
    },
    "contactName": {
      "type": "string"
    },
    "sourceCallId": {
      "type": "string"
    },
    "appointmentId": {
      "type": "string"
    },
    "scheduledLocal": {
      "type": "string",
      "example": "2026-12-01T10:30",
      "description": "Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused."
    },
    "manualPolicy": {
      "$ref": "#/components/schemas/ClientManualPolicy"
    },
    "message": {
      "type": "string"
    },
    "subject": {
      "type": "string"
    },
    "templateId": {
      "type": "integer",
      "minimum": 1
    },
    "aiGuidance": {
      "type": "string"
    },
    "customMessage": {
      "type": "string"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "shared",
        "internal"
      ]
    },
    "context": {
      "type": "object",
      "properties": {
        "contactId": {
          "type": "string"
        },
        "attachments": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ClientTaskAttachment"
          },
          "maxItems": 20
        },
        "title": {
          "type": "string"
        },
        "category": {
          "type": "string",
          "enum": [
            "task",
            "call",
            "sms",
            "email",
            "file",
            "other"
          ]
        },
        "deliveryMethod": {
          "type": "string",
          "enum": [
            "none",
            "sms",
            "email",
            "whatsapp",
            "call",
            "in_person"
          ]
        }
      }
    }
  },
  "required": [
    "requestId",
    "scheduledLocal",
    "manualPolicy"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/manual" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"requestId\":\"YOUR_VALUE\",\"scheduledLocal\":\"2026-12-01T10:30\",\"manualPolicy\":{\"version\":1,\"timezone\":\"YOUR_VALUE\"}}"

Responses

200 Existing identical request returned without creating another task.

application/json

FieldTypeDescription
successboolean
createdboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "created": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
201 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
createdboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "created": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/batch

Read follow-up badges for calls

Dashboard session

Read-only POST. Up to 500 distinct call IDs; current task visibility applies. Returns counts and the two most recent visible items for each call.

Request body Required

application/json

FieldTypeDescription
callIdsRequiredarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "callIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 500,
      "uniqueItems": true
    }
  },
  "required": [
    "callIds"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/batch" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"callIds\":[\"YOUR_VALUE\"]}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
mapobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "map": {
      "type": "object",
      "additionalProperties": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer"
          },
          "openCount": {
            "type": "integer"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ClientFollowupItem"
            },
            "maxItems": 2
          }
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/attachments/upload-url

Request a task attachment upload URL

Dashboard session

Authenticated session required. taskId defaults to draft. Returns a temporary signed upload destination for the validated file type/name. Uploading does not attach the file to a task or send it. Storage must be configured.

Request body Required

application/json

FieldTypeDescription
taskIdstring

Default: "draft"

nameRequiredstring
contentTypeRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "taskId": {
      "type": "string",
      "default": "draft"
    },
    "name": {
      "type": "string"
    },
    "contentType": {
      "type": "string"
    }
  },
  "required": [
    "name",
    "contentType"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/attachments/upload-url" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"YOUR_VALUE\",\"contentType\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
urlstring
keystring
Complete schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string"
    },
    "key": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/attachments/upload

Upload a task attachment

Dashboard session

Multipart file, up to 25 MiB. taskId defaults to draft; an existing task must be owned by the account. Returns stored attachment metadata; creating/attaching or sending is separate.

Request body Required

multipart/form-data

FieldTypeDescription
fileRequiredstring
taskIdstring

Default: "draft"

Complete schema
{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "format": "binary"
    },
    "taskId": {
      "type": "string",
      "default": "draft"
    }
  },
  "required": [
    "file"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/attachments/upload" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
keystring
namestring
contentTypestring
sizeinteger
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "key": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "contentType": {
      "type": "string"
    },
    "size": {
      "type": "integer"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/queue/{id}/files

Read an attached file URL

Dashboard session

Requires current task read access. key must be in the task prefix or its recorded attachments. Returns a temporary download URL; does not modify or send the file.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

keyRequiredquerystring

Exact stored attachment key.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/files?key=YOUR_VALUE" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
urlstring
Complete schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/attachments

Attach stored file metadata

Dashboard session

Requires current task update access. Adds a validated stored key to the task attachment list (at most 30); does not send the file.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

Schema: ClientTaskAttachment

FieldTypeDescription
keystring
namestring
contentTypestring
sizeinteger
Complete schema
{
  "type": "object",
  "properties": {
    "key": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "contentType": {
      "type": "string"
    },
    "size": {
      "type": "integer",
      "minimum": 0
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/attachments" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
attachmentsarray<ClientTaskAttachment>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "attachments": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/ClientTaskAttachment"
      },
      "maxItems": 30
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/todo

Read the work queue feed

Dashboard session

Returns visible task rows and permitted appointments. Restricted members may receive appointmentsAvailable: false. This is a combined feed, not an external calendar export.

Parameters

NameInTypeDescription
sortquerystring

Omit for due order.

Values: newest, oldest

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/todo" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
itemsarray<object>
totalinteger
appointmentsAvailableboolean
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "total": {
      "type": "integer"
    },
    "appointmentsAvailable": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/execute

Execute a follow-up now

Dashboard session

Can cause a real send. Requires current update permission, an eligible task and existing approval, recipient, schedule and quiet-hour gates. Atomic claiming prevents competing execution; inspect returned sent/status/held reasons. A lost or unknown response requires readback, never a blind retry.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/execute" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
statusstring
sentboolean
reasonstring
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "status": {
      "type": "string"
    },
    "sent": {
      "type": "boolean"
    },
    "reason": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/reschedule

Reschedule a task

Dashboard session

Requires update permission and a non-running eligible task. Sets pending and clears previous approval; the user must review the new schedule.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
scheduledAtRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "scheduledAt": {
      "type": "string",
      "format": "date-time"
    }
  },
  "required": [
    "scheduledAt"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/reschedule" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"scheduledAt\":\"2026-11-06T15:00:00Z\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/skip

Skip a task

Dashboard session

Requires update permission and a non-running eligible task. Marks skipped and clears approval without sending anything.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/skip" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/status

Set workflow status

Dashboard session

Changes an eligible task's workflow status only. Completing a row is not proof a message was sent or delivered. Running tasks and requested-callback actions are guarded.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
statusRequiredstring

Values: pending, in_progress, completed, skipped, cancelled

Complete schema
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "pending",
        "in_progress",
        "completed",
        "skipped",
        "cancelled"
      ]
    }
  },
  "required": [
    "status"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/status" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"status\":\"pending\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/done

Mark a task completed

Dashboard session

Requires current update permission and eligible non-running task. Workflow-only completion; does not send a message and must not be treated as delivery evidence.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/done" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/complete

Mark a task completed (alias)

Dashboard session

Requires current update permission and eligible non-running task. Workflow-only completion; does not send a message and must not be treated as delivery evidence.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/complete" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
itemClientFollowupItem
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "item": {
      "$ref": "#/components/schemas/ClientFollowupItem"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/queue/{id}/job

Read a maintenance job brief

Dashboard session

Requires task visibility. Maintenance jobs only; other tasks return 404. Returns eligible team members without phone numbers and the current staff-text availability flag.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/job" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
briefstring
photoCountinteger
staffSmsOnboolean
membersarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "brief": {
      "type": "string"
    },
    "photoCount": {
      "type": "integer"
    },
    "staffSmsOn": {
      "type": "boolean"
    },
    "members": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/send-job

Send a job to selected staff

Dashboard session

Real staff text send, only when the existing staff-text feature is on and selected owned members are active and opted in. Requires task update permission and an available sender; platform agent lines are excluded. This endpoint does not enable the feature. Inspect sent/skipped results; do not automatically repeat an uncertain send.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
memberIdsRequiredarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "memberIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1
    }
  },
  "required": [
    "memberIds"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/send-job" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"memberIds\":[\"YOUR_VALUE\"]}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
sentinteger
skippedarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "sent": {
      "type": "integer"
    },
    "skipped": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/queue/{id}/timeline

Read a task timeline

Dashboard session

Current task visibility applies. Entries are returned in ascending order.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/timeline" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
timelinearray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "timeline": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/queue/{id}/timeline

Add to a task timeline

Dashboard session

Requires update permission. Adds a human timeline entry of up to 10,000 characters, without sending a customer message.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
bodyRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "body": {
      "type": "string",
      "minLength": 1,
      "maxLength": 10000
    }
  },
  "required": [
    "body"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/queue/{id}/timeline" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"body\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
entryobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "entry": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Caller profiles

Profile fields belong to the authenticated account. Conversation and call reads also respect their current visibility rules. Translation returns display text without rewriting the source. Notes and human tasks may notify mentioned teammates; marking a conversation read does not send a message.

PUT/api/plugins/follow-ups/contacts/{phone}

Update an owned caller profile

Dashboard session

Supply at least one profile field; null clears a field. Optional profileId selects the owned profile. Legacy caller_name, caller_email, caller_company, caller_website, caller_address, whatsapp_phone and whatsapp_id aliases are accepted. Updates profile identity and linked profile views without rewriting a call transcript or sending a message.

Parameters

NameInTypeDescription
phoneRequiredpathstring

URL-encoded caller phone number.

Request body Required

application/json

FieldTypeDescription
namestring · nullable
emailstring · nullable
companystring · nullable
websitestring · nullable
addressstring · nullable
whatsappPhonestring · nullable
whatsappIdstring · nullable
profileIdinteger
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "nullable": true,
      "maxLength": 1000
    },
    "email": {
      "type": "string",
      "nullable": true,
      "maxLength": 1000
    },
    "company": {
      "type": "string",
      "nullable": true,
      "maxLength": 1000
    },
    "website": {
      "type": "string",
      "nullable": true,
      "maxLength": 1000
    },
    "address": {
      "type": "string",
      "nullable": true,
      "maxLength": 1000
    },
    "whatsappPhone": {
      "type": "string",
      "nullable": true,
      "maxLength": 1000
    },
    "whatsappId": {
      "type": "string",
      "nullable": true,
      "maxLength": 1000
    },
    "profileId": {
      "type": "integer",
      "minimum": 1
    }
  },
  "minProperties": 1
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
profileobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "profile": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/contacts/{phone}/translate

Translate profile display text

Dashboard session

Accepts 1 to 20 nonempty texts with at most 12,000 total characters. Returns translations in the same order; source text is not changed. Only one request per actor can be in flight.

Parameters

NameInTypeDescription
phoneRequiredpathstring

URL-encoded caller phone number.

Request body Required

application/json

FieldTypeDescription
languageRequiredstring

Values: en, fr, pt, es

textsRequiredarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "language": {
      "type": "string",
      "enum": [
        "en",
        "fr",
        "pt",
        "es"
      ]
    },
    "texts": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1
      },
      "minItems": 1,
      "maxItems": 20
    }
  },
  "required": [
    "language",
    "texts"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}/translate" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"language\":\"en\",\"texts\":[\"YOUR_VALUE\"]}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
translationsarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "translations": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
429 Another translation is in flight.

application/json

FieldTypeDescription
errorstring
codestring
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    }
  }
}
502 Translation unavailable; original text is unchanged.

application/json

FieldTypeDescription
errorstring
codestring
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/contacts/{phone}/conversations

Read visible contact conversations

Dashboard session

Reads the owned contact timeline subject to current channel, mailbox and private-conversation visibility.

Parameters

NameInTypeDescription
phoneRequiredpathstring

URL-encoded caller phone number.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}/conversations" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
conversationsobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "conversations": {
      "type": "object",
      "properties": {
        "sms": {
          "type": "array",
          "items": {
            "type": "object"
          }
        },
        "whatsapp": {
          "type": "array",
          "items": {
            "type": "object"
          }
        },
        "email": {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/contacts/{phone}/calls

Read contact call summaries

Dashboard session

Returns currently visible calls for this phone. The date filter uses Toronto dates; q searches summaries and transcripts. This operation returns summary excerpts, not full transcripts or audio.

Parameters

NameInTypeDescription
phoneRequiredpathstring

URL-encoded caller phone number.

datequerystring

Toronto calendar date.

qquerystring

Search summaries and transcripts; results contain summary excerpts only.

limitqueryinteger

Maximum rows.

Default: 30

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}/calls" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
callsarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "calls": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "created_at": {
            "type": "string"
          },
          "duration": {
            "type": "integer"
          },
          "call_direction": {
            "type": "string"
          },
          "summary": {
            "type": "string",
            "maxLength": 140
          }
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/contacts/{phone}/conversations/read

Mark owned conversation records read

Dashboard session

Marks at most 200 selected visible records in one channel as read. Does not send a reply.

Parameters

NameInTypeDescription
phoneRequiredpathstring

URL-encoded caller phone number.

Request body Required

application/json

FieldTypeDescription
channelRequiredstring

Values: sms, whatsapp, email

idsRequiredarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "channel": {
      "type": "string",
      "enum": [
        "sms",
        "whatsapp",
        "email"
      ]
    },
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "maxItems": 200
    }
  },
  "required": [
    "channel",
    "ids"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}/conversations/read" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"channel\":\"sms\",\"ids\":[\"YOUR_VALUE\"]}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
updatedinteger
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "updated": {
      "type": "integer"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/contacts/{phone}/notes

Read contact notes

Dashboard session

Returns account-owned notes and the current author identity used by the editor.

Parameters

NameInTypeDescription
phoneRequiredpathstring

URL-encoded caller phone number.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}/notes" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
notesarray<object>
meIdstring
isOwnerboolean
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "meId": {
      "type": "string"
    },
    "isOwner": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/contacts/{phone}/notes

Add a contact note

Dashboard session

Requires nonempty content. noteType (or note_type) defaults to manual. Mentioned teammates may receive a notification; this is not a customer message.

Parameters

NameInTypeDescription
phoneRequiredpathstring

URL-encoded caller phone number.

Request body Required

application/json

FieldTypeDescription
contentRequiredstring
noteTypestring

Default: "manual"

Complete schema
{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "minLength": 1
    },
    "noteType": {
      "type": "string",
      "default": "manual"
    }
  },
  "required": [
    "content"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/contacts/{phone}/notes" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"content\":\"YOUR_VALUE\"}"

Responses

201 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
noteobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "note": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PATCH/api/plugins/follow-ups/contacts/notes/{id}

Edit your own contact note

Dashboard session

Only the original author can edit the owned note. Previous content is retained in its revision history.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
contentRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "content": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "content"
  ]
}
Request example
curl -X PATCH "https://almatalk.ca/api/plugins/follow-ups/contacts/notes/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"content\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
noteobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "note": {
      "type": "object"
    }
  }
}
403 The current actor is not the note author.

application/json

FieldTypeDescription
errorstring
codestring
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    }
  }
}
404 Note not found.

application/json

FieldTypeDescription
errorstring
codestring
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Appointments

Booking system

Create, read, update, and cancel appointments through the API. Each appointment belongs to the authenticated user (scoped by API key). Working-hours validation runs automatically against the user's appointment_settings.

Canonical path: /appointments. /booking is an alias of the same router and answers identically on every operation below; it exists because the routes were mounted there first. New integrations should use /appointments. Nothing that already calls /booking needs to change.

Two meeting types:

virtual - a video meeting room is auto-created when the agent or user has auto_create_meeting_room=true (or you pass auto_create_meeting_room: true in the request). The response includes meeting_link and meeting_passcode.

in_person - no virtual room is created; the confirmation surfaces the office address instead.

Auto-sync to Google Calendar: if the user has connected Google Calendar, a cron job runs every 15 minutes pushing any new appointment to their primary calendar. The google_calendar_event_id field gets populated after the push succeeds.

Required scopes:

appointments:read - list / get / availability

appointments:write - create / update / cancel

GET/api/v1/appointments

List appointments

API keyappointments:read

List appointments scoped to the API key's user. Supports filtering by status, date range, contact phone, and upcoming-only.

Parameters

NameInTypeDescription
pagequeryinteger

Default: 1

pageSizequeryinteger

Default: 50

statusquerystring

Values: scheduled, confirmed, completed, cancelled, no_show

fromquerystring

Start date (inclusive) in YYYY-MM-DD format.

toquerystring

End date (inclusive) in YYYY-MM-DD format.

phonequerystring

Filter by exact contact phone (E.164).

upcomingqueryboolean

When true, only returns appointments at or after the current time.

Default: false

Request example
curl -X GET "https://almatalk.ca/api/v1/appointments" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Paged list of appointments

application/json

FieldTypeDescription
successboolean
dataarray<Appointment>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Appointment"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
403 Insufficient permissions

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/appointments

Create appointment

API keyappointments:write

Creates an appointment for a caller. Working-hours validation runs against the user's appointment_settings; a 409 is returned if the requested time is outside hours or already taken.

For meeting_type=virtual (default), a meeting room is auto-created when the agent or user has auto_create_meeting_room=true, OR when the caller passes auto_create_meeting_room: true in the request body. The response includes meeting_link and meeting_passcode.

For meeting_type=in_person, no meeting room is created; the response will have meeting_link: null.

Request body Required

application/json

FieldTypeDescription
contact_nameRequiredstring
contact_phoneRequiredstring

E.164 format preferred.

contact_emailstring
appointment_dateRequiredstring

YYYY-MM-DD

appointment_timeRequiredstring

HH:MM (24h)

durationinteger

Minutes (5–480). Default 30.

service_namestring
notesstring
meeting_typestring

Values: virtual, in_person

Default: "virtual"

agent_idstring

(optional) link the appointment to one of your agents

auto_create_meeting_roomboolean

Override the agent/user default for room creation. Only applies when meeting_type=virtual.

Complete schema
{
  "type": "object",
  "required": [
    "contact_name",
    "contact_phone",
    "appointment_date",
    "appointment_time"
  ],
  "properties": {
    "contact_name": {
      "type": "string",
      "example": "Jordan Taylor"
    },
    "contact_phone": {
      "type": "string",
      "description": "E.164 format preferred.",
      "example": "+15145550142"
    },
    "contact_email": {
      "type": "string",
      "format": "email",
      "example": "[email protected]"
    },
    "appointment_date": {
      "type": "string",
      "description": "YYYY-MM-DD",
      "example": "2026-04-30"
    },
    "appointment_time": {
      "type": "string",
      "description": "HH:MM (24h)",
      "example": "10:00"
    },
    "duration": {
      "type": "integer",
      "description": "Minutes (5–480). Default 30.",
      "example": 30
    },
    "service_name": {
      "type": "string",
      "example": "Will consultation"
    },
    "notes": {
      "type": "string",
      "example": "Repeat client; bring photo ID + previous will."
    },
    "meeting_type": {
      "type": "string",
      "enum": [
        "virtual",
        "in_person"
      ],
      "default": "virtual"
    },
    "agent_id": {
      "type": "string",
      "description": "(optional) link the appointment to one of your agents"
    },
    "auto_create_meeting_room": {
      "type": "boolean",
      "description": "Override the agent/user default for room creation. Only applies when `meeting_type=virtual`."
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/appointments" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"contact_name\":\"Jordan Taylor\",\"contact_phone\":\"+15145550142\",\"appointment_date\":\"2026-04-30\",\"appointment_time\":\"10:00\"}"

Responses

201 Appointment created

application/json

FieldTypeDescription
successboolean
dataAppointment
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "$ref": "#/components/schemas/Appointment"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
403 Insufficient permissions

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
409 Slot conflict or outside working hours

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/appointments/{id}

Get one appointment

API keyappointments:read

Parameters

NameInTypeDescription
idRequiredpathstring
Request example
curl -X GET "https://almatalk.ca/api/v1/appointments/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Appointment

application/json

FieldTypeDescription
successboolean
dataAppointment
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Appointment"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
PATCH/api/v1/appointments/{id}

Update appointment

API keyappointments:write

Reschedule, change status, edit notes, or change meeting type.

Parameters

NameInTypeDescription
idRequiredpathstring

Request body Required

application/json

FieldTypeDescription
contact_namestring
contact_phonestring
contact_emailstring
appointment_datestring
appointment_timestring
durationinteger
service_namestring
notesstring
statusstring

Values: scheduled, confirmed, completed, cancelled, no_show

meeting_typestring

Values: virtual, in_person

Complete schema
{
  "type": "object",
  "properties": {
    "contact_name": {
      "type": "string"
    },
    "contact_phone": {
      "type": "string"
    },
    "contact_email": {
      "type": "string",
      "format": "email"
    },
    "appointment_date": {
      "type": "string",
      "example": "2026-05-02"
    },
    "appointment_time": {
      "type": "string",
      "example": "14:30"
    },
    "duration": {
      "type": "integer"
    },
    "service_name": {
      "type": "string"
    },
    "notes": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "scheduled",
        "confirmed",
        "completed",
        "cancelled",
        "no_show"
      ]
    },
    "meeting_type": {
      "type": "string",
      "enum": [
        "virtual",
        "in_person"
      ]
    }
  }
}
Request example
curl -X PATCH "https://almatalk.ca/api/v1/appointments/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Updated appointment

application/json

FieldTypeDescription
successboolean
dataAppointment
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Appointment"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
DELETE/api/v1/appointments/{id}

Cancel appointment

API keyappointments:write

Marks status as cancelled; does not hard-delete the row.

Parameters

NameInTypeDescription
idRequiredpathstring
Request example
curl -X DELETE "https://almatalk.ca/api/v1/appointments/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Cancelled

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "example": "cancelled"
        }
      }
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/appointments/availability/check

Check available slots for a date

API keyappointments:read

Returns the list of free slots (in duration minute increments) within the user's working hours for the requested date, excluding any already-scheduled or confirmed appointments.

Parameters

NameInTypeDescription
dateRequiredquerystring
durationqueryinteger

Default: 30

Request example
curl -X GET "https://almatalk.ca/api/v1/appointments/availability/check?date=2026-04-30" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Availability

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "date": {
          "type": "string",
          "example": "2026-04-30"
        },
        "working": {
          "type": "boolean",
          "description": "false if the day is closed in working_hours"
        },
        "working_hours": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string",
              "example": "09:00"
            },
            "end": {
              "type": "string",
              "example": "17:00"
            }
          }
        },
        "duration": {
          "type": "integer",
          "example": 30
        },
        "slots": {
          "type": "array",
          "items": {
            "type": "string",
            "example": "10:00"
          }
        }
      }
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/booking

List appointments (alias of /appointments)

API keyappointments:readCompatibility alias

Alias of GET /appointments. Identical behaviour, parameters and response. Use /appointments in new integrations.

Request example
curl -X GET "https://almatalk.ca/api/v1/booking" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Paged list of appointments

application/json

FieldTypeDescription
successboolean
dataarray<Appointment>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Appointment"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
403 Insufficient permissions

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
POST/api/v1/booking

Create appointment (alias of /appointments)

API keyappointments:writeCompatibility alias

Alias of POST /appointments. Identical behaviour, request body and response. Use /appointments in new integrations.

Request body Required

application/json

FieldTypeDescription
contact_nameRequiredstring
contact_phoneRequiredstring
contact_emailstring
appointment_dateRequiredstring
appointment_timeRequiredstring
durationinteger
service_namestring
notesstring
meeting_typestring

Values: virtual, in_person

agent_idstring
auto_create_meeting_roomboolean
Complete schema
{
  "type": "object",
  "required": [
    "contact_name",
    "contact_phone",
    "appointment_date",
    "appointment_time"
  ],
  "properties": {
    "contact_name": {
      "type": "string"
    },
    "contact_phone": {
      "type": "string"
    },
    "contact_email": {
      "type": "string",
      "format": "email"
    },
    "appointment_date": {
      "type": "string"
    },
    "appointment_time": {
      "type": "string"
    },
    "duration": {
      "type": "integer"
    },
    "service_name": {
      "type": "string"
    },
    "notes": {
      "type": "string"
    },
    "meeting_type": {
      "type": "string",
      "enum": [
        "virtual",
        "in_person"
      ]
    },
    "agent_id": {
      "type": "string"
    },
    "auto_create_meeting_room": {
      "type": "boolean"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/v1/booking" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"contact_name\":\"YOUR_VALUE\",\"contact_phone\":\"YOUR_VALUE\",\"appointment_date\":\"YOUR_VALUE\",\"appointment_time\":\"YOUR_VALUE\"}"

Responses

201 Appointment created

application/json

FieldTypeDescription
successboolean
dataAppointment
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "$ref": "#/components/schemas/Appointment"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
403 Insufficient permissions

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
409 Resource conflict

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/booking/{id}

Get one appointment (alias of /appointments/{id})

API keyappointments:readCompatibility alias

Alias of GET /appointments/{id}.

Parameters

NameInTypeDescription
idRequiredpathstring
Request example
curl -X GET "https://almatalk.ca/api/v1/booking/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Appointment

application/json

FieldTypeDescription
successboolean
dataAppointment
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Appointment"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
PATCH/api/v1/booking/{id}

Update appointment (alias of /appointments/{id})

API keyappointments:writeCompatibility alias

Alias of PATCH /appointments/{id}.

Parameters

NameInTypeDescription
idRequiredpathstring

Request body Required

application/json

FieldTypeDescription
appointment_datestring
appointment_timestring
statusstring

Values: scheduled, confirmed, completed, cancelled, no_show

Complete schema
{
  "type": "object",
  "properties": {
    "appointment_date": {
      "type": "string"
    },
    "appointment_time": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "scheduled",
        "confirmed",
        "completed",
        "cancelled",
        "no_show"
      ]
    }
  }
}
Request example
curl -X PATCH "https://almatalk.ca/api/v1/booking/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Updated appointment

application/json

FieldTypeDescription
successboolean
dataAppointment
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Appointment"
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
DELETE/api/v1/booking/{id}

Cancel appointment (alias of /appointments/{id})

API keyappointments:writeCompatibility alias

Alias of DELETE /appointments/{id}. Marks status as cancelled; does not hard-delete the row.

Parameters

NameInTypeDescription
idRequiredpathstring
Request example
curl -X DELETE "https://almatalk.ca/api/v1/booking/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Cancelled

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "example": "cancelled"
        }
      }
    }
  }
}
404 Resource not found

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
GET/api/v1/booking/availability/check

Check available slots (alias of /appointments/availability/check)

API keyappointments:readCompatibility alias

Alias of GET /appointments/availability/check.

Parameters

NameInTypeDescription
dateRequiredquerystring
durationqueryinteger

Default: 30

Request example
curl -X GET "https://almatalk.ca/api/v1/booking/availability/check?date=2026-04-30" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Availability

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "date": {
          "type": "string"
        },
        "working": {
          "type": "boolean"
        },
        "duration": {
          "type": "integer"
        },
        "slots": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    }
  }
}
400 Invalid request parameters

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
401 Authentication required or invalid API key

application/json

Schema: ErrorResponse

FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}

System

GET/api/v1/

Discover the API

Public

Public directory of the v1 resources and documentation URL.

Request example
curl -X GET "https://almatalk.ca/api/v1/"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "version": {
          "type": "string"
        },
        "documentation": {
          "type": "string"
        },
        "playground": {
          "type": "string"
        },
        "openapi": {
          "type": "string"
        },
        "endpoints": {
          "type": "object"
        },
        "aliases": {
          "type": "object"
        },
        "authentication": {
          "type": "object"
        }
      }
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}

ALMA CRM

Account-scoped integration routes under /api/plugins/crm-bridge, separate from /api/v1. Use an account API key with the displayed scope. Connected messaging, email, meetings, numbers and webphone functions require their corresponding account configuration and capabilities. The ordinary API-key form does not offer every connected CRM scope; use the supported ALMA CRM connection for those capabilities. Browser CORS is enabled for https://almacrm.ca; general integrations should run on their own server and keep keys private.

CRM responses are endpoint-specific and do not uniformly use the REST success/data/meta envelope. Authentication and rate-limit failures use the common API-key error envelope; handler errors may be {error: "message"}. Number routes relay the account number-service response. Do not assume that an HTTP success confirms final delivery or an answered call.

CRM webhooks are configured separately from REST webhooks. PUT /webhook-config returns the tenant signing secret and supports sms.inbound and call.completed. Validate X-Alma-Signature as sha256= followed by HMAC-SHA256 of the exact raw body with that secret, using a timing-safe comparison. Do not apply the bare-digest REST signature convention to this CRM header. Store secrets securely and deduplicate event processing.

GET/api/plugins/crm-bridge/credits

Read connected CRM credit balance

API keycredits:read
Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/credits" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
balancenumber
reservednumber
totalnumber
currencystring
top_up_urlstring
Complete schema
{
  "type": "object",
  "properties": {
    "balance": {
      "type": "number"
    },
    "reserved": {
      "type": "number"
    },
    "total": {
      "type": "number"
    },
    "currency": {
      "type": "string"
    },
    "top_up_url": {
      "type": "string"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/messaging-stats

Read sent-message counts

API keyanalytics:read

Counts records marked sent for email, SMS and WhatsApp. These counts are not delivery or engagement confirmation.

Parameters

NameInTypeDescription
fromquerystring

Optional ISO timestamp

toquerystring

Optional ISO timestamp

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/messaging-stats" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
emailsinteger
smsinteger
whatsappinteger
fromstring · nullable
tostring · nullable
Complete schema
{
  "type": "object",
  "properties": {
    "emails": {
      "type": "integer"
    },
    "sms": {
      "type": "integer"
    },
    "whatsapp": {
      "type": "integer"
    },
    "from": {
      "type": "string",
      "nullable": true
    },
    "to": {
      "type": "string",
      "nullable": true
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/plugins/crm-bridge/sms/send

Send an SMS

API keysms:write

Sends a real message and may consume account credits. An active texting-capable owned sender is required. If from is omitted the account sender is chosen. A returned sent status confirms submission, not handset delivery.

Request body Required

application/json

FieldTypeDescription
toRequiredstring
bodyRequiredstring
fromstring
Complete schema
{
  "type": "object",
  "properties": {
    "to": {
      "type": "string"
    },
    "body": {
      "type": "string"
    },
    "from": {
      "type": "string"
    }
  },
  "required": [
    "to",
    "body"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/crm-bridge/sms/send" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"to\":\"YOUR_VALUE\",\"body\":\"YOUR_VALUE\"}"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
message_idstring
statusstring
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "message_id": {
      "type": "string"
    },
    "status": {
      "type": "string"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/numbers/search

Search available account phone numbers

API keyphone-numbers:read

Search only; this does not buy a number. Accepted aliases: area_code, postal_code, pattern for contains, and type for numberType. Availability and pricing can change.

Parameters

NameInTypeDescription
countryRequiredquerystring

ISO country code, for example CA

areaCodequerystring
regionquerystring
postalCodequerystring
localityquerystring
containsquerystring
numberTypequerystring
Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/numbers/search?country=YOUR_VALUE" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

Account number-search response, including available numbers and applicable purchase details.

Complete schema
{
  "type": "object",
  "description": "Account number-search response, including available numbers and applicable purchase\ndetails."
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/plugins/crm-bridge/numbers/buy

Purchase a phone number

API keyphone-numbers:write

Purchases a number for the account and can incur charges. Number availability, account eligibility and billing checks apply. Accepts phoneNumber as an alias of number and type as an alias of numberType. This operation has no documented idempotency key; reconcile the number inventory before retrying after a timeout.

Request body Required

application/json

FieldTypeDescription
numberRequiredstring
countryRequiredstring
numberTypestring
Complete schema
{
  "type": "object",
  "properties": {
    "number": {
      "type": "string"
    },
    "country": {
      "type": "string"
    },
    "numberType": {
      "type": "string"
    }
  },
  "required": [
    "number",
    "country"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/crm-bridge/numbers/buy" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"number\":\"YOUR_VALUE\",\"country\":\"YOUR_VALUE\"}"

Responses

200 Successful response

application/json

Account number-purchase response; failures retain the account service status and response.

Complete schema
{
  "type": "object",
  "description": "Account number-purchase response; failures retain the account service status and response."
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/numbers

List account phone numbers

API keyphone-numbers:read
Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/numbers" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

Account number inventory response. Only numbers belonging to this account are returned.

Complete schema
{
  "type": "object",
  "description": "Account number inventory response. Only numbers belonging to this account are returned."
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/contacts

Export contacts with a stable cursor

API keycontacts:read

Ordered by creation time and id. Reuse the opaque next_cursor while has_more is true. This cursor is for this export endpoint and is not interchangeable with sync cursors.

Parameters

NameInTypeDescription
cursorquerystring

Opaque cursor from the preceding page

limitqueryinteger

Page size

Default: 100

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/contacts" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
contactsarray<Contact>
next_cursorstring · nullable
has_moreboolean
limitinteger
Complete schema
{
  "type": "object",
  "properties": {
    "contacts": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Contact"
      }
    },
    "next_cursor": {
      "type": "string",
      "nullable": true
    },
    "has_more": {
      "type": "boolean"
    },
    "limit": {
      "type": "integer"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
PUT/api/plugins/crm-bridge/webhook-config

Configure connected CRM webhooks

API keycalls:read

Sets the HTTPS delivery destination. An empty crm_webhook_url disables it. A secret is generated if absent; regenerate_secret rotates it. Save the returned secret securely. Events: sms.inbound and call.completed. Signature: X-Alma-Signature with sha256= followed by the raw-body HMAC-SHA256 hex digest.

Request body Required

application/json

FieldTypeDescription
crm_webhook_urlstring
regenerate_secretboolean
Complete schema
{
  "type": "object",
  "properties": {
    "crm_webhook_url": {
      "type": "string"
    },
    "regenerate_secret": {
      "type": "boolean"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/crm-bridge/webhook-config" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
crm_webhook_urlstring · nullable
signing_secretstring
eventsarray<string>
signature_headerstring
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "crm_webhook_url": {
      "type": "string",
      "nullable": true
    },
    "signing_secret": {
      "type": "string"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "signature_header": {
      "type": "string"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/plugins/crm-bridge/embed-token

Create a connected webphone embed token

API keycalls:read

For the supported ALMA CRM webphone integration. Issues a single-use token valid for 900 seconds. Treat the token and returned URL as credentials: do not log or share them. Exchanging it creates an account user session; do not treat it as a call-read-only token.

Request example
curl -X POST "https://almatalk.ca/api/plugins/crm-bridge/embed-token" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
tokenstring
urlstring
expires_ininteger
Complete schema
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string"
    },
    "url": {
      "type": "string"
    },
    "expires_in": {
      "type": "integer"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/plugins/crm-bridge/embed-session

Exchange a single-use webphone embed credential

Short-lived embed token

Used by the supported ALMA CRM webphone. Send the token as JSON embt; the legacy query parameter is also accepted. Rejects an expired, wrong-audience or replayed token. Returns a 900-second account access token and sets a refresh cookie. This creates a user session, not a scope-limited API key. Keep the session private.

Request body Required

application/json

FieldTypeDescription
embtRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "embt": {
      "type": "string"
    }
  },
  "required": [
    "embt"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/crm-bridge/embed-session" \
  -H "Content-Type: application/json" \
  --data "{\"embt\":\"YOUR_VALUE\"}"

Responses

200 Successful response

application/json

FieldTypeDescription
tokenstring
expiresIninteger
Complete schema
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string"
    },
    "expiresIn": {
      "type": "integer"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/plugins/crm-bridge/email/send

Send an email

API keyemail:send

Sends a real email using the account integration. A success/messageId confirms submission, not inbox delivery.

Request body Required

application/json

FieldTypeDescription
toRequiredstring
subjectRequiredstring
body_htmlRequiredstring
reply_tostring
Complete schema
{
  "type": "object",
  "properties": {
    "to": {
      "type": "string"
    },
    "subject": {
      "type": "string"
    },
    "body_html": {
      "type": "string"
    },
    "reply_to": {
      "type": "string"
    }
  },
  "required": [
    "to",
    "subject",
    "body_html"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/crm-bridge/email/send" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"to\":\"YOUR_VALUE\",\"subject\":\"YOUR_VALUE\",\"body_html\":\"YOUR_VALUE\"}"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "messageId": {
          "type": "string",
          "nullable": true
        }
      }
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/plugins/crm-bridge/meetings/create

Create a meeting link

API keymeetings:create

Creates a meeting room. If auto_send_link is true and contact_email is provided, it also sends an email invitation. Leave auto_send_link false when only a link is required. Account meeting and email configuration must be available.

Request body Required

application/json

FieldTypeDescription
display_namestring

Default: "Meeting"

auto_send_linkboolean

Default: false

contact_emailstring
Complete schema
{
  "type": "object",
  "properties": {
    "display_name": {
      "type": "string",
      "maxLength": 120,
      "default": "Meeting"
    },
    "auto_send_link": {
      "type": "boolean",
      "default": false
    },
    "contact_email": {
      "type": "string"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/crm-bridge/meetings/create" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "meeting_id": {
          "type": "string"
        },
        "meeting_url": {
          "type": "string"
        },
        "passcode": {
          "type": "string"
        },
        "emailed": {
          "type": "boolean"
        }
      }
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/contacts/call-summary

Read a contact call summary

API keycalls:read

Matches a contact phone against the account call history. Returns the latest 100 combined call records. Aggregate values are calculated from the bounded source samples, not guaranteed lifetime totals.

Parameters

NameInTypeDescription
contact_phoneRequiredquerystring

Contact phone number

daysqueryinteger

Lookback in days

Default: 90

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/contacts/call-summary?contact_phone=YOUR_VALUE" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "contact": {
          "type": "object",
          "properties": {
            "phone": {
              "type": "string"
            }
          }
        },
        "days": {
          "type": "integer"
        },
        "aggregate": {
          "type": "object",
          "properties": {
            "total_calls": {
              "type": "integer"
            },
            "connected": {
              "type": "integer"
            },
            "missed": {
              "type": "integer"
            }
          }
        },
        "calls": {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      }
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/calls/day-report

Read daily account call totals

API keycalls:read

Uses America/Toronto calendar dates, defaulting to today. from/to specify an inclusive range; date specifies one day. Reports account credits and customer-facing engine labels.

Parameters

NameInTypeDescription
datequerystring

YYYY-MM-DD

fromquerystring

YYYY-MM-DD

toquerystring

YYYY-MM-DD

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/calls/day-report" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "total_calls": {
          "type": "integer"
        },
        "connected": {
          "type": "integer"
        },
        "missed": {
          "type": "integer"
        },
        "sentiment": {
          "type": "object"
        },
        "total_credits": {
          "type": "number"
        },
        "avg_credits_per_call": {
          "type": "number"
        },
        "avg_duration_sec": {
          "type": "number"
        },
        "by_engine": {
          "type": "object"
        },
        "period": {
          "type": "string"
        }
      }
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/sync/contacts

Synchronize contacts

API keycontacts:read

Stable cursor export. since must be an ISO timestamp with an explicit timezone. Reuse next_cursor unchanged. Calls apply a 24-hour lookback for updates; deduplicate by id. Messages include a stable dedupeKey. Start a new incremental pass without a cursor after finishing the current pass.

Parameters

NameInTypeDescription
cursorquerystring

Opaque cursor from this resource

sincequerystring

Incremental start timestamp

limitqueryinteger

Page size

Default: 100

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/sync/contacts" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
itemsarray<Contact>
next_cursorstring · nullable
has_moreboolean
Complete schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Contact"
      }
    },
    "next_cursor": {
      "type": "string",
      "nullable": true
    },
    "has_more": {
      "type": "boolean"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/plugins/crm-bridge/sync/contacts

Create a contact with a stable external id

API keycontacts:write

Use a stable UUID (versions 1 through 5) as externalId and a nonempty phone in fields. A replay of that externalId for the same account returns the existing contact with created false (200); a new contact returns created true (201). Keep the externalId unchanged when safely retrying this operation.

Request body Required

application/json

FieldTypeDescription
externalIdRequiredstring
fieldsRequiredobject
Complete schema
{
  "type": "object",
  "properties": {
    "externalId": {
      "type": "string",
      "format": "uuid"
    },
    "fields": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "nullable": true
        },
        "firstName": {
          "type": "string",
          "nullable": true
        },
        "lastName": {
          "type": "string",
          "nullable": true
        },
        "email": {
          "type": "string",
          "nullable": true
        },
        "phone": {
          "type": "string",
          "nullable": true
        },
        "company": {
          "type": "string",
          "nullable": true
        },
        "stage": {
          "type": "string",
          "nullable": true
        }
      },
      "required": [
        "phone"
      ]
    }
  },
  "required": [
    "externalId",
    "fields"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/crm-bridge/sync/contacts" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"externalId\":\"YOUR_VALUE\",\"fields\":{\"phone\":\"YOUR_VALUE\"}}"

Responses

200 Existing contact for this externalId

application/json

FieldTypeDescription
createdboolean
contactContact
Complete schema
{
  "type": "object",
  "properties": {
    "created": {
      "type": "boolean"
    },
    "contact": {
      "$ref": "#/components/schemas/Contact"
    }
  }
}
201 Successful response

application/json

FieldTypeDescription
createdboolean
contactContact
Complete schema
{
  "type": "object",
  "properties": {
    "created": {
      "type": "boolean"
    },
    "contact": {
      "$ref": "#/components/schemas/Contact"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/sync/calls

Synchronize calls

API keycalls:read

Stable cursor export. since must be an ISO timestamp with an explicit timezone. Reuse next_cursor unchanged. Calls apply a 24-hour lookback for updates; deduplicate by id. Messages include a stable dedupeKey. Start a new incremental pass without a cursor after finishing the current pass.

Parameters

NameInTypeDescription
cursorquerystring

Opaque cursor from this resource

sincequerystring

Incremental start timestamp

limitqueryinteger

Page size

Default: 100

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/sync/calls" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
itemsarray<object>
next_cursorstring · nullable
has_moreboolean
Complete schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "next_cursor": {
      "type": "string",
      "nullable": true
    },
    "has_more": {
      "type": "boolean"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/sync/messages

Synchronize messages

API keymessages:read

Stable cursor export. since must be an ISO timestamp with an explicit timezone. Reuse next_cursor unchanged. Calls apply a 24-hour lookback for updates; deduplicate by id. Messages include a stable dedupeKey. Start a new incremental pass without a cursor after finishing the current pass.

Parameters

NameInTypeDescription
cursorquerystring

Opaque cursor from this resource

sincequerystring

Incremental start timestamp

limitqueryinteger

Page size

Default: 100

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/sync/messages" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
itemsarray<object>
next_cursorstring · nullable
has_moreboolean
Complete schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "next_cursor": {
      "type": "string",
      "nullable": true
    },
    "has_more": {
      "type": "boolean"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/plugins/crm-bridge/sync/contacts/{id}

Read a synchronized contact

API keycontacts:read

Parameters

NameInTypeDescription
idRequiredpathstring

Contact id

Request example
curl -X GET "https://almatalk.ca/api/plugins/crm-bridge/sync/contacts/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY"

Responses

200 Successful response

application/json

FieldTypeDescription
contactContact
Complete schema
{
  "type": "object",
  "properties": {
    "contact": {
      "$ref": "#/components/schemas/Contact"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
PATCH/api/plugins/crm-bridge/sync/contacts/{id}

Update a contact with conflict protection

API keycontacts:write

Send the exact updatedAt from the latest read as expectedUpdatedAt. At least one supported change is required. Phone cannot be cleared. A 409 conflict returns the current contact; read it and reconcile before retrying. name is split into firstName/lastName only when those fields are absent.

Parameters

NameInTypeDescription
idRequiredpathstring

Contact id

Request body Required

application/json

FieldTypeDescription
expectedUpdatedAtRequiredstring
changesRequiredobject
Complete schema
{
  "type": "object",
  "properties": {
    "expectedUpdatedAt": {
      "type": "string",
      "format": "date-time"
    },
    "changes": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "nullable": true
        },
        "firstName": {
          "type": "string",
          "nullable": true
        },
        "lastName": {
          "type": "string",
          "nullable": true
        },
        "email": {
          "type": "string",
          "nullable": true
        },
        "phone": {
          "type": "string",
          "nullable": true
        },
        "company": {
          "type": "string",
          "nullable": true
        },
        "stage": {
          "type": "string",
          "nullable": true
        }
      }
    }
  },
  "required": [
    "expectedUpdatedAt",
    "changes"
  ]
}
Request example
curl -X PATCH "https://almatalk.ca/api/plugins/crm-bridge/sync/contacts/{id}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  --data "{\"expectedUpdatedAt\":\"2026-11-06T15:00:00Z\",\"changes\":{}}"

Responses

200 Successful response

application/json

FieldTypeDescription
contactContact
Complete schema
{
  "type": "object",
  "properties": {
    "contact": {
      "$ref": "#/components/schemas/Contact"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
409 Contact changed since expectedUpdatedAt

application/json

FieldTypeDescription
errorstring
contactContact
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "contact": {
      "$ref": "#/components/schemas/Contact"
    }
  }
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}

Account API keys

These dashboard endpoints require the signed-in account owner session. API keys and team-member sessions cannot manage keys. Use Settings > API and webhooks for the same controls. Store a new or regenerated key immediately: the complete secret is returned only at creation or rotation. Regenerating or deleting invalidates existing integrations using that secret. The admin super-scope cannot be granted through these endpoints.

GET/api/user/api-keys

List account API keys

Account owner session

Parameters

NameInTypeDescription
pagequeryinteger

Page number

Default: 1

pageSizequeryinteger

Maximum 100

Default: 50

Request example
curl -X GET "https://almatalk.ca/api/user/api-keys" \
  -H "Authorization: Bearer YOUR_OWNER_SESSION_TOKEN"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataarray<object>
metaobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "description": "Key metadata only; never the complete secret."
      }
    },
    "meta": {
      "type": "object"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/user/api-keys

Create an account API key

Account owner session

The full key appears once in data.key. Omitted scopes use calls:read, calls:write, campaigns:read and contacts:read. Explicit scopes must be supported and cannot include admin. IP entries must be valid IP addresses; an empty list accepts any source address.

Request body Required

application/json

FieldTypeDescription
nameRequiredstring
scopesarray<string>
rateLimitinteger

Default: 100

ipWhitelistarray<string>
descriptionstring
expiresAtstring
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "scopes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "rateLimit": {
      "type": "integer",
      "minimum": 10,
      "maximum": 10000,
      "default": 100
    },
    "ipWhitelist": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "description": {
      "type": "string",
      "maxLength": 500
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    }
  },
  "required": [
    "name"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/user/api-keys" \
  -H "Authorization: Bearer YOUR_OWNER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"YOUR_VALUE\"}"

Responses

201 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
metaobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object"
    },
    "meta": {
      "type": "object"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
PUT/api/user/api-keys/{id}

Update account API key settings

Account owner session

Updates key metadata, scopes, activity and request ceiling. The secret and expiry are not changed by this operation.

Parameters

NameInTypeDescription
idRequiredpathstring

Key id

Request body Required

application/json

FieldTypeDescription
namestring
scopesarray<string>
rateLimitinteger

Default: 100

ipWhitelistarray<string>
descriptionstring
isActiveboolean
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "scopes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "rateLimit": {
      "type": "integer",
      "minimum": 10,
      "maximum": 10000,
      "default": 100
    },
    "ipWhitelist": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "description": {
      "type": "string",
      "maxLength": 500
    },
    "isActive": {
      "type": "boolean"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/user/api-keys/{id}" \
  -H "Authorization: Bearer YOUR_OWNER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
metaobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object"
    },
    "meta": {
      "type": "object"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
DELETE/api/user/api-keys/{id}

Delete an account API key

Account owner session

Revokes the key immediately.

Parameters

NameInTypeDescription
idRequiredpathstring

Key id

Request example
curl -X DELETE "https://almatalk.ca/api/user/api-keys/{id}" \
  -H "Authorization: Bearer YOUR_OWNER_SESSION_TOKEN"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "deleted": {
          "type": "boolean"
        }
      }
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
POST/api/user/api-keys/{id}/regenerate

Regenerate an account API key

Account owner session

Invalidates the old secret immediately. Save data.key from this response and update the integration securely.

Parameters

NameInTypeDescription
idRequiredpathstring

Key id

Request example
curl -X POST "https://almatalk.ca/api/user/api-keys/{id}/regenerate" \
  -H "Authorization: Bearer YOUR_OWNER_SESSION_TOKEN"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataobject
metaobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object"
    },
    "meta": {
      "type": "object"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/user/api-keys/scopes

List recognized API-key scope names

Account owner session

Returns the recognized scope catalogue. A listed scope does not imply a public route exists. admin may appear in the catalogue but cannot be granted by self-service owners; connected CRM scopes have their own provisioning.

Request example
curl -X GET "https://almatalk.ca/api/user/api-keys/scopes" \
  -H "Authorization: Bearer YOUR_OWNER_SESSION_TOKEN"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}
GET/api/user/api-keys/{id}/audit-logs

Read account API key audit logs

Account owner session

Parameters

NameInTypeDescription
idRequiredpathstring

Key id

pagequeryinteger

Page number

Default: 1

pageSizequeryinteger

Maximum 100

Default: 50

Request example
curl -X GET "https://almatalk.ca/api/user/api-keys/{id}/audit-logs" \
  -H "Authorization: Bearer YOUR_OWNER_SESSION_TOKEN"

Responses

200 Successful response

application/json

FieldTypeDescription
successboolean
dataarray<object>
metaobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "meta": {
      "type": "object"
    }
  }
}
400 Invalid request

application/json

FieldTypeDescription
errorone of
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "oneOf": [
        {
          "type": "string"
        },
        {
          "type": "object"
        }
      ]
    }
  }
}
401 Missing, invalid or expired credentials

application/json

Complete schema
{
  "type": "object"
}
403 Missing scope, ownership or entitlement

application/json

Complete schema
{
  "type": "object"
}
500 Request could not be completed

application/json

Complete schema
{
  "type": "object"
}

Dashboard views

Configure the dashboard in Settings: Dashboard layout. These session-only operations control quick actions, cards and shortcuts.

To give members different views: list active members, read the selected member view, then save its full prefs object. Individual overrides are optional. A member without an override follows their current role default. DELETE the member override to restore that inheritance. Updating a role default does not replace existing individual overrides.

These are dashboard content preferences, not an arbitrary landing-page assignment. Feature permissions still determine what a member can access. Account-owner authority manages individual views; team-management create or update permission is sufficient for role defaults, not individual member overrides.

GET/api/plugins/dashboard-prefs

Read the effective dashboard view

Dashboard session

An owner receives the owner view. An ordinary team member receives their individual override when one exists, otherwise their current role default. With no saved role default, the normal enabled dashboard is returned. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X GET "https://almatalk.ca/api/plugins/dashboard-prefs" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

Schema: DashboardViewResponse

FieldTypeDescription
prefsRequiredDashboardPreferences
Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    }
  },
  "required": [
    "prefs"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
PUT/api/plugins/dashboard-prefs

Save the owner dashboard view

Dashboard session

Requires account-owner authority. Ordinary team members, including members with team-management permission, cannot manage individual views. Saves a complete normalized view. This is replacement, not a partial merge: omitted actions and cards return to enabled defaults, and omitted shortcuts are cleared. To reset the owner view, send {"prefs":{}}. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request body Required

application/json

FieldTypeDescription
prefsRequiredDashboardPreferencesInput
Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferencesInput"
    }
  },
  "required": [
    "prefs"
  ],
  "example": {
    "prefs": {
      "builtins": {
        "analytics": {
          "enabled": true,
          "order": 0
        }
      },
      "cards": {
        "card-workspace": {
          "enabled": true
        },
        "card-campaigns": {
          "enabled": false
        }
      },
      "shortcuts": [
        {
          "id": "calls",
          "name": "Recent calls",
          "icon": "Phone",
          "url": "/app/calls",
          "enabled": true,
          "order": 0
        }
      ]
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/dashboard-prefs" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"prefs\":{\"builtins\":{\"analytics\":{\"enabled\":true,\"order\":0}},\"cards\":{\"card-workspace\":{\"enabled\":true},\"card-campaigns\":{\"enabled\":false}},\"shortcuts\":[{\"id\":\"calls\",\"name\":\"Recent calls\",\"icon\":\"Phone\",\"url\":\"/app/calls\",\"enabled\":true,\"order\":0}]}}"

Responses

200 Current saved or effective workspace data.

application/json

Schema: DashboardSaveResponse

FieldTypeDescription
okRequiredboolean

Values: true

prefsRequiredDashboardPreferences
Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    }
  },
  "required": [
    "ok",
    "prefs"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
GET/api/plugins/dashboard-prefs/members

List members for individual dashboard views

Dashboard session

Requires account-owner authority. Ordinary team members, including members with team-management permission, cannot manage individual views. Returns active members of this account with their current role label and whether an override exists. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X GET "https://almatalk.ca/api/plugins/dashboard-prefs/members" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
membersRequiredarray<DashboardMember>
Complete schema
{
  "type": "object",
  "properties": {
    "members": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/DashboardMember"
      }
    }
  },
  "required": [
    "members"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
GET/api/plugins/dashboard-prefs/members/{memberId}

Read a member dashboard view

Dashboard session

Requires account-owner authority. Ordinary team members, including members with team-management permission, cannot manage individual views. Returns the member override or current role default. inherited is true when there is no override. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
memberIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request example
curl -X GET "https://almatalk.ca/api/plugins/dashboard-prefs/members/{memberId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MemberDashboardViewResponse

FieldTypeDescription
prefsRequiredDashboardPreferences
inheritedRequiredboolean
roleNameRequiredstring

The member current role label.

Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    },
    "inherited": {
      "type": "boolean"
    },
    "roleName": {
      "type": "string",
      "description": "The member current role label."
    }
  },
  "required": [
    "prefs",
    "inherited",
    "roleName"
  ]
}
400 Invalid layout identifier or missing member preferences.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
PUT/api/plugins/dashboard-prefs/members/{memberId}

Set an individual member dashboard view

Dashboard session

Requires account-owner authority. Ordinary team members, including members with team-management permission, cannot manage individual views. The active member must belong to this account. Saves a complete normalized view. This is replacement, not a partial merge: omitted actions and cards return to enabled defaults, and omitted shortcuts are cleared. Saving an empty prefs object creates an explicit default-looking override; use DELETE to inherit the role again. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
memberIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request body Required

application/json

FieldTypeDescription
prefsRequiredDashboardPreferencesInput
Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferencesInput"
    }
  },
  "required": [
    "prefs"
  ],
  "example": {
    "prefs": {
      "builtins": {
        "analytics": {
          "enabled": true,
          "order": 0
        }
      },
      "cards": {
        "card-workspace": {
          "enabled": true
        },
        "card-campaigns": {
          "enabled": false
        }
      },
      "shortcuts": [
        {
          "id": "calls",
          "name": "Recent calls",
          "icon": "Phone",
          "url": "/app/calls",
          "enabled": true,
          "order": 0
        }
      ]
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/dashboard-prefs/members/{memberId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"prefs\":{\"builtins\":{\"analytics\":{\"enabled\":true,\"order\":0}},\"cards\":{\"card-workspace\":{\"enabled\":true},\"card-campaigns\":{\"enabled\":false}},\"shortcuts\":[{\"id\":\"calls\",\"name\":\"Recent calls\",\"icon\":\"Phone\",\"url\":\"/app/calls\",\"enabled\":true,\"order\":0}]}}"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MemberDashboardSaveResponse

FieldTypeDescription
okRequiredboolean

Values: true

prefsRequiredDashboardPreferences
inheritedRequiredboolean

Values: false

Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    },
    "inherited": {
      "type": "boolean",
      "enum": [
        false
      ]
    }
  },
  "required": [
    "ok",
    "prefs",
    "inherited"
  ]
}
400 Invalid layout identifier or missing member preferences.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
DELETE/api/plugins/dashboard-prefs/members/{memberId}

Restore a member current role dashboard

Dashboard session

Requires account-owner authority. Ordinary team members, including members with team-management permission, cannot manage individual views. Deletes only this member override and returns their current role default with inherited=true. Other members, role defaults and the owner view are unchanged. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
memberIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/dashboard-prefs/members/{memberId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MemberDashboardResetResponse

FieldTypeDescription
okRequiredboolean

Values: true

prefsRequiredDashboardPreferences
inheritedRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    },
    "inherited": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "ok",
    "prefs",
    "inherited"
  ]
}
400 Invalid layout identifier or missing member preferences.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
GET/api/plugins/dashboard-prefs/role/{roleId}

Read a role dashboard default

Dashboard session

Requires the account owner or a team role with team-management create or update permission. The role must belong to this account. Returns a normalized default view even when the role has no saved preferences. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
roleIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request example
curl -X GET "https://almatalk.ca/api/plugins/dashboard-prefs/role/{roleId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

Schema: DashboardViewResponse

FieldTypeDescription
prefsRequiredDashboardPreferences
Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    }
  },
  "required": [
    "prefs"
  ]
}
400 Invalid layout identifier or missing member preferences.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
PUT/api/plugins/dashboard-prefs/role/{roleId}

Save a role dashboard default

Dashboard session

Requires the account owner or a team role with team-management create or update permission. The role must belong to this account. Saves a complete normalized view. This is replacement, not a partial merge: omitted actions and cards return to enabled defaults, and omitted shortcuts are cleared. Members without individual overrides inherit this view; existing member overrides remain in place. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
roleIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request body Required

application/json

FieldTypeDescription
prefsRequiredDashboardPreferencesInput
Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferencesInput"
    }
  },
  "required": [
    "prefs"
  ],
  "example": {
    "prefs": {
      "builtins": {
        "analytics": {
          "enabled": true,
          "order": 0
        }
      },
      "cards": {
        "card-workspace": {
          "enabled": true
        },
        "card-campaigns": {
          "enabled": false
        }
      },
      "shortcuts": [
        {
          "id": "calls",
          "name": "Recent calls",
          "icon": "Phone",
          "url": "/app/calls",
          "enabled": true,
          "order": 0
        }
      ]
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/dashboard-prefs/role/{roleId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"prefs\":{\"builtins\":{\"analytics\":{\"enabled\":true,\"order\":0}},\"cards\":{\"card-workspace\":{\"enabled\":true},\"card-campaigns\":{\"enabled\":false}},\"shortcuts\":[{\"id\":\"calls\",\"name\":\"Recent calls\",\"icon\":\"Phone\",\"url\":\"/app/calls\",\"enabled\":true,\"order\":0}]}}"

Responses

200 Current saved or effective workspace data.

application/json

Schema: DashboardSaveResponse

FieldTypeDescription
okRequiredboolean

Values: true

prefsRequiredDashboardPreferences
Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    }
  },
  "required": [
    "ok",
    "prefs"
  ]
}
400 Invalid layout identifier or missing member preferences.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
DELETE/api/plugins/dashboard-prefs/role/{roleId}

Reset a role dashboard default

Dashboard session

Requires the account owner or a team role with team-management create or update permission. The role must belong to this account. Removes the saved role view. Members without an individual override return to the normal dashboard. Existing member overrides remain in place. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
roleIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/dashboard-prefs/role/{roleId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
okRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "ok"
  ]
}
400 Invalid layout identifier or missing member preferences.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Workspace settings are temporarily unavailable.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}

Navigation layout

Configure navigation in Settings: Menu. Menu preferences control visibility, item order and group order for the owner or a team role. A menu preferences PUT merges supplied arrays, while menu-config PUT replaces group names and custom links.

Dashboard overrides and navigation layouts are separate. A member-specific dashboard does not create a member-specific menu. Resetting menu preferences does not delete custom links or group names, and showing a menu entry does not grant access to it.

GET/api/plugins/menu-preferences

Read the effective menu layout

Dashboard session

Returns the owner saved menu, or the current role menu for an ordinary team member. data=null means no saved preferences exist. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X GET "https://almatalk.ca/api/plugins/menu-preferences" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MenuPreferencesResponse

FieldTypeDescription
successRequiredboolean

Values: true

dataRequiredobject · nullable

null means no saved layout exists for this owner or role.

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "data": {
      "type": "object",
      "properties": {
        "hidden": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "order": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "sectionOrder": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Menu group identifier."
          },
          "maxItems": 20
        }
      },
      "nullable": true,
      "description": "null means no saved layout exists for this owner or role."
    }
  },
  "required": [
    "success",
    "data"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
PUT/api/plugins/menu-preferences

Save owner menu visibility and order

Dashboard session

Requires account-owner authority. Ordinary team members inherit their role menu and cannot save or reset the owner menu. Only supplied array fields are merged. Omitted fields retain their values; [] clears one field. hidden and order accept up to 50 string paths; sectionOrder accepts up to 20 group identifiers. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request body Required

application/json

Schema: MenuPreferences

Menu visibility, item ordering and group ordering. PUT merges only array fields supplied in the request. Omitted fields keep their saved values; an explicit empty array clears that dimension. Non-string array entries are removed and arrays are capped. Other existing saved fields are preserved. These preferences do not grant access to hidden or restricted features.

FieldTypeDescription
hiddenarray<string>
orderarray<string>
sectionOrderarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "hidden": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Application menu path."
      },
      "maxItems": 50
    },
    "order": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Application menu path."
      },
      "maxItems": 50
    },
    "sectionOrder": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Menu group identifier."
      },
      "maxItems": 20
    }
  },
  "description": "Menu visibility, item ordering and group ordering. PUT merges only array fields supplied in the request.\nOmitted fields keep their saved values; an explicit empty array clears that dimension. Non-string array entries\nare removed and arrays are capped. Other existing saved fields are preserved. These preferences do not grant\naccess to hidden or restricted features."
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/menu-preferences" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
successRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "success"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
DELETE/api/plugins/menu-preferences

Reset owner menu visibility and order

Dashboard session

Requires account-owner authority. Ordinary team members inherit their role menu and cannot save or reset the owner menu. Deletes the owner saved preferences. Menu group names and custom links in menu-config are separate and are not reset. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/menu-preferences" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
successRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "success"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
GET/api/plugins/menu-preferences/role/{roleId}

Read a role menu layout

Dashboard session

Requires the account owner or a team role with team-management create or update permission. The role must belong to this account. data=null means no saved role menu exists. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
roleIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request example
curl -X GET "https://almatalk.ca/api/plugins/menu-preferences/role/{roleId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MenuPreferencesResponse

FieldTypeDescription
successRequiredboolean

Values: true

dataRequiredobject · nullable

null means no saved layout exists for this owner or role.

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "data": {
      "type": "object",
      "properties": {
        "hidden": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "order": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "sectionOrder": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Menu group identifier."
          },
          "maxItems": 20
        }
      },
      "nullable": true,
      "description": "null means no saved layout exists for this owner or role."
    }
  },
  "required": [
    "success",
    "data"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
PUT/api/plugins/menu-preferences/role/{roleId}

Save a role menu layout

Dashboard session

Requires the account owner or a team role with team-management create or update permission. The role must belong to this account. Only supplied array fields are merged. Omitted fields retain their values; [] clears one field. hidden and order accept up to 50 string paths; sectionOrder accepts up to 20 group identifiers. Ordinary members of this role inherit the layout; there is no per-member menu override endpoint. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
roleIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request body Required

application/json

Schema: MenuPreferences

Menu visibility, item ordering and group ordering. PUT merges only array fields supplied in the request. Omitted fields keep their saved values; an explicit empty array clears that dimension. Non-string array entries are removed and arrays are capped. Other existing saved fields are preserved. These preferences do not grant access to hidden or restricted features.

FieldTypeDescription
hiddenarray<string>
orderarray<string>
sectionOrderarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "hidden": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Application menu path."
      },
      "maxItems": 50
    },
    "order": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Application menu path."
      },
      "maxItems": 50
    },
    "sectionOrder": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Menu group identifier."
      },
      "maxItems": 20
    }
  },
  "description": "Menu visibility, item ordering and group ordering. PUT merges only array fields supplied in the request.\nOmitted fields keep their saved values; an explicit empty array clears that dimension. Non-string array entries\nare removed and arrays are capped. Other existing saved fields are preserved. These preferences do not grant\naccess to hidden or restricted features."
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/menu-preferences/role/{roleId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MenuPreferencesResponse

FieldTypeDescription
successRequiredboolean

Values: true

dataRequiredobject · nullable

null means no saved layout exists for this owner or role.

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "data": {
      "type": "object",
      "properties": {
        "hidden": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "order": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "sectionOrder": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Menu group identifier."
          },
          "maxItems": 20
        }
      },
      "nullable": true,
      "description": "null means no saved layout exists for this owner or role."
    }
  },
  "required": [
    "success",
    "data"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
DELETE/api/plugins/menu-preferences/role/{roleId}

Reset a role menu layout

Dashboard session

Requires the account owner or a team role with team-management create or update permission. The role must belong to this account. Deletes this role saved menu layout. It does not change dashboard preferences, menu group names or custom links. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Parameters

NameInTypeDescription
roleIdRequiredpathstring

An identifier from this account, as returned by the related member or role list.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/menu-preferences/role/{roleId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
successRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "success"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
GET/api/plugins/menu-preferences/whats-new

Read release updates availability

Dashboard session

Returns whether the What's New menu entry is available in the current workspace. It combines account availability with the current role menu. This operation only reads availability. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X GET "https://almatalk.ca/api/plugins/menu-preferences/whats-new" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
successRequiredboolean
enabledRequiredboolean
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "enabled": {
      "type": "boolean"
    }
  },
  "required": [
    "success",
    "enabled"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
403 The session does not have the required layout authority.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
503 Availability could not be read; the entry is unavailable until a successful read.

application/json

FieldTypeDescription
successRequiredboolean

Values: false

enabledRequiredboolean

Values: false

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        false
      ]
    },
    "enabled": {
      "type": "boolean",
      "enum": [
        false
      ]
    }
  },
  "required": [
    "success",
    "enabled"
  ]
}
GET/api/plugins/menu-config

Read menu group names and custom links

Dashboard session

Returns navigation labels and links for the current signed-in user context. This configuration is separate from the owner or role visibility/order preferences. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X GET "https://almatalk.ca/api/plugins/menu-config" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MenuConfigResponse

FieldTypeDescription
successRequiredboolean

Values: true

dataRequiredMenuConfig
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "data": {
      "$ref": "#/components/schemas/MenuConfig"
    }
  },
  "required": [
    "success",
    "data"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
PUT/api/plugins/menu-config

Replace menu group names and custom links

Dashboard session

Replaces both categoryNames and customItems for the current signed-in user context. Omitted collections become empty. Use {} to clear both. Supports the eight documented groups and up to 30 custom links. This does not change hidden/order/sectionOrder or assign a member-specific menu. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request body Required

application/json

Complete schema
{
  "allOf": [
    {
      "$ref": "#/components/schemas/MenuConfigInput"
    }
  ],
  "example": {
    "categoryNames": {
      "Monitor": "Activity"
    },
    "customItems": [
      {
        "label": "API documentation",
        "url": "/api/docs",
        "group": "Help"
      }
    ]
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/menu-config" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"categoryNames\":{\"Monitor\":\"Activity\"},\"customItems\":[{\"label\":\"API documentation\",\"url\":\"/api/docs\",\"group\":\"Help\"}]}"

Responses

200 Current saved or effective workspace data.

application/json

Schema: MenuConfigResponse

FieldTypeDescription
successRequiredboolean

Values: true

dataRequiredMenuConfig
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "data": {
      "$ref": "#/components/schemas/MenuConfig"
    }
  },
  "required": [
    "success",
    "data"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}

Workspace team directory

Read account member and role identifiers for workspace configuration. These session-only directory operations do not create members, modify permissions or send invitations.

GET/api/team/members

List account team members

Dashboard session

Returns members of the signed-in account team, including member and role identifiers. For active members eligible for dashboard overrides, prefer GET /plugins/dashboard-prefs/members. This is a read operation; it does not grant layout-management permission. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X GET "https://almatalk.ca/api/team/members" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
membersRequiredarray<WorkspaceTeamMember>
Complete schema
{
  "type": "object",
  "properties": {
    "members": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WorkspaceTeamMember"
      }
    }
  },
  "required": [
    "members"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
GET/api/team/roles

List account team roles

Dashboard session

Returns roles of the signed-in account team. Use the returned role IDs in dashboard and menu role-layout endpoints. Those endpoints enforce their own management permissions. Dashboard session only; API keys are not accepted. Layout changes never grant feature or data access.

Request example
curl -X GET "https://almatalk.ca/api/team/roles" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Current saved or effective workspace data.

application/json

FieldTypeDescription
rolesRequiredarray<WorkspaceTeamRole>
Complete schema
{
  "type": "object",
  "properties": {
    "roles": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/WorkspaceTeamRole"
      }
    }
  },
  "required": [
    "roles"
  ]
}
401 A valid signed-in session is required.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
404 The member, role or team was not found in this account.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}
500 The workspace operation could not be completed.

application/json

FieldTypeDescription
errorstring

Readable explanation of the refusal or temporary failure.

Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string",
      "description": "Readable explanation of the refusal or temporary failure."
    }
  }
}

AI follow-up drafts

Generate a draft from one currently visible completed call. Draft-only never sends. Generate-and-send requires confirmed: true and current create/update permissions, but schedule, approval, recipient and plan gates still apply. Save the request UUID before submitting. If a result is unknown or the connection is lost, read the same generation; never submit a new UUID automatically. A queue or sent status is not delivery proof.

GET/api/plugins/follow-ups/manual/call-sources

List visible call-source metadata

Dashboard session

Requires current follow-up create access, call and transcript visibility, and account transcript retention. Returns at most 20 currently visible call metadata records with status and hasTranscript; incomplete calls or records without a usable transcript may be included. Private and assignment visibility depend on the current owner or member permissions. This lookup does not establish generation eligibility, return transcript text or send anything. The generation operation separately requires a completed call and a full usable transcript.

Parameters

NameInTypeDescription
sourceCallIdquerystring

Look up one exact visible call.

searchquerystring

Caller phone search.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/manual/call-sources" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
itemsarray<object>
noSendboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "occurredAt": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "contactPhone": {
            "type": "string"
          },
          "contactName": {
            "type": "string"
          },
          "contactEmail": {
            "type": "string"
          },
          "hasTranscript": {
            "type": "boolean"
          }
        }
      }
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/manual/generate

Generate an AI follow-up

Dashboard session

Requires current follow-up read/create access and a completed visible call with a retained full transcript (40 to 24,000 characters). The recipient and optional contact identity must match the current source. Only the listed input fields are accepted; do not submit message text, attachments or a replacement transcript. Drafts expire after 10 minutes. Identical requestId/input reads the durable result; changed input or actor is refused. generate_and_send additionally requires confirmed: true and update permission; generated content is saved under exact-content approval and existing send gates. An unknown result must be read back by UUID, never automatically retried with a new UUID.

Request body Required

application/json

Schema: ClientAIGenerationInput

FieldTypeDescription
requestIdRequiredstring
contactPhoneRequiredstring
contactEmailstring
contactNamestring
sourceCallIdRequiredstring
appointmentIdstring
scheduledLocalRequiredstring

Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused.

manualPolicyRequiredClientManualPolicy
visibilitystring

Values: shared, internal

modeRequiredstring

Values: draft_only, generate_and_send

languageRequiredstring

Values: en, fr, pt

actionTypeRequiredstring

Values: send_email, send_sms

contextobject
aiGuidanceRequiredstring
confirmedboolean
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "contactPhone": {
      "type": "string",
      "example": "+15555550123"
    },
    "contactEmail": {
      "type": "string",
      "example": "[email protected]"
    },
    "contactName": {
      "type": "string"
    },
    "sourceCallId": {
      "type": "string"
    },
    "appointmentId": {
      "type": "string"
    },
    "scheduledLocal": {
      "type": "string",
      "example": "2026-12-01T10:30",
      "description": "Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused."
    },
    "manualPolicy": {
      "$ref": "#/components/schemas/ClientManualPolicy"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "shared",
        "internal"
      ]
    },
    "mode": {
      "type": "string",
      "enum": [
        "draft_only",
        "generate_and_send"
      ]
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "fr",
        "pt"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms"
      ]
    },
    "context": {
      "type": "object",
      "properties": {
        "contactId": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "aiGuidance": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600
    },
    "confirmed": {
      "type": "boolean"
    }
  },
  "required": [
    "requestId",
    "mode",
    "language",
    "sourceCallId",
    "actionType",
    "contactPhone",
    "scheduledLocal",
    "manualPolicy",
    "aiGuidance"
  ],
  "additionalProperties": false,
  "example": {
    "requestId": "7eb0123b-4153-4a6e-9103-c51e54e8fb20",
    "mode": "draft_only",
    "language": "en",
    "sourceCallId": "example-owned-call",
    "actionType": "send_email",
    "contactPhone": "+15555550123",
    "contactEmail": "[email protected]",
    "scheduledLocal": "2026-12-01T10:30",
    "manualPolicy": {
      "version": 1,
      "timezone": "America/Toronto",
      "approval": "ask",
      "mode": "exact",
      "sendWindow": {
        "start": "09:00",
        "end": "17:00"
      },
      "expiryHours": 24
    },
    "aiGuidance": "Summarize only the next step the caller requested."
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/manual/generate" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"requestId\":\"7eb0123b-4153-4a6e-9103-c51e54e8fb20\",\"mode\":\"draft_only\",\"language\":\"en\",\"sourceCallId\":\"example-owned-call\",\"actionType\":\"send_email\",\"contactPhone\":\"+15555550123\",\"contactEmail\":\"[email protected]\",\"scheduledLocal\":\"2026-12-01T10:30\",\"manualPolicy\":{\"version\":1,\"timezone\":\"America/Toronto\",\"approval\":\"ask\",\"mode\":\"exact\",\"sendWindow\":{\"start\":\"09:00\",\"end\":\"17:00\"},\"expiryHours\":24},\"aiGuidance\":\"Summarize only the next step the caller requested.\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientAIGenerationResult

FieldTypeDescription
requestIdstring
modestring

Values: draft_only, generate_and_send

statusstring

Values: generating, ready, failed, stale, dispatching, dispatched, unknown

draftobject · nullable
expiresAtstring
queueIdinteger · nullable
outcomeobject · nullable
noSendboolean
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "mode": {
      "type": "string",
      "enum": [
        "draft_only",
        "generate_and_send"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "generating",
        "ready",
        "failed",
        "stale",
        "dispatching",
        "dispatched",
        "unknown"
      ]
    },
    "draft": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ClientAIDraft"
        }
      ],
      "nullable": true
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    },
    "queueId": {
      "type": "integer",
      "nullable": true
    },
    "outcome": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string"
        },
        "scheduledAt": {
          "type": "string",
          "nullable": true
        },
        "heldFor": {
          "type": "string",
          "nullable": true
        },
        "sent": {
          "type": "boolean",
          "nullable": true
        },
        "delivery": {
          "type": "string",
          "enum": [
            "unknown"
          ]
        }
      },
      "nullable": true
    },
    "noSend": {
      "type": "boolean"
    }
  }
}
409 Request identity, source revision, permission or outcome changed. Read the existing generation.

application/json

FieldTypeDescription
errorstring
codestring
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    }
  }
}
503 Generation or outcome unavailable. It may be unknown; read by UUID before acting.

application/json

FieldTypeDescription
errorstring
codestring
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/manual/generations/{id}

Read an AI generation

Dashboard session

Use the original request UUID and actor. Current source/permission checks still apply. A deleted queue task is reported unavailable rather than claiming a send. This read does not dispatch.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/manual/generations/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientAIGenerationResult

FieldTypeDescription
requestIdstring
modestring

Values: draft_only, generate_and_send

statusstring

Values: generating, ready, failed, stale, dispatching, dispatched, unknown

draftobject · nullable
expiresAtstring
queueIdinteger · nullable
outcomeobject · nullable
noSendboolean
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "mode": {
      "type": "string",
      "enum": [
        "draft_only",
        "generate_and_send"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "generating",
        "ready",
        "failed",
        "stale",
        "dispatching",
        "dispatched",
        "unknown"
      ]
    },
    "draft": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ClientAIDraft"
        }
      ],
      "nullable": true
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    },
    "queueId": {
      "type": "integer",
      "nullable": true
    },
    "outcome": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string"
        },
        "scheduledAt": {
          "type": "string",
          "nullable": true
        },
        "heldFor": {
          "type": "string",
          "nullable": true
        },
        "sent": {
          "type": "boolean",
          "nullable": true
        },
        "delivery": {
          "type": "string",
          "enum": [
            "unknown"
          ]
        }
      },
      "nullable": true
    },
    "noSend": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/suggest

Suggest a draft without sending

Dashboard session

Compatibility route for the same generation contract. The server forces draft_only even if another mode was supplied. Current source, UUID, recipient and permission checks still apply.

Request body Required

application/json

Schema: ClientAIGenerationInput

FieldTypeDescription
requestIdRequiredstring
contactPhoneRequiredstring
contactEmailstring
contactNamestring
sourceCallIdRequiredstring
appointmentIdstring
scheduledLocalRequiredstring

Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused.

manualPolicyRequiredClientManualPolicy
visibilitystring

Values: shared, internal

modeRequiredstring

Values: draft_only, generate_and_send

languageRequiredstring

Values: en, fr, pt

actionTypeRequiredstring

Values: send_email, send_sms

contextobject
aiGuidanceRequiredstring
confirmedboolean
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "contactPhone": {
      "type": "string",
      "example": "+15555550123"
    },
    "contactEmail": {
      "type": "string",
      "example": "[email protected]"
    },
    "contactName": {
      "type": "string"
    },
    "sourceCallId": {
      "type": "string"
    },
    "appointmentId": {
      "type": "string"
    },
    "scheduledLocal": {
      "type": "string",
      "example": "2026-12-01T10:30",
      "description": "Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused."
    },
    "manualPolicy": {
      "$ref": "#/components/schemas/ClientManualPolicy"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "shared",
        "internal"
      ]
    },
    "mode": {
      "type": "string",
      "enum": [
        "draft_only",
        "generate_and_send"
      ]
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "fr",
        "pt"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms"
      ]
    },
    "context": {
      "type": "object",
      "properties": {
        "contactId": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "aiGuidance": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600
    },
    "confirmed": {
      "type": "boolean"
    }
  },
  "required": [
    "requestId",
    "mode",
    "language",
    "sourceCallId",
    "actionType",
    "contactPhone",
    "scheduledLocal",
    "manualPolicy",
    "aiGuidance"
  ],
  "additionalProperties": false,
  "example": {
    "requestId": "7eb0123b-4153-4a6e-9103-c51e54e8fb20",
    "mode": "draft_only",
    "language": "en",
    "sourceCallId": "example-owned-call",
    "actionType": "send_email",
    "contactPhone": "+15555550123",
    "contactEmail": "[email protected]",
    "scheduledLocal": "2026-12-01T10:30",
    "manualPolicy": {
      "version": 1,
      "timezone": "America/Toronto",
      "approval": "ask",
      "mode": "exact",
      "sendWindow": {
        "start": "09:00",
        "end": "17:00"
      },
      "expiryHours": 24
    },
    "aiGuidance": "Summarize only the next step the caller requested."
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/suggest" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"requestId\":\"7eb0123b-4153-4a6e-9103-c51e54e8fb20\",\"mode\":\"draft_only\",\"language\":\"en\",\"sourceCallId\":\"example-owned-call\",\"actionType\":\"send_email\",\"contactPhone\":\"+15555550123\",\"contactEmail\":\"[email protected]\",\"scheduledLocal\":\"2026-12-01T10:30\",\"manualPolicy\":{\"version\":1,\"timezone\":\"America/Toronto\",\"approval\":\"ask\",\"mode\":\"exact\",\"sendWindow\":{\"start\":\"09:00\",\"end\":\"17:00\"},\"expiryHours\":24},\"aiGuidance\":\"Summarize only the next step the caller requested.\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientAIGenerationResult

FieldTypeDescription
requestIdstring
modestring

Values: draft_only, generate_and_send

statusstring

Values: generating, ready, failed, stale, dispatching, dispatched, unknown

draftobject · nullable
expiresAtstring
queueIdinteger · nullable
outcomeobject · nullable
noSendboolean
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "mode": {
      "type": "string",
      "enum": [
        "draft_only",
        "generate_and_send"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "generating",
        "ready",
        "failed",
        "stale",
        "dispatching",
        "dispatched",
        "unknown"
      ]
    },
    "draft": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ClientAIDraft"
        }
      ],
      "nullable": true
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    },
    "queueId": {
      "type": "integer",
      "nullable": true
    },
    "outcome": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string"
        },
        "scheduledAt": {
          "type": "string",
          "nullable": true
        },
        "heldFor": {
          "type": "string",
          "nullable": true
        },
        "sent": {
          "type": "boolean",
          "nullable": true
        },
        "delivery": {
          "type": "string",
          "enum": [
            "unknown"
          ]
        }
      },
      "nullable": true
    },
    "noSend": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Task calendar and bulk work

Session-only work views use current account timezone and current member permissions. Bulk operations require preview then human confirmation, check each current task revision, and report partial results per item. They change workflow state only and do not send messages or create calendar events.

GET/api/plugins/follow-ups/work/context

Read work permissions and timezone

Dashboard session

Fresh owner/member context for the work view. It does not grant permissions; later operations recheck them.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/work/context" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
timezonestring
actorKeystring
canUpdateboolean
canAssignboolean
followupsboolean
bookingsboolean
Complete schema
{
  "type": "object",
  "properties": {
    "timezone": {
      "type": "string"
    },
    "actorKey": {
      "type": "string"
    },
    "canUpdate": {
      "type": "boolean"
    },
    "canAssign": {
      "type": "boolean"
    },
    "followups": {
      "type": "boolean"
    },
    "bookings": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/calendar

Read the task and booking calendar

Dashboard session

Inclusive account-local dates, at most 62 days. Returns at most 200 events per page. Pass nextOffset for the next page; unscheduled=true selects unscheduled open tasks instead of dated events or bookings. Current follow-up and booking visibility apply independently. This is a read-only view.

Parameters

NameInTypeDescription
fromRequiredquerystring

First local date.

toRequiredquerystring

Last local date.

offsetqueryinteger

Pagination offset.

Default: 0

kindsquerystring

Comma-separated followup,booking.

unscheduledqueryboolean

Include unscheduled tasks.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/calendar?from=YOUR_VALUE&to=YOUR_VALUE" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
timezonestring
fromstring
tostring
eventsarray<object>
hasMoreboolean
nextOffsetinteger · nullable
permissionsobject
unscheduledboolean
readOnlyboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "timezone": {
      "type": "string"
    },
    "from": {
      "type": "string"
    },
    "to": {
      "type": "string"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "followup",
              "booking"
            ]
          },
          "source_id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "action_type": {
            "type": "string"
          },
          "starts_at": {
            "type": "string"
          },
          "ends_at": {
            "type": "string"
          },
          "local_date": {
            "type": "string"
          },
          "end_local_date": {
            "type": "string"
          },
          "local_time": {
            "type": "string"
          },
          "member_id": {
            "type": "string",
            "nullable": true
          },
          "revision": {
            "type": "string"
          }
        }
      },
      "maxItems": 200
    },
    "hasMore": {
      "type": "boolean"
    },
    "nextOffset": {
      "type": "integer",
      "nullable": true
    },
    "permissions": {
      "type": "object"
    },
    "unscheduled": {
      "type": "boolean"
    },
    "readOnly": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/work/bulk/preview

Preview a bulk work change

Dashboard session

Up to 100 distinct task IDs. Reschedule requires scheduledLocal and timezone; assign requires memberId (or null to unassign) and assignment permission. Complete is limited to eligible human tasks; requested callbacks allow cancellation only. Preview does not mutate tasks and expires in 10 minutes.

Request body Required

application/json

Schema: ClientBulkPreviewInput

FieldTypeDescription
idsRequiredarray<integer>
actionRequiredstring

Values: complete, cancel, reschedule, assign

scheduledLocalstring
timezonestring
memberIdstring · nullable
Complete schema
{
  "type": "object",
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1
      },
      "minItems": 1,
      "maxItems": 100,
      "uniqueItems": true
    },
    "action": {
      "type": "string",
      "enum": [
        "complete",
        "cancel",
        "reschedule",
        "assign"
      ]
    },
    "scheduledLocal": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "memberId": {
      "type": "string",
      "format": "uuid",
      "nullable": true
    }
  },
  "required": [
    "ids",
    "action"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/work/bulk/preview" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"ids\":[1],\"action\":\"complete\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
operationIdstring
actionstring
parametersobject
itemsarray<object>
expiresAtstring
noSendboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "operationId": {
      "type": "string",
      "format": "uuid"
    },
    "action": {
      "type": "string"
    },
    "parameters": {
      "type": "object"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "revision": {
            "type": "string"
          },
          "eligible": {
            "type": "boolean"
          },
          "reason": {
            "type": "string",
            "nullable": true
          }
        }
      }
    },
    "expiresAt": {
      "type": "string"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/work/bulk/commit

Confirm a bulk work change

Dashboard session

A person must confirm the preview. Current access, task revisions and action eligibility are checked per item. Results can be partial; inspect every item. No message, notification or calendar event is sent.

Request body Required

application/json

FieldTypeDescription
operationIdRequiredstring
confirmedRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "operationId": {
      "type": "string",
      "format": "uuid"
    },
    "confirmed": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "operationId",
    "confirmed"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/work/bulk/commit" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"operationId\":\"YOUR_VALUE\",\"confirmed\":true}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientBulkResult

FieldTypeDescription
operationIdstring
actionstring
itemsarray<object>
completeboolean
noSendboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "operationId": {
      "type": "string",
      "format": "uuid"
    },
    "action": {
      "type": "string"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "eligible": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "applied",
              "blocked",
              "stale",
              "pending"
            ]
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "before": {
            "type": "string"
          },
          "after": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "workflowOnly": {
            "type": "boolean"
          }
        }
      }
    },
    "complete": {
      "type": "boolean"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/work/bulk/{id}

Read a bulk result

Dashboard session

Read the original operation UUID with the same actor after interruption; this does not retry or apply unfinished items.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/work/bulk/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientBulkResult

FieldTypeDescription
operationIdstring
actionstring
itemsarray<object>
completeboolean
noSendboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "operationId": {
      "type": "string",
      "format": "uuid"
    },
    "action": {
      "type": "string"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "eligible": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "applied",
              "blocked",
              "stale",
              "pending"
            ]
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "before": {
            "type": "string"
          },
          "after": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "workflowOnly": {
            "type": "boolean"
          }
        }
      }
    },
    "complete": {
      "type": "boolean"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Task evidence review

Evidence coverage can be unavailable or unknown. A call ending, an API success or an AI suggestion does not prove customer delivery or completion. Confirming links evidence, or completes an eligible human task, without sending anything.

GET/api/plugins/follow-ups/work/evidence/task/{id}

Read evidence for a task

Dashboard session

Reads evidence visible to the current actor, including only permitted call transcripts, conversations and integrations. The default evidence range is 30 days. Unavailable coverage stays unknown. Evidence does not establish delivery or human completion.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/work/evidence/task/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientTaskEvidence

FieldTypeDescription
taskIdinteger
taskRevisionstring
rangeobject
identitystring
coverageobject

Unavailable sources remain unknown, not zero activity.

itemsarray<object>
taskobject
evidenceRevisionstring
canUpdateboolean
readOnlyboolean

Values: true

noSendboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "taskId": {
      "type": "integer",
      "minimum": 1
    },
    "taskRevision": {
      "type": "string"
    },
    "range": {
      "type": "object"
    },
    "identity": {
      "type": "string"
    },
    "coverage": {
      "type": "object",
      "description": "Unavailable sources remain unknown, not zero activity."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "sourceId": {
            "type": "string"
          },
          "conversationId": {
            "type": "string",
            "nullable": true
          },
          "connectionId": {
            "type": "string",
            "nullable": true
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          },
          "direction": {
            "type": "string"
          },
          "rawStatus": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "excerpt": {
            "type": "string"
          },
          "sourceRevision": {
            "type": "string"
          },
          "provenance": {
            "type": "string",
            "enum": [
              "stored_platform_record"
            ]
          },
          "deliveryProven": {
            "type": "boolean"
          }
        }
      }
    },
    "task": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "human": {
          "type": "boolean"
        },
        "open": {
          "type": "boolean"
        }
      }
    },
    "evidenceRevision": {
      "type": "string"
    },
    "canUpdate": {
      "type": "boolean"
    },
    "readOnly": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/work/evidence/analyze

Analyze task evidence

Dashboard session

Requires a durable request UUID and a visible task. Creates a 10-minute actor-bound review, not a completion or send. A repeated or uncertain result must be read using its original review ID.

Request body Required

application/json

FieldTypeDescription
requestIdRequiredstring
taskIdRequiredinteger
languageRequiredstring

Values: en, fr, pt

Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "taskId": {
      "type": "integer",
      "minimum": 1
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "fr",
        "pt"
      ]
    }
  },
  "required": [
    "requestId",
    "taskId",
    "language"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/work/evidence/analyze" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"requestId\":\"YOUR_VALUE\",\"taskId\":1,\"language\":\"en\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientEvidenceReview

FieldTypeDescription
reviewIdstring
statusstring

Values: analyzing, ready, failed, stale, confirmed

suggestionobject
evidenceClientTaskEvidence
expiresAtstring
noSendboolean

Values: true

resultobject
Complete schema
{
  "type": "object",
  "properties": {
    "reviewId": {
      "type": "string",
      "format": "uuid"
    },
    "status": {
      "type": "string",
      "enum": [
        "analyzing",
        "ready",
        "failed",
        "stale",
        "confirmed"
      ]
    },
    "suggestion": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string",
          "enum": [
            "leave_open",
            "review",
            "complete_human"
          ]
        },
        "summary": {
          "type": "string",
          "maxLength": 900
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10
        },
        "aiGenerated": {
          "type": "boolean"
        },
        "requiresConfirmation": {
          "type": "boolean"
        }
      }
    },
    "evidence": {
      "$ref": "#/components/schemas/ClientTaskEvidence"
    },
    "expiresAt": {
      "type": "string"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "result": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string"
        },
        "at": {
          "type": "string"
        },
        "before": {
          "type": "string"
        },
        "after": {
          "type": "string"
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "evidenceRevision": {
          "type": "string"
        },
        "workflowOnly": {
          "type": "boolean",
          "enum": [
            true
          ]
        },
        "deliveryClaim": {
          "type": "boolean",
          "enum": [
            false
          ]
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/work/evidence/review/{id}

Read an evidence review

Dashboard session

Reads the actor-bound review or its confirmed result. It does not confirm a suggestion or send anything.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/work/evidence/review/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientEvidenceReview

FieldTypeDescription
reviewIdstring
statusstring

Values: analyzing, ready, failed, stale, confirmed

suggestionobject
evidenceClientTaskEvidence
expiresAtstring
noSendboolean

Values: true

resultobject
Complete schema
{
  "type": "object",
  "properties": {
    "reviewId": {
      "type": "string",
      "format": "uuid"
    },
    "status": {
      "type": "string",
      "enum": [
        "analyzing",
        "ready",
        "failed",
        "stale",
        "confirmed"
      ]
    },
    "suggestion": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string",
          "enum": [
            "leave_open",
            "review",
            "complete_human"
          ]
        },
        "summary": {
          "type": "string",
          "maxLength": 900
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10
        },
        "aiGenerated": {
          "type": "boolean"
        },
        "requiresConfirmation": {
          "type": "boolean"
        }
      }
    },
    "evidence": {
      "$ref": "#/components/schemas/ClientTaskEvidence"
    },
    "expiresAt": {
      "type": "string"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "result": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string"
        },
        "at": {
          "type": "string"
        },
        "before": {
          "type": "string"
        },
        "after": {
          "type": "string"
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "evidenceRevision": {
          "type": "string"
        },
        "workflowOnly": {
          "type": "boolean",
          "enum": [
            true
          ]
        },
        "deliveryClaim": {
          "type": "boolean",
          "enum": [
            false
          ]
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/work/evidence/review/{id}/confirm

Confirm an evidence decision

Dashboard session

Requires current read/update permission, unexpired review and unchanged task/evidence revisions. link records the citations; complete_human additionally requires an eligible open human task. This is workflow-only, with deliveryClaim: false.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
confirmedRequiredboolean

Values: true

actionRequiredstring

Values: link, complete_human

Complete schema
{
  "type": "object",
  "properties": {
    "confirmed": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "action": {
      "type": "string",
      "enum": [
        "link",
        "complete_human"
      ]
    }
  },
  "required": [
    "confirmed",
    "action"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/work/evidence/review/{id}/confirm" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"confirmed\":true,\"action\":\"link\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientEvidenceReview

FieldTypeDescription
reviewIdstring
statusstring

Values: analyzing, ready, failed, stale, confirmed

suggestionobject
evidenceClientTaskEvidence
expiresAtstring
noSendboolean

Values: true

resultobject
Complete schema
{
  "type": "object",
  "properties": {
    "reviewId": {
      "type": "string",
      "format": "uuid"
    },
    "status": {
      "type": "string",
      "enum": [
        "analyzing",
        "ready",
        "failed",
        "stale",
        "confirmed"
      ]
    },
    "suggestion": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string",
          "enum": [
            "leave_open",
            "review",
            "complete_human"
          ]
        },
        "summary": {
          "type": "string",
          "maxLength": 900
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10
        },
        "aiGenerated": {
          "type": "boolean"
        },
        "requiresConfirmation": {
          "type": "boolean"
        }
      }
    },
    "evidence": {
      "$ref": "#/components/schemas/ClientTaskEvidence"
    },
    "expiresAt": {
      "type": "string"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "result": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string"
        },
        "at": {
          "type": "string"
        },
        "before": {
          "type": "string"
        },
        "after": {
          "type": "string"
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "evidenceRevision": {
          "type": "string"
        },
        "workflowOnly": {
          "type": "boolean",
          "enum": [
            true
          ]
        },
        "deliveryClaim": {
          "type": "boolean",
          "enum": [
            false
          ]
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Calendar sync

Calendar sync is opt-in. Owners manage office connections; members manage their own eligible connections, subject to current calendar/follow-up/booking permissions. Enabled destinations create private generic work reminders with no attendees, no reminders and free availability. Existing calendar events are preserved when sync is disabled. Review unknown outcomes before another action; reconciliation never retries event creation.

GET/api/plugins/calendar-integrations/work-export

Read calendar sync settings

Dashboard session

Current session and work/calendar read access required. Owners see office settings; members see their own personal settings and eligible connections. No events are created.

Request example
curl -X GET "https://almatalk.ca/api/plugins/calendar-integrations/work-export" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientWorkExportSettings

FieldTypeDescription
revisionstring
scopestring

Values: personal, office

permissionsobject
connectionsarray<object>
bindingsarray<object>
statesarray<object>
noAttendeesboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "revision": {
      "type": "string"
    },
    "scope": {
      "type": "string",
      "enum": [
        "personal",
        "office"
      ]
    },
    "permissions": {
      "type": "object",
      "properties": {
        "followup": {
          "type": "boolean"
        },
        "booking": {
          "type": "boolean"
        }
      }
    },
    "connections": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "provider": {
            "type": "string"
          },
          "calendarId": {
            "type": "string"
          }
        }
      }
    },
    "bindings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "booking",
              "followup"
            ]
          },
          "integrationId": {
            "type": "integer",
            "minimum": 1
          },
          "calendarId": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "connectionCurrent": {
            "type": "boolean"
          },
          "consentAt": {
            "type": "string",
            "nullable": true
          }
        }
      }
    },
    "states": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "state": {
            "type": "string"
          },
          "count": {
            "type": "integer"
          }
        }
      }
    },
    "noAttendees": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/calendar-integrations/work-export

Confirm calendar sync destinations

Dashboard session

A person must explicitly opt in. Send the current revision, confirmed: true and preserveExisting: true. At most one destination per booking/followup kind; omitted kinds are disabled. Current own-member/office connection and write permission are rechecked. Sync creates generic private events without attendees, reminders or busy blocking; bookings start after consent, and eligible tasks cover the next 62 days. Disabling preserves existing events. If an outcome is unresolved, read the request and reconcile before another change; never blindly retry a create.

Request body Required

application/json

FieldTypeDescription
requestIdRequiredstring
confirmedRequiredboolean

Values: true

preserveExistingRequiredboolean

Values: true

revisionRequiredstring
localeRequiredstring

Values: en, fr, pt

destinationsRequiredarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "confirmed": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "preserveExisting": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "revision": {
      "type": "string"
    },
    "locale": {
      "type": "string",
      "enum": [
        "en",
        "fr",
        "pt"
      ]
    },
    "destinations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "booking",
              "followup"
            ]
          },
          "enabled": {
            "type": "boolean"
          },
          "integrationId": {
            "type": "integer",
            "minimum": 1
          },
          "calendarId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 2048
          }
        },
        "required": [
          "kind",
          "enabled",
          "integrationId",
          "calendarId"
        ]
      },
      "maxItems": 2
    }
  },
  "required": [
    "requestId",
    "confirmed",
    "preserveExisting",
    "revision",
    "destinations",
    "locale"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/calendar-integrations/work-export" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"requestId\":\"YOUR_VALUE\",\"confirmed\":true,\"preserveExisting\":true,\"revision\":\"YOUR_VALUE\",\"locale\":\"en\",\"destinations\":[{\"kind\":\"booking\",\"enabled\":false,\"integrationId\":1,\"calendarId\":\"YOUR_VALUE\"}]}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

Schema: ClientWorkExportSettings

FieldTypeDescription
revisionstring
scopestring

Values: personal, office

permissionsobject
connectionsarray<object>
bindingsarray<object>
statesarray<object>
noAttendeesboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "revision": {
      "type": "string"
    },
    "scope": {
      "type": "string",
      "enum": [
        "personal",
        "office"
      ]
    },
    "permissions": {
      "type": "object",
      "properties": {
        "followup": {
          "type": "boolean"
        },
        "booking": {
          "type": "boolean"
        }
      }
    },
    "connections": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "provider": {
            "type": "string"
          },
          "calendarId": {
            "type": "string"
          }
        }
      }
    },
    "bindings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "booking",
              "followup"
            ]
          },
          "integrationId": {
            "type": "integer",
            "minimum": 1
          },
          "calendarId": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "connectionCurrent": {
            "type": "boolean"
          },
          "consentAt": {
            "type": "string",
            "nullable": true
          }
        }
      }
    },
    "states": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "state": {
            "type": "string"
          },
          "count": {
            "type": "integer"
          }
        }
      }
    },
    "noAttendees": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/calendar-integrations/work-export/calendars/{id}

List writable calendars

Dashboard session

The connection must currently belong to this owner or member. Returns writable calendar IDs and names; reading may refresh connection authorization but does not create events.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/calendar-integrations/work-export/calendars/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
calendarsarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "calendars": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/calendar-integrations/work-export/requests/{id}

Read a calendar settings request

Dashboard session

Read the original actor-bound request UUID after interruption. Does not create or retry calendar events.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/calendar-integrations/work-export/requests/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
idstring
resultobject
settingsClientWorkExportSettings
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "result": {
      "type": "object"
    },
    "settings": {
      "$ref": "#/components/schemas/ClientWorkExportSettings"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/calendar-integrations/work-export/events

List calendar outcomes needing review

Dashboard session

Returns at most 100 unresolved event ledger entries for the current owner/member scope. This list is not a complete calendar export.

Request example
curl -X GET "https://almatalk.ca/api/plugins/calendar-integrations/work-export/events" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
eventsarray<object>
limitedTointeger

Values: 100

Complete schema
{
  "type": "object",
  "properties": {
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "kind": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "updated_at": {
            "type": "string"
          }
        }
      },
      "maxItems": 100
    },
    "limitedTo": {
      "type": "integer",
      "enum": [
        100
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/calendar-integrations/work-export/events/{id}/reconcile

Reconcile one calendar outcome

Dashboard session

Requires confirmed: true and current access. Reads the connected calendar to resolve the ledger; never repeats a creation or update. An event with an unknown identifier remains held for review.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
confirmedRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "confirmed": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "confirmed"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/calendar-integrations/work-export/events/{id}/reconcile" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"confirmed\":true}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
idstring
statestring
readOnlyReconciliationboolean
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "state": {
      "type": "string"
    },
    "readOnlyReconciliation": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Task assignment rules

Only the account owner can manage assignment rules; team and delegated sessions are refused. Rules route human work to currently eligible members. Saving a rule does not send a message. Backfill requires a fresh preview fingerprint and is limited to the newest 200 eligible tasks.

GET/api/plugins/follow-ups/task-rules

Read assignment rules and current health

Dashboard session

Account owner only. Returns rules, default, eligible people, agents, plans and account hours for Settings. Health reflects current membership, permission and plan eligibility, not a guarantee a future assignment will apply.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/task-rules" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
rulesarray<object>
defaultobject · nullable
peopleobject
agentsarray<object>
planobject
upsellboolean
alertsarray<object>
openUnassignedinteger
activeMembersinteger
hoursobject
maxRulesinteger

Values: 25

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rules": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "default": {
      "type": "object",
      "nullable": true
    },
    "people": {
      "type": "object"
    },
    "agents": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "plan": {
      "type": "object",
      "properties": {
        "teamAllowed": {
          "type": "boolean"
        },
        "teamMax": {
          "type": "integer"
        },
        "followupsAllowed": {
          "type": "boolean"
        }
      }
    },
    "upsell": {
      "type": "boolean"
    },
    "alerts": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "openUnassigned": {
      "type": "integer"
    },
    "activeMembers": {
      "type": "integer"
    },
    "hours": {
      "type": "object",
      "properties": {
        "tz": {
          "type": "string"
        },
        "set": {
          "type": "boolean"
        }
      }
    },
    "maxRules": {
      "type": "integer",
      "enum": [
        25
      ]
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/task-rules

Create an assignment rule

Dashboard session

Account owner only. At most 25 rules. Name is unique within the account. Agents and active members must belong to this account and the team plan must allow assignment. Eligibility is rechecked when work is assigned.

Request body Required

application/json

Schema: ClientTaskRuleInput

FieldTypeDescription
nameRequiredstring
matchClientTaskRuleMatch
assigneeRequiredClientTaskAssignee
enabledboolean

Default: true

Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "match": {
      "$ref": "#/components/schemas/ClientTaskRuleMatch"
    },
    "assignee": {
      "$ref": "#/components/schemas/ClientTaskAssignee"
    },
    "enabled": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "name",
    "assignee"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/task-rules" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"YOUR_VALUE\",\"assignee\":\"YOUR_VALUE\"}"

Responses

201 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
ruleobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rule": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PUT/api/plugins/follow-ups/task-rules/default

Set or remove the default assignee

Dashboard session

Account owner only. Use assignee: null to remove the default. Otherwise choose an eligible assignee, optional sources and includeManual. Meeting and manually added work are included only when requested.

Request body Required

application/json

FieldTypeDescription
assigneeRequiredobject · nullable
includeManualboolean
sourcesarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "assignee": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ClientTaskAssignee"
        }
      ],
      "nullable": true
    },
    "includeManual": {
      "type": "boolean"
    },
    "sources": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "callback_request",
          "property_request",
          "promise_keeper",
          "message_verifier",
          "meeting",
          "follow_up_rule",
          "manual"
        ]
      }
    }
  },
  "required": [
    "assignee"
  ],
  "additionalProperties": false
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/task-rules/default" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"assignee\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
defaultobject · nullable
removedboolean
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "default": {
      "type": "object",
      "nullable": true
    },
    "removed": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PUT/api/plugins/follow-ups/task-rules/order

Reorder assignment rules

Dashboard session

Account owner only. ids must contain every non-default rule of this account exactly once. Default priority is separate.

Request body Required

application/json

FieldTypeDescription
idsRequiredarray<integer>
Complete schema
{
  "type": "object",
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1
      },
      "uniqueItems": true
    }
  },
  "required": [
    "ids"
  ]
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/task-rules/order" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"ids\":[1]}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
rulesarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rules": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/task-rules/preview

Preview task assignments

Dashboard session

Account owner only. Optional unsaved rules are evaluated in order, up to 25 rules plus a default (26 entries). Omit rules to use saved rules. Nothing is assigned or sent; current membership/plan validation applies.

Request body Required

application/json

FieldTypeDescription
rulesarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "rules": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "name": {
            "type": "string"
          },
          "match": {
            "$ref": "#/components/schemas/ClientTaskRuleMatch"
          },
          "assignee": {
            "$ref": "#/components/schemas/ClientTaskAssignee"
          },
          "enabled": {
            "type": "boolean"
          },
          "isDefault": {
            "type": "boolean"
          }
        },
        "required": [
          "assignee"
        ]
      },
      "maxItems": 26
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/task-rules/preview" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
rowsarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rows": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/task-rules/draft

Draft an assignment or follow-up rule

Dashboard session

Account owner only. AI-assisted drafting only. kind is assignment or follow_up. Returns draft and localized sentence, questions in needs, or blocked reason. It does not save, activate, assign or send. Follow-up suggestions that contact people are drafted off and ask first; save and enable separately after review. Requires the assistant to be available on the account. Up to 20 AI drafting requests per account per hour; a supplied spec skips generation and is validated directly.

Request body Required

application/json

FieldTypeDescription
kindRequiredstring

Values: assignment, follow_up

textstring
answersobject
specobject
Complete schema
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "assignment",
        "follow_up"
      ]
    },
    "text": {
      "type": "string"
    },
    "answers": {
      "type": "object"
    },
    "spec": {
      "type": "object"
    }
  },
  "required": [
    "kind"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/task-rules/draft" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"kind\":\"assignment\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
draftobject
sentenceobject
needsarray<object>
blockedobject
Complete schema
{
  "type": "object",
  "properties": {
    "draft": {
      "type": "object"
    },
    "sentence": {
      "type": "object"
    },
    "needs": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "blocked": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/task-rules/backfill

Preview assignment backfill

Dashboard session

Account owner only. Read the bounded newest-200 selection and selectionDigest before requesting a backfill. This is an assignment preview, not lead creation or a message send.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/task-rules/backfill" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
countinteger
totalinteger
selectionDigeststring
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "count": {
      "type": "integer"
    },
    "total": {
      "type": "integer"
    },
    "selectionDigest": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/task-rules/backfill

Apply a confirmed assignment selection

Dashboard session

Account owner only. Send the exact selectionDigest from the preview as expectedSelectionDigest. Current eligible selection is recomputed transactionally; stale selection returns 409. Assigns at most the newest 200 eligible tasks without sending messages.

Request body Required

application/json

FieldTypeDescription
expectedSelectionDigestRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "expectedSelectionDigest": {
      "type": "string"
    }
  },
  "required": [
    "expectedSelectionDigest"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/task-rules/backfill" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"expectedSelectionDigest\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
batchIdstring
assignedinteger
sentenceobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "batchId": {
      "type": "string"
    },
    "assigned": {
      "type": "integer"
    },
    "sentence": {
      "type": "object"
    }
  }
}
409 The preview selection changed; obtain and review a fresh preview.

application/json

FieldTypeDescription
errorstring
codestring
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PUT/api/plugins/follow-ups/task-rules/{id}/enabled

Set assignment rule enabled state

Dashboard session

Account owner only. Sets enabled explicitly, never toggles. Enabling starts a new eligibility boundary; older tasks are not automatically backfilled.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
enabledRequiredboolean
Complete schema
{
  "type": "object",
  "properties": {
    "enabled": {
      "type": "boolean"
    }
  },
  "required": [
    "enabled"
  ]
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/task-rules/{id}/enabled" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"enabled\":false}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
ruleobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rule": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PUT/api/plugins/follow-ups/task-rules/{id}

Update an assignment rule

Dashboard session

Account owner only. Omitted name, match and assignee retain their current values. Use the separate enabled route to change enabled state. Current membership and plan are revalidated.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
namestring
matchClientTaskRuleMatch
assigneeClientTaskAssignee
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "match": {
      "$ref": "#/components/schemas/ClientTaskRuleMatch"
    },
    "assignee": {
      "$ref": "#/components/schemas/ClientTaskAssignee"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/task-rules/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
ruleobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rule": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
DELETE/api/plugins/follow-ups/task-rules/{id}

Delete an assignment rule

Dashboard session

Account owner only. Deletes only this account rule. Does not send messages or retroactively change all existing assignments.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/follow-ups/task-rules/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
deletedinteger
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "deleted": {
      "type": "integer",
      "minimum": 1
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Follow-up tools

Automation rules, templates and sequences are owned by the account. Owners can write; permitted members with View All can read. Rule preview is also available to members with follow-up read permission, without private sample data. Tests, task execution, staff job messages and sequence enrollment can cause real sends or future actions. Use them only after the intended person confirms.

POST/api/plugins/follow-ups/rules/preview

Preview a follow-up rule

Dashboard session

Send ruleId or a draft with triggerEvent/actionType/actionConfig. Renders owned template variables. Members with read permission receive copy without a private call or booking sample. No send or rule write.

Request body Required

application/json

FieldTypeDescription
ruleIdinteger
namestring
triggerEventstring

One of the trigger events returned by the follow-up configuration.

actionTypestring

Values: send_email, send_sms, send_whatsapp, schedule_callback, ai_suggest, create_task

conditionsobject
delayMinutesinteger
templateIdinteger · nullable
agentIdstring · nullable
priorityinteger
actionConfigobject
enabledboolean
Complete schema
{
  "type": "object",
  "properties": {
    "ruleId": {
      "type": "integer",
      "minimum": 1
    },
    "name": {
      "type": "string"
    },
    "triggerEvent": {
      "type": "string",
      "description": "One of the trigger events returned by the follow-up configuration."
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "schedule_callback",
        "ai_suggest",
        "create_task"
      ]
    },
    "conditions": {
      "type": "object"
    },
    "delayMinutes": {
      "type": "integer"
    },
    "templateId": {
      "type": "integer",
      "nullable": true
    },
    "agentId": {
      "type": "string",
      "nullable": true
    },
    "priority": {
      "type": "integer"
    },
    "actionConfig": {
      "type": "object"
    },
    "enabled": {
      "type": "boolean"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/rules/preview" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
previewobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "preview": {
      "type": "object",
      "properties": {
        "channel": {
          "type": "string",
          "nullable": true
        },
        "subject": {
          "type": "string",
          "nullable": true
        },
        "body": {
          "type": "string",
          "nullable": true
        },
        "aiWritten": {
          "type": "boolean"
        },
        "sample": {
          "type": "object",
          "nullable": true
        },
        "testTo": {
          "type": "string",
          "nullable": true
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/rules/test

Send a test to yourself

Dashboard session

Account owner only. Real send to the account owner's configured phone or email only; client/lead recipient fields are rejected. Requires channel plan/readiness, existing send gates and rendered non-AI-written copy. Maximum 10 tests per hour. A 200 response can have sent: false; it is not customer delivery proof.

Request body Required

application/json

FieldTypeDescription
ruleIdinteger
namestring
triggerEventstring

One of the trigger events returned by the follow-up configuration.

actionTypestring

Values: send_email, send_sms, send_whatsapp, schedule_callback, ai_suggest, create_task

conditionsobject
delayMinutesinteger
templateIdinteger · nullable
agentIdstring · nullable
priorityinteger
actionConfigobject
enabledboolean
Complete schema
{
  "type": "object",
  "properties": {
    "ruleId": {
      "type": "integer",
      "minimum": 1
    },
    "name": {
      "type": "string"
    },
    "triggerEvent": {
      "type": "string",
      "description": "One of the trigger events returned by the follow-up configuration."
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "schedule_callback",
        "ai_suggest",
        "create_task"
      ]
    },
    "conditions": {
      "type": "object"
    },
    "delayMinutes": {
      "type": "integer"
    },
    "templateId": {
      "type": "integer",
      "nullable": true
    },
    "agentId": {
      "type": "string",
      "nullable": true
    },
    "priority": {
      "type": "integer"
    },
    "actionConfig": {
      "type": "object"
    },
    "enabled": {
      "type": "boolean"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/rules/test" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
testboolean

Values: true

sentboolean
channelstring
tostring
reasonstring
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "test": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "sent": {
      "type": "boolean"
    },
    "channel": {
      "type": "string"
    },
    "to": {
      "type": "string"
    },
    "reason": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PUT/api/plugins/follow-ups/rules/{id}

Update an automation rule

Dashboard session

Account owner only. Current plan must allow follow-ups. Omitted fields retain values; explicitly null templateId or agentId clears it. Owned template/agent references are validated. Snake-case aliases of triggerEvent, actionType, delayMinutes, templateId, agentId and actionConfig are accepted. Changes may affect future automated sends.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
ruleIdinteger
namestring
triggerEventstring

One of the trigger events returned by the follow-up configuration.

actionTypestring

Values: send_email, send_sms, send_whatsapp, schedule_callback, ai_suggest, create_task

conditionsobject
delayMinutesinteger
templateIdinteger · nullable
agentIdstring · nullable
priorityinteger
actionConfigobject
enabledboolean
Complete schema
{
  "type": "object",
  "properties": {
    "ruleId": {
      "type": "integer",
      "minimum": 1
    },
    "name": {
      "type": "string"
    },
    "triggerEvent": {
      "type": "string",
      "description": "One of the trigger events returned by the follow-up configuration."
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "schedule_callback",
        "ai_suggest",
        "create_task"
      ]
    },
    "conditions": {
      "type": "object"
    },
    "delayMinutes": {
      "type": "integer"
    },
    "templateId": {
      "type": "integer",
      "nullable": true
    },
    "agentId": {
      "type": "string",
      "nullable": true
    },
    "priority": {
      "type": "integer"
    },
    "actionConfig": {
      "type": "object"
    },
    "enabled": {
      "type": "boolean"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/rules/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
ruleobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rule": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
DELETE/api/plugins/follow-ups/rules/{id}

Delete an automation rule

Dashboard session

Account owner only. Deletes the owned rule. This does not recall messages already sent.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/follow-ups/rules/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
deletedinteger
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "deleted": {
      "type": "integer",
      "minimum": 1
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/rules/{id}/toggle

Toggle an automation rule

Dashboard session

Account owner only. Flips enabled state. Disabling is allowed; enabling requires the current plan. This can enable future sends. It is not idempotent: read the rule after an uncertain response instead of retrying a toggle.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/rules/{id}/toggle" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
ruleobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "rule": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/templates

List follow-up templates

Dashboard session

Owner or permitted View All member. Returns owned saved templates, newest first.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/templates" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
templatesarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "templates": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/templates

Save a follow-up template

Dashboard session

Account owner only. Saving copy does not send it. name and body must be nonempty.

Request body Required

application/json

FieldTypeDescription
nameRequiredstring
channelRequiredstring

Values: email, sms, whatsapp

subjectstring
bodyRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1
    },
    "channel": {
      "type": "string",
      "enum": [
        "email",
        "sms",
        "whatsapp"
      ]
    },
    "subject": {
      "type": "string"
    },
    "body": {
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "name",
    "channel",
    "body"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/templates" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"YOUR_VALUE\",\"channel\":\"email\",\"body\":\"YOUR_VALUE\"}"

Responses

201 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
templateobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "template": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PUT/api/plugins/follow-ups/templates/{id}

Update a follow-up template

Dashboard session

Account owner only. Updates supplied name/channel/subject/body fields on the owned template. Does not send it.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
namestring
channelstring

Values: email, sms, whatsapp

subjectstring
bodystring
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1
    },
    "channel": {
      "type": "string",
      "enum": [
        "email",
        "sms",
        "whatsapp"
      ]
    },
    "subject": {
      "type": "string"
    },
    "body": {
      "type": "string",
      "minLength": 1
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/templates/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
templateobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "template": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
DELETE/api/plugins/follow-ups/templates/{id}

Delete a follow-up template

Dashboard session

Account owner only. Deletes only an owned template; previously sent messages are not recalled.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/follow-ups/templates/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
deletedinteger
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "deleted": {
      "type": "integer",
      "minimum": 1
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/templates/ai-brand-scan

Read brand information for a draft

Dashboard session

Account owner only. Reads the supplied website for a draft. Requires the follow-up plan and shares a 30-per-hour limit with template generation. No template is saved and no message is sent.

Request body Required

application/json

FieldTypeDescription
websiteUrlRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "websiteUrl": {
      "type": "string",
      "format": "uri"
    }
  },
  "required": [
    "websiteUrl"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/templates/ai-brand-scan" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"websiteUrl\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
brandobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "brand": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/templates/upload-image

Upload a template image

Dashboard session

Account owner only. Multipart image up to 2 MiB, PNG/JPEG/WebP/GIF. The returned URL is for a public template image, not a private task attachment. No message is sent.

Request body Required

multipart/form-data

FieldTypeDescription
imageRequiredstring
Complete schema
{
  "type": "object",
  "properties": {
    "image": {
      "type": "string",
      "format": "binary"
    }
  },
  "required": [
    "image"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/templates/upload-image" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
urlstring
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "url": {
      "type": "string",
      "format": "uri"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/templates/ai-generate

Draft a follow-up template

Dashboard session

Account owner only. Requires the follow-up plan; shares the 30-per-hour brand-scan limit. description is 1 to 2,000 characters. Optional images are public HTTP(S) URLs with placement instructions. Returns a draft and brand information; saving uses POST /templates and sending is separate.

Request body Required

application/json

FieldTypeDescription
descriptionRequiredstring
channelstring

Values: email, sms, whatsapp

websiteUrlstring
brandobject
imagesarray<object>
languagestring
Complete schema
{
  "type": "object",
  "properties": {
    "description": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "channel": {
      "type": "string",
      "enum": [
        "email",
        "sms",
        "whatsapp"
      ]
    },
    "websiteUrl": {
      "type": "string",
      "format": "uri"
    },
    "brand": {
      "type": "object"
    },
    "images": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "placement": {
            "type": "string",
            "maxLength": 200
          }
        }
      },
      "maxItems": 6
    },
    "language": {
      "type": "string"
    }
  },
  "required": [
    "description"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/templates/ai-generate" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"description\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
templateobject
brandobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "template": {
      "type": "object"
    },
    "brand": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/stats

Read follow-up statistics

Dashboard session

Returns account follow-up queue statistics under the authenticated account context. A completed workflow count is not proof of message delivery.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/stats" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
successboolean
statsobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "stats": {
      "type": "object",
      "properties": {
        "overdue": {
          "type": "integer"
        },
        "dueToday": {
          "type": "integer"
        },
        "upcoming": {
          "type": "integer"
        },
        "completedThisMonth": {
          "type": "integer"
        },
        "totalRules": {
          "type": "integer"
        },
        "totalTemplates": {
          "type": "integer"
        },
        "unscheduled": {
          "type": "integer"
        },
        "needsApproval": {
          "type": "integer"
        },
        "openTotal": {
          "type": "integer"
        },
        "failed": {
          "type": "integer"
        }
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/sequences

List follow-up sequences

Dashboard session

Owner or permitted View All member. Includes step_count and active_enrollments for each owned sequence.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/sequences" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
sequencesarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "sequences": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/sequences

Create a follow-up sequence

Dashboard session

Account owner only. Can enable future actions if isActive is true. Review trigger, stop and enrollment conditions before activation; this is not a draft-only endpoint.

Request body Required

application/json

FieldTypeDescription
nameRequiredstring
descriptionstring
triggerTypestring

Values: manual, no_answer, interested, callback_requested, not_interested, completed

stopConditionsobject
enrollConditionsobject
isActiveboolean
priorityinteger
maxEnrollmentsinteger · nullable
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "triggerType": {
      "type": "string",
      "enum": [
        "manual",
        "no_answer",
        "interested",
        "callback_requested",
        "not_interested",
        "completed"
      ]
    },
    "stopConditions": {
      "type": "object"
    },
    "enrollConditions": {
      "type": "object"
    },
    "isActive": {
      "type": "boolean"
    },
    "priority": {
      "type": "integer"
    },
    "maxEnrollments": {
      "type": "integer",
      "nullable": true
    }
  },
  "required": [
    "name"
  ]
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/sequences" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{\"name\":\"YOUR_VALUE\"}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
sequenceobject
Complete schema
{
  "type": "object",
  "properties": {
    "sequence": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
PUT/api/plugins/follow-ups/sequences/{id}

Update a follow-up sequence

Dashboard session

Account owner only. Changes supplied name, description, triggerType, isActive, priority, stopConditions and enrollConditions. Changes can affect active future actions.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
namestring
descriptionstring
triggerTypestring

Values: manual, no_answer, interested, callback_requested, not_interested, completed

stopConditionsobject
enrollConditionsobject
isActiveboolean
priorityinteger
Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "triggerType": {
      "type": "string",
      "enum": [
        "manual",
        "no_answer",
        "interested",
        "callback_requested",
        "not_interested",
        "completed"
      ]
    },
    "stopConditions": {
      "type": "object"
    },
    "enrollConditions": {
      "type": "object"
    },
    "isActive": {
      "type": "boolean"
    },
    "priority": {
      "type": "integer"
    }
  }
}
Request example
curl -X PUT "https://almatalk.ca/api/plugins/follow-ups/sequences/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
sequenceobject
Complete schema
{
  "type": "object",
  "properties": {
    "sequence": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
DELETE/api/plugins/follow-ups/sequences/{id}

Delete a follow-up sequence

Dashboard session

Account owner only. Deletes this account sequence. Does not recall already completed external actions.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/follow-ups/sequences/{id}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
okboolean
Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/sequences/{id}/steps

Read sequence steps

Dashboard session

Owner or permitted View All member; the parent sequence must belong to the account.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/sequences/{id}/steps" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
stepsarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "steps": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/sequences/{id}/steps

Add a sequence step

Dashboard session

Account owner only. Adds an owned step. A step can cause real actions when the active sequence runs; review actionConfig and conditions before enabling it.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
stepNumberinteger
stepNamestring
delayAmountinteger

Default: 0

delayUnitstring

Values: minutes, hours, days

actionTypestring

Values: call, sms, whatsapp, email, wait, webhook

actionConfigobject
conditionsarray<object>
stopIfarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "stepNumber": {
      "type": "integer"
    },
    "stepName": {
      "type": "string"
    },
    "delayAmount": {
      "type": "integer",
      "default": 0
    },
    "delayUnit": {
      "type": "string",
      "enum": [
        "minutes",
        "hours",
        "days"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "call",
        "sms",
        "whatsapp",
        "email",
        "wait",
        "webhook"
      ]
    },
    "actionConfig": {
      "type": "object"
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object"
      }
    },
    "stopIf": {
      "type": "array",
      "items": {
        "type": "object"
      }
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/sequences/{id}/steps" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
stepobject
Complete schema
{
  "type": "object",
  "properties": {
    "step": {
      "type": "object"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
DELETE/api/plugins/follow-ups/sequences/{id}/steps/{stepId}

Delete a sequence step

Dashboard session

Account owner only. Deletes only a step of this account sequence; no send occurs in this request.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

stepIdRequiredpathstring

Account-owned resource identifier.

Request example
curl -X DELETE "https://almatalk.ca/api/plugins/follow-ups/sequences/{id}/steps/{stepId}" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
okboolean
Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
GET/api/plugins/follow-ups/sequences/{id}/enrollments

Read sequence enrollments

Dashboard session

Owner or permitted View All member. Returns at most the newest 200 owned enrollments.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request example
curl -X GET "https://almatalk.ca/api/plugins/follow-ups/sequences/{id}/enrollments" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
enrollmentsarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "enrollments": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "maxItems": 200
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/sequences/{id}/enroll

Enroll a contact in a sequence

Dashboard session

Account owner only. Can schedule future sends or calls. Requires an active owned sequence with a first step and available enrollment capacity. Existing phone enrollment is not duplicated. Inspect ok and reason rather than assuming HTTP 200 means enrolled.

Parameters

NameInTypeDescription
idRequiredpathstring

Account-owned resource identifier.

Request body Required

application/json

FieldTypeDescription
phonestring
namestring
emailstring
Complete schema
{
  "type": "object",
  "properties": {
    "phone": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "email": {
      "type": "string"
    }
  }
}
Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/sequences/{id}/enroll" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  --data "{}"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
okboolean
enrollmentIdinteger
reasonstring
Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    },
    "enrollmentId": {
      "type": "integer"
    },
    "reason": {
      "type": "string"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}
POST/api/plugins/follow-ups/sequences/enrollments/{enrollmentId}/stop

Stop a sequence enrollment

Dashboard session

Account owner only. Marks this account enrollment stopped with manual reason and clears its next step time. Does not recall a completed external action.

Parameters

NameInTypeDescription
enrollmentIdRequiredpathstring

Account-owned resource identifier.

Request example
curl -X POST "https://almatalk.ca/api/plugins/follow-ups/sequences/enrollments/{enrollmentId}/stop" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN"

Responses

200 Successful response. Inspect the returned state before taking the next action.

application/json

FieldTypeDescription
okboolean
Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean"
    }
  }
}
default Request refused or unavailable. Inspect the error and current resource state; do not automatically repeat an action that may have sent or written data.

application/json

FieldTypeDescription
errorstring
codestring
successboolean
Complete schema
{
  "type": "object",
  "properties": {
    "error": {
      "type": "string"
    },
    "code": {
      "type": "string"
    },
    "success": {
      "type": "boolean"
    }
  }
}

Data schemas

Meta
FieldTypeDescription
requestIdstring
timestampstring
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "timestamp": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PaginationMeta
Complete schema
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Meta"
    },
    {
      "type": "object",
      "properties": {
        "pagination": {
          "type": "object",
          "properties": {
            "page": {
              "type": "integer"
            },
            "pageSize": {
              "type": "integer"
            },
            "totalItems": {
              "type": "integer"
            },
            "totalPages": {
              "type": "integer"
            },
            "hasNext": {
              "type": "boolean"
            },
            "hasPrev": {
              "type": "boolean"
            }
          }
        }
      }
    }
  ]
}
ErrorResponse
FieldTypeDescription
successboolean
errorobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": false
    },
    "error": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string",
          "example": "VALIDATION_ERROR"
        },
        "message": {
          "type": "string",
          "example": "Invalid request parameters"
        },
        "details": {
          "type": "object"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
HealthResponse
FieldTypeDescription
successboolean
dataobject
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "example": "healthy"
        },
        "version": {
          "type": "string",
          "example": "v1"
        },
        "timestamp": {
          "type": "string",
          "format": "date-time"
        }
      }
    }
  }
}
DeleteResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "deleted": {
          "type": "boolean",
          "example": true
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
TriggerCallRequest
FieldTypeDescription
agentIdRequiredstring

ID of the agent to use for the call

toNumberRequiredstring

Phone number to call (E.164 format recommended)

fromNumberstring

An active number owned by this account; if omitted the account default is selected. A number must be configured for the chosen agent and route.

enginestring

Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice engine.

Values: almatalk-voice, alma-realtime

metadataobject

Custom metadata to attach to the call

scheduledAtstring

Compatibility field accepted by validation but not used to defer a call. POST /calls starts immediately; do not use this field for scheduling.

dynamicVariablesobject

String variables for the standard AlmaTalk Voice conversation. These override matching metadata keys. They are not applied by the alternate realtime route.

Complete schema
{
  "type": "object",
  "required": [
    "agentId",
    "toNumber"
  ],
  "properties": {
    "agentId": {
      "type": "string",
      "format": "uuid",
      "description": "ID of the agent to use for the call"
    },
    "toNumber": {
      "type": "string",
      "description": "Phone number to call (E.164 format recommended)",
      "example": "+14155551234"
    },
    "fromNumber": {
      "type": "string",
      "description": "An active number owned by this account; if omitted the account default is selected. A number\nmust be configured for the chosen agent and route."
    },
    "engine": {
      "type": "string",
      "enum": [
        "almatalk-voice",
        "alma-realtime"
      ],
      "description": "Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice\nengine."
    },
    "metadata": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "Custom metadata to attach to the call"
    },
    "scheduledAt": {
      "type": "string",
      "format": "date-time",
      "description": "Compatibility field accepted by validation but not used to defer a call. POST /calls starts\nimmediately; do not use this field for scheduling."
    },
    "dynamicVariables": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      },
      "description": "String variables for the standard AlmaTalk Voice conversation. These override matching metadata\nkeys. They are not applied by the alternate realtime route."
    }
  }
}
TriggerCallResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "example": true
    },
    "data": {
      "type": "object",
      "properties": {
        "callId": {
          "type": "string",
          "description": "Opaque call identifier. Preserve the returned value; it is not necessarily a UUID."
        },
        "status": {
          "type": "string",
          "example": "queued"
        },
        "agentId": {
          "type": "string",
          "format": "uuid"
        },
        "toNumber": {
          "type": "string"
        },
        "fromNumber": {
          "type": "string"
        },
        "engine": {
          "type": "string"
        },
        "createdAt": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
Appointment
FieldTypeDescription
idstring
contact_namestring
contact_phonestring
contact_emailstring · nullable
appointment_datestring
appointment_timestring
durationinteger
service_namestring · nullable
notesstring · nullable
statusstring

Values: scheduled, confirmed, completed, cancelled, no_show

meeting_typestring

Values: virtual, in_person

meeting_linkstring · nullable

Populated for virtual appointments after a meeting room is created. Null for in-person.

meeting_passcodestring · nullable
google_calendar_event_idstring · nullable

Set after the cron sync pushes this appointment to the user's Google Calendar.

call_idstring · nullable

If the appointment was booked from a voice call, the originating call id.

flow_idstring · nullable
metadataobject · nullable
created_atstring
updated_atstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "example": "hlZ72Bbi9jKVaorosV9Tc"
    },
    "contact_name": {
      "type": "string",
      "example": "Jordan Taylor"
    },
    "contact_phone": {
      "type": "string",
      "example": "+15145550142"
    },
    "contact_email": {
      "type": "string",
      "format": "email",
      "nullable": true,
      "example": "[email protected]"
    },
    "appointment_date": {
      "type": "string",
      "example": "2026-04-30"
    },
    "appointment_time": {
      "type": "string",
      "example": "10:00"
    },
    "duration": {
      "type": "integer",
      "example": 30
    },
    "service_name": {
      "type": "string",
      "nullable": true,
      "example": "Will consultation"
    },
    "notes": {
      "type": "string",
      "nullable": true
    },
    "status": {
      "type": "string",
      "enum": [
        "scheduled",
        "confirmed",
        "completed",
        "cancelled",
        "no_show"
      ],
      "example": "scheduled"
    },
    "meeting_type": {
      "type": "string",
      "enum": [
        "virtual",
        "in_person"
      ],
      "example": "virtual"
    },
    "meeting_link": {
      "type": "string",
      "nullable": true,
      "description": "Populated for virtual appointments after a meeting room is created. Null for in-person.",
      "example": "https://almatalk.ca/meet/almatalk-7lKuE-CP1LY6"
    },
    "meeting_passcode": {
      "type": "string",
      "nullable": true,
      "example": "742193"
    },
    "google_calendar_event_id": {
      "type": "string",
      "nullable": true,
      "description": "Set after the cron sync pushes this appointment to the user's Google Calendar."
    },
    "call_id": {
      "type": "string",
      "nullable": true,
      "description": "If the appointment was booked from a voice call, the originating call id."
    },
    "flow_id": {
      "type": "string",
      "nullable": true
    },
    "metadata": {
      "type": "object",
      "nullable": true
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
Call
FieldTypeDescription
idstring

Opaque call reference. Preserve this value exactly; it is not necessarily a UUID.

enginestring

Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice engine.

Values: almatalk-voice, alma-realtime

agentIdstring
toNumberstring
fromNumberstring
statusstring

Values: queued, ringing, in-progress, completed, failed, no-answer, busy

durationinteger

Duration in seconds

creditsUsednumber
transcriptstring
aiSummarystring
recordingUrlstring
sentimentstring
createdAtstring
endedAtstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Opaque call reference. Preserve this value exactly; it is not necessarily a UUID."
    },
    "engine": {
      "type": "string",
      "enum": [
        "almatalk-voice",
        "alma-realtime"
      ],
      "description": "Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice\nengine."
    },
    "agentId": {
      "type": "string",
      "format": "uuid"
    },
    "toNumber": {
      "type": "string"
    },
    "fromNumber": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "queued",
        "ringing",
        "in-progress",
        "completed",
        "failed",
        "no-answer",
        "busy"
      ]
    },
    "duration": {
      "type": "integer",
      "description": "Duration in seconds"
    },
    "creditsUsed": {
      "type": "number"
    },
    "transcript": {
      "type": "string"
    },
    "aiSummary": {
      "type": "string"
    },
    "recordingUrl": {
      "type": "string"
    },
    "sentiment": {
      "type": "string"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "endedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
CallListResponse
FieldTypeDescription
successboolean
dataarray<Call>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Call"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
CallDetailResponse
FieldTypeDescription
successboolean
dataCall
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Call"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
HangupResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "callId": {
          "type": "string"
        },
        "status": {
          "type": "string",
          "example": "hangup_requested"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CreateCampaignRequest
FieldTypeDescription
nameRequiredstring
agentIdRequiredstring
phoneNumberIdstring
enginestring

Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice engine.

Values: almatalk-voice, alma-realtime

scheduledStartTimestring
timezonestring
callWindowStartstring
callWindowEndstring
maxConcurrentCallsinteger

Default: 5

retryAttemptsinteger

Default: 2

retryDelayMinutesinteger

Default: 30

Complete schema
{
  "type": "object",
  "required": [
    "name",
    "agentId"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 255
    },
    "agentId": {
      "type": "string",
      "format": "uuid"
    },
    "phoneNumberId": {
      "type": "string",
      "format": "uuid"
    },
    "engine": {
      "type": "string",
      "enum": [
        "almatalk-voice",
        "alma-realtime"
      ],
      "description": "Telephony engine. almatalk-voice: AlmaTalk Voice engine. alma-realtime: Alma realtime voice\nengine."
    },
    "scheduledStartTime": {
      "type": "string",
      "format": "date-time"
    },
    "timezone": {
      "type": "string",
      "example": "America/New_York"
    },
    "callWindowStart": {
      "type": "string",
      "pattern": "^\\d{2}:\\d{2}$",
      "example": "09:00"
    },
    "callWindowEnd": {
      "type": "string",
      "pattern": "^\\d{2}:\\d{2}$",
      "example": "18:00"
    },
    "maxConcurrentCalls": {
      "type": "integer",
      "minimum": 1,
      "maximum": 100,
      "default": 5
    },
    "retryAttempts": {
      "type": "integer",
      "minimum": 0,
      "maximum": 5,
      "default": 2
    },
    "retryDelayMinutes": {
      "type": "integer",
      "minimum": 1,
      "maximum": 1440,
      "default": 30
    }
  }
}
Campaign
FieldTypeDescription
idstring
namestring
statusstring

Values: draft, scheduled, running, paused, completed, cancelled

agentIdstring
phoneNumberIdstring
totalContactsinteger
calledContactsinteger
scheduledStartTimestring
startedAtstring
completedAtstring
createdAtstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "enum": [
        "draft",
        "scheduled",
        "running",
        "paused",
        "completed",
        "cancelled"
      ]
    },
    "agentId": {
      "type": "string",
      "format": "uuid"
    },
    "phoneNumberId": {
      "type": "string",
      "format": "uuid"
    },
    "totalContacts": {
      "type": "integer"
    },
    "calledContacts": {
      "type": "integer"
    },
    "scheduledStartTime": {
      "type": "string",
      "format": "date-time"
    },
    "startedAt": {
      "type": "string",
      "format": "date-time"
    },
    "completedAt": {
      "type": "string",
      "format": "date-time"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
CampaignResponse
FieldTypeDescription
successboolean
dataCampaign
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Campaign"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CampaignListResponse
FieldTypeDescription
successboolean
dataarray<Campaign>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Campaign"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
AddCampaignContactsRequest
FieldTypeDescription
contactsRequiredarray<object>
Complete schema
{
  "type": "object",
  "required": [
    "contacts"
  ],
  "properties": {
    "contacts": {
      "type": "array",
      "minItems": 1,
      "maxItems": 10000,
      "items": {
        "type": "object",
        "required": [
          "phoneNumber"
        ],
        "properties": {
          "phoneNumber": {
            "type": "string"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "customFields": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
AddContactsResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "campaignId": {
          "type": "string"
        },
        "contactsAdded": {
          "type": "integer"
        },
        "contactsSkipped": {
          "type": "integer"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CampaignActionResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "campaignId": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
Agent
FieldTypeDescription
idstring
namestring
typestring

Values: flow, incoming

telephonyProviderstring
languagestring
isActiveboolean
transferEnabledboolean
createdAtstring
updatedAtstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string"
    },
    "type": {
      "type": "string",
      "enum": [
        "flow",
        "incoming"
      ]
    },
    "telephonyProvider": {
      "type": "string"
    },
    "language": {
      "type": "string"
    },
    "isActive": {
      "type": "boolean"
    },
    "transferEnabled": {
      "type": "boolean"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
AgentDetail
Complete schema
{
  "allOf": [
    {
      "$ref": "#/components/schemas/Agent"
    },
    {
      "type": "object",
      "properties": {
        "systemPrompt": {
          "type": "string"
        },
        "firstMessage": {
          "type": "string"
        },
        "llmModel": {
          "type": "string",
          "description": "AlmaTalk model label; internal model identifiers are private."
        },
        "temperature": {
          "type": "number"
        },
        "voiceId": {
          "type": "string"
        },
        "transferPhoneNumber": {
          "type": "string"
        },
        "maxDurationSeconds": {
          "type": "integer"
        }
      }
    }
  ]
}
AgentListResponse
FieldTypeDescription
successboolean
dataarray<Agent>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Agent"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
AgentDetailResponse
FieldTypeDescription
successboolean
dataAgentDetail
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/AgentDetail"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
FlowExportResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "version": {
          "type": "string"
        },
        "agentId": {
          "type": "string"
        },
        "agentName": {
          "type": "string"
        },
        "exportedAt": {
          "type": "string",
          "format": "date-time"
        },
        "flow": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "name": {
              "type": "string"
            },
            "nodes": {
              "type": "array",
              "items": {
                "type": "object"
              }
            },
            "edges": {
              "type": "array",
              "items": {
                "type": "object"
              }
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
FlowImportRequest
FieldTypeDescription
flowRequiredobject
Complete schema
{
  "type": "object",
  "required": [
    "flow"
  ],
  "properties": {
    "flow": {
      "type": "object",
      "required": [
        "nodes",
        "edges"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "nodes": {
          "type": "array",
          "items": {
            "type": "object"
          }
        },
        "edges": {
          "type": "array",
          "items": {
            "type": "object"
          }
        }
      }
    }
  }
}
FlowImportResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "agentId": {
          "type": "string"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CreateContactRequest
FieldTypeDescription
phoneRequiredstring
firstNamestring
lastNamestring
emailstring
companystring
tagsarray<string>
customFieldsobject
Complete schema
{
  "type": "object",
  "required": [
    "phone"
  ],
  "properties": {
    "phone": {
      "type": "string",
      "minLength": 10
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "company": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "customFields": {
      "type": "object",
      "additionalProperties": true
    }
  }
}
UpdateContactRequest
FieldTypeDescription
phonestring
firstNamestring
lastNamestring
emailstring
companystring
tagsarray<string>
customFieldsobject
stagestring
Complete schema
{
  "type": "object",
  "properties": {
    "phone": {
      "type": "string"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "company": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "customFields": {
      "type": "object"
    },
    "stage": {
      "type": "string"
    }
  }
}
Contact
FieldTypeDescription
idstring
phonestring
firstNamestring
lastNamestring
emailstring
companystring
tagsarray<string>
customFieldsobject
stagestring
leadScoreinteger
aiSummarystring
sentimentstring
createdAtstring
updatedAtstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "phone": {
      "type": "string"
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "email": {
      "type": "string"
    },
    "company": {
      "type": "string"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "customFields": {
      "type": "object"
    },
    "stage": {
      "type": "string"
    },
    "leadScore": {
      "type": "integer"
    },
    "aiSummary": {
      "type": "string"
    },
    "sentiment": {
      "type": "string"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    },
    "updatedAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
ContactResponse
FieldTypeDescription
successboolean
dataContact
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "$ref": "#/components/schemas/Contact"
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
ContactListResponse
FieldTypeDescription
successboolean
dataarray<Contact>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Contact"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
BulkImportRequest
FieldTypeDescription
contactsRequiredarray<CreateContactRequest>
skipDuplicatesboolean

Default: true

Complete schema
{
  "type": "object",
  "required": [
    "contacts"
  ],
  "properties": {
    "contacts": {
      "type": "array",
      "minItems": 1,
      "maxItems": 10000,
      "items": {
        "$ref": "#/components/schemas/CreateContactRequest"
      }
    },
    "skipDuplicates": {
      "type": "boolean",
      "default": true
    }
  }
}
BulkImportResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "imported": {
          "type": "integer"
        },
        "skipped": {
          "type": "integer"
        },
        "errors": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "row": {
                "type": "integer"
              },
              "phoneNumber": {
                "type": "string"
              },
              "error": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CreditBalanceResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "available": {
          "type": "number"
        },
        "reserved": {
          "type": "number"
        },
        "total": {
          "type": "number"
        },
        "currency": {
          "type": "string",
          "example": "credits"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CreditUsageResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "period": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string",
              "format": "date-time"
            },
            "end": {
              "type": "string",
              "format": "date-time"
            }
          }
        },
        "usage": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "date": {
                "type": "string",
                "format": "date"
              },
              "calls": {
                "type": "integer",
                "description": "Number of credit deductions on this date, not distinct calls."
              },
              "minutes": {
                "type": "integer",
                "description": "A copy of `credits`, not measured call duration. Kept for backward compatibility.\nUse `credits`, or `GET /analytics/calls` for real duration."
              },
              "credits": {
                "type": "number",
                "description": "Credits deducted on this date."
              }
            }
          }
        },
        "total": {
          "type": "object",
          "properties": {
            "calls": {
              "type": "integer"
            },
            "minutes": {
              "type": "integer"
            },
            "credits": {
              "type": "number"
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CallAnalyticsResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "totalCalls": {
          "type": "integer"
        },
        "completedCalls": {
          "type": "integer"
        },
        "failedCalls": {
          "type": "integer"
        },
        "totalDurationMinutes": {
          "type": "integer"
        },
        "averageDurationSeconds": {
          "type": "integer"
        },
        "creditsUsed": {
          "type": "number"
        },
        "period": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string",
              "format": "date-time"
            },
            "end": {
              "type": "string",
              "format": "date-time"
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CampaignAnalyticsResponse
FieldTypeDescription
successboolean
dataarray<object>
metaPaginationMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "campaignId": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "totalContacts": {
            "type": "integer"
          },
          "completed": {
            "type": "integer"
          },
          "successful": {
            "type": "integer"
          },
          "failed": {
            "type": "integer"
          },
          "pending": {
            "type": "integer"
          },
          "successRate": {
            "type": "integer"
          },
          "startedAt": {
            "type": "string",
            "format": "date-time"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/PaginationMeta"
    }
  }
}
AnalyticsSummaryResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "period": {
          "type": "object",
          "properties": {
            "start": {
              "type": "string",
              "format": "date-time"
            },
            "end": {
              "type": "string",
              "format": "date-time"
            },
            "days": {
              "type": "integer"
            }
          }
        },
        "calls": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "completed": {
              "type": "integer"
            }
          }
        },
        "campaigns": {
          "type": "object",
          "properties": {
            "total": {
              "type": "integer"
            },
            "running": {
              "type": "integer"
            },
            "completed": {
              "type": "integer"
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
CreateWebhookRequest
FieldTypeDescription
urlRequiredstring

HTTPS endpoint to receive webhook payloads

eventsRequiredarray<string>
secretstring

Custom signing secret (auto-generated if not provided)

descriptionstring
Complete schema
{
  "type": "object",
  "required": [
    "url",
    "events"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "description": "HTTPS endpoint to receive webhook payloads"
    },
    "events": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "string",
        "enum": [
          "call.started",
          "call.ringing",
          "call.answered",
          "call.completed",
          "call.failed",
          "call.transferred",
          "call.no_answer",
          "call.busy",
          "call.voicemail",
          "inbound_call.received",
          "inbound_call.answered",
          "inbound_call.completed",
          "inbound_call.missed",
          "campaign.started",
          "campaign.completed",
          "campaign.paused",
          "campaign.resumed",
          "campaign.failed",
          "campaign.cancelled",
          "flow.started",
          "flow.completed",
          "flow.failed",
          "appointment.booked",
          "appointment.confirmed",
          "appointment.cancelled",
          "appointment.rescheduled",
          "appointment.completed",
          "appointment.no_show",
          "form.submitted",
          "contact.created",
          "contact.updated",
          "credits.low",
          "credits.depleted"
        ]
      }
    },
    "secret": {
      "type": "string",
      "description": "Custom signing secret (auto-generated if not provided)"
    },
    "description": {
      "type": "string"
    }
  }
}
UpdateWebhookRequest
FieldTypeDescription
urlstring
eventsarray<string>

Replaces the subscription's event list. Same accepted names as on create.

isActiveboolean
descriptionstring
Complete schema
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "format": "uri"
    },
    "events": {
      "type": "array",
      "minItems": 1,
      "description": "Replaces the subscription's event list. Same accepted names as on create.",
      "items": {
        "type": "string",
        "enum": [
          "call.started",
          "call.ringing",
          "call.answered",
          "call.completed",
          "call.failed",
          "call.transferred",
          "call.no_answer",
          "call.busy",
          "call.voicemail",
          "inbound_call.received",
          "inbound_call.answered",
          "inbound_call.completed",
          "inbound_call.missed",
          "campaign.started",
          "campaign.completed",
          "campaign.paused",
          "campaign.resumed",
          "campaign.failed",
          "campaign.cancelled",
          "flow.started",
          "flow.completed",
          "flow.failed",
          "appointment.booked",
          "appointment.confirmed",
          "appointment.cancelled",
          "appointment.rescheduled",
          "appointment.completed",
          "appointment.no_show",
          "form.submitted",
          "contact.created",
          "contact.updated",
          "credits.low",
          "credits.depleted"
        ]
      }
    },
    "isActive": {
      "type": "boolean"
    },
    "description": {
      "type": "string"
    }
  }
}
Webhook
FieldTypeDescription
idstring
urlstring
eventsarray<string>
isActiveboolean
descriptionstring
lastDeliveryAtstring
lastDeliveryStatusstring
createdAtstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "url": {
      "type": "string"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "isActive": {
      "type": "boolean"
    },
    "description": {
      "type": "string"
    },
    "lastDeliveryAt": {
      "type": "string",
      "format": "date-time"
    },
    "lastDeliveryStatus": {
      "type": "string"
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
WebhookResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "allOf": [
        {
          "$ref": "#/components/schemas/Webhook"
        },
        {
          "type": "object",
          "properties": {
            "secret": {
              "type": "string",
              "description": "Only returned on creation"
            }
          }
        }
      ]
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
WebhookListResponse
FieldTypeDescription
successboolean
dataarray<Webhook>
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/Webhook"
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
WebhookEventsResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "events": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "example": "call.completed"
              },
              "description": {
                "type": "string"
              },
              "emitted": {
                "type": "boolean",
                "description": "Whether anything in this deployment currently fires the event. `false` means the\nname is accepted on a subscription and never delivered.",
                "example": true
              }
            }
          }
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
WebhookTestResponse
FieldTypeDescription
successboolean
dataobject
metaMeta
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean"
    },
    "data": {
      "type": "object",
      "properties": {
        "delivered": {
          "type": "boolean"
        },
        "statusCode": {
          "type": "integer"
        },
        "message": {
          "type": "string"
        }
      }
    },
    "meta": {
      "$ref": "#/components/schemas/Meta"
    }
  }
}
DashboardActionPreference
FieldTypeDescription
enabledboolean
ordernumber

Finite order value; lower values appear first. Defaults to the natural action order.

Complete schema
{
  "type": "object",
  "properties": {
    "enabled": {
      "type": "boolean"
    },
    "order": {
      "type": "number",
      "description": "Finite order value; lower values appear first. Defaults to the natural action order."
    }
  }
}
DashboardCardPreference
FieldTypeDescription
enabledboolean
Complete schema
{
  "type": "object",
  "properties": {
    "enabled": {
      "type": "boolean"
    }
  }
}
DashboardShortcut
FieldTypeDescription
idstring

Optional on input; a missing ID is generated.

namestring

Trimmed; an empty name becomes Shortcut.

iconstring

An unsupported icon becomes Link.

Values: Phone, PhoneIncoming, PhoneOutgoing, Users, UserPlus, Contact2, Calendar, FileText, BookOpen, Workflow, Bot, Megaphone, Webhook, Target, Plus, Link

urlstring

An internal /app/... path or a valid https:// URL. Invalid URLs are removed from the shortcut list.

enabledboolean
ordernumber
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Optional on input; a missing ID is generated.",
      "maxLength": 64
    },
    "name": {
      "type": "string",
      "description": "Trimmed; an empty name becomes Shortcut.",
      "maxLength": 40
    },
    "icon": {
      "type": "string",
      "enum": [
        "Phone",
        "PhoneIncoming",
        "PhoneOutgoing",
        "Users",
        "UserPlus",
        "Contact2",
        "Calendar",
        "FileText",
        "BookOpen",
        "Workflow",
        "Bot",
        "Megaphone",
        "Webhook",
        "Target",
        "Plus",
        "Link"
      ],
      "description": "An unsupported icon becomes Link."
    },
    "url": {
      "type": "string",
      "description": "An internal /app/... path or a valid https:// URL. Invalid URLs are removed from the shortcut\nlist."
    },
    "enabled": {
      "type": "boolean"
    },
    "order": {
      "type": "number"
    }
  }
}
DashboardPreferences

The normalized dashboard view: quick actions, cards and custom shortcuts. A save replaces the view; it does not merge with the previous view. Unknown IDs and fields are removed, and omitted fields use defaults. This configures dashboard content; it does not assign a new landing-page URL or change account permissions.

FieldTypeDescription
builtinsRequiredobject

Only these supported action IDs are retained. Omitted actions default to enabled in natural order. Layout visibility never grants permission.

cardsRequiredobject

Supported dashboard cards can be shown or hidden. Cards are not reordered by this contract. Omitted cards default to enabled.

shortcutsRequiredarray<DashboardShortcut>

Up to 12 valid custom links. Omitted shortcuts become an empty list when preferences are saved.

Complete schema
{
  "type": "object",
  "properties": {
    "builtins": {
      "type": "object",
      "description": "Only these supported action IDs are retained. Omitted actions default to enabled in natural order.\nLayout visibility never grants permission.",
      "properties": {
        "create-campaign": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "create-agent": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "flow-builder": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "secure-message": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "open-conversations": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "team-chat": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "new-follow-up": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "book-appointment": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "meetings": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "analytics": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        }
      }
    },
    "cards": {
      "type": "object",
      "description": "Supported dashboard cards can be shown or hidden. Cards are not reordered by this contract. Omitted\ncards default to enabled.",
      "properties": {
        "card-total-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-incoming-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-outgoing-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-contacts": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-campaigns": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-appointments": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-forms-submitted": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-knowledge-base": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-webhooks": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-templates": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-emails-sent": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-sms-sent": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-whatsapp-sent": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-business-snapshot": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-follow-ups": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-secure-messages": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-conversations": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-needs-you": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-recent-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-lead-temperature": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-call-activity": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-caller-mood": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-call-timing": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-workspace": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        }
      }
    },
    "shortcuts": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/DashboardShortcut"
      },
      "maxItems": 12,
      "description": "Up to 12 valid custom links. Omitted shortcuts become an empty list when preferences are saved."
    }
  },
  "required": [
    "builtins",
    "cards",
    "shortcuts"
  ],
  "description": "The normalized dashboard view: quick actions, cards and custom shortcuts. A save replaces the view;\nit does not merge with the previous view. Unknown IDs and fields are removed, and omitted fields use defaults.\nThis configures dashboard content; it does not assign a new landing-page URL or change account permissions."
}
DashboardPreferencesInput

Send the full desired view. Any omitted built-in action or card returns to its enabled default; omitted shortcuts are cleared. Use an empty object to restore the normal view.

FieldTypeDescription
builtinsobject

Only these supported action IDs are retained. Omitted actions default to enabled in natural order. Layout visibility never grants permission.

cardsobject

Supported dashboard cards can be shown or hidden. Cards are not reordered by this contract. Omitted cards default to enabled.

shortcutsarray<DashboardShortcut>

Up to 12 valid custom links. Omitted shortcuts become an empty list when preferences are saved.

Complete schema
{
  "type": "object",
  "properties": {
    "builtins": {
      "type": "object",
      "description": "Only these supported action IDs are retained. Omitted actions default to enabled in natural order.\nLayout visibility never grants permission.",
      "properties": {
        "create-campaign": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "create-agent": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "flow-builder": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "secure-message": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "open-conversations": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "team-chat": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "new-follow-up": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "book-appointment": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "meetings": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        },
        "analytics": {
          "$ref": "#/components/schemas/DashboardActionPreference"
        }
      }
    },
    "cards": {
      "type": "object",
      "description": "Supported dashboard cards can be shown or hidden. Cards are not reordered by this contract. Omitted\ncards default to enabled.",
      "properties": {
        "card-total-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-incoming-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-outgoing-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-contacts": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-campaigns": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-appointments": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-forms-submitted": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-knowledge-base": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-webhooks": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-templates": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-emails-sent": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-sms-sent": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-whatsapp-sent": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-business-snapshot": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-follow-ups": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-secure-messages": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-conversations": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-needs-you": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-recent-calls": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-lead-temperature": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-call-activity": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-caller-mood": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-call-timing": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        },
        "card-workspace": {
          "$ref": "#/components/schemas/DashboardCardPreference"
        }
      }
    },
    "shortcuts": {
      "type": "array",
      "items": {
        "$ref": "#/components/schemas/DashboardShortcut"
      },
      "maxItems": 12,
      "description": "Up to 12 valid custom links. Omitted shortcuts become an empty list when preferences are saved."
    }
  },
  "description": "Send the full desired view. Any omitted built-in action or card returns to its enabled default; omitted\nshortcuts are cleared. Use an empty object to restore the normal view."
}
DashboardViewResponse
FieldTypeDescription
prefsRequiredDashboardPreferences
Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    }
  },
  "required": [
    "prefs"
  ]
}
DashboardSaveResponse
FieldTypeDescription
okRequiredboolean

Values: true

prefsRequiredDashboardPreferences
Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    }
  },
  "required": [
    "ok",
    "prefs"
  ]
}
MemberDashboardViewResponse
FieldTypeDescription
prefsRequiredDashboardPreferences
inheritedRequiredboolean
roleNameRequiredstring

The member current role label.

Complete schema
{
  "type": "object",
  "properties": {
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    },
    "inherited": {
      "type": "boolean"
    },
    "roleName": {
      "type": "string",
      "description": "The member current role label."
    }
  },
  "required": [
    "prefs",
    "inherited",
    "roleName"
  ]
}
MemberDashboardSaveResponse
FieldTypeDescription
okRequiredboolean

Values: true

prefsRequiredDashboardPreferences
inheritedRequiredboolean

Values: false

Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    },
    "inherited": {
      "type": "boolean",
      "enum": [
        false
      ]
    }
  },
  "required": [
    "ok",
    "prefs",
    "inherited"
  ]
}
MemberDashboardResetResponse
FieldTypeDescription
okRequiredboolean

Values: true

prefsRequiredDashboardPreferences
inheritedRequiredboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "prefs": {
      "$ref": "#/components/schemas/DashboardPreferences"
    },
    "inherited": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  },
  "required": [
    "ok",
    "prefs",
    "inherited"
  ]
}
DashboardMember
FieldTypeDescription
idRequiredstring
nameRequiredstring
emailRequiredstring
roleNameRequiredstring
hasOverrideRequiredboolean
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "roleName": {
      "type": "string"
    },
    "hasOverride": {
      "type": "boolean"
    }
  },
  "required": [
    "id",
    "name",
    "email",
    "roleName",
    "hasOverride"
  ]
}
MenuPreferences

Menu visibility, item ordering and group ordering. PUT merges only array fields supplied in the request. Omitted fields keep their saved values; an explicit empty array clears that dimension. Non-string array entries are removed and arrays are capped. Other existing saved fields are preserved. These preferences do not grant access to hidden or restricted features.

FieldTypeDescription
hiddenarray<string>
orderarray<string>
sectionOrderarray<string>
Complete schema
{
  "type": "object",
  "properties": {
    "hidden": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Application menu path."
      },
      "maxItems": 50
    },
    "order": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Application menu path."
      },
      "maxItems": 50
    },
    "sectionOrder": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Menu group identifier."
      },
      "maxItems": 20
    }
  },
  "description": "Menu visibility, item ordering and group ordering. PUT merges only array fields supplied in the request.\nOmitted fields keep their saved values; an explicit empty array clears that dimension. Non-string array entries\nare removed and arrays are capped. Other existing saved fields are preserved. These preferences do not grant\naccess to hidden or restricted features."
}
MenuPreferencesResponse
FieldTypeDescription
successRequiredboolean

Values: true

dataRequiredobject · nullable

null means no saved layout exists for this owner or role.

Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "data": {
      "type": "object",
      "properties": {
        "hidden": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "order": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Application menu path."
          },
          "maxItems": 50
        },
        "sectionOrder": {
          "type": "array",
          "items": {
            "type": "string",
            "description": "Menu group identifier."
          },
          "maxItems": 20
        }
      },
      "nullable": true,
      "description": "null means no saved layout exists for this owner or role."
    }
  },
  "required": [
    "success",
    "data"
  ]
}
MenuConfig

Menu group names and custom navigation links, saved for the current signed-in user context. PUT replaces both collections. Omitted categoryNames or customItems become empty. This is separate from menu visibility/order preferences and is not a per-member override API.

FieldTypeDescription
categoryNamesRequiredobject

Optional display labels for the supported menu groups. Unknown groups are ignored.

customItemsRequiredarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "categoryNames": {
      "type": "object",
      "description": "Optional display labels for the supported menu groups. Unknown groups are ignored.",
      "properties": {
        "General": {
          "type": "string",
          "maxLength": 30
        },
        "Build": {
          "type": "string",
          "maxLength": 30
        },
        "Telephony": {
          "type": "string",
          "maxLength": 30
        },
        "Monitor": {
          "type": "string",
          "maxLength": 30
        },
        "Schedule": {
          "type": "string",
          "maxLength": 30
        },
        "Team": {
          "type": "string",
          "maxLength": 30
        },
        "Help": {
          "type": "string",
          "maxLength": 30
        },
        "Settings": {
          "type": "string",
          "maxLength": 30
        }
      }
    },
    "customItems": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 40
          },
          "url": {
            "type": "string",
            "description": "An internal /app path, /api/docs, or an http:// or https:// URL. Invalid links are dropped.",
            "maxLength": 300
          },
          "group": {
            "type": "string",
            "enum": [
              "General",
              "Build",
              "Telephony",
              "Monitor",
              "Schedule",
              "Team",
              "Help",
              "Settings"
            ],
            "description": "Unknown or omitted groups use Build."
          }
        },
        "required": [
          "label",
          "url"
        ]
      },
      "maxItems": 30
    }
  },
  "required": [
    "categoryNames",
    "customItems"
  ],
  "description": "Menu group names and custom navigation links, saved for the current signed-in user context. PUT replaces\nboth collections. Omitted categoryNames or customItems become empty. This is separate from menu visibility/order\npreferences and is not a per-member override API."
}
MenuConfigInput

Menu group names and custom navigation links, saved for the current signed-in user context. PUT replaces both collections. Omitted categoryNames or customItems become empty. This is separate from menu visibility/order preferences and is not a per-member override API.

FieldTypeDescription
categoryNamesobject

Optional display labels for the supported menu groups. Unknown groups are ignored.

customItemsarray<object>
Complete schema
{
  "type": "object",
  "properties": {
    "categoryNames": {
      "type": "object",
      "description": "Optional display labels for the supported menu groups. Unknown groups are ignored.",
      "properties": {
        "General": {
          "type": "string",
          "maxLength": 30
        },
        "Build": {
          "type": "string",
          "maxLength": 30
        },
        "Telephony": {
          "type": "string",
          "maxLength": 30
        },
        "Monitor": {
          "type": "string",
          "maxLength": 30
        },
        "Schedule": {
          "type": "string",
          "maxLength": 30
        },
        "Team": {
          "type": "string",
          "maxLength": 30
        },
        "Help": {
          "type": "string",
          "maxLength": 30
        },
        "Settings": {
          "type": "string",
          "maxLength": 30
        }
      }
    },
    "customItems": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "maxLength": 40
          },
          "url": {
            "type": "string",
            "description": "An internal /app path, /api/docs, or an http:// or https:// URL. Invalid links are dropped.",
            "maxLength": 300
          },
          "group": {
            "type": "string",
            "enum": [
              "General",
              "Build",
              "Telephony",
              "Monitor",
              "Schedule",
              "Team",
              "Help",
              "Settings"
            ],
            "description": "Unknown or omitted groups use Build."
          }
        },
        "required": [
          "label",
          "url"
        ]
      },
      "maxItems": 30
    }
  },
  "description": "Menu group names and custom navigation links, saved for the current signed-in user context. PUT replaces\nboth collections. Omitted categoryNames or customItems become empty. This is separate from menu visibility/order\npreferences and is not a per-member override API."
}
MenuConfigResponse
FieldTypeDescription
successRequiredboolean

Values: true

dataRequiredMenuConfig
Complete schema
{
  "type": "object",
  "properties": {
    "success": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "data": {
      "$ref": "#/components/schemas/MenuConfig"
    }
  },
  "required": [
    "success",
    "data"
  ]
}
WorkspaceTeamMember
FieldTypeDescription
idstring
emailstring
namestring
roleIdstring
roleNamestring
statusstring

Membership status; use dashboard-prefs/members for active members eligible for an individual view.

phonestring · nullable
smsNotificationsEnabledboolean
callNotificationsEnabledboolean
lastLoginAtstring · nullable
createdAtstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "name": {
      "type": "string"
    },
    "roleId": {
      "type": "string",
      "format": "uuid"
    },
    "roleName": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "description": "Membership status; use dashboard-prefs/members for active members eligible for an individual\nview."
    },
    "phone": {
      "type": "string",
      "nullable": true
    },
    "smsNotificationsEnabled": {
      "type": "boolean"
    },
    "callNotificationsEnabled": {
      "type": "boolean"
    },
    "lastLoginAt": {
      "type": "string",
      "format": "date-time",
      "nullable": true
    },
    "createdAt": {
      "type": "string",
      "format": "date-time"
    }
  }
}
WorkspaceTeamRole
FieldTypeDescription
idstring
namestring
descriptionstring · nullable
is_system_roleboolean
created_atstring
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "type": "string",
      "nullable": true
    },
    "is_system_role": {
      "type": "boolean"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
ClientManualPolicy
FieldTypeDescription
versionRequiredinteger

Values: 1

timezoneRequiredstring

Exact account timezone from manual/options.

approvalstring

Values: ask, auto

Default: "ask"

modestring

Values: exact, ai, task

Default: "exact"

sendWindowobject

Default: {"start":"09:00","end":"21:00"}

expiryHoursinteger

Default: 24

Complete schema
{
  "type": "object",
  "properties": {
    "version": {
      "type": "integer",
      "enum": [
        1
      ]
    },
    "timezone": {
      "type": "string",
      "description": "Exact account timezone from manual/options."
    },
    "approval": {
      "type": "string",
      "enum": [
        "ask",
        "auto"
      ],
      "default": "ask"
    },
    "mode": {
      "type": "string",
      "enum": [
        "exact",
        "ai",
        "task"
      ],
      "default": "exact"
    },
    "sendWindow": {
      "type": "object",
      "properties": {
        "start": {
          "type": "string",
          "example": "09:00"
        },
        "end": {
          "type": "string",
          "example": "17:00"
        }
      },
      "required": [
        "start",
        "end"
      ],
      "default": {
        "start": "09:00",
        "end": "21:00"
      }
    },
    "expiryHours": {
      "type": "integer",
      "minimum": 1,
      "maximum": 168,
      "default": 24
    }
  },
  "required": [
    "version",
    "timezone"
  ]
}
ClientTaskAttachment
FieldTypeDescription
keystring
namestring
contentTypestring
sizeinteger
Complete schema
{
  "type": "object",
  "properties": {
    "key": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "contentType": {
      "type": "string"
    },
    "size": {
      "type": "integer",
      "minimum": 0
    }
  }
}
ClientManualFollowup
FieldTypeDescription
requestIdRequiredstring
handledBystring

Values: human, automated

actionTypestring

Values: send_email, send_sms, send_whatsapp, human_task

contactPhonestring
contactEmailstring
contactNamestring
sourceCallIdstring
appointmentIdstring
scheduledLocalRequiredstring

Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused.

manualPolicyRequiredClientManualPolicy
messagestring
subjectstring
templateIdinteger
aiGuidancestring
customMessagestring
visibilitystring

Values: shared, internal

contextobject
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "handledBy": {
      "type": "string",
      "enum": [
        "human",
        "automated"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms",
        "send_whatsapp",
        "human_task"
      ]
    },
    "contactPhone": {
      "type": "string",
      "example": "+15555550123"
    },
    "contactEmail": {
      "type": "string",
      "example": "[email protected]"
    },
    "contactName": {
      "type": "string"
    },
    "sourceCallId": {
      "type": "string"
    },
    "appointmentId": {
      "type": "string"
    },
    "scheduledLocal": {
      "type": "string",
      "example": "2026-12-01T10:30",
      "description": "Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused."
    },
    "manualPolicy": {
      "$ref": "#/components/schemas/ClientManualPolicy"
    },
    "message": {
      "type": "string"
    },
    "subject": {
      "type": "string"
    },
    "templateId": {
      "type": "integer",
      "minimum": 1
    },
    "aiGuidance": {
      "type": "string"
    },
    "customMessage": {
      "type": "string"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "shared",
        "internal"
      ]
    },
    "context": {
      "type": "object",
      "properties": {
        "contactId": {
          "type": "string"
        },
        "attachments": {
          "type": "array",
          "items": {
            "$ref": "#/components/schemas/ClientTaskAttachment"
          },
          "maxItems": 20
        },
        "title": {
          "type": "string"
        },
        "category": {
          "type": "string",
          "enum": [
            "task",
            "call",
            "sms",
            "email",
            "file",
            "other"
          ]
        },
        "deliveryMethod": {
          "type": "string",
          "enum": [
            "none",
            "sms",
            "email",
            "whatsapp",
            "call",
            "in_person"
          ]
        }
      }
    }
  },
  "required": [
    "requestId",
    "scheduledLocal",
    "manualPolicy"
  ]
}
ClientFollowupItem
FieldTypeDescription
idinteger
statusstring
actionTypestring
contactPhonestring · nullable
contactEmailstring · nullable
scheduledAtstring · nullable
contextobject
sourceCallIdstring · nullable
Complete schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "integer",
      "minimum": 1
    },
    "status": {
      "type": "string"
    },
    "actionType": {
      "type": "string"
    },
    "contactPhone": {
      "type": "string",
      "nullable": true
    },
    "contactEmail": {
      "type": "string",
      "nullable": true
    },
    "scheduledAt": {
      "type": "string",
      "format": "date-time",
      "nullable": true
    },
    "context": {
      "type": "object"
    },
    "sourceCallId": {
      "type": "string",
      "nullable": true
    }
  }
}
ClientAIGenerationInput
FieldTypeDescription
requestIdRequiredstring
contactPhoneRequiredstring
contactEmailstring
contactNamestring
sourceCallIdRequiredstring
appointmentIdstring
scheduledLocalRequiredstring

Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused.

manualPolicyRequiredClientManualPolicy
visibilitystring

Values: shared, internal

modeRequiredstring

Values: draft_only, generate_and_send

languageRequiredstring

Values: en, fr, pt

actionTypeRequiredstring

Values: send_email, send_sms

contextobject
aiGuidanceRequiredstring
confirmedboolean
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "contactPhone": {
      "type": "string",
      "example": "+15555550123"
    },
    "contactEmail": {
      "type": "string",
      "example": "[email protected]"
    },
    "contactName": {
      "type": "string"
    },
    "sourceCallId": {
      "type": "string"
    },
    "appointmentId": {
      "type": "string"
    },
    "scheduledLocal": {
      "type": "string",
      "example": "2026-12-01T10:30",
      "description": "Future local account time, at most 365 days ahead. Ambiguous or nonexistent daylight-saving times are refused."
    },
    "manualPolicy": {
      "$ref": "#/components/schemas/ClientManualPolicy"
    },
    "visibility": {
      "type": "string",
      "enum": [
        "shared",
        "internal"
      ]
    },
    "mode": {
      "type": "string",
      "enum": [
        "draft_only",
        "generate_and_send"
      ]
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "fr",
        "pt"
      ]
    },
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms"
      ]
    },
    "context": {
      "type": "object",
      "properties": {
        "contactId": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "aiGuidance": {
      "type": "string",
      "minLength": 1,
      "maxLength": 600
    },
    "confirmed": {
      "type": "boolean"
    }
  },
  "required": [
    "requestId",
    "mode",
    "language",
    "sourceCallId",
    "actionType",
    "contactPhone",
    "scheduledLocal",
    "manualPolicy",
    "aiGuidance"
  ],
  "additionalProperties": false,
  "example": {
    "requestId": "7eb0123b-4153-4a6e-9103-c51e54e8fb20",
    "mode": "draft_only",
    "language": "en",
    "sourceCallId": "example-owned-call",
    "actionType": "send_email",
    "contactPhone": "+15555550123",
    "contactEmail": "[email protected]",
    "scheduledLocal": "2026-12-01T10:30",
    "manualPolicy": {
      "version": 1,
      "timezone": "America/Toronto",
      "approval": "ask",
      "mode": "exact",
      "sendWindow": {
        "start": "09:00",
        "end": "17:00"
      },
      "expiryHours": 24
    },
    "aiGuidance": "Summarize only the next step the caller requested."
  }
}
ClientAIDraft
FieldTypeDescription
actionTypestring

Values: send_email, send_sms

subjectstring
bodystring
rationalestring
citationsarray<object>
languagestring

Values: en, fr, pt

sourceCallIdstring
sourceRevisionstring
contentSha256string
Complete schema
{
  "type": "object",
  "properties": {
    "actionType": {
      "type": "string",
      "enum": [
        "send_email",
        "send_sms"
      ]
    },
    "subject": {
      "type": "string",
      "maxLength": 200
    },
    "body": {
      "type": "string",
      "maxLength": 2000
    },
    "rationale": {
      "type": "string",
      "maxLength": 600
    },
    "citations": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "quote": {
            "type": "string",
            "minLength": 5,
            "maxLength": 500
          }
        }
      },
      "minItems": 1,
      "maxItems": 8
    },
    "language": {
      "type": "string",
      "enum": [
        "en",
        "fr",
        "pt"
      ]
    },
    "sourceCallId": {
      "type": "string"
    },
    "sourceRevision": {
      "type": "string"
    },
    "contentSha256": {
      "type": "string"
    }
  }
}
ClientAIGenerationResult
FieldTypeDescription
requestIdstring
modestring

Values: draft_only, generate_and_send

statusstring

Values: generating, ready, failed, stale, dispatching, dispatched, unknown

draftobject · nullable
expiresAtstring
queueIdinteger · nullable
outcomeobject · nullable
noSendboolean
Complete schema
{
  "type": "object",
  "properties": {
    "requestId": {
      "type": "string",
      "format": "uuid"
    },
    "mode": {
      "type": "string",
      "enum": [
        "draft_only",
        "generate_and_send"
      ]
    },
    "status": {
      "type": "string",
      "enum": [
        "generating",
        "ready",
        "failed",
        "stale",
        "dispatching",
        "dispatched",
        "unknown"
      ]
    },
    "draft": {
      "allOf": [
        {
          "$ref": "#/components/schemas/ClientAIDraft"
        }
      ],
      "nullable": true
    },
    "expiresAt": {
      "type": "string",
      "format": "date-time"
    },
    "queueId": {
      "type": "integer",
      "nullable": true
    },
    "outcome": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string"
        },
        "scheduledAt": {
          "type": "string",
          "nullable": true
        },
        "heldFor": {
          "type": "string",
          "nullable": true
        },
        "sent": {
          "type": "boolean",
          "nullable": true
        },
        "delivery": {
          "type": "string",
          "enum": [
            "unknown"
          ]
        }
      },
      "nullable": true
    },
    "noSend": {
      "type": "boolean"
    }
  }
}
ClientBulkPreviewInput
FieldTypeDescription
idsRequiredarray<integer>
actionRequiredstring

Values: complete, cancel, reschedule, assign

scheduledLocalstring
timezonestring
memberIdstring · nullable
Complete schema
{
  "type": "object",
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "integer",
        "minimum": 1
      },
      "minItems": 1,
      "maxItems": 100,
      "uniqueItems": true
    },
    "action": {
      "type": "string",
      "enum": [
        "complete",
        "cancel",
        "reschedule",
        "assign"
      ]
    },
    "scheduledLocal": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "memberId": {
      "type": "string",
      "format": "uuid",
      "nullable": true
    }
  },
  "required": [
    "ids",
    "action"
  ]
}
ClientBulkResult
FieldTypeDescription
operationIdstring
actionstring
itemsarray<object>
completeboolean
noSendboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "operationId": {
      "type": "string",
      "format": "uuid"
    },
    "action": {
      "type": "string"
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "eligible": {
            "type": "boolean"
          },
          "status": {
            "type": "string",
            "enum": [
              "applied",
              "blocked",
              "stale",
              "pending"
            ]
          },
          "reason": {
            "type": "string",
            "nullable": true
          },
          "before": {
            "type": "string"
          },
          "after": {
            "type": "string"
          },
          "at": {
            "type": "string"
          },
          "workflowOnly": {
            "type": "boolean"
          }
        }
      }
    },
    "complete": {
      "type": "boolean"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
ClientTaskEvidence
FieldTypeDescription
taskIdinteger
taskRevisionstring
rangeobject
identitystring
coverageobject

Unavailable sources remain unknown, not zero activity.

itemsarray<object>
taskobject
evidenceRevisionstring
canUpdateboolean
readOnlyboolean

Values: true

noSendboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "taskId": {
      "type": "integer",
      "minimum": 1
    },
    "taskRevision": {
      "type": "string"
    },
    "range": {
      "type": "object"
    },
    "identity": {
      "type": "string"
    },
    "coverage": {
      "type": "object",
      "description": "Unavailable sources remain unknown, not zero activity."
    },
    "items": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "sourceId": {
            "type": "string"
          },
          "conversationId": {
            "type": "string",
            "nullable": true
          },
          "connectionId": {
            "type": "string",
            "nullable": true
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          },
          "direction": {
            "type": "string"
          },
          "rawStatus": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "excerpt": {
            "type": "string"
          },
          "sourceRevision": {
            "type": "string"
          },
          "provenance": {
            "type": "string",
            "enum": [
              "stored_platform_record"
            ]
          },
          "deliveryProven": {
            "type": "boolean"
          }
        }
      }
    },
    "task": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string"
        },
        "status": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "human": {
          "type": "boolean"
        },
        "open": {
          "type": "boolean"
        }
      }
    },
    "evidenceRevision": {
      "type": "string"
    },
    "canUpdate": {
      "type": "boolean"
    },
    "readOnly": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
ClientEvidenceReview
FieldTypeDescription
reviewIdstring
statusstring

Values: analyzing, ready, failed, stale, confirmed

suggestionobject
evidenceClientTaskEvidence
expiresAtstring
noSendboolean

Values: true

resultobject
Complete schema
{
  "type": "object",
  "properties": {
    "reviewId": {
      "type": "string",
      "format": "uuid"
    },
    "status": {
      "type": "string",
      "enum": [
        "analyzing",
        "ready",
        "failed",
        "stale",
        "confirmed"
      ]
    },
    "suggestion": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string",
          "enum": [
            "leave_open",
            "review",
            "complete_human"
          ]
        },
        "summary": {
          "type": "string",
          "maxLength": 900
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10
        },
        "aiGenerated": {
          "type": "boolean"
        },
        "requiresConfirmation": {
          "type": "boolean"
        }
      }
    },
    "evidence": {
      "$ref": "#/components/schemas/ClientTaskEvidence"
    },
    "expiresAt": {
      "type": "string"
    },
    "noSend": {
      "type": "boolean",
      "enum": [
        true
      ]
    },
    "result": {
      "type": "object",
      "properties": {
        "action": {
          "type": "string"
        },
        "at": {
          "type": "string"
        },
        "before": {
          "type": "string"
        },
        "after": {
          "type": "string"
        },
        "citations": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "evidenceRevision": {
          "type": "string"
        },
        "workflowOnly": {
          "type": "boolean",
          "enum": [
            true
          ]
        },
        "deliveryClaim": {
          "type": "boolean",
          "enum": [
            false
          ]
        }
      }
    }
  }
}
ClientWorkExportSettings
FieldTypeDescription
revisionstring
scopestring

Values: personal, office

permissionsobject
connectionsarray<object>
bindingsarray<object>
statesarray<object>
noAttendeesboolean

Values: true

Complete schema
{
  "type": "object",
  "properties": {
    "revision": {
      "type": "string"
    },
    "scope": {
      "type": "string",
      "enum": [
        "personal",
        "office"
      ]
    },
    "permissions": {
      "type": "object",
      "properties": {
        "followup": {
          "type": "boolean"
        },
        "booking": {
          "type": "boolean"
        }
      }
    },
    "connections": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "provider": {
            "type": "string"
          },
          "calendarId": {
            "type": "string"
          }
        }
      }
    },
    "bindings": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "booking",
              "followup"
            ]
          },
          "integrationId": {
            "type": "integer",
            "minimum": 1
          },
          "calendarId": {
            "type": "string"
          },
          "enabled": {
            "type": "boolean"
          },
          "connectionCurrent": {
            "type": "boolean"
          },
          "consentAt": {
            "type": "string",
            "nullable": true
          }
        }
      }
    },
    "states": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "state": {
            "type": "string"
          },
          "count": {
            "type": "integer"
          }
        }
      }
    },
    "noAttendees": {
      "type": "boolean",
      "enum": [
        true
      ]
    }
  }
}
ClientTaskAssignee
Complete schema
{
  "oneOf": [
    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "owner",
            "none"
          ]
        }
      },
      "required": [
        "type"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "member"
          ]
        },
        "memberId": {
          "type": "string",
          "format": "uuid"
        }
      },
      "required": [
        "type",
        "memberId"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "round_robin"
          ]
        },
        "memberIds": {
          "type": "array",
          "items": {
            "type": "string",
            "format": "uuid"
          },
          "minItems": 1,
          "maxItems": 25,
          "uniqueItems": true
        }
      },
      "required": [
        "type",
        "memberIds"
      ],
      "additionalProperties": false
    }
  ]
}
ClientTaskRuleMatch
FieldTypeDescription
sourcesarray<string>
includeManualboolean
agentIdsarray<string>
requestKindsarray<string>
keywordsarray<string>
urgentOnlyboolean
callerTypestring

Values: new, returning

hoursstring

Values: open, closed

Complete schema
{
  "type": "object",
  "properties": {
    "sources": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "callback_request",
          "property_request",
          "promise_keeper",
          "message_verifier",
          "meeting",
          "follow_up_rule",
          "manual"
        ]
      },
      "minItems": 1
    },
    "includeManual": {
      "type": "boolean"
    },
    "agentIds": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "maxItems": 25
    },
    "requestKinds": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "repair",
          "quote",
          "other"
        ]
      },
      "minItems": 1
    },
    "keywords": {
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "maxLength": 60
      },
      "minItems": 1,
      "maxItems": 10
    },
    "urgentOnly": {
      "type": "boolean"
    },
    "callerType": {
      "type": "string",
      "enum": [
        "new",
        "returning"
      ]
    },
    "hours": {
      "type": "string",
      "enum": [
        "open",
        "closed"
      ]
    }
  },
  "additionalProperties": false
}
ClientTaskRuleInput
FieldTypeDescription
nameRequiredstring
matchClientTaskRuleMatch
assigneeRequiredClientTaskAssignee
enabledboolean

Default: true

Complete schema
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80
    },
    "match": {
      "$ref": "#/components/schemas/ClientTaskRuleMatch"
    },
    "assignee": {
      "$ref": "#/components/schemas/ClientTaskAssignee"
    },
    "enabled": {
      "type": "boolean",
      "default": true
    }
  },
  "required": [
    "name",
    "assignee"
  ]
}