# SkipCalls Public API ## API Docs - users [Get current user profile](https://e6m95bh5sn.apidog.io/get-current-user-profile-40627607e0.md): - users [Sync contacts from mobile device](https://e6m95bh5sn.apidog.io/sync-contacts-from-mobile-device-40627608e0.md): Bulk upsert of contacts from the device address book, keyed on `userId + phoneNumber`. Existing contacts are updated with the most recent values, new ones are created. Rows missing `phoneNumber` or missing BOTH `firstName` AND `companyName` are silently skipped and counted. Phone numbers are normalized (strips `()`, `-`, spaces) so formatting variations don't create duplicates. Does NOT emit timeline activity — this is a silent sync. - users [Delete all contacts](https://e6m95bh5sn.apidog.io/delete-all-contacts-40627609e0.md): When `id` query param is provided, deletes only that contact. When omitted, deletes ALL of the user's contacts and requires request body `{"confirmation":"delete all"}`. The cleanup runs in one transaction: contact-only rows are removed, and calls/SMS/tasks/follow-ups/appointments are retained with `contactId` cleared. - users [Get all contacts](https://e6m95bh5sn.apidog.io/get-all-contacts-40627610e0.md): Paginated list of non-deleted contacts with per-contact stats (call counts, last interaction date) and aggregations (unique company count + list). `sort` accepts `lastInteraction`, `created`, or `name` — invalid values silently fall back to `created`. Sorting by `lastInteraction` is indexed but can get slow above ~10k contacts; prefer `created` for the default list view. - users [Update contact](https://e6m95bh5sn.apidog.io/update-contact-40627611e0.md): Partial update of a single contact's fields: name, email, company, avatar, tags, `isFavorite`, `lifecycleStage`, `doNotCall`, `doNotSms`. Changing `phoneNumber` resets the contact's identity key — avoid unless intentional. `doNotCall` and `doNotSms` act as outbound suppression flags; enforcement happens at send time, not in this endpoint. - users [Get a single contact with stats](https://e6m95bh5sn.apidog.io/get-a-single-contact-with-stats-40627612e0.md): Returns contact details enriched with totalIncomingCalls, totalOutboundCalls, totalSmsMessages, lastCallDate, upcomingAppointments - users [Find duplicate contacts](https://e6m95bh5sn.apidog.io/find-duplicate-contacts-40627613e0.md): Returns candidate duplicate pairs grouped by either phone (last 10 digits of the normalized number match) or name (fuzzy similarity > 0.8, Levenshtein-like). Each group carries a `matchType` and a `confidence` hint. Run this after large imports before calling `/merge` — phone matches are high-confidence, name matches produce false positives for common names and should always be reviewed by a human. - users [Merge two duplicate contacts](https://e6m95bh5sn.apidog.io/merge-two-duplicate-contacts-40627614e0.md): Keeps the primary contact and reassigns all linked records (calls, SMS, notes, tasks, appointments) from secondary to primary, then soft-deletes the secondary. Field conflicts are resolved by `mergedData` — whatever you pass wins, so the client must decide ahead of time which values to keep. Irreversible: the secondary's `deletedAt` is set, history is preserved under the primary. - users [Search contacts](https://e6m95bh5sn.apidog.io/search-contacts-40627615e0.md): Full-text, typo-tolerant search across name, phone, company, and tags. Results are ranked by similarity then recency. If the query contains digits, also matches against the normalized (digits-only, last 10) phone so `555-123` and `(555) 123` find the same contact. With `injectCalls=true`, recent matching calls are returned as synthetic contacts (source `WEB`, max 5) — useful for surfacing numbers that aren't saved yet. - users [Import contacts from CSV or JSON file](https://e6m95bh5sn.apidog.io/import-contacts-from-csv-or-json-file-40627616e0.md): Bulk import from arbitrary CSV or JSON. An AI pass reads the first 10 lines / 500 chars and auto-maps unknown column names to canonical contact fields (`firstName`, `lastName`, `phoneNumber`, `email`, `address`, `companyName`, `notes`, `tags`). If mapping fails, sensible defaults are used. Rows missing a valid phone, or missing BOTH `firstName` and `companyName`, are rejected with per-row errors; valid rows merge by phone rather than creating duplicates. Comma-separated tag strings are split into arrays. - users [Get tag statistics for autocomplete](https://e6m95bh5sn.apidog.io/get-tag-statistics-for-autocomplete-40627617e0.md): Returns all tags used across the user's contacts with occurrence counts, sorted by count DESC. Feeds frontend tag autocomplete and tag-cloud widgets. Only contacts with non-empty `tags` arrays contribute — newly-invented tags that aren't yet assigned to any contact won't appear. Tag matching is case-sensitive, so "VIP" and "vip" count as separate tags. - users [Advanced search in contacts by name, company, and tags](https://e6m95bh5sn.apidog.io/advanced-search-in-contacts-by-name-company-and-tags-40627618e0.md): Multi-criteria filter with AND between groups and OR within a group: `name` is split on spaces and matched against `firstName`/`lastName`/`companyName` (and `phoneNumber` if it contains digits, with phone normalization), `companies` matches any in the array, `tags` matches any in the array. Supports custom `sortBy` and `sortOrder`. Tag filtering is case-sensitive — keep tag naming consistent across the app. Combining many filters narrows results aggressively. - users [List notes for a customer (newest first)](https://e6m95bh5sn.apidog.io/list-notes-for-a-customer-newest-first-40627619e0.md): Returns all notes attached to the contact, ordered by `createdAt DESC`. Notes are user-scoped by default: team members only see their own notes unless `isPublic: true` was set when the note was created (team accounts feature). Use this for a dedicated notes tab; the same notes also appear in the contact timeline. - users [Add a note to a customer](https://e6m95bh5sn.apidog.io/add-a-note-to-a-customer-40627620e0.md): Attaches a free-text note to the contact and records the activity in its timeline. `isPublic` controls team visibility — defaults to private (visible only to the author). Notes are a human-authored layer separate from AI-generated summaries: keep them for context that the agent can't infer from transcripts (deal notes, manual follow-ups, offline context). - users [Get unified timeline for a customer](https://e6m95bh5sn.apidog.io/get-unified-timeline-for-a-customer-40627621e0.md): Paginated, unified activity feed — inbound/outbound calls, SMS, notes, tasks, appointments, file uploads, custom field changes — sorted newest-first. This endpoint is read-only; to create activity, hit the specific endpoints (`/notes`, `/schedule-call`, `/send-sms`, etc.) and the timeline entry is written automatically. Aggregation is capped at ~1000 activities per contact; use `limit`/`offset` pagination for very active contacts to avoid slow loads. - users [Update a customer note](https://e6m95bh5sn.apidog.io/update-a-customer-note-40627622e0.md): Updates note content and/or toggles the `isPublic` flag. The note ID is scoped to the caller's user ID and the current contact, so you can't edit someone else's note or a note from another customer. - users [Delete a customer note](https://e6m95bh5sn.apidog.io/delete-a-customer-note-40627623e0.md): Removes a note from the contact. The timeline entry for the note remains unless separately removed. - users [Update custom fields on a customer](https://e6m95bh5sn.apidog.io/update-custom-fields-on-a-customer-40627624e0.md): Sets values for one or more user-defined custom fields on a contact. Each key must match an existing custom field definition — unknown keys are silently ignored. Values are validated against the field's type and (for `SELECT`/`MULTI_SELECT`) its options. Passing `null` clears the field; clearing a field marked `isRequired` returns a validation error. The change is recorded on the contact timeline. - Calendars [List booked appointments](https://e6m95bh5sn.apidog.io/list-booked-appointments-40627625e0.md): Returns appointments booked via calls or imported from connected calendars (Google, Outlook, Calendly, Square, Cal.com, GHL). Supports pagination (1-indexed `page`, max 100 per page — different from the 0-indexed offset used by `/calls`), plus filters by `period` ('upcoming' | 'past' | 'all'), `agentId`, `calendarId`, and free-text `search` across phone/email/title. Appointments only appear if at least one calendar is connected and enabled. - Calendars [Get upcoming appointments for widget](https://e6m95bh5sn.apidog.io/get-upcoming-appointments-for-widget-40627626e0.md): Lightweight endpoint for dashboard/widget UIs — returns the next N confirmed appointments sorted by `startTime` ascending (nearest first), default limit 5. Tentative appointments are excluded. Use `/calendars/appointments` with `period='upcoming'` when you need full pagination, filtering, or the unabridged appointment payload. - Calendars [Get appointment statistics](https://e6m95bh5sn.apidog.io/get-appointment-statistics-40627627e0.md): Returns count buckets for dashboard summary cards: total `upcoming`, `thisWeek`, `thisMonth`, and all-time `total`. "This week" and "this month" are relative to today in the user's timezone. Aggregates across every connected calendar provider (Google, Outlook, Calendly, Square, Cal.com, GHL) — no way to scope to a single calendar from this endpoint. - Calendars [Get a single appointment](https://e6m95bh5sn.apidog.io/get-a-single-appointment-40627628e0.md): Returns the full appointment record including the external calendar event URL (`externalEventUrl` — deep link to Google Calendar, Calendly, etc.), the creating call reference (`callId` + `callDetailsUrl`), and whether it came from an inbound or outbound call (`isIncoming`). Useful for building detail views after `/calendars/appointments` or `/calendars/appointments/upcoming`. - Calendars [Hide/delete an appointment from the list](https://e6m95bh5sn.apidog.io/hidedelete-an-appointment-from-the-list-40627629e0.md): Soft-deletes the appointment from SkipCalls only. The event REMAINS in the external calendar provider (Google, Outlook, Calendly, Square, Cal.com, GHL) — this endpoint does NOT cancel the booking with the customer. To fully cancel, also delete the event from the provider UI or via the `cancel_event` LLM tool during a call. There is no restore endpoint. - calls [Transcribe audio (for chat)](https://e6m95bh5sn.apidog.io/transcribe-audio-for-chat-40627630e0.md): Converts base64-encoded audio into text. Used for voice input in the chat UI so users can speak instead of typing. Accepts common formats (webm, mp3, wav, m4a, ogg). Audio must be a base64 data URL. Not intended for call transcription — call transcripts are generated automatically during the call lifecycle. - calls [Schedule a new call](https://e6m95bh5sn.apidog.io/schedule-a-new-call-40627631e0.md): Queues an outbound call. Creates the record in QUEUED status (or NOT_STARTED if scheduled for a future time). Runs validation: phone format and country checks (rejects VOIP/premium/shared-cost numbers for US/CA), destination-country restriction (your phone numbers must match the destination country), rate limits, balance check against `maxDurationMinutes`, and a content safety review. If the goal is ambiguous, the response may be `NEEDS_CLARIFICATION` with a follow-up question instead of a scheduled call — set `force: true` to skip clarification. - calls [Cancel a scheduled call by ID](https://e6m95bh5sn.apidog.io/cancel-a-scheduled-call-by-id-40627632e0.md): Transitions a call from NOT_STARTED or QUEUED to CANCELLED. The record is retained for history and analytics. Only not-yet-started calls can be cancelled here — for IN_PROGRESS calls use `POST /calls/:id/drop`, and for finished calls use `DELETE /calls/:id/full`. Reserved minutes are released back to the user's balance. - calls [Get call details](https://e6m95bh5sn.apidog.io/get-call-details-40627633e0.md): Returns the full call record with all relations loaded: transactions (billing), agent, voicemails, dataCollections, evaluations, tasks, analysis, followUps, plus computed fields `isFavorite`, `shareHash`, and a plain-text `transcription` rendered from `roleplayTranscript`. For in-progress calls some fields (finalSummary, minutesUsed) may be partial. - calls [Copy a call](https://e6m95bh5sn.apidog.io/copy-a-call-40627634e0.md): Duplicates an existing call for a retry with optional overrides (new `scheduledAt`, different `phoneNumber`, revised goal/context). The new call's `copyOfCallId` points to the source, forming a retry chain. `cronSchedule` is intentionally NOT copied to prevent runaway recurring retries. Runs the same validation as `/schedule`, so a copy can still be denied. Primarily used when a call failed or the customer was unavailable. - calls [Get call history](https://e6m95bh5sn.apidog.io/get-call-history-40627635e0.md): Lists outbound calls for the current user with status/date/phone filters, pagination, and aggregated stats (totals by status, minutes used). When `raw=true` the response is a plain array without stats. `transcription` is rendered on-the-fly from `roleplayTranscript` and may be empty for in-progress calls. Use `favorites=true` to filter to pinned calls only. - calls [Search calls](https://e6m95bh5sn.apidog.io/search-calls-40627636e0.md): Full-text search across BOTH outbound and incoming calls in one query. Matches against transcripts, finalSummary, title, phoneNumber/phoneNumberFrom, goal, and callerName (case-insensitive). Results carry a `callType: 'outgoing' | 'incoming'` discriminator plus `matchedFields` showing which columns hit. For outbound-only results use `/calls/search/outgoing`; for incoming-only use `/incoming-calls/search`. Soft-deleted calls are excluded. - calls [Search outgoing calls only](https://e6m95bh5sn.apidog.io/search-outgoing-calls-only-40627637e0.md): Same search semantics as `/calls/search` but scoped to outbound calls — faster because it skips the incoming-calls merge step. Matches transcripts, summaries, titles, goals, and phone numbers case-insensitively, returning `matchedFields` for each result. Use this when you know you only care about outbound history (e.g., a campaign follow-up list). - calls [Rate a call](https://e6m95bh5sn.apidog.io/rate-a-call-40627638e0.md): Records a thumbs-up/thumbs-down rating plus optional comment on a completed call. Set `isIncomingCall=true` to rate an inbound call instead of outbound. A call can only be rated once — a second call returns 400. Ratings are generally only meaningful for SUCCESS/FAILED calls; rating an in-progress call is allowed but discouraged. - calls [Drop a call immediately by ID](https://e6m95bh5sn.apidog.io/drop-a-call-immediately-by-id-40627639e0.md): Best-effort termination of an IN_PROGRESS or AWAITING_CONNECTION call. The endpoint returns success even if the call is already ending. Minutes consumed up to the drop are billed, and the call is finalized with status FAILED and reason DROPPED_BY_USER. No-op if the call is already finished. - calls [Add call to favorites](https://e6m95bh5sn.apidog.io/add-call-to-favorites-40627640e0.md): Pins an outbound call for quick access via the `favorites=true` filter on history/search. A second call returns 400 — check `isFavorite` first or catch the error. Favoriting does not affect call behavior, retention, or billing; it is purely a UI concern. - calls [Remove call from favorites](https://e6m95bh5sn.apidog.io/remove-call-from-favorites-40627641e0.md): Unpins an outbound call. Returns 400 if the call was not previously favorited — check `isFavorite` first if you want idempotent behavior. Does not modify the call record itself. - calls [Update call notes](https://e6m95bh5sn.apidog.io/update-call-notes-40627642e0.md): Attaches or replaces free-form plain-text notes on a call — pass `isIncomingCall=true` to target an inbound call instead. Typically used to record follow-up actions, context the agent missed, or personal observations after reviewing the transcript. Can be called on both in-progress and completed calls; there is no formatting support (plain text only). - incoming-calls [Get incoming call history](https://e6m95bh5sn.apidog.io/get-incoming-call-history-40627643e0.md): Lists inbound calls received on the user's agent numbers with status/date/phone filters and pagination. Unlike outbound calls, inbound calls only appear here once their status is FINISHED or PROCESSED (they go IN_PROGRESS → FINISHED → PROCESSED). Soft-deleted/hidden calls are excluded. Use `hideTrashCalls=true` to exclude spam and calls that ended immediately after the greeting before pagination and totals are calculated. Use `favorites=true` for pinned calls only, `raw=true` to skip the stats block. Each call still consumes minutes from the user's subscription balance. - incoming-calls [Search incoming calls only](https://e6m95bh5sn.apidog.io/search-incoming-calls-only-40627644e0.md): Full-text search scoped to inbound calls — matches caller name, phone number, transcript, summary, and title case-insensitively. Faster than `/calls/search` which also scans outbound calls. Returns `matchedFields` per result showing which columns hit the query. Soft-deleted calls are excluded. - incoming-calls [Get incoming call details](https://e6m95bh5sn.apidog.io/get-incoming-call-details-40627645e0.md): Returns the full inbound call record with all relations: transcript, finalSummary, agent config used, `dataCollections` (structured data extracted by the AI), `followUps` and `tasks` created during the call (both filtered to non-deleted and sorted newest first). If the call is still IN_PROGRESS some fields may be partial. - incoming-calls [Delete an incoming call](https://e6m95bh5sn.apidog.io/delete-an-incoming-call-40627646e0.md): Soft-deletes an inbound call by setting `deletedAt`, hiding it from history and search. The record stays in the DB for analytics and audit; there is no restore endpoint. Does not affect transactions/billing or delete any booked appointments created during the call. - incoming-calls [Block the caller phone number from this incoming call](https://e6m95bh5sn.apidog.io/block-the-caller-phone-number-from-this-incoming-call-40627647e0.md): Adds the call's `phoneNumberFrom` to the user's blocklist so future calls from that number are rejected by ALL the user's agents globally. Typical use: spam, harassment, or competitors. Blocks the exact number only (not the caller name/account). Use `POST /incoming-calls/:id/unblock` with the same call ID to reverse. - incoming-calls [Unblock the caller phone number from this incoming call](https://e6m95bh5sn.apidog.io/unblock-the-caller-phone-number-from-this-incoming-call-40627648e0.md): Removes `phoneNumberFrom` of the referenced call from the user's blocklist — effective immediately, the next call from that number will ring through to the agent again. Pass the incoming call ID that was originally used to block, not the phone number directly. - incoming-calls [Drop an incoming call immediately by ID](https://e6m95bh5sn.apidog.io/drop-an-incoming-call-immediately-by-id-40627649e0.md): Terminates an IN_PROGRESS inbound call. Best-effort: returns success even if termination fails (the call may already be ending). Minutes consumed up to the drop are billed. - incoming-calls [Add incoming call to favorites](https://e6m95bh5sn.apidog.io/add-incoming-call-to-favorites-40627650e0.md): Pins an inbound call for quick access via the `favorites=true` filter on history/search. A second call returns 400 — check `isFavorite` first or catch the error. Purely a UI concern — does not change call behavior or retention. - incoming-calls [Remove incoming call from favorites](https://e6m95bh5sn.apidog.io/remove-incoming-call-from-favorites-40627651e0.md): Unpins an inbound call. Returns 400 if the call was not previously favorited — check `isFavorite` first if you want idempotent behavior. Does not modify the call record itself. - agents [Create a new agent](https://e6m95bh5sn.apidog.io/create-a-new-agent-40627652e0.md): Creates a voice AI agent with the provided configuration. The agent won't receive calls until a phone number is assigned, but it can be tested immediately. Instructions are validated by an LLM and rejected if vague or off-topic. Subscription agent-count limits are enforced. Mobile users auto-get isVoiceMailAgent=true; avatar is auto-generated from name. - agents [Get all not deleted agents for the current user](https://e6m95bh5sn.apidog.io/get-all-not-deleted-agents-for-the-current-user-40627653e0.md): Returns all non-deleted agents you own, ordered by newest first, with nested phone numbers (test numbers excluded), tools, evaluations, and data collections plus their results. Use for the dashboard agent list, external sync, or audits. Soft-deleted agents are filtered out. - agents [Get all public agents](https://e6m95bh5sn.apidog.io/get-all-public-agents-40627654e0.md): Returns curated public template agents visible to all users — useful as starting points, examples, or for a template gallery. Response excludes userId and sensitive config fields. No authentication data is required beyond standard JWT. - agents [Get a specific agent by ID](https://e6m95bh5sn.apidog.io/get-a-specific-agent-by-id-40627655e0.md): Retrieves the full agent configuration including instructions, voice, evaluations, data collections, linked calendars, transfer numbers, and tasks. Use for edit form pre-population, detail views, or config audits. Returns 404 if the agent doesn't belong to the authenticated user or was soft-deleted. - agents [Update an agent](https://e6m95bh5sn.apidog.io/update-an-agent-40627656e0.md): Partial update — only fields sent in the body are changed. If instructions change they're re-validated and rejected if invalid. If toolIds is sent, ALL existing tool links are replaced. SMS-capable setting changes reconcile Messaging Service registration for assigned US Twilio numbers. - agents [Delete an agent](https://e6m95bh5sn.apidog.io/delete-an-agent-40627657e0.md): Deletes the agent and its evaluations, data collections, and transfer numbers. Phone numbers become unassigned and can be reused. - agents [Toggle an agent active status](https://e6m95bh5sn.apidog.io/toggle-an-agent-active-status-40627658e0.md): Flips the agent's isActive flag to quickly pause or resume it without losing configuration. Inactive agents don't receive calls. Use for off-hours pause, maintenance windows, or a single-click enable/disable control in the UI. - agents [Reset an agent to dashboard defaults](https://e6m95bh5sn.apidog.io/reset-an-agent-to-dashboard-defaults-40627659e0.md): Resets the agent's editable dashboard configuration to the default new-receptionist settings while preserving the agent record and linked resources. The reset is recorded in agent audit history. - agents [Get agent change history](https://e6m95bh5sn.apidog.io/get-agent-change-history-40627660e0.md): Returns paginated audit log of every config change on this agent (instructions, voice, settings, etc.) with old/new values and source attribution. Use for compliance reports, debugging unexpected changes, or rollback planning. Defaults: limit=50, offset=0. - agents [Create agent evaluation](https://e6m95bh5sn.apidog.io/create-agent-evaluation-40627661e0.md): Defines a new call-quality criterion (yes/no question like "Did the agent mention pricing?"). After every call, the LLM evaluates the transcript and returns SUCCESS/FAILURE/UNKNOWN with a rationale. Use to track agent performance metrics and build quality dashboards. - agents [Get agent evaluations](https://e6m95bh5sn.apidog.io/get-agent-evaluations-40627662e0.md): Returns all evaluation criteria defined for this agent with their execution results (SUCCESS/FAILURE/UNKNOWN + rationale per call). Use for quality dashboards, trend analysis, or listing tracked metrics. Soft-deleted evaluations are filtered out. - agents [Update agent evaluation](https://e6m95bh5sn.apidog.io/update-agent-evaluation-40627663e0.md): Modifies the name or prompt of an evaluation criterion. Past results are preserved — only future evaluations use the new prompt. Use to refine criteria or clarify what you're measuring. Ownership verified via the nested agent.userId. - agents [Delete agent evaluation](https://e6m95bh5sn.apidog.io/delete-agent-evaluation-40627664e0.md): Soft-deletes the evaluation (sets deletedAt). Past results stay archived and queryable; no new evaluations run on future calls. Use when retiring outdated metrics or simplifying dashboards. - agents [Create agent data collection](https://e6m95bh5sn.apidog.io/create-agent-data-collection-40627665e0.md): Defines a structured field (customer_name, budget, appointment_time, etc.) auto-extracted from every call transcript. Specify dataType (STRING/NUMBER/INTEGER/BOOLEAN/DATE) to enforce the expected type on the extracted value. Use for CRM sync, analytics, or integrations. - agents [Get agent data collections](https://e6m95bh5sn.apidog.io/get-agent-data-collections-40627666e0.md): Returns all extraction fields configured for this agent plus the values extracted from recent calls. Use for CRM sync settings, reviewing captured data, or auditing extraction setup. Soft-deleted fields are filtered out. - agents [Update agent data collection](https://e6m95bh5sn.apidog.io/update-agent-data-collection-40627667e0.md): Modifies the description or dataType of an extraction field. Past results remain untouched; future calls use the new config. Use to clarify extraction instructions or change the expected data type. - agents [Delete agent data collection](https://e6m95bh5sn.apidog.io/delete-agent-data-collection-40627668e0.md): Soft-deletes the extraction field. Past extracted values are preserved and queryable; no new extractions run on future calls. Use to remove unused fields or consolidate data capture. - agents [Connect calendar to agent](https://e6m95bh5sn.apidog.io/connect-calendar-to-agent-40627669e0.md): Links a calendar (Google/Outlook/Apple) to the agent so it can check availability and auto-book appointments during calls. Specify work hours per day (HHMM format), timezone, default duration, buffer minutes. The calendar must already belong to the user. - agents [Get agent connected calendars](https://e6m95bh5sn.apidog.io/get-agent-connected-calendars-40627670e0.md): Returns all calendars linked to this agent with their booking config (work hours, timezone, duration, buffer, active flag). Use to view integrations, verify booking setup, or audit access. - agents [Duplicate an agent-calendar link (virtual calendar)](https://e6m95bh5sn.apidog.io/duplicate-an-agent-calendar-link-virtual-calendar-40627671e0.md): Creates a second AgentCalendar row pointing at the same underlying calendar but with independent duration/description. Use this to expose multiple "virtual" variants of one Google/Outlook/Apple calendar to the AI — e.g., "New patient — 40 min" and "Follow-up — 10 min" on the same physical calendar. The AI sees them as distinct options and picks one per appointment type. Only allowed for self-managed providers (GOOGLE, OUTLOOK, APPLE); external booking engines (Calendly, Cal.com, Square, GHL) dictate duration from their own system, so cloning is rejected. :agentCalendarId is the AgentCalendar primary key (not the underlying calendar's ID). - agents [Update calendar settings](https://e6m95bh5sn.apidog.io/update-calendar-settings-40627672e0.md): Partial update of a calendar link — work hours, timezone, default duration, buffer minutes, active flag, double-booking permission. Use for seasonal schedule changes, timezone updates after relocation, or enabling/disabling booking temporarily. - agents [Disconnect calendar from agent](https://e6m95bh5sn.apidog.io/disconnect-calendar-from-agent-40627673e0.md): Removes the link between the agent and the calendar. Agent stops checking availability or booking events on this calendar. The underlying calendar itself is preserved. Use when replacing calendars or removing booking capability. - agents [Create or update widget embed configuration](https://e6m95bh5sn.apidog.io/create-or-update-widget-embed-configuration-40627674e0.md): Creates or updates the widget config for embedding this agent on a website as a voice button. Requires at least one allowed domain (exact "example.com" or wildcard "*.example.com"). Embed key is generated on first create and preserved on updates. Customize position, autoConnect, primaryColor, callButtonText. - agents [Get widget embed configuration](https://e6m95bh5sn.apidog.io/get-widget-embed-configuration-40627675e0.md): Returns the widget's embedKey (pk_embed_*), isEnabled flag, allowed domains, styling options, and usage stats (totalConnections, lastUsedAt). Use to display the embed code snippet in settings or verify current config. - agents [Disable widget embed](https://e6m95bh5sn.apidog.io/disable-widget-embed-40627676e0.md): Sets isEnabled=false on the widget config — the embed stops working on all websites immediately, but config (domains, styling, embed key) is preserved for quick re-enable. Use for maintenance, temporarily pausing, or removing from production. - agents [Regenerate embed key](https://e6m95bh5sn.apidog.io/regenerate-embed-key-40627677e0.md): Invalidates the current embed key and generates a new pk_embed_* value. The old key stops working immediately — any deployed