# Channel Automation API ## Pages - [Channel Automation API](https://developer.channelautomations.com/api/index.md) — Comprehensive API documentation for the Channel Automation backend system. ## Features - **Messaging**: Send/receive SMS and MMS through Twilio integration - **Contact Management**: Full CRUD operations for contact records - **Webhooks**: Configure and monitor webhook integrations - **Analytics**: Visual query builder and data analytics - **Pipeline Management**: Sales pipeline and lead tracking - **Calendar Booking**: Appointment scheduling and booking system (Cloudflare Worker) - **AI Content Processing**: Intelligent content generation, enhancement, summarization, and expansion (Cloudflare Worker) - **Authentication**: JWT and API key authentication - **Workspace Management**: Multi-tenant workspace support ## Authentication This API supports two authentication methods: 1. **Bearer Token**: JWT authentication for user sessions 2. **API Key**: X-API-Key header for programmatic access ## Rate Limiting API endpoints are rate-limited to ensure fair usage and system stability. ## Data Security All data access is workspace-isolated, ensuring tenant data separation. ## Calendar API (Cloudflare Worker) The Calendar Booking API is deployed as a separate Cloudflare Worker for optimal performance: - **Public Endpoints**: Available without authentication for booking and availability queries - **Admin Endpoints**: Require JWT or API key authentication for event management - **Auto-Contact Creation**: New bookings automatically create contacts in the CRM - **Global Edge Deployment**: Served from Cloudflare's global network for low latency ## AI Content API (Cloudflare Worker) The Notes AI Processor provides intelligent content operations via edge deployment: - **Base URL**: https://ai-notes.customerconnects.app/api/notes - **Features**: Content generation, enhancement, summarization, and expansion using GPT-4o - **Authentication**: No auth required for frontend use, API key required for external integrations - **Performance**: Sub-50ms response times with global edge caching - **Integration**: Seamless integration with Notes system and external tools (Zapier, Make.com) - [Delete a team (cascades to rule, members, tracker)](https://developer.channelautomations.com/api/delete-api-agent-teams-team-id/index.md) - [Revoke a saved report's share link](https://developer.channelautomations.com/api/delete-api-analytics-saved-queries-id-share/index.md) - [Delete a saved query](https://developer.channelautomations.com/api/delete-api-analytics-saved-queries-id/index.md) - [Remove an API key](https://developer.channelautomations.com/api/delete-api-api-keys-id/index.md) — Requires a verified session and current workspace membership; metadata roles never authorize key access. Existing key ownership and operation checks remain in force. - [Clear (cancel) a contact's appointment](https://developer.channelautomations.com/api/delete-api-appointments/index.md) — Finds the contact by `contact_id` or `phone_number` and cancels their appointment(s). **ALL** of the contact's live upcoming appointments are soft-deleted in the `appointments` table, not just the soonest one — duplicate rows do occur (the AI setter, inbound webhooks, and the booking page each insert independently), and clearing one left the duplicate on the calendar. Past appointments are left alone as reporting history; if the contact has nothing upcoming, the single most recent appointment is cleared instead. Once no live appointment remains, the contact's `appointment_date`, `appointment_time`, and `appointment_date_display` columns are nulled so the contact record and the calendar agree. If a live appointment still remains, those columns are left pointing at it. **A cancel that removed nothing returns `success: false` with reason `no_appointment_to_clear`** — still HTTP 200, because the request was processed fine and the outcome was simply "nothing booked". Check `success` (or `appointments_cleared`), not the status code: a cancel arriving before the booking exists must not be read as a cancellation. Idempotent — calling it twice gives `success: false` the second time. Never creates a contact — an unknown identifier returns 404 with reason `contact_not_found`. **Required fields:** one of `contact_id` / `phone_number`. No date/time. - [Delete calendar event by ID (Admin)](https://developer.channelautomations.com/api/delete-api-calendar-events-id/index.md) — Delete an existing calendar event by its ID. Requires admin authentication. - [Delete calendar event (Admin)](https://developer.channelautomations.com/api/delete-api-calendar-events/index.md) — Delete an existing calendar event. Requires admin authentication. - [Delete a reusable email content block](https://developer.channelautomations.com/api/delete-api-email-content-blocks-block-id/index.md) — Deletes a workspace-scoped reusable HTML block. Existing templates keep their placeholder text, but future sends no longer resolve the deleted block. - [Remove a per-user feature flag override](https://developer.channelautomations.com/api/delete-api-feature-flag-admin-workspaces-workspace-id-users-user-id-flags-flag-name/index.md) — Deletes the override so the user inherits the workspace flag again. SaaS platform owners only. CRM_CORE is reserved and rejected with code RESERVED_FEATURE_FLAG. - [Erase one visit's location-derived check-in evidence, live step progress, coaching texts and mapped target](https://developer.channelautomations.com/api/delete-api-field-sales-appointments-id-location-evidence/index.md) — Admin-only privacy erasure. Works even when the check-in flag is off. Does not change the appointment or assignment. - [Soft-delete a visit note](https://developer.channelautomations.com/api/delete-api-field-sales-appointments-id-notes-note-id/index.md) — Stamps metadata.deleted_at and metadata.deleted_by. The author can delete. An owner or admin can delete someone else's note on the web path only. The phone path does not widen that right. - [Delete a QA note](https://developer.channelautomations.com/api/delete-api-field-sales-conversations-id-qa-notes-note-id/index.md) — The author can delete; an owner or admin can delete anyone's. The row is removed. - [Delete a conversation and queue erasure of its audio and analysis](https://developer.channelautomations.com/api/delete-api-field-sales-conversations-id/index.md) — Owners and admins may delete any conversation; a rep may delete their own. Access is revoked immediately. The private audio object, transcript, analysis, and score are erased by a background job, leaving an auditable tombstone recording who deleted it and when. Idempotent. - [Remove one person's credential.](https://developer.channelautomations.com/api/delete-api-field-sales-credentials-people-id/index.md) - [Soft-delete your own visit note from the iPhone app](https://developer.channelautomations.com/api/delete-api-field-sales-rep-appointments-id-notes-note-id/index.md) - [Delete the rep's own currently assigned visit recording](https://developer.channelautomations.com/api/delete-api-field-sales-rep-conversations-id/index.md) - [Delete a shift (its assignments and check-ins go with it)](https://developer.channelautomations.com/api/delete-api-field-sales-shifts-id/index.md) - [Remove an integration](https://developer.channelautomations.com/api/delete-api-integrations-integration-id/index.md) - [Delete a training example](https://developer.channelautomations.com/api/delete-api-knowledge-studio-examples-example-id/index.md) - [Delete a knowledge source and its chunks](https://developer.channelautomations.com/api/delete-api-knowledge-studio-sources-source-id/index.md) - [Cancel this user's phone recording and remove its raw upload](https://developer.channelautomations.com/api/delete-api-livechat-video-phone-handoffs-id/index.md) - [Delete image from storage](https://developer.channelautomations.com/api/delete-api-media-delete/index.md) — Delete an image file from Cloudflare R2 storage. Includes security checks to ensure the file belongs to the specified workspace. - [Delete a notification alert rule](https://developer.channelautomations.com/api/delete-api-notification-alerts-id/index.md) - [Delete notification](https://developer.channelautomations.com/api/delete-api-notifications-workspace-id-notification-id/index.md) — Permanently delete a notification - [Delete a pipeline (soft delete)](https://developer.channelautomations.com/api/delete-api-pipeline-pipelines-id/index.md) - [Delete a registered RCS card (Tier 3](https://developer.channelautomations.com/api/delete-api-rcs-workspaces-workspace-id-templates-template-id/index.md) — Removes the card from rcs_content_templates (so it leaves the picker). The underlying Twilio Content Template is left in the account by default. Authenticated workspace user (Bearer). - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/delete-api-triggers-id-scheduled-contact-id/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/delete-api-triggers-id-scheduled/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/delete-api-triggers-id/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Remove a number from an AI caller pool](https://developer.channelautomations.com/api/delete-api-voice-campaigns-number-pools-pool-id-numbers-number-id/index.md) — Removes only pool membership. Existing reservations, number policy and inbound routing remain intact. - [Remove a teammate](https://developer.channelautomations.com/api/delete-api-workspace-members-remove/index.md) — Current owner/admin authority and delete scope for API keys; creator cannot be removed. - [Disconnect a connected AI app](https://developer.channelautomations.com/api/delete-api-workspaces-workspace-id-ai-connectors-grants-grant-id/index.md) — Owners and admins may disconnect any grant in the workspace; anyone may disconnect their own. Sets revoked_at and revoked_by; the app's next call is refused. Repeating it is harmless. - [Revoke an AI connector integration key](https://developer.channelautomations.com/api/delete-api-workspaces-workspace-id-ai-connectors-integration-keys-key-id/index.md) — Owners and admins. Sets is_active=false; the key stops working on its next call. - [Delete an error log entry](https://developer.channelautomations.com/api/delete-api-workspaces-workspace-id-error-logs-id/index.md) - [Archive a Voice AI API tool](https://developer.channelautomations.com/api/delete-api-workspaces-workspace-id-voice-ai-tools-tool-id/index.md) — Served by the separate Voice API. Requires verified workspace owner/admin membership and VOICE_AI_API_TOOLS enabled. Credentials never appear in responses. - [List customer AI connector permissions for every workspace](https://developer.channelautomations.com/api/get-api-admin-mcp-access/index.md) — Platform admins only. Returns every workspace with its permissions or defaults, plus the role ceiling, defaults and quota limits. Missing settings rows require no provisioning. Rows carry `writes_enabled` (confirmed customer changes) once migration 20261005f is applied; `writes_supported` says whether it is. 503 MCP_ACCESS_NOT_SET_UP until migration 20261005d is applied. - [MCP staff key management bundle (Command Center)](https://developer.channelautomations.com/api/get-api-admin-mcp-permissions/index.md) — Platform admins only (requireSaasOwner). Returns active staff, workspaces, every MCP staff key (never its hash or value) with its exact workspace grants, `expires_at`, `is_expired`, `is_global`, and the key expiry policy. Before migration 20261005a the keys come back without `expires_at`. - [Read the verified platform operator's role](https://developer.channelautomations.com/api/get-api-admin-me/index.md) — Requires a verified user session and the existing platform-operator and IP checks. Prior workspace membership is not required. - [Get live user presence counts by workspace](https://developer.channelautomations.com/api/get-api-admin-workspace-presence/index.md) — Returns per-workspace online, available, and away counts based on agent presence heartbeats received in the last two minutes. SaaS owner only. - [List all agent teams for a workspace](https://developer.channelautomations.com/api/get-api-agent-teams-workspace-workspace-id/index.md) - [Per-agent human outbound dialing KPIs](https://developer.channelautomations.com/api/get-api-analytics-agent-calling-stats/index.md) — Dials, connects, contacts, appointments and wrap-up coverage per agent per day. Backed by upr_agent_calling_daily — the same function behind the daily calling email, so the two always agree. The response also includes a canonical revenue ledger that follows agent-booked contacts to their current configured CRM sale outcome, plus precomputed lead-source and project-type performance. Managers see the whole team; everyone else sees only their own activity. - [Latest Voice AI questionnaire checklist for a single contact](https://developer.channelautomations.com/api/get-api-analytics-contact-voice-questionnaire/index.md) — Returns the most recent Voice AI confirmation call's questionnaire steps for a contact, read from the analytics replica so it matches the Customer Hub / Recent Calls drawer. - [Get available data sources for query builder](https://developer.channelautomations.com/api/get-api-analytics-data-sources/index.md) - [Get query execution history/logs](https://developer.channelautomations.com/api/get-api-analytics-executions/index.md) - [Underlying counted inbound calls and exact booking evidence](https://developer.channelautomations.com/api/get-api-analytics-inbound-calls-by-number-calls/index.md) — Workspace admins and owners only. Same verified-workspace and date rules as inbound-calls-by-number. Reads rollup facts only, never raw calls or appointments. Filters follow the report's historical/current label rules. Booking evidence is withheld until a complete refresh; later cancellations remain included. Lead evidence records internal contact creation or an existing match at arrival; older unsupported calls remain unknown. Optional handling evidence describes saved answer/session signals, fallback routes, provider-reported transfers and ringing declines. Signed destination-leg acknowledgements are distinct from human pickup, booking ownership or a verified business handover. - [Inbound calls per dialed number and number label](https://developer.channelautomations.com/api/get-api-analytics-inbound-calls-by-number/index.md) — Inbound calls grouped by the workspace number that was dialed and that number's label (Settings → Contact Center → Inbound numbers). Counts calls the platform recorded: team or built-in Voice AI calls by Twilio call ID, and Voice AI provider calls by provider call ID. Integration-reported rows without a verifiable call ID are returned separately as `unverified` and are never added to `calls`. A label stamped when the call came in is kept; other calls use the number's current label. Workspace admins and owners only; agents receive 403. Reads pre-computed facts refreshed every 2 hours (7:45 AM–9:45 PM ET) and nightly. `verifiedBookings` counts non-deleted appointments with an exact saved call ID, grouped by inbound call time. Reschedules count once; later cancellations remain included. Bookings without an exact link are excluded. No conversion rate is inferred. - [Get analytics performance statistics](https://developer.channelautomations.com/api/get-api-analytics-performance/index.md) - [Get saved queries for workspace](https://developer.channelautomations.com/api/get-api-analytics-saved-queries/index.md) - [Fetch a shared report's rendered data by share token (login + workspace membership required)](https://developer.channelautomations.com/api/get-api-analytics-shared-report-token/index.md) — Returns the report name, description, table rows, and chart data. The caller MUST be a signed-in member of the report's workspace. No public access. - [Get query templates](https://developer.channelautomations.com/api/get-api-analytics-templates/index.md) - [Lightweight Voice AI summary for the Calling tab](https://developer.channelautomations.com/api/get-api-analytics-voice-ai-calling-summary/index.md) — Returns only the per-assistant breakdown, call dispositions, and questionnaire-completion stats used by the Calling → AI Analytics tab. Skips the full dashboard's appointment fetch, contact-stage loops, and transcript columns for a much faster cold load. - [Voice AI raw analytics dashboard data](https://developer.channelautomations.com/api/get-api-analytics-voice-ai-raw-dashboard/index.md) — Returns Voice AI dashboard widget data aggregated from the isolated analytics-layer Supabase replica tables. - [List API key operations](https://developer.channelautomations.com/api/get-api-api-keys-permissions/index.md) — Requires a verified session and current workspace membership; metadata roles never authorize key access. Existing key ownership and operation checks remain in force. - [List authorized API keys](https://developer.channelautomations.com/api/get-api-api-keys/index.md) — Requires a verified session and current workspace membership; metadata roles never authorize key access. Administrators can list teammates' key metadata but never receive their full key values. - [Get billing history/invoices](https://developer.channelautomations.com/api/get-api-billing-history-workspace-id/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Create Stripe customer portal session](https://developer.channelautomations.com/api/get-api-billing-portal-workspace-id/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Get current usage statistics](https://developer.channelautomations.com/api/get-api-billing-usage-workspace-id/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Get complete billing information for workspace](https://developer.channelautomations.com/api/get-api-billing-workspace-workspace-id/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Get available appointment slots across a date range](https://developer.channelautomations.com/api/get-api-calendar-availability-range/index.md) — Multi-day availability in one call, so a booking UI or agent can show the next open days without one request per date. Each day carries the same slot objects the single-day endpoint returns. Days with no availability are still present with has_slots false, so the caller can render a full calendar strip. - [Get available appointment slots](https://developer.channelautomations.com/api/get-api-calendar-availability/index.md) — Retrieve available booking slots for a specific date, optionally filtered by admin/agent - [Get specific booking by ID (Admin)](https://developer.channelautomations.com/api/get-api-calendar-bookings-id/index.md) — Retrieve a specific booking by its ID. Requires admin authentication. - [Search bookings with advanced filters (Admin)](https://developer.channelautomations.com/api/get-api-calendar-bookings-search/index.md) — Search and filter bookings with advanced criteria. Requires admin authentication. - [Get appointment bookings (Admin)](https://developer.channelautomations.com/api/get-api-calendar-bookings/index.md) — Retrieve list of appointment bookings with optional filtering. Requires admin authentication. - [Get specific calendar event by ID (Admin)](https://developer.channelautomations.com/api/get-api-calendar-events-id/index.md) — Retrieve a specific calendar event by its ID. Requires admin authentication. - [List calendar events with filters (Admin)](https://developer.channelautomations.com/api/get-api-calendar-events/index.md) — Retrieve list of calendar events with optional filtering. Requires admin authentication. - [Get available timezones for booking](https://developer.channelautomations.com/api/get-api-calendar-timezones/index.md) — Retrieve list of supported IANA timezones for appointment booking. Requires authentication. - [List pending appointment follow-up actions for manager review](https://developer.channelautomations.com/api/get-api-call-center-appointment-delivery/index.md) — Requires current manager membership, contact visibility. Returns 25 changes plus a continuation cursor. Booking success is separate from follow-up delivery. - [Get enabled appointment types and existing visits](https://developer.channelautomations.com/api/get-api-call-center-contacts-contact-id-appointment-options/index.md) — Requires a verified session, current workspace membership. Contact actions enforce visibility; visit configuration requires manager access. - [Read an email and related messages using saved reply references](https://developer.channelautomations.com/api/get-api-call-center-contacts-contact-id-emails-message-id-thread/index.md) — On-demand, bounded to 200 header candidates and 20 related bodies. Subjects alone never establish a thread. The limited field identifies incomplete history. - [Read a page of email previews for a visible Calling contact](https://developer.channelautomations.com/api/get-api-call-center-contacts-contact-id-emails/index.md) - [Review Second Chance leads and their current eligibility](https://developer.channelautomations.com/api/get-api-call-center-recovery-reviews/index.md) — Owner, admin or manager only; requires current contact visibility. Returns up to 25 candidates, including reviewed history, with a continuation cursor. Eligibility does not override calling cadence or compliance. - [List visible Second Chance candidates](https://developer.channelautomations.com/api/get-api-call-center-recovery/index.md) — Requires a verified session, current workspace membership. Contact actions enforce visibility; visit configuration requires manager access. - [List manager visit profiles](https://developer.channelautomations.com/api/get-api-call-center-visit-profiles/index.md) — Requires a verified session, current workspace membership. Contact actions enforce visibility; visit configuration requires manager access. - [Load the queue AI worker settings and today's activity](https://developer.channelautomations.com/api/get-api-call-queues-queue-id-ai-worker/index.md) - [SMS/MMS segment counts and estimated Twilio cost for one contact](https://developer.channelautomations.com/api/get-api-contacts-contact-id-sms-usage/index.md) — Counts every billable SMS/MMS for the contact across full history (not the conversation window), computes Twilio billable segments from message encoding, and prices them against the hardcoded rate card in src/config/smsRates.js. Cost is an ESTIMATE — see that file for measured rates and known variance. Available to every workspace; each one reads only its own contacts' messages, priced against its own Twilio account's rates. - [Enhanced contact search with advanced filtering](https://developer.channelautomations.com/api/get-api-contacts-enhanced-search/index.md) — Advanced contact search with multiple filtering options and comprehensive criteria - [Search contacts](https://developer.channelautomations.com/api/get-api-contacts-search/index.md) — Search contacts by various criteria (ID, phone, email, name) with flexible matching - [Get conversation history by phone number](https://developer.channelautomations.com/api/get-api-conversations-phone/index.md) — Fetches the conversation history for a contact identified by phone number. Returns messages in chronological order with sender labels and optional timestamps. Internal notes are always excluded. - [Get all conversations within a date range](https://developer.channelautomations.com/api/get-api-conversations-recent/index.md) — Returns conversations (grouped by contact) that had message activity within the specified date range. Designed for CRM integrations that need to pull "all chat records from the day prior" without knowing phone numbers. - [Get a reusable email content block](https://developer.channelautomations.com/api/get-api-email-content-blocks-block-id/index.md) — Fetches one workspace-scoped reusable HTML block for Email Builder V2. - [List reusable email content blocks](https://developer.channelautomations.com/api/get-api-email-content-blocks/index.md) — Lists workspace-scoped reusable HTML blocks for Email Builder V2. - [List workspace feature flags and per-user overrides](https://developer.channelautomations.com/api/get-api-feature-flag-admin-workspaces-workspace-id-flags/index.md) — Returns the workspace-level FEATURE_FLAGS object plus all per-user overrides for the workspace, excluding the reserved CRM_CORE key. SaaS platform owners only. - [List Sales Coach visit assignments and latest check-ins for one contact](https://developer.channelautomations.com/api/get-api-field-sales-appointments-assignments/index.md) — Owners/admins receive assignment choices with account emails for duplicate display names; managers receive only read-only assigned-rep choices and check-in evidence. - [List notes on one Sales Coach visit](https://developer.channelautomations.com/api/get-api-field-sales-appointments-id-notes/index.md) — Notes are activities rows with type note and appointment_id set. Deleted notes (metadata.deleted_at) are omitted. Oldest first. The same handler is mounted at /api/field-sales/rep/appointments/{id}/notes for the iPhone app. The rep path never widens a manager to visits that are not assigned to them. No feature flag. - [List today's appointments mapped to the signed-in rep](https://developer.channelautomations.com/api/get-api-field-sales-appointments-today/index.md) — Reads only explicit Field Coach appointment mappings. Manager roles are not broadened to the workspace appointment list. Each visible appointment includes contact_address, separate from the meeting location. When check-in is enabled, a ready mapped visit also includes visit_target coordinates for the 150 m map; no device coordinates are returned. - [Preview the arrival alert email with this workspace's name and logo and sample visit details](https://developer.channelautomations.com/api/get-api-field-sales-arrival-alert-settings-preview/index.md) - [Read the workspace's Sales Coach arrival alert settings](https://developer.channelautomations.com/api/get-api-field-sales-arrival-alert-settings/index.md) — Owners, admins and managers. ON by default; `recipients` empty means all owners, admins and managers receive the email. - [Read the workspace's auto-analyze rules](https://developer.channelautomations.com/api/get-api-field-sales-auto-analyze-settings/index.md) - [The consent certificate for one sign-up as a PDF (managers). Generated on demand from the evidence rows, so it includes the latest YES / STOP reply.](https://developer.channelautomations.com/api/get-api-field-sales-compliance-captures-id-certificate-pdf/index.md) - [One sign-up with the full consent wording the customer signed (managers)](https://developer.channelautomations.com/api/get-api-field-sales-compliance-captures-id/index.md) - [Field sign-ups signed in [from, to) with their consent evidence, newest first (managers)](https://developer.channelautomations.com/api/get-api-field-sales-compliance-captures/index.md) — Query: from, to (ISO, at most 93 days), optional location_id, limit (max 500). total is an exact count for the range; truncated says the page holds fewer rows than total. - [The consent wording in use and its version history (managers)](https://developer.channelautomations.com/api/get-api-field-sales-compliance-disclosure/index.md) - [Every sign-up in [from, to) with its consent evidence as CSV (managers). from/to ISO, at most 93 days and 5,000 rows.](https://developer.channelautomations.com/api/get-api-field-sales-compliance-export-csv/index.md) - [Whether a confirmation text ("Reply YES") goes to each new sign-up, and its wording (managers). Off by default.](https://developer.channelautomations.com/api/get-api-field-sales-compliance-optin-settings/index.md) - [Every Sales Coach field touch for one contact, newest first (owners, admins, managers who can see the contact)](https://developer.channelautomations.com/api/get-api-field-sales-contacts-id-field-journey/index.md) — Sign-ups and consent, confirmation texts and YES/STOP replies, visit check-ins and time on site (30-day retention), recordings, visit notes and rep intro videos. Independent of the appointment check-in setting. `unavailable` names any source that could not be read. - [Search contacts the caller may link to a recording](https://developer.channelautomations.com/api/get-api-field-sales-contacts-search/index.md) — Workspace-scoped name/email/phone search, filtered through can_view_contact so folder-inbox restrictions apply. With rep intros on (or the setting unreadable), a non-manager searches by name only and gets no email or phone. - [List QA notes on a conversation](https://developer.channelautomations.com/api/get-api-field-sales-conversations-id-qa-notes/index.md) — Owner/admin/manager only; reps never see QA notes. Oldest first. - [Get transcript, analysis, and score for a conversation](https://developer.channelautomations.com/api/get-api-field-sales-conversations-id/index.md) - [List visible field-sales conversations](https://developer.channelautomations.com/api/get-api-field-sales-conversations/index.md) - [Required credentials, every team member's credentials and the team with their field roles (managers). include_archived=1 adds archived credentials.](https://developer.channelautomations.com/api/get-api-field-sales-credentials/index.md) - [Field roles (Marketing, Sales, Installation) with their people and settings](https://developer.channelautomations.com/api/get-api-field-sales-field-roles/index.md) — Managers read; owners and admins edit (can_edit). Roles are labels mapped to CRM job types, never permissions. - [Read the workspace's rep intro video settings](https://developer.channelautomations.com/api/get-api-field-sales-intro-settings/index.md) — Owners, admins and managers. Returns defaults when nothing is saved; can_edit is true for owners and admins. - [Every rep intro video in a date range, for managers](https://developer.channelautomations.com/api/get-api-field-sales-intros/index.md) - [Stores, event booths and canvass areas with their shifts (next 14 days) and the people on each](https://developer.channelautomations.com/api/get-api-field-sales-locations/index.md) — Managers (owner, admin, manager). include_archived=1 adds archived locations. Also returns the client team members who can be put on a shift. - [Public link of a shared testimonial on the company API domain; a written review or a video player renders as a page (video URLs signed for 15 minutes); 404 once unshared or withdrawn](https://developer.channelautomations.com/api/get-api-field-sales-public-testimonials-token/index.md) - [List QA flags (the review queue)](https://developer.channelautomations.com/api/get-api-field-sales-qa-flags/index.md) — Managers see the workspace queue; everyone else sees flags on their own conversations only. - [The rep's intro options for one assigned visit](https://developer.channelautomations.com/api/get-api-field-sales-rep-appointments-appointment-id-intro/index.md) — Limit, templates rendered for this visit, and whether an intro can be sent. Never includes the customer's phone number. - [List notes on one visit from the Sales Coach iPhone app](https://developer.channelautomations.com/api/get-api-field-sales-rep-appointments-id-notes/index.md) — Rep-scoped alias of GET /api/field-sales/appointments/{id}/notes. A manager on the phone still needs an active assignment. - [Get the signed-in rep's own visit review (native Sales Coach)](https://developer.channelautomations.com/api/get-api-field-sales-rep-conversations-id/index.md) — Same response as the general detail route, restricted to a conversation the caller recorded for an appointment actively assigned to them whose contact they can still view. Managers get no workspace-wide access here, and pending QA flags raised by someone else are never included. - [List only the signed-in rep's currently assigned visit reviews](https://developer.channelautomations.com/api/get-api-field-sales-rep-conversations/index.md) — Includes score summaries and each latest review's rubric section scores. Workspace membership, recorder ownership, active appointment assignment and contact visibility are enforced. Managers do not receive a broader native feed. - [The consent wording a rep shows a customer before a sign-up (the newest version), or null when none is set](https://developer.channelautomations.com/api/get-api-field-sales-rep-disclosure/index.md) - [The signed-in person's shifts (12 h ago to 7 days ahead) with each location's fence and their open check-in](https://developer.channelautomations.com/api/get-api-field-sales-rep-shifts/index.md) - [Read the workspace scorecard and its version history](https://developer.channelautomations.com/api/get-api-field-sales-scorecard/index.md) - [Read what the Sales Coach settings page shows about field readiness](https://developer.channelautomations.com/api/get-api-field-sales-settings-overview/index.md) — Owners, admins and managers. Read only. Returns whether check-in is on and its radius, how many sales process steps the current scorecard has, whether the workspace has its own AI key and a texting number, and every rep with an active visit assignment (upcoming visits, last 4 digits of their profile phone, and whether they turned texts off), plus `my_channels`: how the caller personally gets visit alerts (email / text / in the CRM, with their masked mobile). `can_edit` is true for owners and admins. - [Totals per status for the tiles (managers)](https://developer.channelautomations.com/api/get-api-field-sales-testimonials-counts/index.md) - [One testimonial with its text or a 15-minute video URL, consent evidence and share link (managers)](https://developer.channelautomations.com/api/get-api-field-sales-testimonials-id/index.md) - [Testimonials for review and sharing, newest first, 50 per page (managers). Optional status, offset.](https://developer.channelautomations.com/api/get-api-field-sales-testimonials/index.md) - [Visits happening right now ("In the field"), for managers](https://developer.channelautomations.com/api/get-api-field-sales-visits-live/index.md) — One row per rep and visit in the last 12 hours that is checked in (presence) or being recorded (live steps), left-joined. Presence liveness is derived from the last location reading (on_site under 5 minutes, otherwise no_signal with the clock stopped); live steps are live under 2 minutes, paused under 15, else ended. The nudge is derived at read time. When the check-in flag is off, presence is skipped and checkin_enabled is false; recordings still appear. No feature flag of its own; owners, admins and managers only. - [Get all available integrations](https://developer.channelautomations.com/api/get-api-integrations-available/index.md) - [Check integration health](https://developer.channelautomations.com/api/get-api-integrations-integration-id-health/index.md) - [Get integration logs](https://developer.channelautomations.com/api/get-api-integrations-integration-id-logs/index.md) - [Get integration details](https://developer.channelautomations.com/api/get-api-integrations-integration-id/index.md) - [Read the workspace's Add Call History defaults](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-call-history-defaults/index.md) — Returns the employee, call result, call type and call queue codes this workspace writes call history with. - [Call queues suggested from the workspace's Lead Perfection call-queue table](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-call-queue-suggestions/index.md) — Returns pending suggestions (one per Lead Perfection call queue, with proposed criteria in call_queues shape) plus suggestions decided in the last 30 days and the last sync's bookkeeping. Approval and dismissal happen through the approve_call_queue_suggestion / dismiss_call_queue_suggestion RPCs. Requires LP_CALL_QUEUE_SYNC. - [List Lead Perfection contacts for a workspace](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-contact-list/index.md) — Returns workspace Lead Perfection contact rows using stored contact metadata, latest call summary, and queue status. Requires LEAD_PERFECTION_DATA_WINDOW. - [Get Lead Perfection contact summary](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-contact-summary/index.md) — Returns compact Lead Perfection metadata, latest raw payload, normalized call rows, and lead records for a contact. Requires LEAD_PERFECTION_DATA_WINDOW. - [List Lead Perfection call-history code tables for a workspace](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-disposition-codes/index.md) — Returns the employee, call-result, call-type and call-queue code tables from Lead Perfection GetSalesApptDispProd, used to populate the Add Call History connector operation. Cached per workspace for 24 hours. - [Get latest raw Lead Perfection GetLead payload](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-raw-lead/index.md) — Returns the latest stored raw GetLead payload by contact id or Lead Perfection cst id. Requires LEAD_PERFECTION_DATA_WINDOW. - [Count contacts by their latest Lead Perfection call result code](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-result-rules-code-counts/index.md) — Returns how many of the workspace's contacts have each code as their current latest LP call result, the same value the rules Preview evaluates (contacts whose last sync found no call are not counted). Feeds the "Contacts with code" column on the call result rules table. Owners and admins only. - [Read workspace sync freshness and schedule](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-sync-health/index.md) — Returns complete-sync freshness, next run, failure and retry state for the authenticated workspace. Requires LEAD_PERFECTION_DATA_WINDOW. - [Get Lead Perfection sync status](https://developer.channelautomations.com/api/get-api-integrations-leadperfection-sync-status/index.md) — Returns latest Lead Perfection sync state rows for a workspace. Requires LEAD_PERFECTION_DATA_WINDOW. - [Get integration usage statistics](https://developer.channelautomations.com/api/get-api-integrations-stats-overview/index.md) - [Get user's configured integrations](https://developer.channelautomations.com/api/get-api-integrations-user/index.md) - [Get all available integrations (no auth for testing)](https://developer.channelautomations.com/api/get-api-integrations/index.md) - [List approved and draft training examples for an AI agent](https://developer.channelautomations.com/api/get-api-knowledge-studio-examples/index.md) - [Get a knowledge source including its full content](https://developer.channelautomations.com/api/get-api-knowledge-studio-sources-source-id/index.md) - [List active knowledge sources available to an AI agent](https://developer.channelautomations.com/api/get-api-knowledge-studio-sources/index.md) - [LeadPerfection open periods for an event type (calendar worker only)](https://developer.channelautomations.com/api/get-api-leadperfection-forward-look-internal-availability/index.md) — Returns signed slot ids and wall-clock times. States are available, no_availability, needs_zip, provider_unavailable, invalid_vendor_response, profile_incomplete or disabled. Never returns native slots and never exposes LeadPerfection counters. - [Play an inbound attachment without exposing messaging credentials](https://developer.channelautomations.com/api/get-api-livechat-messages-message-id-media-media-index/index.md) — Resolves only a saved inbound message in the requested workspace. Requires current workspace membership, contact visibility and a server-signed attachment provenance marker from a verified provider webhook. Provider media is limited to 50 MiB and fetched with server-side authentication. - [Poll this user's phone recording for the selected contact](https://developer.channelautomations.com/api/get-api-livechat-video-phone-handoffs-id/index.md) - [Read phone recording availability using its QR capability](https://developer.channelautomations.com/api/get-api-livechat-video-phone-handoffs-mobile/index.md) — Authorization: Bearer contains the QR capability, not a user session. No contact or workspace data is returned. - [Read video preparation progress for a workspace](https://developer.channelautomations.com/api/get-api-livechat-video-prepare-run-id/index.md) - [Proxy a vCard (.vcf) file so LiveChat can parse and render it](https://developer.channelautomations.com/api/get-api-media-vcard/index.md) — Fetches a vCard from an allow-listed host server-side and returns the raw text. Contact cards sent by flows are hosted on vcf.fyi, which serves no CORS headers, so a browser fetch is blocked. This same-origin proxy lets LiveChat parse the vCard into a rich contact card. Host allow-list prevents SSRF (no fetching arbitrary/internal URLs). - [How many workspace addresses still need mapping for Nearby](https://developer.channelautomations.com/api/get-api-nearby-appointments-backfill-status/index.md) — Counts only — makes no geocoding calls, so it is free to poll. `pending` ignores address-edit drift; the backfill itself catches those. - [Booked appointments nearest a contact's address](https://developer.channelautomations.com/api/get-api-nearby-appointments/index.md) — Returns up to `limit` appointments within `radius_miles` of the given contact, one row per neighbouring contact, ranked by straight-line distance. `est_drive_minutes` is an ESTIMATE derived from that straight line at an assumed 30mph — it is NOT a routed drive time and must be labelled as an estimate wherever it is displayed. Gated by the NEARBY_APPOINTMENTS workspace feature flag (404 when off). - [AI Service Health Check](https://developer.channelautomations.com/api/get-api-notes-health/index.md) — Check AI service availability and feature status - [List recent notification alert firings](https://developer.channelautomations.com/api/get-api-notification-alerts-firings/index.md) - [List all notification alert rules](https://developer.channelautomations.com/api/get-api-notification-alerts/index.md) - [Get unread notification count](https://developer.channelautomations.com/api/get-api-notifications-workspace-id-count/index.md) - [Get notifications for workspace](https://developer.channelautomations.com/api/get-api-notifications-workspace-id/index.md) — Retrieve all notifications for a specific workspace with filtering - [Read a workspace board number box summary](https://developer.channelautomations.com/api/get-api-number-rotation-board-board-id-summary/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Read workspace boards and number boxes](https://developer.channelautomations.com/api/get-api-number-rotation-boards/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Read workspace rotation configuration](https://developer.channelautomations.com/api/get-api-number-rotation-config/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Read workspace number rotation events](https://developer.channelautomations.com/api/get-api-number-rotation-events/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Read workspace sender pool](https://developer.channelautomations.com/api/get-api-number-rotation-pool/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [List OAuth connections](https://developer.channelautomations.com/api/get-api-oauth-connections/index.md) — Lists active OAuth/password-grant connections for the current workspace. Sensitive encrypted fields are never returned. - [Active workspace numbers joined with Outbound IQ reputation stats](https://developer.channelautomations.com/api/get-api-outbound-iq-numbers/index.md) - [Outbound IQ connection settings](https://developer.channelautomations.com/api/get-api-outbound-iq-settings/index.md) - [Today's caller-ID assignment vs fallback counts](https://developer.channelautomations.com/api/get-api-outbound-iq-today/index.md) - [Get all opportunities with filtering options](https://developer.channelautomations.com/api/get-api-pipeline-opportunities/index.md) - [Get a pipeline by ID](https://developer.channelautomations.com/api/get-api-pipeline-pipelines-id/index.md) - [List all pipelines](https://developer.channelautomations.com/api/get-api-pipeline-pipelines/index.md) - [Load CRM-ready property intelligence for a contact](https://developer.channelautomations.com/api/get-api-property-intelligence-demo-brief/index.md) — Feature-flagged endpoint that combines RentCast property records, value and rent AVMs, active sale/rental listings, market statistics, and Google Street View metadata for a single contact or address. The response intentionally omits property-owner names and mailing addresses. - [Local-only CEO demo brief for property intelligence](https://developer.channelautomations.com/api/get-api-property-intelligence-internal-demo-brief/index.md) — Internal development endpoint that combines property records, value/rent AVMs, active sale/rental listings, market statistics, and Street View into a compact demo response. It is available only for localhost requests when NODE_ENV is not production. - [Local-only property intelligence smoke test](https://developer.channelautomations.com/api/get-api-property-intelligence-internal-test-lookup/index.md) — Internal development endpoint for testing RentCast and Google Street View locally. It is available only for localhost requests when NODE_ENV is not production. - [Local-only Street View image smoke test](https://developer.channelautomations.com/api/get-api-property-intelligence-internal-test-street-view-image/index.md) — Internal development endpoint for testing the Street View image proxy locally. It is available only for localhost requests when NODE_ENV is not production. - [Preview property intelligence for an address or contact](https://developer.channelautomations.com/api/get-api-property-intelligence-lookup/index.md) — Feature-flagged prototype endpoint that combines RentCast property records, RentCast value estimates, and Google Street View metadata for a single address. The response intentionally omits property-owner names and mailing addresses. - [Proxy a Google Street View image for an address](https://developer.channelautomations.com/api/get-api-property-intelligence-street-view-image/index.md) — Proxies a Google Street View Static API image through the backend so Google API keys remain server-side. Requires the PROPERTY_INTELLIGENCE workspace feature flag. - [List sendable RCS cards for the LiveChat composer](https://developer.channelautomations.com/api/get-api-rcs-workspaces-workspace-id-agent-templates/index.md) — Returns the workspace's registered card templates (id, label, card preview) so an agent can pick one in the composer. Gated by RCS_MESSAGING + workspace_rcs_config; returns an empty list (rcsEnabled:false) when RCS is off. Authenticated workspace agent (Bearer). - [Get RCS configuration for self-serve setup (workspace admin)](https://developer.channelautomations.com/api/get-api-rcs-workspaces-workspace-id-client-config/index.md) — Workspace-admin-readable view of the RCS feature-flag state and workspace_rcs_config row, used by the in-app RCS settings card. Returns featureFlagEnabled so the UI can show whether RCS has been unlocked for this workspace. Config includes eligibility_tag_id (null means all contacts). No Twilio auth tokens are stored or returned here. - [Get RCS configuration status for a workspace (platform owner only)](https://developer.channelautomations.com/api/get-api-rcs-workspaces-workspace-id-config/index.md) — Returns the workspace's RCS feature-flag state and workspace_rcs_config row (no Twilio auth tokens are stored in this table). SaaS platform owner access required. - [List a workspace's stored RCS content templates (platform owner only)](https://developer.channelautomations.com/api/get-api-rcs-workspaces-workspace-id-templates/index.md) — Returns the rcs_content_templates rows for the workspace (rich-card metadata, no Twilio tokens). - [Mint the homeowner's Meet Your Rep link for one appointment](https://developer.channelautomations.com/api/get-api-rep-profiles-appointment-appointment-id-link/index.md) — Owner, admin or manager (database role) who can see the contact. The appointment and its contact must belong to the caller's workspace. Returns the link, the visit state, and an editable SMS suggestion that is present only while the visit is upcoming. Set REP_PAGE_MINTING_DISABLED=true to stop all minting (503). - [Mint a 10-minute preview token for the signed-in member](https://developer.channelautomations.com/api/get-api-rep-profiles-me-preview-token/index.md) — Any current member of the workspace may preview their own public profile, including an unpublished draft. The token is accepted only by the public preview routes. It never records a page open. Returns 503 when the signing key can't be read (migration 20261009h not applied). - [The signed-in member's personal rep link and the profile the app shows](https://developer.channelautomations.com/api/get-api-rep-profiles-me-public-profile/index.md) — Any current member may call this. A personal link is created only for an owner, admin, manager, or a member with a Field Coach assignment, and only when they have a public profile row. Company name, logo, phone and member-since come from rep_public_profile_model, the same read the public page uses. link_live is true only when that page would return 200. REP_PAGE_MINTING_DISABLED stops creating a new code and still returns one that already exists. Returns 503 when the database function is missing. - [List personal links for every public profile in the workspace](https://developer.channelautomations.com/api/get-api-rep-profiles-team-public-links/index.md) — Owner, admin or manager only. The role is read from workspace_members, not from the token. Managers can view. Owners and admins also get can_unpublish. This route never creates a code. Returns 503 when the database function is missing. A caller who is not a member of the workspace in x-workspace-id is rejected by authenticate. - [Get workflow trigger counts or detailed analytics](https://developer.channelautomations.com/api/get-api-triggers-analytics/index.md) — Counts mode reads precomputed hourly summaries. Unrefreshed counts and refreshed_at are null. Detailed mode reads execution history. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [List available trigger event types](https://developer.channelautomations.com/api/get-api-triggers-event-types/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Read workspace trigger executions](https://developer.channelautomations.com/api/get-api-triggers-executions/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/get-api-triggers-id/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Read workspace scheduled reminders](https://developer.channelautomations.com/api/get-api-triggers-scheduled/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [List or create workspace triggers](https://developer.channelautomations.com/api/get-api-triggers/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Twilio connection status for a workspace (the Auth Token is never returned)](https://developer.channelautomations.com/api/get-api-twilio-config-workspace-id/index.md) — apiKeyAuth, and the authorized workspace must be the URL workspace (a `?workspace_id=` or header naming another workspace is a 403). The Auth Token and API key secret are write-only: the response carries `has_auth_token` instead. `account_sid` is included for workspace owners/admins (and platform/service callers) only. - [Read the manual batch protocol supported by this backend](https://developer.channelautomations.com/api/get-api-unified-workflow-batch-capabilities/index.md) — Read-only and uncached. Requires verified identity and a bound workspace. A 404 from an older backend permits the existing legacy submission only when no v2 submission is pending. No credential or executable workflow is returned. - [Read a workflow run in the selected workspace](https://developer.channelautomations.com/api/get-api-unified-workflow-workflow-status-task-id/index.md) — Requires a verified current member session or configured backend automation credential. Source labels provide no authority. Resource IDs must belong to the selected workspace; member contact visibility is checked. Inline definitions and database-lookup bypasses are rejected. - [Get one Sales Coach review with its summary, scorecard, coaching and transcript](https://developer.channelautomations.com/api/get-api-v1-sales-coach-reviews-id/index.md) — Returns a finished review. Call it only for list items whose state is `ready`. A 404 or 409 is not a failure of your workflow: the change that caused it appears again in a later list poll. Requires a Sales Coach API key. - [List Sales Coach reviews changed since your last poll](https://developer.channelautomations.com/api/get-api-v1-sales-coach-reviews/index.md) — Returns reviews in the key's workspace ordered by last change, oldest first. Poll with the returned `next_cursor` until `has_more` is false, then store it and start from it next time. Only reviews that were analysed at least once appear. Changes younger than two minutes are held back until they settle (see `as_of`), so a cursor never skips a change. Upsert by `id`, and read the detail only for items whose `state` is `ready`. Requires a Sales Coach API key. - [What the CRM already knows about a contact, for a live voice agent](https://developer.channelautomations.com/api/get-api-v1-voice-lookup-contacts-contact-id-context/index.md) — Returns facts only, never instructions. `checklist` is the qualification checklist the contact record shows as primary (voice or text). `last_call` is the newest connected Voice AI call with a summary. A part that fails or exceeds the time budget is null and named in `unavailable`. Requires a workspace API key with contacts read. - [Calls taken by each voice agent in the workspace](https://developer.channelautomations.com/api/get-api-voice-agent-studio-agent-call-counts/index.md) — Counts come from the canonical call records our ingest keeps; an agent with no calls is absent from the list. Any member of the workspace may read it — the figures contain no contact data. - [Simultaneous call capacity for the workspace](https://developer.channelautomations.com/api/get-api-voice-campaigns-capacity/index.md) — How many calls this workspace can run at once, how much headroom the last dial reported, and the highest simultaneous-call count reached recently. The voice engine exposes no endpoint for the included-versus-purchased line split, so that breakdown is deliberately absent rather than inferred. - [Attempts the voice engine left uncertain, awaiting operator review](https://developer.channelautomations.com/api/get-api-voice-campaigns-held-attempts/index.md) — Reservations whose engine response was never trustworthy. They keep their allowance because the phone may have rung, and are never redialled automatically. Carries contact detail, so it is manager-only. - [Voice agents that can answer callbacks on a pool number](https://developer.channelautomations.com/api/get-api-voice-campaigns-number-pools-agents/index.md) — Used by the "who answers it" picker when provisioning a caller number. - [GET AI outbound number pool configuration](https://developer.channelautomations.com/api/get-api-voice-campaigns-number-pools-inventory/index.md) — Workspace-scoped AI caller pool operation. Does not dial or change provider routing. - [GET AI outbound number pool configuration](https://developer.channelautomations.com/api/get-api-voice-campaigns-number-pools/index.md) — Workspace-scoped AI caller pool operation. Does not dial or change provider routing. - [Preview an existing number's incoming call routing](https://developer.channelautomations.com/api/get-api-voice-workspace-numbers-sid-preview/index.md) — Verifies live Twilio ownership and voice capability and checks the assistant through the existing workspace Voice Config connection. Makes no provider changes. - [List existing workspace numbers for voice agents](https://developer.channelautomations.com/api/get-api-voice-workspace-numbers/index.md) — Owner/admin only. Returns only the authenticated workspace inventory; credentials never leave the server. - [Get all members of a workspace](https://developer.channelautomations.com/api/get-api-workspace-members-workspace-workspace-id/index.md) - [AI connector access for this workspace](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-ai-connectors-access/index.md) — Any current member. Availability is automatic; legacy platform_enabled/enabled fields are always true. eligible_for_me requires an allowed current role, no folder restriction, and an active workspace. Optional settings default to owner/admin roles and standard quotas. Missing tables and lookup failures remain errors. Quotas are read-only here. - [AI connector activity in this workspace](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-ai-connectors-activity/index.md) — Owners and admins. Calls recorded after the MCP_ACTIVITY_CUTOVER timestamp (unset = now, so nothing older is shown), newest first, excluding internal prompt routing. Each line has the time, who (Channel Automation support for any staff or unclassified call — never a key label, prefix, client id or IP), how (In-app Ask, Connected app, Integration key), which credential (`credential`: the integration key's name or the connected app's name, resolved from credential_id within this workspace only), the tool in plain words, and whether it succeeded. - [List connected AI apps (OAuth grants)](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-ai-connectors-grants/index.md) — Owners and admins see every grant in the workspace; other members see only their own. - [List AI connector integration keys](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-ai-connectors-integration-keys/index.md) — Owners and admins. Metadata only — key values are never stored or shown again. - [Review an automation template](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-automation-templates-template-id/index.md) — Returns the saved snapshot with dependencyReview.blockers and dependencyReview.warnings recomputed from that snapshot. Does not refresh source content or modify the saved version. - [Get error log statistics](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-error-logs-stats/index.md) - [List error logs for a workspace](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-error-logs/index.md) — Returns paginated error logs with optional filters for category, severity, and resolution status - [Get sequence performance analytics](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-sequence-analytics/index.md) — Returns workspace-wide sequence analytics for the requested lookback window. - [Get one selected agent with masked secrets](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-voice-ai-agents-agent-id/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [List configured voice agents without initializing profiles](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-voice-ai-agents/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [Read built-in Voice AI configuration](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-voice-ai-config/index.md) — Served by the Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Returns turn_control_v2_enabled and saved detection settings. The new settings are effective only when the workspace flag is enabled. - [List voice-capable workspace numbers and their inbound agent assignments](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-voice-ai-numbers/index.md) — Admin or manager only. Credentials are never returned. Missing assignment schema preserves workspace-default routing and sets assignment_unavailable. No profiles are created. - [Get shared workspace voice settings with masked credentials](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-voice-ai-settings-shared/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [List saved Voice AI API tools](https://developer.channelautomations.com/api/get-api-workspaces-workspace-id-voice-ai-tools/index.md) — Served by the separate Voice API. Requires verified workspace owner/admin membership and VOICE_AI_API_TOOLS enabled. Credentials never appear in responses. - [Public agent workspace questionnaire page](https://developer.channelautomations.com/api/get-research-agent-workspace/index.md) — Serves the standalone UX research questionnaire (no authentication). Personalized links may append query params (e.g. ?ws=123&src=email) which are captured with the submission. - [Public weekend](https://developer.channelautomations.com/api/get-research-monday-wish/index.md) — Serves a one-question form asking what single feature or change users would want shipped by Monday. Personalized links may append query params (e.g. ?src=announcement) which are captured with the submission. - [Get API information and available services](https://developer.channelautomations.com/api/get/index.md) — Root endpoint that returns information about the API and available calendar services - [Update an MCP staff key (only the fields sent)](https://developer.channelautomations.com/api/patch-api-admin-mcp-permissions-keys-key-id/index.md) — Applies only the fields present in the body, and only those that differ from the stored key. Owner-only (saas_admin_users role 'owner'): setting a global grant (any wildcardRole — the only global grant), any write grant, re-activating an inactive key (isActive true), reassigning staffMemberId, and extending expiresAt on a global or expired key. Platform admins may rename, deactivate, remove global grants, and shorten expiry. A concurrent change answers 409. The admin log records server-built before/after values only. - [Update booking status by ID (Admin)](https://developer.channelautomations.com/api/patch-api-calendar-bookings-id/index.md) — Update the status of an existing booking by its ID. Requires admin authentication. - [Review defer dismiss or assign a recovery candidate](https://developer.channelautomations.com/api/patch-api-call-center-contacts-contact-id-recovery/index.md) — Requires a verified session, current workspace membership. Contact actions enforce visibility; visit configuration requires manager access. - [Update a reusable email content block](https://developer.channelautomations.com/api/patch-api-email-content-blocks-block-id/index.md) — Updates a workspace-scoped reusable HTML block for Email Builder V2. - [Edit a visit note](https://developer.channelautomations.com/api/patch-api-field-sales-appointments-id-notes-note-id/index.md) — Only the author can edit. The /rep/ alias is /api/field-sales/rep/appointments/{id}/notes/{noteId}. Metadata is read and merged; source and kind are kept. - [Edit a QA note](https://developer.channelautomations.com/api/patch-api-field-sales-conversations-id-qa-notes-note-id/index.md) — Only the author can edit. - [Rename, change the role or remind days, or archive (status) a required credential.](https://developer.channelautomations.com/api/patch-api-field-sales-credentials-types-id/index.md) - [Save a rep's edit of a follow-up draft](https://developer.channelautomations.com/api/patch-api-field-sales-followups-id/index.md) — Stores the edit alongside the generated text; the model's original output is never overwritten. - [Edit a location (any field; a pin or a changed address re-places the fence; status archived hides it)](https://developer.channelautomations.com/api/patch-api-field-sales-locations-id/index.md) - [Edit your own visit note from the iPhone app](https://developer.channelautomations.com/api/patch-api-field-sales-rep-appointments-id-notes-note-id/index.md) - [Mark all notifications as read](https://developer.channelautomations.com/api/patch-api-notifications-workspace-id-mark-all-read/index.md) - [Dismiss notification](https://developer.channelautomations.com/api/patch-api-notifications-workspace-id-notification-id-dismiss/index.md) - [Mark notification as read](https://developer.channelautomations.com/api/patch-api-notifications-workspace-id-notification-id-read/index.md) - [Update AI outbound campaign settings](https://developer.channelautomations.com/api/patch-api-voice-campaigns-campaign-id/index.md) — Supports optional number_pool_id. Caller selection changes are permitted only in draft; other existing campaign fields retain their behavior. This endpoint does not dial. - [Update an AI caller pool](https://developer.channelautomations.com/api/patch-api-voice-campaigns-number-pools-pool-id/index.md) — Workspace-scoped AI caller pool operation. Does not dial or change provider routing. - [Update shared AI caller number policy](https://developer.channelautomations.com/api/patch-api-voice-campaigns-pool-numbers-number-id/index.md) — Workspace-scoped AI caller pool operation. Does not dial or change provider routing. - [Change a teammate access role](https://developer.channelautomations.com/api/patch-api-workspace-members-update-role/index.md) — Current authority is rechecked atomically in storage. Creator membership remains owner or admin. - [Mark an error log as resolved](https://developer.channelautomations.com/api/patch-api-workspaces-workspace-id-error-logs-id-resolve/index.md) - [Rotate an MCP staff key (new value shown once)](https://developer.channelautomations.com/api/post-api-admin-mcp-permissions-keys-key-id-rotate/index.md) — Generates a new key value, replaces key_hash and key_prefix, and returns the plaintext once. The old value stops working immediately. Active state, grants and expiry are unchanged. Allowed for a platform owner, or for the platform admin who created the key when the key is neither global nor holds any write grant. A concurrent rotation answers 409. - [Create an MCP staff key (value shown once)](https://developer.channelautomations.com/api/post-api-admin-mcp-permissions-keys/index.md) — Platform admins may create a workspace-scoped key (no wildcard; grant workspaces afterwards). Global access ("every workspace") is expressed ONLY through wildcardRole; it and any write grant require a saas_admin_users role 'owner' (403 OWNER_ROLE_REQUIRED). default_role is always stored as 'none'; a legacy defaultRole of 'read'/'write' is applied as wildcardRole (the stronger wins). Every key expires: `expiresAt` defaults to now + 90 days and may be at most 365 days away. The admin log records only server-built values; any client `reason`/`newValues`/`oldValues` is kept as `operator_note`. - [Provision a workspace for a client](https://developer.channelautomations.com/api/post-api-admin-workspaces/index.md) — Requires a verified user session; the existing operator gate (configured operator emails or a platform admin role) then runs once on that verified identity. No prior workspace selection or membership is required to provision a workspace. - [Dry-run — given a contact (or contact id), return which team would match](https://developer.channelautomations.com/api/post-api-agent-teams-workspace-workspace-id-preview/index.md) - [Create a new agent team with members and rule](https://developer.channelautomations.com/api/post-api-agent-teams-workspace-workspace-id/index.md) - [Resume AI responses for a workspace contact](https://developer.channelautomations.com/api/post-api-ai-conversation-state-contact-id-resume/index.md) — Requires a verified session, current workspace membership, and contact tenancy. Body userId and workspaceId are ignored; actor identity comes from the verified session. - [Pause AI and cancel queued AI replies for a workspace contact](https://developer.channelautomations.com/api/post-api-ai-conversation-state-contact-id-takeover/index.md) — Requires a verified session, current workspace membership, and contact tenancy. Body userId and workspaceId are ignored; actor identity comes from the verified session. - [Process text or preview a saved assistant draft](https://developer.channelautomations.com/api/post-api-ai-process-text/index.md) — The preview_assistant_draft operation is available in every workspace and requires a Bearer session, selected X-Workspace-Id membership, and draft-editor or administrator access. Other operation contracts are unchanged. Preview uses a saved current draft, a reviewed safety baseline, current knowledge and model, and no tools or persistent conversation. - [Execute an analytics query](https://developer.channelautomations.com/api/post-api-analytics-execute/index.md) - [Export query results as CSV](https://developer.channelautomations.com/api/post-api-analytics-export-csv/index.md) - [Enable sharing for a saved report and return a login-gated share link](https://developer.channelautomations.com/api/post-api-analytics-saved-queries-id-share/index.md) — Generates (or returns the existing) share token. The link is viewable only by signed-in members of the report's workspace. - [Save a new query](https://developer.channelautomations.com/api/post-api-analytics-saved-queries/index.md) - [Regenerate an API key](https://developer.channelautomations.com/api/post-api-api-keys-id-regenerate/index.md) — Requires a verified session and current workspace membership; metadata roles never authorize key access. An owner or admin may regenerate a teammate's key, but only the key's owner receives the new full value; for anyone else `data.api_key` is null. Refuses (400 USE_AI_CONNECTORS_SETTINGS) to regenerate an AI connector key; create a new one in Settings → AI Connectors instead. - [Create an API key](https://developer.channelautomations.com/api/post-api-api-keys/index.md) — Requires a verified session and current workspace membership; metadata roles never authorize key access. Existing key ownership and operation checks remain in force. Refuses (400 USE_AI_CONNECTORS_SETTINGS) any permissions object containing "mcp"; AI connector keys are created only under /api/workspaces/{workspaceId}/ai-connectors/integration-keys. - [Schedule reminders, or rearm a committed voice move using voiceRescheduleChangeId and x-internal-secret.](https://developer.channelautomations.com/api/post-api-appointment-reminders-schedule/index.md) - [Create an appointment by phone number](https://developer.channelautomations.com/api/post-api-appointments/index.md) — Looks up an existing contact by phone number in the workspace, or creates a new one from the provided payload, and inserts an appointment row. Calendar links (Google, Outlook, iCal) are auto-generated by a database trigger immediately after insert. The "Appointment Booked" flow trigger is fired automatically and any active sequences for the contact are stopped. **Required fields:** `phone_number`, `adate`, `atime`. Everything else is optional. **Timezone resolution priority (used to convert `adate`+`atime` to UTC):** 1. Existing contact's `timezone` column (if the phone matches a contact that has a timezone set) 2. Phone area code → IANA timezone (works for all US numbers via the built-in area code map) 3. Caller-provided `adate_utc` (used as-is if neither of the above succeeds) 4. UTC (treat `adate`+`atime` as UTC — last resort) The resolved `booking_timezone` is stored on the appointment row so the LiveChat UI and calendar view can display times in the correct local zone. - [Create Stripe checkout session for plan upgrade](https://developer.channelautomations.com/api/post-api-billing-checkout/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Create setup intent for payment method collection](https://developer.channelautomations.com/api/post-api-billing-payment-method-setup/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Update workspace payment method](https://developer.channelautomations.com/api/post-api-billing-payment-method-update/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Cancel workspace subscription](https://developer.channelautomations.com/api/post-api-billing-subscription-cancel/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Reactivate canceled subscription](https://developer.channelautomations.com/api/post-api-billing-subscription-reactivate/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Update billing information](https://developer.channelautomations.com/api/post-api-billing-update-info/index.md) — The actual target must match the currently authorized workspace. Existing operation permissions are unchanged. - [Create appointment booking (Public)](https://developer.channelautomations.com/api/post-api-calendar-book/index.md) — Create a new appointment booking. Can be used by external users without authentication. The contact is resolved by the first identity the request supplies, in this order: contact_id, then contact_phone (alias phone), then contact_name plus contact_email. A phone that is not already in the workspace creates a contact; a phone that matches an existing one books against it and does not overwrite its name. - [Create or update calendar event (Admin)](https://developer.channelautomations.com/api/post-api-calendar-events/index.md) — Create a new calendar event or update an existing one. Requires admin authentication. - [Queue one retry of interrupted appointment follow-up actions](https://developer.channelautomations.com/api/post-api-call-center-appointment-delivery-change-id-retry/index.md) — Manager only, contact scoped. Only needs-review changes can be retried. Completed steps and appointment data remain intact. The processor resumes unfinished work. - [Book reschedule or cancel an appointment atomically](https://developer.channelautomations.com/api/post-api-call-center-contacts-contact-id-appointment-changes/index.md) — Requires a verified session, current workspace membership. Contact actions enforce visibility; visit configuration requires manager access. - [Rank rep capacity and road travel appointment offers](https://developer.channelautomations.com/api/post-api-call-center-contacts-contact-id-appointment-offers/index.md) — Requires a verified session, current workspace membership. Contact actions enforce visibility; visit configuration requires manager access. - [Send an email or a reply to a visible Calling contact](https://developer.channelautomations.com/api/post-api-call-center-contacts-contact-id-emails/index.md) — Workspace and recipient are resolved server-side. Email opt-out and Sandbox Mode are checked before sending. Reply headers come only from the original email under the same contact and workspace. Unknown send outcomes must not be retried automatically. - [Send an agent text to a contact from the Call Center profile](https://developer.channelautomations.com/api/post-api-call-center-contacts-contact-id-text/index.md) — Sends one SMS to a workspace contact from the Calling / standalone Call Center profile drawer. Denials run in a fixed order BEFORE the carrier is reached: authentication, workspace membership and contact visibility, contact tenancy, Sandbox Mode whitelist, DNC / SMS opt-out. The message then gets merge-field rendering and the GSM-7 body guard, is sent from the same number LiveChat would use (contact board number, registered short code, or the workspace default) and is saved to the LiveChat thread. - [Discover recovery candidates from completed call evidence](https://developer.channelautomations.com/api/post-api-call-center-recovery-refresh/index.md) — Scans up to 25 completed human or Voice AI call analyses created in the last 30 days using original transcript-backed evidence. Calls without a completed analysis are not included. Pass nextCursor from the previous response to continue without skipping tied timestamps. Does not dial or send messages. Requires current membership. - [Create an outbound call log](https://developer.channelautomations.com/api/post-api-calls-initiate/index.md) — Creates an outbound voice call log entry and attributes it to the initiating human agent when a user ID is supplied. - [Reset a contact's AI context for internal verification](https://developer.channelautomations.com/api/post-api-contact-ai-contact-id-reset-context/index.md) — Requires a fresh verified user session and the existing platform/IP permission gate, without selected-workspace membership. The stored contact must match workspace_id and its first name must be confirmed. Other contact-AI endpoints are outside this authentication correction. - [Cancel active automation workflows for a contact](https://developer.channelautomations.com/api/post-api-contacts-contact-id-cancel-active-workflows/index.md) — Cancels active workflow runs, active sequence-backed workflow runs, and pending sequence message jobs for one contact. It does not delete workflow or sequence definitions. - [Pause automation for a contact](https://developer.channelautomations.com/api/post-api-contacts-contact-id-pause-automation/index.md) — Sets a contact-level automation pause and cancels currently active workflow and sequence runs for that contact. - [Resume automation for a contact](https://developer.channelautomations.com/api/post-api-contacts-contact-id-resume-automation/index.md) — Clears the contact-level automation pause. Previously cancelled workflow runs are not restarted. - [Create a new contact without requiring a phone number](https://developer.channelautomations.com/api/post-api-contacts-no-phone/index.md) - [Create new contact](https://developer.channelautomations.com/api/post-api-contacts/index.md) — Create a new contact with duplicate checking and comprehensive data validation - [Create a custom field definition](https://developer.channelautomations.com/api/post-api-custom-fields/index.md) — Creates a workspace-scoped custom field definition for contacts, appointments, or workspace-level values. - [Ask LeadGPT for agent action recommendations](https://developer.channelautomations.com/api/post-api-customer-hub-leadgpt-ask/index.md) — Returns non-mutating LeadGPT action cards for the authenticated workspace. The route derives workspace access from apiKeyAuth and only uses the client workspace id for auth scoping. - [Create a reusable email content block](https://developer.channelautomations.com/api/post-api-email-content-blocks/index.md) — Creates a workspace-scoped reusable HTML block for Email Builder V2. - [Record a rep-initiated device-location check-in for one assigned visit](https://developer.channelautomations.com/api/post-api-field-sales-appointments-id-checkin/index.md) — Checks a fresh phone location against the admin-mapped address for this visit. This is device-reported proximity, not tamper-proof proof of attendance; no background tracking occurs. - [The rep's reason for leaving a visit before the minimum](https://developer.channelautomations.com/api/post-api-field-sales-appointments-id-leave-reason/index.md) - [Explicitly map one assigned Sales Coach visit address](https://developer.channelautomations.com/api/post-api-field-sales-appointments-id-map-address/index.md) — Admin-only, flag-gated action. May make one billable Google Geocoding request. Assignment saves never geocode. - [Add a note to one Sales Coach visit](https://developer.channelautomations.com/api/post-api-field-sales-appointments-id-notes/index.md) — Stores plain text on the appointment's contact. contact_id is copied from the appointment. created_by_user_id is set explicitly because service-role inserts have a null auth.uid(). source is web on this path and mobile_app on the /rep/ path. - [One location reading while a checked-in Sales Coach visit is open](https://developer.channelautomations.com/api/post-api-field-sales-appointments-id-presence/index.md) — Sent by the rep's phone about every 2 minutes after a VERIFIED check-in, until the response says stop_tracking. Uses the same 150 m / 100 m accuracy rule as check-in. Two readings in a row outside the circle record a departure (at the first one). Leaving before the workspace minimum emails managers "Left early" and returns ask_leave_reason; staying past the maximum emails "Running long". Only the distance is stored, never the phone's coordinates. Flag-gated with check-in (FIELD_SALES_GEOFENCED_CHECKIN). - [The appointment's testimonial link for a customer (any workspace member who can see the contact). Creates the first one, reopens the open one, renews an expired one; replaces_link_id replaces it or starts a new request after a submission (a retry returns the same successor).](https://developer.channelautomations.com/api/post-api-field-sales-appointments-id-testimonial-link/index.md) — Body: { replaces_link_id? }. Response: { link: { id, state open|opened|submitted|revoked|expired, url, expires_at, opened_at, submitted_at }, created, stale, can_new_link }. 404 appointment_missing, 409 contact_missing. - [Send a sample arrival alert to the signed-in user's own email](https://developer.channelautomations.com/api/post-api-field-sales-arrival-alert-settings-test/index.md) — Owners, admins and managers. Always sends to the caller's own sign-in email, never an arbitrary address. - [Publish new consent wording as the next version (owners and admins). Earlier versions and every signed consent stay as they are.](https://developer.channelautomations.com/api/post-api-field-sales-compliance-disclosure/index.md) - [Verify an upload and queue conversation processing](https://developer.channelautomations.com/api/post-api-field-sales-conversations-id-finalize/index.md) — Idempotent. Re-finalizing a failed conversation retries processing against the same immutable object; it never re-uploads or overwrites audio. - [Generate editable SMS and email follow-up drafts](https://developer.channelautomations.com/api/post-api-field-sales-conversations-id-followup/index.md) — Drafts are written from the stored analysis and are never sent. Regenerating replaces the existing drafts for this conversation, including any edits. - [Create a short-lived private playback URL](https://developer.channelautomations.com/api/post-api-field-sales-conversations-id-playback/index.md) - [Mark a conversation for QA review](https://developer.channelautomations.com/api/post-api-field-sales-conversations-id-qa-flag/index.md) — Raises a review flag on a conversation the caller can already see — a rep on their own conversation, a manager on any. One open flag per conversation; flagging again returns the existing open flag. A pending flag is visible to managers and to the flagger, never surfaced to the rep until a verdict is given. - [Add a QA note to a conversation](https://developer.channelautomations.com/api/post-api-field-sales-conversations-id-qa-notes/index.md) — Owner/admin/manager only. Plain text, 1-2,000 characters. - [Re-run transcription and analysis, publishing a new version](https://developer.channelautomations.com/api/post-api-field-sales-conversations-id-reprocess/index.md) — Owner/admin/manager only. Re-runs the pipeline against the stored audio and publishes the next analysis version beside the existing one; the earlier result is never overwritten. Use after a model, prompt, or scorecard change. - [Register a field-sales recording upload](https://developer.channelautomations.com/api/post-api-field-sales-conversations/index.md) - [Add a required credential. Body { name, role_key (marketing|sales|installation|null = everyone), remind_days (1-365, default 60) }. 409 duplicate name.](https://developer.channelautomations.com/api/post-api-field-sales-credentials-types/index.md) - [Queue an existing workspace call recording for Field Coach analysis](https://developer.channelautomations.com/api/post-api-field-sales-existing-calls-analyze/index.md) — Owner/admin/manager only. Idempotently links a call_logs or vapi_call_records row to one shared Field Coach conversation without copying or modifying the source call. - [Render a draft intro template with a sample customer](https://developer.channelautomations.com/api/post-api-field-sales-intro-settings-preview/index.md) - [Allow a rep to send a new intro after an unconfirmed send](https://developer.channelautomations.com/api/post-api-field-sales-intros-intro-id-release/index.md) — Managers only. Works only for an intro whose send could not be confirmed and that Twilio never acknowledged (no message id). The office should check the LiveChat thread first. - [Add a dated shift (starts_at, ends_at ≤ 24 h, slots, note, user_ids of client team members)](https://developer.channelautomations.com/api/post-api-field-sales-locations-id-shifts/index.md) - [Create a location](https://developer.channelautomations.com/api/post-api-field-sales-locations/index.md) — Body: name, kind (store|event|canvass), street/city/state/zip, radius_meters (25-2000), lead_source_tag, optional pin {latitude, longitude}. A pin is PINNED; otherwise the address is geocoded and kept only at ROOFTOP precision (geocode: rooftop|needs_pin|no_address|unavailable). - [Send a written testimonial with consent (Authorization: Bearer ). One per link; a repeat returns the first.](https://developer.channelautomations.com/api/post-api-field-sales-public-testimonial-links-submit/index.md) — Body: { kind: 'written', first_name, signer_name, agreed: true, wording_sha256, written_text (1-2000 chars) }. 409 wording_changed; 410 revoked / expired / binding_lost. - [The upload finished: the stored video is checked and accepted, then prepared for review (Authorization: Bearer ). Safe to repeat.](https://developer.channelautomations.com/api/post-api-field-sales-public-testimonial-links-video-complete/index.md) — Body: { attempt_id }. 202 processing; 409 not_uploaded; 400 rejected; 410 closed. - [Start (or restart) a video upload for this link's video consent (Authorization: Bearer ). Returns a 2-hour signed resumable-upload token for a new, never-reused path.](https://developer.channelautomations.com/api/post-api-field-sales-public-testimonial-links-video-upload/index.md) — Body: { size, type (video/quicktime | video/mp4), duration_seconds }. 400 too long / too large / wrong type; 409 no video consent yet; 410 expired; 429 too many attempts. - [What the customer's testimonial page shows (Authorization: Bearer ). Stamps the first open.](https://developer.channelautomations.com/api/post-api-field-sales-public-testimonial-links-view/index.md) - [Rep acknowledges a coaching verdict](https://developer.channelautomations.com/api/post-api-field-sales-qa-flags-id-acknowledge/index.md) — Only the rep whose conversation was reviewed can acknowledge, and only a needs_coaching verdict — that is what closes the coaching loop. - [Resolve a QA flag with a human verdict](https://developer.channelautomations.com/api/post-api-field-sales-qa-flags-id-verdict/index.md) — Owner/admin/manager only. The claim is atomic, so two reviewers cannot both resolve one flag. needs_coaching requires a note — a verdict the rep cannot act on is noise. - [Add a visit note from the Sales Coach iPhone app](https://developer.channelautomations.com/api/post-api-field-sales-rep-appointments-id-notes/index.md) — Rep-scoped alias. metadata.source is mobile_app. - [Finalize the rep's own actively assigned visit recording](https://developer.channelautomations.com/api/post-api-field-sales-rep-conversations-id-finalize/index.md) - [Register an assigned visit recording with safe retries](https://developer.channelautomations.com/api/post-api-field-sales-rep-conversations/index.md) — Uses the same upload body as conversations. appointment_id, contact_id and client_recording_id are required. Requires the signed-in user's active assignment and contact visibility even for managers. Reusing the key returns the same upload target; conflicting content returns 409. - [Submit an uploaded intro for sending](https://developer.channelautomations.com/api/post-api-field-sales-rep-intros-intro-id-finalize/index.md) - [Register a rep intro video and get its private upload target](https://developer.channelautomations.com/api/post-api-field-sales-rep-intros/index.md) — Idempotent on client_intro_id. A replay returns the intro's current status and never changes other intros. At most 10 per visit per day. - [Record a sign-up at the rep's shift with the customer's signed consent (retry-safe on client_capture_id)](https://developer.channelautomations.com/api/post-api-field-sales-rep-lead-captures/index.md) — Body: client_capture_id, shift_id, first_name, last_name, phone, email, note, disclosure_version_id, signer_name, agreed (true), signed_at, location {latitude, longitude, accuracy_meters, captured_at}, device. 403 not_assigned, 409 outside_shift_window / disclosure_not_found. The reply never says whether the number already belonged to a contact. No text message is sent. - [Judge the newest ~30 s of an in-progress visit against the sales process](https://developer.channelautomations.com/api/post-api-field-sales-rep-live-steps/index.md) — Transcribes one short audio chunk and returns which process steps are covered, the step the conversation is on, and at most one nudge (an earlier step still open while a later one is under way). The phone holds the state and sends it back each time; the server stores no audio or transcript. It does keep the step progress per visit (which steps are covered, when in the recording, the current step) so managers can follow the visit in "In the field"; the conversation context is never stored. No feature flag; requires an active assignment of the visit to the caller, a scorecard with steps, and the workspace's own AI key. - [Check in at a shift (assigned, shift window from 60 min before start to the end, exact place, inside its fence)](https://developer.channelautomations.com/api/post-api-field-sales-rep-shifts-id-checkin/index.md) — Body: client_attempt_id (8-80 chars, retry-safe) and location {latitude, longitude, accuracy_meters, captured_at}. 403 not_assigned; 409 outside_shift_window; 422 outside_radius|uncertain_location|low_accuracy|address_imprecise|invalid_location. - [Check out of the caller's shift (idempotent)](https://developer.channelautomations.com/api/post-api-field-sales-rep-site-sessions-id-checkout/index.md) - [A location reading for the caller's open shift check-in (every ~2 min); 2 outside in a row ends it](https://developer.channelautomations.com/api/post-api-field-sales-rep-site-sessions-id-readings/index.md) - [Approve, reject or restore (back to review) a testimonial (managers). Body: { action }](https://developer.channelautomations.com/api/post-api-field-sales-testimonials-id-review/index.md) - [Share an approved testimonial; returns its public link (managers). 409 when consent was withdrawn.](https://developer.channelautomations.com/api/post-api-field-sales-testimonials-id-share/index.md) - [Stop sharing; every link handed out stops working (managers)](https://developer.channelautomations.com/api/post-api-field-sales-testimonials-id-unshare/index.md) - [The customer withdrew consent. Unshares, clears a written review's text or deletes a video's files, and keeps the consent record (managers)](https://developer.channelautomations.com/api/post-api-field-sales-testimonials-id-withdraw-consent/index.md) - [Suggest three short texts a manager could send the rep at this visit](https://developer.channelautomations.com/api/post-api-field-sales-visits-appointment-id-message-suggest/index.md) — Owners, admins and managers. Built from the visit's step progress and timing only (skipped step, current step, steps covered, minutes on site), never from the conversation. Uses the workspace's own AI key. - [Text the rep at this visit from the workspace number](https://developer.channelautomations.com/api/post-api-field-sales-visits-appointment-id-message/index.md) — Owners, admins and managers. Sends one SMS to the phone on the rep's profile, honouring the rep's STOP. The text is GSM-7 guarded and at most 320 characters. Recorded in field_sales_coaching_messages (30-day purge). - [Execute an integration action](https://developer.channelautomations.com/api/post-api-integrations-integration-id-execute/index.md) - [Setup a new integration](https://developer.channelautomations.com/api/post-api-integrations-integration-id-setup/index.md) - [Test integration configuration](https://developer.channelautomations.com/api/post-api-integrations-integration-id-test/index.md) - [Enable or disable an integration](https://developer.channelautomations.com/api/post-api-integrations-integration-id-toggle/index.md) - [Re-read Lead Perfection's call-queue table and reconcile suggestions](https://developer.channelautomations.com/api/post-api-integrations-leadperfection-call-queue-suggestions-refresh/index.md) — Forces a fresh read of the LP code tables (bypassing the 24h cache), proposes criteria for each queue, inserts new pending suggestions, re-opens dismissed ones LP has renamed, and stamps rename / removal markers on approved queues. Never creates or deactivates a call queue. Requires LP_CALL_QUEUE_SYNC and an active Lead Perfection connection. - [Trigger Lead Perfection call-result sync for one contact](https://developer.channelautomations.com/api/post-api-integrations-leadperfection-sync-trigger/index.md) — Pulls Lead Perfection GetLead data for a contact, stores the raw payload, normalizes call results, and updates contact CRM metadata. Requires LEAD_PERFECTION_DATA_SYNC. - [Poll Lead Perfection for workspace call-result changes](https://developer.channelautomations.com/api/post-api-integrations-leadperfection-sync-workspace-poll/index.md) — Pulls live Lead Perfection GetLead activity for the workspace, matches or creates contacts by LP identifiers and phone/email, stores raw payloads, writes the latest call result to contact custom fields, and directly blocks SMS/email for DNC. An incremental full-history DNC scan resumes from saved progress on each poll. Activity batches also resume settled record checkpoints within the shared execution cap. A successful partial response has complete=false and continuation=true, with cumulative counts for the saved batch; it does not advance complete-sync freshness. Requires LEAD_PERFECTION_DATA_SYNC. - [Approve a proposed training example into the live prompt](https://developer.channelautomations.com/api/post-api-knowledge-studio-examples-example-id-approve/index.md) — Owner/admin/manager only. Proposals (is_approved = false) are generated from QA-passed Field Coach conversations and are ignored by every AI runtime reader until approved here. Approving an already-approved example is a 404, so a double click cannot rewrite its attribution. - [Discard a proposed training example](https://developer.channelautomations.com/api/post-api-knowledge-studio-examples-example-id-discard/index.md) — Owner/admin/manager only. Deletes the proposal; the source conversation is untouched. - [Add a training example used for style and response shape](https://developer.channelautomations.com/api/post-api-knowledge-studio-examples/index.md) - [Preview the exact knowledge and style examples a question retrieves](https://developer.channelautomations.com/api/post-api-knowledge-studio-retrieve/index.md) - [Add manual, FAQ, file, or public URL knowledge](https://developer.channelautomations.com/api/post-api-knowledge-studio-sources/index.md) - [Book a signed LeadPerfection offer exactly once (calendar worker only)](https://developer.channelautomations.com/api/post-api-leadperfection-forward-look-internal-bookings/index.md) — Send-once saga. Status committed, rejected, slot_taken, provider_unknown (may have reached LeadPerfection; never resent), handoff or conflict. A replay of the same idempotency key returns the stored outcome without calling LeadPerfection. - [Verify an lp slot id and confirm the period is still open (calendar worker only)](https://developer.channelautomations.com/api/post-api-leadperfection-forward-look-internal-resolve-slot/index.md) - [Read public website metadata for a conversation link preview](https://developer.channelautomations.com/api/post-api-link-preview/index.md) — Verified workspace members only. Checks public DNS and each redirect, limits HTML to 512 KiB and six seconds, and never executes scripts or forwards credentials. Returns null when the site cannot be previewed. - [Upload one phone video with a single-use QR capability](https://developer.channelautomations.com/api/post-api-livechat-video-phone-handoffs-upload/index.md) — Authorization: Bearer contains the QR capability. The computer reviews and prepares the video; this endpoint never sends messages. - [Create a ten-minute phone recording QR code](https://developer.channelautomations.com/api/post-api-livechat-video-phone-handoffs/index.md) - [Prepare a short video for text messaging](https://developer.channelautomations.com/api/post-api-livechat-video-prepare/index.md) - [Email teammates who were @mentioned in a comment](https://developer.channelautomations.com/api/post-api-livechat2-notify-mentions/index.md) — Requires a signed-in session (Authorization Bearer) and current membership of the workspace in X-Workspace-Id. Takes only the id of a comment the caller saved in this workspace in the last 24 hours. The email uses that comment's stored text and author name, the contact's real name, and the mentions recorded when it was saved; only current members are emailed, and all text is HTML-escaped. The first call claims the send on the comment's mention record (livechat_internal_notes.notified_at, one per message id) and records the outcome (notify_outcome), so a repeated or overlapping call emails no one again and reports the recorded outcome. - [Save an internal comment on a contact](https://developer.channelautomations.com/api/post-api-livechat2-save-comment/index.md) — Requires a signed-in session (Authorization Bearer) and current membership of the workspace in X-Workspace-Id. Any member may comment on any contact in that workspace. The server builds the row: only body, contact, msg_type (comment or note), user_name and a client UUID are taken from the request; direction, internal flag and time are set by the server, and the verified author is stored in metadata.author_user_id (user_id stays empty so reports do not count comments as agent messages). A client id is used once: re-sending it within 24 hours by the same author for the same contact returns the first row; any other reuse, in any workspace, is 409. Mentioned users who are not current members are dropped. - [Upload an MP4 for sequence video steps](https://developer.channelautomations.com/api/post-api-media-upload-video/index.md) - [Upload image for sequence messages](https://developer.channelautomations.com/api/post-api-media-upload/index.md) — Upload an image file to Cloudflare R2 storage for use in SMS sequences. Supports JPEG, PNG, GIF, and WebP formats up to 10MB. Images are organized by workspace for security and isolation. - [Classify a media URL before attaching it to a sequence step](https://developer.channelautomations.com/api/post-api-media-validate-url/index.md) — Server-side HEAD (5s timeout, at most 3 redirects) with an SSRF guard. Used by the sequence composer to steer YouTube/Vimeo/Loom watch pages into video-link mode instead of attaching them as MMS. - [Map (geocode) a batch of workspace addresses for Nearby — on demand](https://developer.channelautomations.com/api/post-api-nearby-appointments-backfill/index.md) — Admin-only, because each address is a BILLED Google Geocoding call (~$5 per 1,000), charged once per address and then cached forever. There is deliberately no scheduled job; an operator triggers this. Capped at MAX_PER_REQUEST per call so the request finishes inside gateway timeouts — the response reports `remaining` so the caller can simply call again. Idempotent: addresses already mapped, or already known unplaceable, are skipped and never re-billed. - [Enhance Content](https://developer.channelautomations.com/api/post-api-notes-enhance/index.md) — Improve existing content with grammar correction, tone adjustment, style enhancement, or comprehensive improvements. **Note**: This endpoint is deployed on Cloudflare Workers at `https://ai-notes.customerconnects.app` - [Expand Content](https://developer.channelautomations.com/api/post-api-notes-expand/index.md) — Elaborate on brief content by adding details, examples, context, or specific information to make it more comprehensive. **Note**: This endpoint is deployed on Cloudflare Workers at `https://ai-notes.customerconnects.app` - [Generate Content](https://developer.channelautomations.com/api/post-api-notes-generate/index.md) — Generate new content based on a prompt using GPT-4o. Perfect for creating initial drafts, expanding on ideas, or generating content from minimal input. **Note**: This endpoint is deployed on Cloudflare Workers at `https://ai-notes.customerconnects.app` - [Summarize Content](https://developer.channelautomations.com/api/post-api-notes-summarize/index.md) — Create concise summaries of lengthy content. Choose from different summary lengths and formats including bullet points. **Note**: This endpoint is deployed on Cloudflare Workers at `https://ai-notes.customerconnects.app` - [Fire a test webhook for a notification alert rule](https://developer.channelautomations.com/api/post-api-notification-alerts-id-test/index.md) - [Create a notification alert rule](https://developer.channelautomations.com/api/post-api-notification-alerts/index.md) - [Create a new notification](https://developer.channelautomations.com/api/post-api-notifications-workspace-id/index.md) — Create a custom notification for workspace users - [Park a workspace number](https://developer.channelautomations.com/api/post-api-number-rotation-numbers-id-park/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Reactivate a workspace number](https://developer.channelautomations.com/api/post-api-number-rotation-numbers-id-reactivate/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Refresh existing number voice capabilities](https://developer.channelautomations.com/api/post-api-number-rotation-refresh-voice-capabilities/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Test an OAuth connection](https://developer.channelautomations.com/api/post-api-oauth-connections-id-test/index.md) — Attempts to retrieve a valid provider token for the selected workspace connection. - [Create or replace an OAuth connection](https://developer.channelautomations.com/api/post-api-oauth-connections/index.md) — Stores encrypted provider credentials for a workspace. For Lead Perfection, this accepts username/password/clientid/appkey and optionally apiBaseUrl. - [Start an optional Allison Live voice session](https://developer.channelautomations.com/api/post-api-openai-live-session/index.md) - [Test the universal key and sync campaign, dispositions, and numbers](https://developer.channelautomations.com/api/post-api-outbound-iq-connect/index.md) - [Remove the stored Outbound IQ key and turn assignment off](https://developer.channelautomations.com/api/post-api-outbound-iq-disconnect/index.md) - [Activate a paused number in Outbound IQ](https://developer.channelautomations.com/api/post-api-outbound-iq-numbers-e164-activate/index.md) - [Pause a number in Outbound IQ (cool-off)](https://developer.channelautomations.com/api/post-api-outbound-iq-numbers-e164-pause/index.md) - [Request carrier remediation for a number](https://developer.channelautomations.com/api/post-api-outbound-iq-numbers-e164-remediate/index.md) - [Run the Outbound IQ ANI Planner](https://developer.channelautomations.com/api/post-api-outbound-iq-planner/index.md) - [Re-push active Twilio numbers to Outbound IQ](https://developer.channelautomations.com/api/post-api-outbound-iq-sync-now/index.md) - [Create a new pipeline](https://developer.channelautomations.com/api/post-api-pipeline-pipelines/index.md) - [Test Google Address Validation from Flow Builder](https://developer.channelautomations.com/api/post-api-proxy-queue-address-validation/index.md) — Runs a one-off Google Address Validation request through Trigger.dev so the test uses the same server-side environment variables as production workflow execution. - [Schedule an email for delivery](https://developer.channelautomations.com/api/post-api-queue-schedule-email/index.md) — Schedules an email to be sent via the queue service - [Schedule an SMS message for delivery](https://developer.channelautomations.com/api/post-api-queue-schedule-sms/index.md) — Schedules a message to be sent via the queue service - [Send a saved RCS card from the LiveChat composer (Tier 2](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-agent-send-card/index.md) — Sends a registered card template to a contact. Gated by RCS_MESSAGING + workspace_rcs_config and requires the contact be RCS-capable (contacts.rcs_capable=true). Returns sent:false (HTTP 200) when not capable or RCS is unavailable, so the composer can surface a clear message. Authenticated workspace agent (Bearer). - [Send an agent LiveChat text or media reply as RCS](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-agent-send/index.md) — Used by the LiveChat composer to send an agent's text or single image/prepared video RCS-first. Twilio delivers RCS where the device supports it and otherwise falls back to SMS/MMS from the contact's own board number (FallbackFrom), so the conversation stays on one number. A contact not yet confirmed RCS-capable is only attempted when that board number resolves. Gated by RCS_MESSAGING + workspace_rcs_config. Returns sent:false (HTTP 200) with a fallback-safe outcome only when no RCS send was attempted or definitively rejected by the configuration allowlist. Invalid, raw or unverifiable media returns rejected and must never fall back. Media is workspace-owned public storage, at most 5,000,000 bytes including UTF-8 text; videos must be prepared MP4 files at most 600,000 bytes. MMS-only image formats and multiple attachments use the existing MMS path after validation. Requires an authenticated workspace agent (Bearer). - [Send a test RCS message to a workspace's test device (workspace admin)](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-client-test-send/index.md) — Self-serve validation: a workspace admin sends a test RCS to their test device. Because RCS always sends to a contact's own phone (so consent gates + history stay bound to one identity), the device phone is resolved to an EXISTING contact in the workspace — no contact is created (the contacts table has webhook/badge triggers, so auto-create would have side effects). If no contact matches the number, returns sent:false with a clear reason so the admin can add it as a contact first. The send runs the full guardrail chain (RCS_MESSAGING flag, workspace_rcs_config enabled+status, sandbox, DNC, opted_in_sms and configured eligibility tag) via the shared sendRcsTextDirectly path. Non-RCS devices fall back to SMS automatically. - [Create an RCS card from the builder (Tier 3](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-templates-create/index.md) — Builds a Twilio Content Template (twilio/card + twilio/text fallback) from a builder payload and registers it in rcs_content_templates so it appears in the composer picker. Uses the workspace's own Twilio credentials. Enforces RCS card limits (title ≤200, subtitle ≤60, body ≤1600, ≤4 buttons). Authenticated workspace user (Bearer). - [Validate an RCS card payload without creating anything (Flow Builder V2)](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-templates-validate/index.md) — Thin wrapper around the same pure validation used by templates/create — runs every RCS card limit check (title/subtitle/body length, ≤4 buttons, per-type title length, URL/phone format) with NO database write and NO Twilio call, so a card-authoring UI can show inline errors on every keystroke. Authenticated workspace user (Bearer). - [Register an RCS content template for a workspace (platform owner only)](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-templates/index.md) — Stores a reference to a Twilio Content Template (created via the Content API or Console) so it can be reused by id. variable_mapping maps Twilio's numbered placeholders ({{1}}, {{2}}, …) to contact/appointment field paths that are resolved at send time. SaaS platform owner access required. - [Send a test RICH RCS card (platform owner only)](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-test-send-card/index.md) — Sends a Twilio Content Template (rich card / carousel / quick-reply) through the workspace Messaging Service with automatic SMS fallback. Provide either a stored templateId or a raw contentSid. Same gating + consent rules as text RCS (RCS_MESSAGING flag, workspace_rcs_config, sandbox, DNC, opted_in_sms). Always sends to the contact's own phone number. SaaS platform owner access required. - [Send a test RCS text message (platform owner only)](https://developer.channelautomations.com/api/post-api-rcs-workspaces-workspace-id-test-send/index.md) — Sends a text RCS message through the workspace's Twilio Messaging Service with automatic SMS/MMS fallback for non-RCS recipients. Blocked unless the RCS_MESSAGING feature flag and workspace_rcs_config.enabled are both true. Respects sandbox mode, DNC, and opted_in_sms exactly like SMS. SaaS platform owner access required. - [Copy the signed-in member's avatar into the private rep photo bucket](https://developer.channelautomations.com/api/post-api-rep-profiles-me-photo-from-avatar/index.md) — Copies bytes only. The public avatar stays public. A default color avatar has no bytes and returns 400. The response is a storage path. The browser writes that path onto rep_profiles with the user's own session so the change audit records them. - [Replace the signed-in rep's personal link](https://developer.channelautomations.com/api/post-api-rep-profiles-me-public-link-rotate/index.md) — The caller must be eligible for a personal link. The previous code stops working. Returns 503 when REP_PAGE_MINTING_DISABLED is true, or when the link table is not available yet. The new code is not written to the log. - [Unpublish another member's public profile](https://developer.channelautomations.com/api/post-api-rep-profiles-user-id-unpublish/index.md) — Owner or admin only. The role is read from workspace_members, not from the token. The write is rep_profile_admin_unpublish, which can change published to false and nothing else. Idempotent when already unpublished. - [Send a message via Twilio for a workspace](https://developer.channelautomations.com/api/post-api-send-message/index.md) - [Send a SendGrid test email](https://developer.channelautomations.com/api/post-api-sendgrid-send-test-email/index.md) — Sends a one-off test email for the current workspace's active SendGrid configuration. Builder merge fields are not contact-resolved in this test path, but unsubscribe placeholders are converted into a safe test link so raw tokens are not delivered. - [Schedule an SMS for a future time (LiveChat, Allison, sequences)](https://developer.channelautomations.com/api/post-api-trigger-schedule-until/index.md) — Every /api/trigger route (send-sms, schedule-message-wait, schedule-message, schedule-recurring, schedule-delay, schedule-until, cancel-job, job-status) requires EITHER a verified Supabase session (`Authorization: Bearer `) of a current member of `workspaceId` (body; query on GET), OR `X-Internal-Service-Key` equal to the backend's INTERNAL_SERVICE_KEY (backend-to-backend; refused when unset). API keys are refused. cancel-job / job-status also answer 403 for a job of another workspace. - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/post-api-triggers-id-schedule/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/post-api-triggers-process-appointment-booked/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows, contacts and any concrete appointmentId must belong to that workspace; selected contacts also require existing contact visibility. appointmentId remains optional (omitted or null). Service calls require X-Trigger-Secret and X-Workspace-Id; source labels confer no authority. Both caller types pass workspace and resource checks; supplied appointments must belong to the selected contact. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Process time triggers for an authorized contact](https://developer.channelautomations.com/api/post-api-triggers-process-contact/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/post-api-triggers-process-date-distance/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Service calls require X-Trigger-Secret and X-Workspace-Id; source labels confer no authority. Both caller types pass workspace and resource checks; supplied appointments must belong to the selected contact. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Reschedule triggers for an authorized contact](https://developer.channelautomations.com/api/post-api-triggers-reschedule-for-contact/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Send an appointment alert test for the authorized workspace](https://developer.channelautomations.com/api/post-api-triggers-test-appointment-alert/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Process bulk field changes via webhook](https://developer.channelautomations.com/api/post-api-triggers-webhooks-bulk-field-changes/index.md) - [List or create workspace triggers](https://developer.channelautomations.com/api/post-api-triggers/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Add an owned phone number to an approved A2P messaging service](https://developer.channelautomations.com/api/post-api-twilio-add-to-messaging-service/index.md) — Rechecks campaign approval before attachment. This does not assert carrier number registration or delivery readiness. - [Search available US phone numbers](https://developer.channelautomations.com/api/post-api-twilio-available-numbers/index.md) - [Trigger a Twilio credit alert for a workspace](https://developer.channelautomations.com/api/post-api-twilio-credit-alert/index.md) — Internal endpoint used by background SMS senders when Twilio rejects an outbound message for an account credit or suspension issue. - [List messaging services with VERIFIED A2P campaigns for the workspace](https://developer.channelautomations.com/api/post-api-twilio-messaging-services/index.md) — Returns only approved campaigns. Provider lookup failure is an error, not an empty list. - [Buy a phone number and optionally configure SMS and Voice](https://developer.channelautomations.com/api/post-api-twilio-purchase-number/index.md) — A successful purchase returns HTTP 200 even if setup fails. Inspect setupErrors; never retry the purchase to repair setup. SMS uses the existing workspace SMS route; Voice uses the existing Voice provisioning endpoint. - [Release an owned Twilio phone number](https://developer.channelautomations.com/api/post-api-twilio-release-number/index.md) - [Record authenticated message status and delivery-channel evidence](https://developer.channelautomations.com/api/post-api-twilio-workspace-id-status/index.md) — Requires a valid X-Twilio-Signature; shares the primary callback handler and never sends messages. - [Submit a bounded manual batch with a stable retry identity](https://developer.channelautomations.com/api/post-api-unified-workflow-batch-execute-v2/index.md) — Negotiated manual_flow_batch_v1 protocol. Requires verified identity, bound workspace, stored workflow and visible contacts. At most 500 IDs; UUID requestId is mandatory and task keys last 24 hours. This distinct path prevents an older replica ignoring retry IDs. Never fall back to a legacy POST after a v2 refusal or lost response. - [Execute a stored workflow for visible contacts](https://developer.channelautomations.com/api/post-api-unified-workflow-batch-execute/index.md) — Requires verified identity, workspace binding and complete contact visibility validation before dispatch. Released callers may omit requestId and retain legacy single-request and response semantics, including partial-success/manual-duplicate limits. Legacy validation uses 200-row ownership reads and at most 25 visibility checks concurrently; total request latency remains a release gate. Requests with a UUID requestId are limited to 500 contacts and use 24-hour per-contact task keys. New browsers negotiate and use batch-execute-v2; no POST failure is retried through the legacy endpoint. - [Cancel a workflow run in the selected workspace](https://developer.channelautomations.com/api/post-api-unified-workflow-cancel-workflow-task-id/index.md) — Requires a verified current member session or configured backend automation credential. Source labels provide no authority. Resource IDs must belong to the selected workspace; member contact visibility is checked. Inline definitions and database-lookup bypasses are rejected. - [Execute a stored workflow for a visible contact](https://developer.channelautomations.com/api/post-api-unified-workflow-execute-for-contact/index.md) — Requires a verified current member session or configured backend automation credential. Source labels provide no authority. Resource IDs must belong to the selected workspace; member contact visibility is checked. Inline definitions and database-lookup bypasses are rejected. - [Execute a stored workflow](https://developer.channelautomations.com/api/post-api-unified-workflow-execute-workflow/index.md) — Requires a verified current member session or configured backend automation credential. Source labels provide no authority. Resource IDs must belong to the selected workspace; member contact visibility is checked. Inline definitions and database-lookup bypasses are rejected. - [Generate a Voice AI webhook signing secret](https://developer.channelautomations.com/api/post-api-voice-ai-provisioning-workspaces-workspace-id-webhook-secret/index.md) — Generates and stores an encrypted X-Vapi-Secret value for signed Voice AI ingest. SaaS owner access and a verified user session required; no selected workspace membership is needed. - [Estimate who an audience would call, and who it would exclude](https://developer.channelautomations.com/api/post-api-voice-campaigns-audience-preview/index.md) — Runs the saved contact filter and applies the per-contact gates as they stand right now: no usable phone, marked Do Not Call, and outside the contact's own local calling window. An estimate by design — a contact outside its window now becomes dialable later, and the authoritative decision is taken at dial time. - [Freeze the audience and mark the campaign running](https://developer.channelautomations.com/api/post-api-voice-campaigns-campaign-id-start/index.md) — Materializes the audience into the dispatch ledger, marking contacts with no phone or a Do Not Call status as permanently skipped, then sets the campaign running. Places no calls: the scheduled dispatcher applies pacing, capacity and the per-contact calling window, and is the only thing that dials. - [Preview the lead brief supplied before an outbound call](https://developer.channelautomations.com/api/post-api-voice-campaigns-context-preview-contact-id/index.md) — Reads current contact facts without queuing or dialing. Requires contact visibility within the authenticated workspace. - [Record whether a held attempt actually placed a call](https://developer.channelautomations.com/api/post-api-voice-campaigns-held-attempts-attempt-id-resolve/index.md) — Deliberately manual, and audited. `no_call_placed` releases the attempt's daily allowance and returns the contact to the queue — only ever a human decision, because getting it wrong dials someone a second time. `call_placed` requires the exact provider call id read from the voice dashboard, which is exact evidence and rejoins the normal settlement and attribution path. Nothing is inferred from contact identity or a nearby timestamp. - [Add an imported number to an AI caller pool](https://developer.channelautomations.com/api/post-api-voice-campaigns-number-pools-pool-id-numbers/index.md) — Workspace-scoped AI caller pool operation. Does not dial or change provider routing. - [Create a free voice number, attach an agent, and add it to the pool](https://developer.channelautomations.com/api/post-api-voice-campaigns-number-pools-pool-id-provision/index.md) — One action on purpose. A number with no agent to answer callbacks cannot be enrolled, so creating and assigning separately would leave a number the pool refuses. Free numbers are capped per voice account; the account's own message is returned when it declines. Does not dial. - [POST AI outbound number pool configuration](https://developer.channelautomations.com/api/post-api-voice-campaigns-number-pools-refresh/index.md) — Workspace-scoped AI caller pool operation. Does not dial or change provider routing. - [Create an AI caller pool](https://developer.channelautomations.com/api/post-api-voice-campaigns-number-pools/index.md) — Workspace-scoped AI caller pool operation. Does not dial or change provider routing. - [Create a draft AI outbound campaign](https://developer.channelautomations.com/api/post-api-voice-campaigns/index.md) — Supports optional number_pool_id. Caller selection changes are permitted only in draft; other existing campaign fields retain their behavior. This endpoint does not dial. - [Connect a workspace Twilio number to a voice agent](https://developer.channelautomations.com/api/post-api-voice-workspace-numbers-connect/index.md) — Rechecks the preview before importing and assigning. SMS stays disabled in the voice engine and existing SMS routing is checked. Records original routing before first import; uncertain creates are not repeated automatically. Owner/admin required. - [Invite an existing or new teammate](https://developer.channelautomations.com/api/post-api-workspace-members-add-by-email/index.md) — Verified current owner/admin or exact platform admin; new-account credentials are unchanged. - [Create the signed-in user default workspace](https://developer.channelautomations.com/api/post-api-workspace-members-create-default/index.md) — Verified session only; requested user must equal the session subject. Existing membership prevents default creation. - [Send a teammate a password recovery email](https://developer.channelautomations.com/api/post-api-workspace-members-request-recovery/index.md) — Requires current owner/admin authority and matching verified requester identity. Sends only to the target's Auth email using a server-selected redirect. Never changes or returns the existing password, a recovery token, or a recovery link. The retired path /api/workspace-members/reset-password returns 410 and sends nothing. - [Add an existing user to a workspace](https://developer.channelautomations.com/api/post-api-workspace-members/index.md) — Verified current owner/admin or exact platform admin; API keys also require workspace_members write scope. - [Create an AI connector integration key (value shown once)](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-ai-connectors-integration-keys/index.md) — Owners and admins. The key acts as the caller: it stops working if the caller leaves the workspace, loses an allowed role, or becomes folder-restricted. It holds exactly {"mcp":["read"]}, works only with the AI connector (MCP) server and is refused by every REST route. Only its SHA-256 hash is stored (key_full is NULL). Expiry defaults to, and may not exceed, 90 days. The caller must be eligible (current role allowed, not folder-restricted, workspace not cancelled/suspended). - [Preview install-time bindings for an unsaved selection](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-automation-templates-analyze-install-preview/index.md) — Read-only. Re-runs the selection capture on the server and returns the schema v3 binding plan for a destination workspace (slots with destination options, field conflicts, target validation, canInstall). Used by the Create modal's inline install before the template exists. Nothing is written. - [Analyze automation template selection](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-automation-templates-analyze/index.md) — Expands referenced flows and sequences within the source workspace. Returns grouped dependency warnings with affected resources and steps; no data is written. - [Validate a template installation](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-automation-templates-template-id-install-preview/index.md) — Read-only validation of saved dependencies and destination field conflicts. Schema v3 also returns bindings[] (slots plus destination options), unresolvedBindingIds, and canInstall which requires every required slot to be decided. Legacy v1/v2 snapshots keep the prior blocker behavior. Grouped issues include context.locations. - [Install an automation template](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-automation-templates-template-id-install/index.md) — Checks source and destination access, then validates saved dependencies before any destination write. Schema v3 accepts bindings (bind + targetId, or skip) and applies them before remap. Undecided required slots return 409 unresolved_bindings with zero writes. Unresolved legacy dependencies return 409 with details.blockers and details.warnings. Installed sequences are drafts; resource-bundle webhooks are inactive. - [Stop follow-ups for a verified contact appointment](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-contacts-contact-id-stop-sequences-on-appointment/index.md) — Requires the existing API-key/session gate or backend automation credential; public source labels no longer bypass authentication. All workspace selectors must agree. Automation requires an appointment; sessions/API keys may omit it. Any supplied appointment must belong to the URL contact. Existing session/API-key contact access is retained. - [Bulk resolve all unresolved error logs](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-error-logs-resolve-all/index.md) - [Continue a signed Twilio inbound call flow](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-inbound-call-flow-run-id-step/index.md) — Requires a valid Twilio signature and workspace/CallSid-bound run. Menu and Dial callbacks retain existing behavior. A Voice AI step returns the existing authenticated connect TwiML for the selected agent, skipping team hours while retaining inbound enablement, key and concurrency gates. Unavailable agents or lookup failures follow the wired unavailable exit and log agent_fallback. - [Validate and publish an immutable inbound call flow version](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-inbound-call-flows-flow-id-publish/index.md) — Owners and admins only. Existing five step types retain their rules. icf_voice_ai uses config.agentId (UUID or null for the number assignment then workspace default) and requires a wired unavailable exit. Explicit agents must belong to the workspace, be unarchived and set up. Disabled agents produce a warning. Existing graphs perform no additional agent reads. - [Mint a realtime token for the Journey Board Live Activity feed](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-sequences-id-journey-live-token/index.md) — Returns a short-lived, read-only Trigger.dev public access token scoped to the `sequence:` run tag, so the Journey Board can subscribe to live run events for one sequence. Default ON for all workspaces; setting the SEQUENCE_JOURNEY_LIVE_FEED flag to false disables it per workspace. - [Activate built-in Voice AI](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-activate/index.md) — Served by the Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Flag-off workspaces retain the legacy access contract. - [Archive an unused nondefault agent and retain history](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-agents-agent-id-archive/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [Set the default without moving either configuration](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-agents-agent-id-default/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [Duplicate an agent on the server while retaining lookup credentials](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-agents-agent-id-duplicate/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [Create a voice agent and lazily preserve the current workspace agent](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-agents/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [Send context to an active voice call](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-calls-call-sid-context/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Internal callers may instead send X-Voice-Service-Time (Unix milliseconds) and X-Voice-Service-Signature (hex HMAC-SHA256). The signature binds the method, full route including workspace, and JSON body, and expires after 60 seconds. Existing route-specific validation still applies. - [Create a short-lived active-call listening token](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-calls-call-sid-listen-token/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Existing route-specific validation still applies. - [Transfer an active voice call](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-calls-call-sid-transfer/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Internal callers may instead send X-Voice-Service-Time (Unix milliseconds) and X-Voice-Service-Signature (hex HMAC-SHA256). The signature binds the method, full route including workspace, and JSON body, and expires after 60 seconds. Existing route-specific validation still applies. - [Configure a phone number voice webhook](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-configure-phone-webhook/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Existing route-specific validation still applies. - [Look up customer context for a voice preview](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-lookup-customer/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Existing route-specific validation still applies. - [Look up knowledge for a voice preview](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-lookup-knowledge/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Existing route-specific validation still applies. - [Start a built-in Voice AI outbound call](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-outbound-call/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Internal callers may instead send X-Voice-Service-Time (Unix milliseconds) and X-Voice-Service-Signature (hex HMAC-SHA256). The signature binds the method, full route including workspace, and JSON body, and expires after 60 seconds. Every non-queue dial checks outbound enablement, workspace DNC/suppressions, phone opt-out and contact-local calling hours before the dial-cap claim or Twilio. Refusals return 409 refused_compliance; flow callers skip the step. AI queue calls keep their existing SQL compliance gate. Workspace lease capacity applies to both paths; the outbound share defaults to 70 percent and preserves at least one inbound slot when the total is two or more. - [Create a built-in Voice AI WebRTC preview session](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-preview-realtime-session/index.md) — Served by the Voice API. Requires a Bearer session for a workspace owner/admin/manager when the V2 flag is enabled. Accepts unsaved turn settings when opted in. Uses automatic WebRTC response control rather than phone bridge control. Returns a short-lived client secret; never log or cache the response. include_api_tools=true additionally requires an owner/admin Bearer JWT and both VOICE_AI_API_TOOLS and VOICE_AI_TELEPHONY_TURN_CONTROL_V2. It advertises enabled saved tools and returns tool_preview.ticket plus names; the signed binding expires after 15 minutes and authorizes real API test actions. - [Generate a voice preview](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-preview-tts/index.md) — Served by the standalone Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Legacy flag-off access is preserved. Existing route-specific validation still applies. - [Test a saved Voice AI API tool](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-tools-tool-id-test/index.md) — Shared workspace limit is two active requests and ten starts per minute across all server instances. Served by the separate Voice API. Requires verified workspace owner/admin membership and VOICE_AI_API_TOOLS enabled. Credentials never appear in responses. - [Create a Voice AI API tool](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-ai-tools/index.md) — Served by the separate Voice API. Requires verified workspace owner/admin membership and VOICE_AI_API_TOOLS enabled. Credentials never appear in responses. - [Record a signed destination-leg handoff acknowledgement](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-handoffs-attempt-id-kind/index.md) — Internal carrier callback. Requires a valid account signature and an exact saved workspace, account, attempt and parent/child call binding. A destination answer does not identify a human. - [Record carrier status and release ended Voice AI call capacity](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice-status/index.md) — Terminal parent-call receipts with a valid Twilio signature release the workspace lease and any provisional voiceLease. Child calls, recording-only events and unsigned receipts cannot release capacity. Existing status and recording processing is preserved. - [Route a Twilio voice call to the configured workspace destination](https://developer.channelautomations.com/api/post-api-workspaces-workspace-id-voice/index.md) — Twilio form webhook. Workspaces with VOICE_AI_TELEPHONY_TURN_CONTROL_V2 require X-Twilio-Signature validation before call routing; the new AI path emits a short-lived signed stream permission. Uses the exact public webhook URL including query parameters. New outbound callbacks with voiceLease also require the Twilio signature and bind the pre-dial capacity lease atomically. Legacy inbound routing is unchanged. - [Poll Lead Perfection workspaces for latest call results](https://developer.channelautomations.com/api/post-internal-triggers-leadperfection-process-due/index.md) — Internal endpoint called by Supabase pg_cron via pg_net. Pulls all selected Lead Perfection activity, directly enforces DNC on contacts, and resumes a separate full-history DNC reconciliation from saved progress. - [Dispatch a settled built-in Voice AI call (x-internal-secret required).](https://developer.channelautomations.com/api/post-internal-triggers-voice-ai-call-ended/index.md) - [Submit agent workspace questionnaire answers](https://developer.channelautomations.com/api/post-research-agent-workspace/index.md) — Public, unauthenticated submission endpoint for the UX research questionnaire. Stores answers, respondent info, workflow-posture tallies, and link/query-param tracking metadata in ux_research_survey_responses. Includes honeypot spam filtering and per-IP throttling. - [Submit Monday-wish answer](https://developer.channelautomations.com/api/post-research-monday-wish/index.md) — Public, unauthenticated submission for the weekend one-wish pulse. Stores the free-text answer and respondent info in ux_research_survey_responses under survey_key monday-wish-2026-09. - [Test inbound Twilio SMS orchestration](https://developer.channelautomations.com/api/post-test-twilio-workspace-id/index.md) — Internal test endpoint that exercises the shared inbound Twilio orchestrator without provider signature validation. - [Record authenticated message status and delivery-channel evidence](https://developer.channelautomations.com/api/post-twilio-workspace-id-status/index.md) — Requires a valid X-Twilio-Signature. Terminal channel evidence is retained even before the message row exists. This endpoint never sends a message. - [Receive inbound Twilio SMS for a workspace](https://developer.channelautomations.com/api/post-twilio-workspace-id/index.md) — Twilio-facing inbound SMS webhook that resolves the workspace from the URL, persists the inbound message, and starts downstream inbound processing. - [Receive a configured inbound webhook](https://developer.channelautomations.com/api/post-webhooks-webhook-id/index.md) — Applies saved field mappings to the contact. Call Disposition (call_disposition_code) and Call Outcome (call_outcome) require a mapped Call ID (call_id). Call Outcome accepts a workspace-defined key and derives its standard disposition. Both the disposition column and structured-output mirror are saved. Agent-entered outcomes are preserved. Invalid inputs return 400, workspace mismatches return 403, and ambiguous call identifiers return 409. - [Set customer AI connector permissions for one workspace](https://developer.channelautomations.com/api/put-api-admin-mcp-access-workspace-id/index.md) — Platform admins only. Creates or updates the workspace's mcp_workspace_access row with the fields sent (others keep their stored value or column default). AI Connectors are available automatically; availability switches are refused. allowed_roles must be a subset of owner, admin, manager, agent. Quotas are whole numbers within quota_limits. `writes_enabled` lets the workspace's eligible members confirm changes proposed by the AI (Phase 5): turning it ON is platform-owner only (403 OWNER_ROLE_REQUIRED for an admin); any platform admin may turn it off. 503 MCP_WRITES_NOT_SET_UP when it is sent before migration 20261005f. Workspace owners can never set it. Written with the service-role client; the admin log records the server-built before/after values. - [Atomically replace a staff MCP key's workspace grants](https://developer.channelautomations.com/api/put-api-admin-mcp-permissions-keys-key-id-workspaces/index.md) — Platform admins may assign read grants; write grants and any replacement on a global-write key require a platform owner. Replacement is transactional; failure preserves the previous grants and read overrides. Requires the atomic-grant migration; no non-atomic fallback. - [Change an existing member auto-assignment preference](https://developer.channelautomations.com/api/put-api-agent-tags-workspace-workspace-id-agent-user-id-auto-assign-enabled/index.md) — Verified member for self, current manager or owner/admin for the workspace, or verified platform administrator. Never creates a membership. - [Update a team's metadata, members, and/or rule](https://developer.channelautomations.com/api/put-api-agent-teams-team-id/index.md) - [Bulk update team priorities (drag-to-reorder)](https://developer.channelautomations.com/api/put-api-agent-teams-workspace-workspace-id-reorder/index.md) - [Update a saved query](https://developer.channelautomations.com/api/put-api-analytics-saved-queries-id/index.md) - [Save Voice AI final funnel stage mapping](https://developer.channelautomations.com/api/put-api-analytics-voice-ai-raw-dashboard-funnel-stage-mapping/index.md) — Stores workspace-specific mappings from CRM lead-status or appointment status/result values to standard Voice AI final funnel stages. - [Update an API key](https://developer.channelautomations.com/api/put-api-api-keys-id/index.md) — Requires a verified session and current workspace membership; metadata roles never authorize key access. Existing key ownership and operation checks remain in force. Refuses (400 USE_AI_CONNECTORS_SETTINGS) adding "mcp" to a key; an existing AI connector key may only be renamed or deactivated here (no permission, expiry or re-activation change). - [Update (reschedule) a contact's appointment](https://developer.channelautomations.com/api/put-api-appointments/index.md) — Finds the contact by `contact_id` or `phone_number`, then updates their appointment to the new date/time. Both the `appointments` table row (source of truth — calendar links regenerate automatically) and the contact's `appointment_date`, `appointment_time`, and `appointment_date_display` columns are updated together, so the contact record always matches the appointment. **Which appointment is updated:** the contact's next upcoming appointment; if none is upcoming, their most recent one. If the contact has no appointments at all, a new one is created (`created_new_appointment: true` in the response). Unlike POST, this endpoint does NOT fire "Appointment Booked" flow triggers or stop sequences — safe to call from a flow's Run API Request action without causing trigger loops. It also never creates a contact: an unknown identifier returns 404. **Required fields:** `adate`, `atime`, and one of `contact_id` / `phone_number`. **Timezone resolution priority (to convert `adate`+`atime` to UTC):** 1. Caller-provided `timezone` (IANA name or abbreviation like "PST") 2. Contact's `timezone` column 3. Phone area code → IANA timezone (US numbers) 4. Caller-provided `adate_utc` (used as-is) 5. UTC (last resort) - [Update calendar event by ID (Admin)](https://developer.channelautomations.com/api/put-api-calendar-events-id/index.md) — Update an existing calendar event by its ID. Requires admin authentication. - [Save a workspace representative visit profile](https://developer.channelautomations.com/api/put-api-call-center-visit-profiles-user-id/index.md) — Requires a verified session, current workspace membership. Contact actions enforce visibility; visit configuration requires manager access. - [Save the queue AI worker and optional Voice AI agent](https://developer.channelautomations.com/api/put-api-call-queues-queue-id-ai-worker/index.md) — Agent must be a set-up, enabled voice profile in this workspace. Null uses the default. Turning on the worker clears its pause reason. - [Save the human-agent call wrap-up disposition](https://developer.channelautomations.com/api/put-api-calls-call-sid-disposition/index.md) — Sets call_logs.call_disposition for the matching call_sid (workspace-scoped) and mirrors the value into structured_outputs.call_disposition so the unified_calls view + Voice AI Human Agent dashboard surface it without a view change. Vocabulary aligns with vapi_call_records.call_disposition (APPOINTMENT_SET, CALLBACK_SCHEDULED, VOICEMAIL_LEFT, NO_ANSWER, NOT_INTERESTED, DO_NOT_CALL_HONORED, ...). - [Save a wrap-up disposition for a call that produced no CallSid](https://developer.channelautomations.com/api/put-api-calls-contact-contact-id-disposition/index.md) — Outbound calls that are never answered (no-answer, busy, carrier reject) never fire the Twilio SDK's accept event, so the browser never learns their CallSid and cannot use PUT /api/calls/{callSid}/disposition. The call_logs row still exists — the voice webhook writes it at dial time — so this route addresses it by (workspace, contact, agent, recency) instead. Only fills a row whose disposition is still empty; never overwrites. - [Update a custom field definition](https://developer.channelautomations.com/api/put-api-custom-fields-id/index.md) — Updates editable custom field definition settings, including the display label, field type, options, and workspace-level default value. - [Set a workspace-level feature flag](https://developer.channelautomations.com/api/put-api-feature-flag-admin-workspaces-workspace-id-flags-flag-name/index.md) — Turns a feature flag on or off for the whole workspace. SaaS platform owners only. CRM_CORE is reserved and rejected with code RESERVED_FEATURE_FLAG. - [Set a per-user feature flag override](https://developer.channelautomations.com/api/put-api-feature-flag-admin-workspaces-workspace-id-users-user-id-flags-flag-name/index.md) — Creates or updates a per-user override. An override wins over the workspace flag in either direction — enable a feature for one user while the workspace is off (pilot), or opt one user out of a workspace-wide feature. SaaS platform owners only. CRM_CORE is reserved and rejected with code RESERVED_FEATURE_FLAG. - [Assign or unassign a Sales Coach visit](https://developer.channelautomations.com/api/put-api-field-sales-appointments-id-assignment/index.md) - [Save the workspace's Sales Coach arrival alert settings](https://developer.channelautomations.com/api/put-api-field-sales-arrival-alert-settings/index.md) — Owners and admins only. Invalid addresses are dropped; at most 25 recipients. - [Save the workspace's auto-analyze rules](https://developer.channelautomations.com/api/put-api-field-sales-auto-analyze-settings/index.md) — Owners and admins only (managers can view). Enabling means recorded calls in this workspace are transcribed and scored automatically under the workspace's own AI key, within the duration floor, sample rate, and daily cap saved here. - [Turn the confirmation text on or off and set its wording (owners and admins). Body { enabled, message_template }; {company}, {place}, {first_name}; must mention STOP.](https://developer.channelautomations.com/api/put-api-field-sales-compliance-optin-settings/index.md) - [Record or update one person's credential. Body { user_id, type_id, number, issued_on, expires_on (YYYY-MM-DD; none = does not expire), note }. 409 not_eligible / archived.](https://developer.channelautomations.com/api/put-api-field-sales-credentials-people/index.md) - [Save one field role's settings and replace its people](https://developer.channelautomations.com/api/put-api-field-sales-field-roles-key/index.md) - [Save the workspace's rep intro video settings](https://developer.channelautomations.com/api/put-api-field-sales-intro-settings/index.md) — Owners and admins. Templates may only use the allowed fields and must contain STOP. Turning intros off cancels every intro not yet sent. - [Publish a new scorecard version](https://developer.channelautomations.com/api/put-api-field-sales-scorecard/index.md) — Owner/admin only. Publishing never edits an existing version — it creates the next immutable one. Conversations analyzed afterwards (including reprocesses) are graded against it; historical scores keep the version that graded them, and team averages never blend versions. - [Replace who works a shift (user_ids)](https://developer.channelautomations.com/api/put-api-field-sales-shifts-id-assignments/index.md) - [Update integration configuration](https://developer.channelautomations.com/api/put-api-integrations-integration-id-update/index.md) - [Save the workspace's Add Call History defaults](https://developer.channelautomations.com/api/put-api-integrations-leadperfection-call-history-defaults/index.md) — Stores the four Lead Perfection codes used when writing call history. Values are LP codes, not labels. - [Update a training example](https://developer.channelautomations.com/api/put-api-knowledge-studio-examples-example-id/index.md) - [Update a knowledge source and rebuild its chunks](https://developer.channelautomations.com/api/put-api-knowledge-studio-sources-source-id/index.md) - [Update a notification alert rule](https://developer.channelautomations.com/api/put-api-notification-alerts-id/index.md) - [Update notification](https://developer.channelautomations.com/api/put-api-notifications-workspace-id-notification-id/index.md) — Update an existing notification - [Save a workspace board number box](https://developer.channelautomations.com/api/put-api-number-rotation-board-board-id-box/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Save workspace rotation configuration](https://developer.channelautomations.com/api/put-api-number-rotation-config/index.md) — Current workspace membership is required. Header, query and body workspace selectors must agree. Matching header-only callers remain supported; membership roles are unchanged. - [Update Outbound IQ operator settings](https://developer.channelautomations.com/api/put-api-outbound-iq-settings/index.md) - [Update a pipeline](https://developer.channelautomations.com/api/put-api-pipeline-pipelines-id/index.md) - [Save RCS configuration self-serve (workspace admin)](https://developer.channelautomations.com/api/put-api-rcs-workspaces-workspace-id-client-config/index.md) — Lets a workspace admin enter their own Twilio RCS details (Messaging Service SID, RCS sender ID, SMS fallback number, test device) once the RCS_MESSAGING feature flag is enabled for the workspace. Self-serve go-live: on save the row is upserted with enabled=true and status='test' (status='approved' is preserved if already set), so RCS starts sending immediately without a platform-owner step. Blocked (403) if the feature flag is off — a workspace cannot self-configure RCS it hasn't been granted. The write uses the service role after the admin check; no Twilio auth tokens are stored here. - [Update a registered RCS card in place (Flow Builder V2 "Update card")](https://developer.channelautomations.com/api/put-api-rcs-workspaces-workspace-id-templates-template-id/index.md) — Creates a NEW Twilio Content Template (Content Templates are immutable — every create mints a fresh content_sid) but UPDATEs the existing rcs_content_templates ROW in place rather than inserting a new one, so a flow node's stored templateId stays stable across edits even though the underlying content_sid churns. Same validation/limits as templates/create. Authenticated workspace user (Bearer). - [Manage a trigger or its scheduled reminders](https://developer.channelautomations.com/api/put-api-triggers-id/index.md) — Interactive requests require current membership; supplied workspace selectors must agree. Referenced triggers, flows and contacts must belong to that workspace; selected contacts also require existing contact visibility. Any supplied resource ID must be a hyphenated UUID string on the signed-in path. - [Choose which roles may use AI connectors](https://developer.channelautomations.com/api/put-api-workspaces-workspace-id-ai-connectors-access/index.md) — Workspace owner only. Changes allowed_roles (a subset of owner, admin, manager, agent). AI Connectors are available automatically for existing and new workspaces. Confirmed changes and usage limits remain platform-controlled. A missing settings row uses default permissions. - [Save only changed agent keys with revision compare and swap](https://developer.channelautomations.com/api/put-api-workspaces-workspace-id-voice-ai-agents-agent-id/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [Save built-in Voice AI configuration](https://developer.channelautomations.com/api/put-api-workspaces-workspace-id-voice-ai-config/index.md) — Served by the Voice API. Requires a Bearer session for a workspace owner/admin/manager when VOICE_AI_TELEPHONY_TURN_CONTROL_V2 is enabled. Optional turn settings are validated for opted-in workspaces; flag-off workspaces retain existing turn behavior. Other existing configuration properties are accepted by this endpoint. - [Assign or clear the inbound voice agent for an owned number](https://developer.channelautomations.com/api/put-api-workspaces-workspace-id-voice-ai-numbers-phone/index.md) — Does not redirect the number or change Twilio settings. Consumer readiness is required before assigning. Clears use null and preserve default routing. Takes effect within the five-second runtime memo window. - [Patch shared keys without modifying any agent script](https://developer.channelautomations.com/api/put-api-workspaces-workspace-id-voice-ai-settings-shared/index.md) — Requires workspace owner, admin or manager. No page-load initialization. Creation requires capability version 1 from voice_service, ingest_worker and trigger. - [Update a Voice AI API tool](https://developer.channelautomations.com/api/put-api-workspaces-workspace-id-voice-ai-tools-tool-id/index.md) — Served by the separate Voice API. Requires verified workspace owner/admin membership and VOICE_AI_API_TOOLS enabled. Credentials never appear in responses. ## Sections - [Send Sms](https://developer.channelautomations.com/api/send-sms/llms.txt) - [Tags](https://developer.channelautomations.com/api/tags/llms.txt) - [Twilio](https://developer.channelautomations.com/api/twilio/llms.txt)