{"info":{"name":"Telzino API","description":"API documentation for Telzino","version":"1.0.0","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"variable":[{"key":"baseUrl","value":"http://api.telzino.io","type":"string"},{"key":"accessToken","value":"your-access-token-here","type":"string","description":"JWT Bearer token for authentication"}],"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{accessToken}}","type":"string"}]},"item":[{"name":"OAuth","item":[{"name":"Request Access Token","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/oauth/token","host":["{{baseUrl}}"],"path":["oauth","token"]},"description":"Accepts a JSON request body for the Client Credentials Grant and translates it into the `application/x-www-form-urlencoded` format required by Auth0. Returns an access token.\n","body":{"mode":"raw","raw":"{\n  \"client_id\": \"YOUR_CLIENT_ID\",\n  \"client_secret\": \"YOUR_CLIENT_SECRET\",\n  \"audience\": \"https://api.telzino.com/\",\n  \"grant_type\": \"client_credentials\"\n}"}}}]},{"name":"V1 - Accounts","item":[{"name":"Get resellers for an account","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/accounts/{accountId}/resellers","host":["{{baseUrl}}"],"path":["v1","accounts","{accountId}","resellers"],"variable":[{"key":"accountId","value":"{{accountId}}"}],"query":[{"key":"external_id","value":"","disabled":true}]}}},{"name":"Create a new reseller for an account","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/accounts/{accountId}/resellers","host":["{{baseUrl}}"],"path":["v1","accounts","{accountId}","resellers"],"variable":[{"key":"accountId","value":"{{accountId}}"}]},"body":{"mode":"raw","raw":"{\n  \"resellerName\": \"Test Reseller\",\n  \"external_id\": \"external-reseller-123\"\n}"}}}]},{"name":"V1 - Agents","item":[{"name":"List call logs for an agent","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/call-logs","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","call-logs"],"variable":[{"key":"agentId","value":"{{agentId}}","description":"The agent ID"}],"query":[{"key":"page","value":"","description":"Page number for pagination","disabled":true},{"key":"limit","value":"","description":"Number of items per page (max 100)","disabled":true},{"key":"startDate","value":"","description":"Only calls started at or after this time (ISO 8601)","disabled":true},{"key":"endDate","value":"","description":"Only calls started at or before this time (ISO 8601)","disabled":true}]},"description":"Returns a paginated list of call transcripts/logs for a specific agent."}},{"name":"Revert an agent to an earlier version","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/history/{versionId}/revert","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","history","{versionId}","revert"],"variable":[{"key":"agentId","value":"{{agentId}}","description":"The unique identifier of the agent"},{"key":"versionId","value":"{{versionId}}","description":"The `id` of a version from GET /v1/agents/{agentId}/history"}]},"description":"Saves the agent with the settings recorded in an earlier version from\n`GET /v1/agents/{agentId}/history`. Nothing is removed from the history: the revert is\nrecorded as a new version (`action: reverted`, `source: dashboard-api`), which appears\nin the history a few seconds later.\n\nOnly the recorded settings are restored. Functions, outbound and voicemail greetings,\nAMD/IVR, screenshare, email server, call limits and retries, agent type, agent status,\nintegrations, SIP and knowledge-base documents stay as they are now. Web transfer also\nstays, except that restoring call transfer off turns web transfer off with it.\n\nThe organization's feature locks apply, with the same messages as\n`PUT /v1/agents/{agentId}`: restoring an AI model, voice provider, cloned voice, warm\ntransfer, knowledge base (RAG), PII redaction or email template the organization can\nno longer use is refused with 403, as is changing the knowledge base settings while RAG\nis no longer available. Keeping a setting the agent already has on is not refused.\n\nReverting to a version whose settings match the current ones changes nothing, and no\nnew version is recorded.\n\nNo request body.\n"}},{"name":"List an agent's change history","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/history","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","history"],"variable":[{"key":"agentId","value":"{{agentId}}","description":"The unique identifier of the agent"}],"query":[{"key":"page","value":"","description":"Page number (1-indexed). A value that is not a whole number of 1 or more falls back to 1; a page past the end returns an empty list.","disabled":true},{"key":"limit","value":"","description":"Number of versions per page (max 100). A value that is not a whole number of 1 or more falls back to 50; a value over 100 is capped at 100.","disabled":true}]},"description":"Returns the agent's recorded settings changes, newest first: who made each change,\nwhen, from where, and every field that changed with its old and new value. This is\nthe same record the Dashboard's Change History tab and Connect's Change history page\nshow.\n\nOnly the agent's main settings are recorded. Not recorded: agent status (active /\ninactive), functions, outbound and voicemail greetings, AMD/IVR, web transfer,\nscreenshare, email server, call limits and retries, agent type, integrations and\ncredentials, SIP, and knowledge-base documents. Only LiveKit agents are recorded; any other agent returns an empty list.\n\nA change made through the API appears here a few seconds after it is saved.\n\nUse an entry's `id` with `POST /v1/agents/{agentId}/history/{versionId}/revert`.\n`version` is a display number (1 = oldest on record) and can shift when old\nversions are removed by the account's retention setting; `id` never changes.\n"}},{"name":"Upload warm-transfer hold music","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/moh","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","moh"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Uploads an MP3 or WAV file (max 4 MB) to be played to the caller while on\nhold during a warm transfer. The file is stored and its public URL is saved\nto the agent's `warm_transfer_moh_url`. Replacing an existing file removes the\nprevious one. Only livekit agents are supported.\n"}},{"name":"Remove warm-transfer hold music","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/moh","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","moh"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Deletes any uploaded hold-music file and clears the agent's `warm_transfer_moh_url`."}},{"name":"Get an outbound call with current status and result","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/outbound-calls/{callId}","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","outbound-calls","{callId}"],"variable":[{"key":"agentId","value":"{{agentId}}"},{"key":"callId","value":"{{callId}}"}]}}},{"name":"Cancel a scheduled retry, or soft-delete a finished call","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/outbound-calls/{callId}","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","outbound-calls","{callId}"],"variable":[{"key":"agentId","value":"{{agentId}}"},{"key":"callId","value":"{{callId}}"}]},"description":"Routes by call status. A retry still in the `scheduled` state is cancelled so it never dials (TLZ-476); one already promoted and dialing is left untouched. Any other call is soft-deleted: it stops appearing in the outbound-call and call-log endpoints and its recording and share link stop resolving, while aggregate usage and billing figures are unchanged. Only a scheduled retry or a finished call can be removed — one still in flight cannot.\n"}},{"name":"Trigger an outbound call","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/outbound-calls","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","outbound-calls"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Creates an outbound call record; the dispatcher service places the call. Requires a livekit agent.","body":{"mode":"raw","raw":"{}"}}},{"name":"List outbound calls for an agent","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/outbound-calls","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","outbound-calls"],"variable":[{"key":"agentId","value":"{{agentId}}"}],"query":[{"key":"page","value":"","disabled":true},{"key":"limit","value":"","disabled":true},{"key":"status","value":"","description":"Filter by call status","disabled":true}]}}},{"name":"Get an agent's payment readiness and current in-call payment config","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/payments/readiness","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","payments","readiness"],"variable":[{"key":"agentId","value":"{{agentId}}"}],"query":[{"key":"refresh","value":"","description":"Set to true to force a live re-sync of merchant status from Stripe for this call","disabled":true}]},"description":"Reports whether an agent can be armed to take payments and, if the tool is enabled, its current guardrails. Use this to discover WHY enabling is blocked before calling `PUT /v1/agents/{agentId}/payments/tool` — e.g. the merchant isn't charge-ready yet, or the agent's organization has no usable Twilio connection (or, for a not-yet-migrated agent, no credentials of its own) or the agent has no From number. The platform fee is intentionally not exposed here.\n"}},{"name":"Enable or disable the in-call payment tool on an agent","request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/payments/tool","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","payments","tool"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Arms (or disarms) the agent's ability to take card payments during a call. Enabling writes the payment tool and its guardrails into the agent config that the voice worker reads at call time. Enabling is gated: the agent's organization must be charge-ready in Stripe (completed Connect onboarding) AND the agent's organization must have a usable Twilio connection and the agent a From number, because the payment link is delivered to the caller by text. Disabling only removes the tool and is always allowed.\n","body":{"mode":"raw","raw":"{}"}}},{"name":"Get a specific agent","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}"],"variable":[{"key":"agentId","value":"{{agentId}}","description":"The unique identifier of the agent"}]},"description":"Retrieves details of a specific agent by ID. Only returns agents accessible by the authenticated account."}},{"name":"Update an agent","request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}"],"variable":[{"key":"agentId","value":"{{agentId}}","description":"The unique identifier of the agent"}]},"description":"Updates an existing agent.\n\nTop-level field names differ between read and write: GET returns the stored\nsnake_case columns (e.g. `system_prompt`), while this endpoint takes camelCase\n(e.g. `systemPrompt`). Keys inside nested objects such as `voiceSettings` and\n`config` stay snake_case. `email` is sent as an array of addresses but returned by\nGET as the stored string.\n","body":{"mode":"raw","raw":"{\n  \"name\": \"Updated Agent Name\",\n  \"systemPrompt\": \"Updated system prompt...\",\n  \"status\": \"active\"\n}"}}},{"name":"Delete an agent","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}"],"variable":[{"key":"agentId","value":"{{agentId}}","description":"The unique identifier of the agent"}]},"description":"Deletes an existing agent."}},{"name":"Set SIP Registration for an agent","request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/sip/registration","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","sip","registration"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Saves SIP registration data for a LiveKit agent.","body":{"mode":"raw","raw":"{\n  \"sipDomain\": \"sip.provider.com\",\n  \"username\": \"1001\",\n  \"password\": \"secret\",\n  \"proxy\": \"proxy.provider.com\",\n  \"port\": 5060,\n  \"transport\": \"udp\",\n  \"subscribe\": false,\n  \"sipRoutingHeaderXDestUser\": \"routing.user+1@example\",\n  \"sipUserAgent\": \"Yealink SIP-T54W 96.86.0.75\"\n}"}}},{"name":"Enable or disable SIP Registration for an agent","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/sip/registration","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","sip","registration"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Toggles the `registrationEnabled` flag on an agent's existing SIP\nregistration without resending the full configuration. Use this to mark\nan agent active/inactive while keeping its stored SIP credentials. The\nagent must already have a SIP registration configured (use PUT first).\n","body":{"mode":"raw","raw":"{\n  \"registrationEnabled\": false\n}"}}},{"name":"Delete SIP Registration for an agent","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/sip/registration","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","sip","registration"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Removes SIP registration data for a LiveKit agent."}},{"name":"Get SIP Registration status for an agent","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/sip/registration/status","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","sip","registration","status"],"variable":[{"key":"agentId","value":"{{agentId}}"}]},"description":"Returns the current OpenSIPS registration state for a LiveKit agent."}},{"name":"Update an agent's activation status","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/agents/{agentId}/status","host":["{{baseUrl}}"],"path":["v1","agents","{agentId}","status"],"variable":[{"key":"agentId","value":"{{agentId}}","description":"The unique identifier of the agent"}]},"description":"Activates or deactivates an agent without sending the rest of its configuration.\n\nAccepts only the two reversible states:\n- `active` — agent is available to receive calls\n- `inactive` — agent is temporarily disabled\n\nIf the agent has SIP registration configured, its `registrationEnabled` flag is\ncarried along in the same write: `inactive` deregisters the agent so it stops\nreceiving calls, `active` registers it again. Agents without SIP registration are\nunaffected beyond the status itself.\n\n`cancelled` (permanently disabled) and `pending` (awaiting activation) are rejected\nwith 400; set those via `PUT /v1/agents/{agentId}` instead. An agent already in\n`cancelled` cannot be revived here and returns 409.\n\nIdempotent: re-sending a status the agent already has, with its registration\nalready in the matching state, succeeds without writing.\n\nNote: `active` agents are the billable ones, so toggling status changes the\naccount's billable agent count on the next quantity sync.\n","body":{"mode":"raw","raw":"{\n  \"status\": \"inactive\"\n}"}}},{"name":"List all agents","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/agents","host":["{{baseUrl}}"],"path":["v1","agents"],"query":[{"key":"organization_id","value":"","description":"Filter by organization ID","disabled":true},{"key":"provider","value":"","description":"Filter by provider","disabled":true},{"key":"page","value":"","description":"Page number for pagination","disabled":true},{"key":"limit","value":"","description":"Number of items per page (max 100)","disabled":true}]},"description":"Returns a paginated list of agents accessible by the authenticated account. Optionally filter by organization_id or provider."}},{"name":"Create a new agent","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/agents","host":["{{baseUrl}}"],"path":["v1","agents"]},"description":"Creates a new agent associated with the specified organization.","body":{"mode":"raw","raw":"{\n  \"name\": \"Customer Support Agent\",\n  \"description\": \"Handles customer inquiries\",\n  \"greetingMessage\": \"Hello! How can I help you today?\",\n  \"outboundGreetingMessage\": \"Hi, this is Ava calling from Acme Corp.\",\n  \"systemPrompt\": \"You are a helpful customer support agent...\",\n  \"agentType\": \"simple\",\n  \"model\": \"gpt-4.1\",\n  \"voiceModel\": \"gpt-4o-realtime-preview\",\n  \"sttModel\": \"deepgram\",\n  \"ttsModel\": \"cartesia\",\n  \"voiceSettings\": {\n    \"voice_id\": \"alloy\"\n  },\n  \"transferEnabled\": false,\n  \"organizationId\": \"123e4567-e89b-12d3-a456-426614174000\"\n}"}}}]},{"name":"V1 - Billing-report","item":[{"name":"Get billing report with usage data","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/billing-report","host":["{{baseUrl}}"],"path":["v1","billing-report"],"query":[{"key":"start_date","value":"","description":"Start date (YYYY-MM-DD format)","disabled":false},{"key":"end_date","value":"","description":"End date (YYYY-MM-DD format)","disabled":false},{"key":"reseller_ids","value":"","description":"Optional - Filter by reseller IDs (comma-separated or array)","disabled":true},{"key":"organization_ids","value":"","description":"Optional - Filter by organization IDs (comma-separated or array)","disabled":true},{"key":"demo_only","value":"","description":"Optional - Only demo agents (TLZ-683). Only organizations with at least one demo agent are returned; agent_count and voice_minutes cover only those demo agents. Uses the current demo list; never served from cache.","disabled":true}]},"description":"Returns billing data with usage statistics.\nResults are cached in Redis - subsequent requests for same date range return cached data.\n\n**Note:** Input dates use ISO format (YYYY-MM-DD), response dates are in US format (MM/DD/YYYY).\n"}}]},{"name":"V1 - Call-logs","item":[{"name":"Download call recording","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/call-logs/{callLogId}/recording","host":["{{baseUrl}}"],"path":["v1","call-logs","{callLogId}","recording"],"variable":[{"key":"callLogId","value":"{{callLogId}}","description":"The call log ID"}]},"description":"Downloads the recording for a specific call log as an audio file."}},{"name":"Create a public share link for a call transcript","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/call-logs/{callLogId}/share","host":["{{baseUrl}}"],"path":["v1","call-logs","{callLogId}","share"],"variable":[{"key":"callLogId","value":"{{callLogId}}","description":"The call log ID"}]},"description":"Creates a public, unauthenticated link to the transcript of a call log — the same\nlink the dashboard's \"Share Transcript\" button produces. The transcript is\nsnapshotted at share time; the link never expires and cannot be revoked. Each call\ncreates a new link.\n\nSharing is refused when the call log's organization has Secure Access enabled or\nhas Transcript Sharing disabled (either via the organization toggle or a\nreseller/partner feature lock).\n"}}]},{"name":"V1 - Custom-voices","item":[{"name":"Delete a custom voice","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/custom-voices/{voiceId}","host":["{{baseUrl}}"],"path":["v1","custom-voices","{voiceId}"],"variable":[{"key":"voiceId","value":"{{voiceId}}","description":"Custom voice ID (the VoiceOption id)"}],"query":[{"key":"organizationId","value":"","description":"Organization the voice belongs to","disabled":false}]},"description":"Deletes an organization's cloned voice. Fails with 409 if any agents are still using the voice; the response lists them."}},{"name":"List an organization's custom voices","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/custom-voices","host":["{{baseUrl}}"],"path":["v1","custom-voices"],"query":[{"key":"organizationId","value":"","description":"Organization whose custom voices to list","disabled":false}]},"description":"Returns the organization's cloned voices as catalogue options."}},{"name":"Clone a custom voice from an audio sample","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/custom-voices","host":["{{baseUrl}}"],"path":["v1","custom-voices"]},"description":"Creates a cloned voice for the organization from an uploaded audio clip (max 4MB). Requires the organization's custom-voices feature to be enabled and explicit consent."}}]},{"name":"V1 - Email-servers","item":[{"name":"List the account's email servers","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/email-servers","host":["{{baseUrl}}"],"path":["v1","email-servers"]},"description":"Returns the email servers configured for the authenticated account. Use the returned id as the emailServerId field when creating or updating agents. Sensitive fields (SMTP password, SendGrid API key) are never returned.\n\nAn API key limited to a single reseller or organization may call this — an agent names an email server by id, so the list is needed — but receives only `id`, `name`, `type`, `is_default`, `created_at` and `updated_at`. The host, port and from-address fields below are omitted, since they belong to the partner rather than to the reseller or organization the key is scoped to.\n"}}]},{"name":"V1 - Email-templates","item":[{"name":"Get an email template","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/email-templates/{templateId}","host":["{{baseUrl}}"],"path":["v1","email-templates","{templateId}"],"variable":[{"key":"templateId","value":"{{templateId}}"}]}}},{"name":"Update an email template","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/email-templates/{templateId}","host":["{{baseUrl}}"],"path":["v1","email-templates","{templateId}"],"variable":[{"key":"templateId","value":"{{templateId}}"}]},"description":"Partial update. organization_id and version are immutable and ignored.","body":{"mode":"raw","raw":"{}"}}},{"name":"Delete an email template","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/email-templates/{templateId}","host":["{{baseUrl}}"],"path":["v1","email-templates","{templateId}"],"variable":[{"key":"templateId","value":"{{templateId}}"}]},"description":"Only archived templates may be deleted, and only when no agent references them."}},{"name":"List email templates","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/email-templates","host":["{{baseUrl}}"],"path":["v1","email-templates"],"query":[{"key":"organization_id","value":"","description":"Filter to a single organization (must belong to the account).","disabled":true},{"key":"status","value":"","disabled":true},{"key":"page","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"Returns a paginated list of email templates across the authenticated account's organizations. No secrets are ever returned (templates hold no credentials)."}},{"name":"Create an email template","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/email-templates","host":["{{baseUrl}}"],"path":["v1","email-templates"]},"body":{"mode":"raw","raw":"{}"}}}]},{"name":"V1 - Features","item":[{"name":"List feature availability for an account, reseller or organization","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/features","host":["{{baseUrl}}"],"path":["v1","features"],"query":[{"key":"organization_id","value":"","description":"Optional. Report availability for this organization, applying its account, reseller and organization-level locks. The organization must belong to the authenticated account or the request is rejected with 404. Mutually exclusive with reseller_id.\n","disabled":true},{"key":"reseller_id","value":"","description":"Optional. Report availability for this reseller, applying its own and its account's locks. The reseller must belong to the authenticated account or the request is rejected with 404. Mutually exclusive with organization_id.\n","disabled":true}]},"description":"Returns every feature in the platform registry with whether it is available or\nlocked for the entity you ask about, so an integration can hide a capability\nbefore a user reaches the write that would be rejected with `403 forbidden`.\n\nChoose the scope with at most one parameter — passing both is rejected:\n\n- **No parameter** — the authenticated account. This reports only locks placed on\n  the account itself, which are the ones that reach every reseller and\n  organization beneath it.\n- **`reseller_id`** — the reseller, including the locks it inherits from the\n  account.\n- **`organization_id`** — the exact view for that organization, including\n  everything it inherits from its reseller and account. This is the scope to use\n  when deciding what to show a specific customer.\n\n`state` is `locked` when the feature is withheld at this scope or above it, and\n`locked_scope` says which: `here` for a lock on the entity you asked about, and\n`inherited` for one placed further up. `decided_by` names what established the\nanswer — `feature_administration` for the feature matrix, `legacy_column` for the\nper-account and per-organization settings that govern while Feature Administration\nis switched off, and `default_available` for a feature nothing withholds.\n\n`feature_administration_enabled` reports which of those two regimes is in force\nplatform-wide. It is included because the same feature can be governed differently\nunder each, and a caller comparing responses over time needs to know which it got.\n\nTwo caveats worth building against:\n\n- **LLM models are the `llm.*` keys, and only those.** An `llm.*` feature reported\n  as available means the model can be chosen; there is no separate per-organization\n  grant any more. `gpt-4.1`, the default model, has no `llm.*` row because it can\n  never be locked. Prefer `GET /v1/llm-models` for building a model picker — it\n  returns the models themselves rather than feature keys.\n- **Opt-in features report permission, not state.** For `secure_access`,\n  `phi_redaction` and `use_reseller_smtp`, `available` means the organization is\n  permitted to switch the feature on, not that it currently is.\n"}}]},{"name":"V1 - Guardrails","item":[{"name":"Update a guardrail","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/guardrails/{guardrailId}","host":["{{baseUrl}}"],"path":["v1","guardrails","{guardrailId}"],"variable":[{"key":"guardrailId","value":"{{guardrailId}}","description":"Guardrail ID"}]},"description":"Updates one or more fields of a guardrail. At least one field is required.","body":{"mode":"raw","raw":"{\n  \"enabled\": false\n}"}}},{"name":"Delete a guardrail","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/guardrails/{guardrailId}","host":["{{baseUrl}}"],"path":["v1","guardrails","{guardrailId}"],"variable":[{"key":"guardrailId","value":"{{guardrailId}}","description":"Guardrail ID"}]}}}]},{"name":"V1 - Knowledge-bases","item":[{"name":"Re-index every source in a knowledge base","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-bases/{knowledgeBaseId}/reingest","host":["{{baseUrl}}"],"path":["v1","knowledge-bases","{knowledgeBaseId}","reingest"],"variable":[{"key":"knowledgeBaseId","value":"{{knowledgeBaseId}}"}]},"description":"Queues a force-reindex for every source in the knowledge base in one call,\nreplacing each source's existing vectors. Takes no request body.\n\nIndexing is on demand only — there is no scheduled re-crawl — so content that\nchanged after it was first indexed stays stale until a refresh is triggered.\n\nWhat a refresh does per source type:\n* **URL sources** are re-fetched from the live page, so edits made since the\n  last run are picked up.\n* **File sources** are re-processed from their stored copy, which does not\n  change. To pick up an edited document, use\n  `POST /v1/knowledge-sources/{sourceId}/replace` instead.\n\nSources that already have a queued or in-progress job are left alone and\nreported in `skipped`, so calling this twice in a row is safe.\n\nPoll each returned `jobId` via `GET /v1/rag/jobs/{jobId}` to follow progress,\nor poll `GET /v1/knowledge-bases/{knowledgeBaseId}/sources` and wait for every\nsource to leave `pending`.\n"}},{"name":"Update a knowledge base","request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-bases/{knowledgeBaseId}","host":["{{baseUrl}}"],"path":["v1","knowledge-bases","{knowledgeBaseId}"],"variable":[{"key":"knowledgeBaseId","value":"{{knowledgeBaseId}}"}]},"description":"Renames a knowledge base and/or replaces its description. `name` is required on\nevery call — this is a full replace, not a partial patch. Names must be unique\nwithin the organization.\n","body":{"mode":"raw","raw":"{\n  \"name\": \"Product FAQ (2026)\",\n  \"description\": \"Updated pricing and support answers\"\n}"}}},{"name":"Delete a knowledge base","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-bases/{knowledgeBaseId}","host":["{{baseUrl}}"],"path":["v1","knowledge-bases","{knowledgeBaseId}"],"variable":[{"key":"knowledgeBaseId","value":"{{knowledgeBaseId}}"}]},"description":"Deletes the knowledge base and all of its sources, including the stored files and\ntheir indexed vectors. Any agent referencing it has its assignment cleared.\nThis cannot be undone.\n"}},{"name":"List sources in a knowledge base","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/knowledge-bases/{knowledgeBaseId}/sources","host":["{{baseUrl}}"],"path":["v1","knowledge-bases","{knowledgeBaseId}","sources"],"variable":[{"key":"knowledgeBaseId","value":"{{knowledgeBaseId}}"}]},"description":"Returns the knowledge base's sources (files and URLs), newest first. Deleted\nsources are omitted. File sources include their stored metadata (`file_name`,\n`file_size`, `file_mime`); the file contents themselves are not served by this API.\n"}},{"name":"Add a URL or file source to a knowledge base","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-bases/{knowledgeBaseId}/sources","host":["{{baseUrl}}"],"path":["v1","knowledge-bases","{knowledgeBaseId}","sources"],"variable":[{"key":"knowledgeBaseId","value":"{{knowledgeBaseId}}"}]},"description":"Creates a source. The body is discriminated on `sourceType`.\n\n**URL sources** are queued for ingestion immediately; the response returns\n`sourceId` and `jobId`.\n\n**File sources** use a three-step upload: this call returns a `presignedUrl`,\nyou `PUT` the file bytes to it, then call\n`POST /v1/knowledge-sources/{sourceId}/enqueue` with the returned `jobId` to start\ningestion. Supported types are PDF, DOCX, TXT, Markdown, HTML and CSV, up to 50 MB.\n\nDuplicates return `409 duplicate_source` with the existing source in `details`.\nSet `forceReingest: true` to re-ingest the existing source instead.\n","body":{"mode":"raw","raw":"{\n  \"sourceType\": \"file\",\n  \"fileName\": \"guide.pdf\",\n  \"fileMime\": \"application/pdf\",\n  \"fileSize\": 1048576\n}"}}}]},{"name":"V1 - Knowledge-sources","item":[{"name":"Download a knowledge source file","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/knowledge-sources/{sourceId}/download","host":["{{baseUrl}}"],"path":["v1","knowledge-sources","{sourceId}","download"],"variable":[{"key":"sourceId","value":"{{sourceId}}"}]},"description":"Returns a short-lived presigned URL for the source's original uploaded file.\n`GET` that URL to retrieve the bytes — it carries the original filename, so a\nbrowser saves it under the name it was uploaded with rather than the internal\nstorage key.\n\nThe URL expires after `expiresIn` seconds; request a new one rather than\nstoring it. Only **file** sources can be downloaded — a URL source returns\n`400 invalid_request`, and its address is already available in the `url` field\nfrom List Sources.\n"}},{"name":"Start ingestion for an uploaded file source","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-sources/{sourceId}/enqueue","host":["{{baseUrl}}"],"path":["v1","knowledge-sources","{sourceId}","enqueue"],"variable":[{"key":"sourceId","value":"{{sourceId}}"}]},"description":"Third and final step of the file upload flow. Call this after `PUT`-ing the file\nbytes to the `presignedUrl` returned by Create Source, passing the `jobId` from\nthat same response.\n\nOnly file sources can be enqueued — URL sources are queued automatically on\ncreation and return `400 invalid_request` here. The `jobId` must belong to this\nsource, otherwise the call is rejected with `400 invalid_request`.\n\nPoll `GET /v1/rag/jobs/{jobId}` to follow progress.\n","body":{"mode":"raw","raw":"{\n  \"jobId\": \"33333333-3333-3333-3333-333333333333\"\n}"}}},{"name":"Re-ingest an existing source","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-sources/{sourceId}/reingest","host":["{{baseUrl}}"],"path":["v1","knowledge-sources","{sourceId}","reingest"],"variable":[{"key":"sourceId","value":"{{sourceId}}"}]},"description":"Re-indexes a source from scratch and replaces its existing vectors. Use this to\nrefresh a URL whose page has changed, or to retry a source left in `error`\nstatus. Works for both file and URL sources, and takes no request body.\n\nPoll the returned `jobId` via `GET /v1/rag/jobs/{jobId}` to follow progress.\n"}},{"name":"Replace a file source's document with an updated version","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-sources/{sourceId}/replace","host":["{{baseUrl}}"],"path":["v1","knowledge-sources","{sourceId}","replace"],"variable":[{"key":"sourceId","value":"{{sourceId}}"}]},"description":"Returns a presigned URL for uploading a new version of an existing file\nsource's document, overwriting the stored copy in place.\n\nUse this when a document has been edited. Re-ingesting a file source\nre-reads the same stored copy, so it can never pick up an edited document;\nuploading the document again as a new source leaves the outdated version\nindexed alongside the new one. Replacing keeps exactly one source, and its\nid, so anything referencing it keeps working.\n\nThree steps, mirroring file source creation:\n1. `POST` here to get `presignedUrl` and a `jobId`.\n2. `PUT` the file bytes to `presignedUrl`.\n3. `POST /v1/knowledge-sources/{sourceId}/enqueue` with that `jobId` and\n   `forceReindex: true` to rebuild the vectors.\n\nOnly **file** sources can be replaced. A URL source returns `400` — re-ingest\nit instead, which re-fetches the live page.\n","body":{"mode":"raw","raw":"{}"}}},{"name":"Delete a knowledge source","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/knowledge-sources/{sourceId}","host":["{{baseUrl}}"],"path":["v1","knowledge-sources","{sourceId}"],"variable":[{"key":"sourceId","value":"{{sourceId}}"}]},"description":"Removes a source from its knowledge base, deletes its stored file, and queues\nremoval of its indexed vectors. The agent stops retrieving from it. This cannot\nbe undone — re-add the file or URL to restore it.\n"}}]},{"name":"V1 - Llm-models","item":[{"name":"List available LLM models","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/llm-models","host":["{{baseUrl}}"],"path":["v1","llm-models"],"query":[{"key":"organization_id","value":"","description":"Optional. Scope the catalogue to exactly what this organization may use, applying its account, reseller and org-level Feature Administration locks. The organization must belong to the authenticated account or the request is rejected with 404.\n","disabled":true}]},"description":"Returns the language models agents can use. Use the returned id as the agent's model.\n\nThe list is filtered by Feature Administration:\n\n- Without `organization_id`, the response is the floor plus every model NOT locked\n  at the account level. Org/reseller-level locks are enforced on the write path\n  instead — the token only carries an account id.\n- With `organization_id`, the response is the exact view for that organization: the\n  floor plus every model not locked for it at the account, reseller or org level.\n\nThe floor model is always present in both cases.\n"}}]},{"name":"V1 - Mcp","item":[{"name":"Test an MCP server connection","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/mcp/test-connection","host":["{{baseUrl}}"],"path":["v1","mcp","test-connection"]},"description":"Validates an MCP (Model Context Protocol) server configuration by opening the\ntransport, performing the initialize handshake, and listing the available tools.\nStateless — nothing is created or stored. Use this to verify a configuration\nbefore assigning it to an agent. A failed connection returns HTTP 200 with\n`success: false`; only malformed requests return 400.\n","body":{"mode":"raw","raw":"{}"}}}]},{"name":"V1 - Me","item":[{"name":"Get account ID for the current client","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/me","host":["{{baseUrl}}"],"path":["v1","me"]},"description":"Returns the account_id associated with the client_id in the access token. Requires a valid Bearer access token."}}]},{"name":"V1 - Metrics","item":[{"name":"Get usage and performance metrics","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/metrics","host":["{{baseUrl}}"],"path":["v1","metrics"],"query":[{"key":"startDate","value":"","description":"Start of the reporting window (ISO 8601)","disabled":false},{"key":"endDate","value":"","description":"End of the reporting window (ISO 8601)","disabled":false},{"key":"organizationId","value":"","description":"Limit to one organization's agents","disabled":true},{"key":"resellerId","value":"","description":"Limit to one reseller's organizations (ignored when organizationId is set)","disabled":true}]},"description":"Returns aggregated call metrics for a date range. Scope with organizationId or resellerId; with neither, all agents under the account are included. AI-insight fields degrade to null when the analytics backend is unavailable."}}]},{"name":"V1 - Organizations","item":[{"name":"Create a new agent","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/agents","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","agents"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}]},"description":"Creates a minimal LiveKit agent (title, description, external_id) under the given organization. For creating an agent with full configuration (voice, prompts, model, etc.) use POST /v1/agents instead.\n","body":{"mode":"raw","raw":"{\n  \"title\": \"Support Bot\",\n  \"description\": \"Handles support tickets\",\n  \"external_id\": \"external-agent-123\"\n}"}}},{"name":"List an organization's guardrails","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/guardrails","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","guardrails"],"variable":[{"key":"organization_id","value":"{{organization_id}}","description":"Organization ID"}]},"description":"Returns all guardrails in the organization, oldest first."}},{"name":"Create a guardrail","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/guardrails","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","guardrails"],"variable":[{"key":"organization_id","value":"{{organization_id}}","description":"Organization ID"}]},"description":"Creates a guardrail in the organization. Names must be unique within the organization.","body":{"mode":"raw","raw":"{\n  \"name\": \"No PII\",\n  \"description\": \"Never reveal or confirm a caller's full account number, SSN, or payment card details.\",\n  \"enabled\": true\n}"}}},{"name":"List knowledge bases for an organization","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/knowledge-bases","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","knowledge-bases"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}]},"description":"Returns the organization's RAG knowledge bases, oldest first, each with a\n`source_count` of its non-deleted sources.\n\nKnowledge Base must be enabled for the organization, otherwise this returns\n`403 forbidden`. It cannot be enabled through the API — enable it in the\nTelzino Dashboard under the organization's feature settings.\n"}},{"name":"Create a knowledge base","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/knowledge-bases","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","knowledge-bases"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}]},"description":"Creates an organization-level knowledge base. Names must be unique within the\norganization. Assign it to an agent with Update Agent (`knowledgeBaseId`).\n","body":{"mode":"raw","raw":"{\n  \"name\": \"Product FAQ\",\n  \"description\": \"Public pricing and support answers\"\n}"}}},{"name":"Start (or resume) a merchant's Stripe Connect onboarding","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/payments/onboarding","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","payments","onboarding"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}]},"description":"Ensures the organization has a Stripe connected account (creating one on the platform if needed) and returns a Connect Account Session `client_secret` plus the platform `publishable_key`. Pass both to Stripe's embedded onboarding component (`loadConnectAndInitialize` + `ConnectAccountOnboarding`) so the merchant can submit their own banking and identity details directly to Stripe. The publishable key is public by design (it ships in client-side JS); the platform never receives or stores merchant API keys. Safe to call repeatedly: account creation is idempotent per organization and each call mints a fresh, short-lived session secret.\n"}},{"name":"Get a merchant's Stripe payment (charge-readiness) status","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/payments/status","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","payments","status"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}],"query":[{"key":"refresh","value":"","disabled":true}]},"description":"Returns whether the organization's connected Stripe account is onboarded and able to accept charges. Read-only. Serves the cached account status; pass `?refresh=true` to re-sync from Stripe (slower).\n"}},{"name":"Delete an organization","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}]}}},{"name":"Remove a number from the outbound suppression list","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/suppression-list/{number}","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","suppression-list","{number}"],"variable":[{"key":"organization_id","value":"{{organization_id}}"},{"key":"number","value":"%2B15105550123"}]},"description":"TLZ-477 US-4.6. The number is E.164, whose leading plus sign is not safe in a URL path: send it percent-encoded (%2B15105550123) or raw. Both forms are accepted and normalised, so a client that encodes differently cannot silently fail to un-suppress a number.\n"}},{"name":"List the outbound suppression (do-not-call) entries for an organization","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/suppression-list","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","suppression-list"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}],"query":[{"key":"page","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"TLZ-477 US-4.6. Paginated deliberately — an unpaginated read is silently capped by the database, and a suppression list that appears to end early is a dangerous thing to show. Entries are scoped per organization, which is NARROWER than the TLZ-476 contact caps: a number suppressed here is still dialable by a sibling organization under the same account.\n"}},{"name":"Add a number to the outbound suppression list","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/organizations/{organization_id}/suppression-list","host":["{{baseUrl}}"],"path":["v1","organizations","{organization_id}","suppression-list"],"variable":[{"key":"organization_id","value":"{{organization_id}}"}]},"description":"Idempotent — adding a number already on the list succeeds rather than erroring, since an error here would be a reason not to record a do-not-call request.\n","body":{"mode":"raw","raw":"{}"}}}]},{"name":"V1 - Outbound-calls","item":[{"name":"Export a compliance audit trail of outbound calls","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/outbound-calls/export","host":["{{baseUrl}}"],"path":["v1","outbound-calls","export"],"query":[{"key":"from","value":"","description":"Start of the range","disabled":false},{"key":"to","value":"","description":"End of the range","disabled":false},{"key":"campaign_id","value":"","description":"Filter to one campaign, matched against the reserved `metadata.campaign_id` key supplied on Trigger Outbound Call","disabled":true},{"key":"agent_id","value":"","description":"Filter to one agent","disabled":true},{"key":"status","value":"","description":"Filter to one call status","disabled":true},{"key":"format","value":"","description":"CSV downloads as an attachment; JSON returns the same columns under `data`","disabled":true}]},"description":"TLZ-477 US-4.5 — the per-campaign audit export. Sourced from outbound calls rather than call transcripts, so EVERY dialled number appears including attempts that were never answered (no_answer, busy, failed); those have no transcript but do carry the consent basis they were placed under, which is what an audit asks about. A date range is required. Requests matching more rows than the cap are refused with 413 rather than truncated — a partial audit file is worse than none, because it cannot be told apart from a complete one.\n"}},{"name":"Cancel all scheduled retries for a phone number","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/outbound-calls/queued","host":["{{baseUrl}}"],"path":["v1","outbound-calls","queued"],"query":[{"key":"to_number","value":"","description":"E.164 destination number, e.g. +15105550123","disabled":false}]},"description":"TLZ-476 US-3.3 — cancels every still-scheduled outbound retry to the given number across the caller's account, for on-demand opt-out / DNC handling when only the phone number is known. Retries that have already started dialing are left untouched. Account-scoped: one account can never cancel another's retries.\n"}}]},{"name":"V1 - Payments","item":[{"name":"List the caller's merchants with Stripe charge-readiness","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/payments/merchants","host":["{{baseUrl}}"],"path":["v1","payments","merchants"]},"description":"Returns every organization (merchant) owned by the authenticated account together with its Stripe Connect status, in a single call. Read-only and strictly scoped to the caller's own organizations. Serves cached status (no per-merchant Stripe round trip); use `/v1/organizations/{organization_id}/payments/status?refresh=true` to force a re-sync for one merchant.\n"}},{"name":"List payment transactions across the caller's merchants","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/payments/transactions","host":["{{baseUrl}}"],"path":["v1","payments","transactions"],"query":[{"key":"status","value":"","disabled":true},{"key":"organization_id","value":"","disabled":true},{"key":"search","value":"","disabled":true},{"key":"limit","value":"","disabled":true},{"key":"offset","value":"","disabled":true}]},"description":"Read-only payment ledger, strictly scoped to organizations owned by the authenticated account. Customer references are masked. Supports filtering by status, organization, and a free-text search over Stripe ids / customer.\n"}}]},{"name":"V1 - Places","item":[{"name":"Search Google business listings","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/places/search","host":["{{baseUrl}}"],"path":["v1","places","search"],"query":[{"key":"q","value":"","description":"Business name or address to search for.","disabled":false}]},"description":"Searches Google Places (Autocomplete with Text Search fallback) for a business.\nReturns place suggestions you can link to an agent via the `googlePlaceId` field\non Create/Update Agent. Queries shorter than 3 characters return an empty list.\n"}}]},{"name":"V1 - Profile","item":[{"name":"Get the logged-in dashboard user's profile","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/profile","host":["{{baseUrl}}"],"path":["v1","profile"]},"description":"Returns the Auth0 user profile from the dashboard session cookie. This endpoint authenticates via the encrypted session cookie, not a bearer token - it is intended for the dashboard UI, not machine-to-machine API clients."}}]},{"name":"V1 - Rag","item":[{"name":"Get ingestion job status","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/rag/jobs/{jobId}","host":["{{baseUrl}}"],"path":["v1","rag","jobs","{jobId}"],"variable":[{"key":"jobId","value":"{{jobId}}"}]},"description":"Polls the progress of an ingestion job returned by Create Source, Enqueue, or\nRe-ingest. A source is only searchable by the agent once its job has finished and\nthe source reaches `active` status.\n\n`chunks_processed` and `chunks_total` are populated while indexing is running;\n`error_text` explains a failed job.\n"}}]},{"name":"V1 - Reports","item":[{"name":"Get minutes usage by agent","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/reports/minutes-by-agent","host":["{{baseUrl}}"],"path":["v1","reports","minutes-by-agent"],"query":[{"key":"start_date","value":"","description":"Start date in YYYY-MM-DD","disabled":false},{"key":"end_date","value":"","description":"End date in YYYY-MM-DD","disabled":false},{"key":"agent_ids","value":"","description":"Agent UUIDs as comma-separated values or repeated `agent_ids[]` params","disabled":false}]},"description":"Returns minutes usage aggregated by agent for the requested date range.\nData is sourced from LiveKit voice minutes in ClickHouse.\n"}},{"name":"Get minutes usage grouped by organization with agent breakdown","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/reports/minutes-by-organization","host":["{{baseUrl}}"],"path":["v1","reports","minutes-by-organization"],"query":[{"key":"start_date","value":"","disabled":false},{"key":"end_date","value":"","disabled":false},{"key":"organization_ids","value":"","description":"Optional filter by organization UUIDs (comma-separated or `organization_ids[]`)","disabled":true},{"key":"reseller_ids","value":"","description":"Optional filter by reseller UUIDs (comma-separated or `reseller_ids[]`)","disabled":true}]},"description":"Returns voice minutes aggregated per organization for the requested date range,\nwith a nested per-agent breakdown. Data is sourced from LiveKit voice minutes in ClickHouse.\nIf `organization_ids` / `reseller_ids` are omitted, all organizations the caller has access to are returned.\n"}}]},{"name":"V1 - Resellers","item":[{"name":"Get organizations for a reseller","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/resellers/{resellerId}/organizations","host":["{{baseUrl}}"],"path":["v1","resellers","{resellerId}","organizations"],"variable":[{"key":"resellerId","value":"{{resellerId}}"}],"query":[{"key":"external_id","value":"","disabled":true}]}}},{"name":"Create a new organization for a reseller","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/resellers/{resellerId}/organizations","host":["{{baseUrl}}"],"path":["v1","resellers","{resellerId}","organizations"],"variable":[{"key":"resellerId","value":"{{resellerId}}"}]},"body":{"mode":"raw","raw":"{\n  \"orgName\": \"Acme Solar\",\n  \"external_id\": \"external-org-12345\"\n}"}}},{"name":"Delete a reseller","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/resellers/{resellerId}","host":["{{baseUrl}}"],"path":["v1","resellers","{resellerId}"],"variable":[{"key":"resellerId","value":"{{resellerId}}"}]}}}]},{"name":"V1 - Reservations","item":[{"name":"Reservation agent analytics","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/reservations/analytics","host":["{{baseUrl}}"],"path":["v1","reservations","analytics"],"query":[{"key":"start_date","value":"","disabled":false},{"key":"end_date","value":"","disabled":false},{"key":"organization_id","value":"","disabled":true},{"key":"agent_id","value":"","disabled":true}]},"description":"Call outcomes, drop-off, SMS delivery and third-party API usage for\nOpenTable Reservation agents, over a date range.\n\nScoped to the authenticated account. Narrow further with `organization_id`\nor `agent_id`. Third-party API **cost** is never returned — StayAPI and\nTwilio Lookup are funded at the Platform tier, so only call counts are\nexposed, for capacity and anomaly detection.\n"}}]},{"name":"V1 - Retry-policies","item":[{"name":"Get a retry policy","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/retry-policies/{policyId}","host":["{{baseUrl}}"],"path":["v1","retry-policies","{policyId}"]}}},{"name":"Update a retry policy","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/retry-policies/{policyId}","host":["{{baseUrl}}"],"path":["v1","retry-policies","{policyId}"]},"description":"Partial update. Editing a policy does NOT change retry chains already in flight — each call carries its own snapshot of the rules taken when it was created.","body":{"mode":"raw","raw":"{}"}}},{"name":"Delete a retry policy","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/retry-policies/{policyId}","host":["{{baseUrl}}"],"path":["v1","retry-policies","{policyId}"]},"description":"Agents and calls referencing it fall back to \"no retries\". Chains already in flight are unaffected — they keep their own snapshot of the rules."}},{"name":"List retry policies","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/retry-policies","host":["{{baseUrl}}"],"path":["v1","retry-policies"]},"description":"Account-level outbound retry rulebooks. Use an `id` as `retry_policy_id` when triggering an outbound call, or as `defaultRetryPolicyId` on an agent."}},{"name":"Create a retry policy","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/retry-policies","host":["{{baseUrl}}"],"path":["v1","retry-policies"]},"body":{"mode":"raw","raw":"{}"}}}]},{"name":"V1 - Sessions","item":[{"name":"Create session token (NetSapiens API Key)","request":{"method":"POST","header":[{"key":"X-NS-Api-Key","value":"ns_api_token_from_netsapiens_oauth","description":"NetSapiens API token from OAuth"},{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sessions/netsapiens","host":["{{baseUrl}}"],"path":["v1","sessions","netsapiens"]},"description":"Used by NetSapiens frontend JavaScript for direct integration","body":{"mode":"raw","raw":"{}"}}},{"name":"Create session token (General OAuth2)","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sessions","host":["{{baseUrl}}"],"path":["v1","sessions"]},"description":"Used by 3rd-party backend services using Telzino Account API Keys","body":{"mode":"raw","raw":"{}"}}}]},{"name":"V1 - Sms-templates","item":[{"name":"Get an SMS template","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/sms-templates/{templateId}","host":["{{baseUrl}}"],"path":["v1","sms-templates","{templateId}"],"variable":[{"key":"templateId","value":"{{templateId}}"}]}}},{"name":"Update an SMS template","request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sms-templates/{templateId}","host":["{{baseUrl}}"],"path":["v1","sms-templates","{templateId}"],"variable":[{"key":"templateId","value":"{{templateId}}"}]},"description":"Partial update. message_type, organization_id, media_key and version are immutable and are REJECTED with 400 — the schema is strict, so an unknown or server-managed key fails the request rather than being silently dropped. This annotation feeds the generated OpenAPI spec; it previously said \"ignored\", which contradicted the code and the published docs.","body":{"mode":"raw","raw":"{}"}}},{"name":"Delete an SMS template","request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"}],"url":{"raw":"{{baseUrl}}/v1/sms-templates/{templateId}","host":["{{baseUrl}}"],"path":["v1","sms-templates","{templateId}"],"variable":[{"key":"templateId","value":"{{templateId}}"}]},"description":"Only archived templates may be deleted, and only when no agent references them."}},{"name":"List SMS templates","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/sms-templates","host":["{{baseUrl}}"],"path":["v1","sms-templates"],"query":[{"key":"organization_id","value":"","description":"Filter to a single organization (must belong to the account).","disabled":true},{"key":"status","value":"","disabled":true},{"key":"message_type","value":"","disabled":true},{"key":"page","value":"","disabled":true},{"key":"limit","value":"","disabled":true}]},"description":"Returns a paginated list of SMS templates across the authenticated account's organizations. No secrets are ever returned (templates hold no credentials)."}},{"name":"Create an SMS template","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/sms-templates","host":["{{baseUrl}}"],"path":["v1","sms-templates"]},"body":{"mode":"raw","raw":"{}"}}}]},{"name":"V1 - Stt-providers","item":[{"name":"List available speech-to-text providers","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/stt-providers","host":["{{baseUrl}}"],"path":["v1","stt-providers"]},"description":"Returns the STT providers agents can use. Use the returned id as the agent's sttModel."}}]},{"name":"V1 - Tools","item":[{"name":"Check whether a phone number is a mobile phone","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/tools/check-mobile","host":["{{baseUrl}}"],"path":["v1","tools","check-mobile"],"query":[{"key":"number","value":"","description":"Phone number to check","disabled":false}]},"description":"Looks up a phone number's line type. Unknown, anonymous, or too-short numbers return a graceful valid=false result instead of an error. Used by the agent runtime (e.g. to decide whether SMS is possible)."}},{"name":"Check whether a phone number is a mobile phone (webhook form)","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/tools/check-mobile","host":["{{baseUrl}}"],"path":["v1","tools","check-mobile"]},"description":"Webhook variant used by the agent runtime. Provide the number as caller_id, number, or phone_number.","body":{"mode":"raw","raw":"{\n  \"caller_id\": \"+14155552671\"\n}"}}}]},{"name":"V1 - Voices","item":[{"name":"Generate a voice preview clip","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{accessToken}}","description":"JWT Bearer token"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/v1/voices/preview","host":["{{baseUrl}}"],"path":["v1","voices","preview"]},"description":"Synthesizes a short MP3 preview of the given voice. If no text is supplied, a default greeting in the voice's language (English, Spanish, or French) is used.","body":{"mode":"raw","raw":"{\n  \"voiceId\": \"694f9389-aac1-45b6-b726-9d9369183238\",\n  \"text\": \"Thanks for calling Acme Corp, how can I help?\"\n}"}}},{"name":"List available voices","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/v1/voices","host":["{{baseUrl}}"],"path":["v1","voices"],"query":[{"key":"organizationId","value":"","description":"Tailor the catalogue to this organization - omits locked TTS vendors, and merges in its custom voices when that feature is enabled. Requires access to the organization; an inaccessible id is ignored.","disabled":true}]},"description":"Returns the full voice catalogue. When an accessible organizationId is supplied the catalogue is tailored to that organization - the voices of any TTS vendor locked for it are omitted (TLZ-505), and if it has the custom-voices feature enabled its custom (cloned) voices are merged in. An organizationId you cannot access is ignored and the full catalogue is returned."}}]}]}