@graph8/sdk 0.251.0 → 0.260.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -2
- package/dist/cli.js +216 -0
- package/dist/index.d.mts +104 -7
- package/dist/index.d.ts +104 -7
- package/dist/index.js +44 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +44 -3
- package/dist/index.mjs.map +1 -1
- package/dist/react.d.mts +102 -7
- package/dist/react.d.ts +102 -7
- package/dist/react.js +62 -11
- package/dist/react.js.map +1 -1
- package/dist/react.mjs +53 -12
- package/dist/react.mjs.map +1 -1
- package/dist/types/README.md +7 -0
- package/dist/types/agency.d.ts +20 -0
- package/dist/types/agentSetup.d.ts +57 -0
- package/dist/types/api.d.ts +127 -0
- package/dist/types/appClient.d.ts +99 -0
- package/dist/types/appPlatform.d.ts +269 -0
- package/dist/types/appTokens.d.ts +125 -0
- package/dist/types/apps.d.ts +130 -0
- package/dist/types/audiences.d.ts +88 -0
- package/dist/types/calendar.d.ts +55 -0
- package/dist/types/campaigns.d.ts +61 -0
- package/dist/types/chat.d.ts +35 -0
- package/dist/types/cli.d.ts +14 -0
- package/dist/types/companies.d.ts +123 -0
- package/dist/types/contacts.d.ts +200 -0
- package/dist/types/copilot.d.ts +31 -0
- package/dist/types/core.d.ts +1052 -0
- package/dist/types/deals.d.ts +215 -0
- package/dist/types/enrich.d.ts +51 -0
- package/dist/types/fields.d.ts +84 -0
- package/dist/types/forms.d.ts +16 -0
- package/dist/types/http.d.ts +141 -0
- package/dist/types/inbox.d.ts +123 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/intent.d.ts +196 -0
- package/dist/types/lists.d.ts +44 -0
- package/dist/types/mailboxes.d.ts +240 -0
- package/dist/types/marketplace.d.ts +62 -0
- package/dist/types/meetings.d.ts +70 -0
- package/dist/types/newsletter.d.ts +212 -0
- package/dist/types/notes.d.ts +57 -0
- package/dist/types/objects.d.ts +281 -0
- package/dist/types/pipelines.d.ts +135 -0
- package/dist/types/quotes.d.ts +143 -0
- package/dist/types/react.d.ts +978 -0
- package/dist/types/search.d.ts +99 -0
- package/dist/types/sequences.d.ts +255 -0
- package/dist/types/signals.d.ts +28 -0
- package/dist/types/skills.d.ts +176 -0
- package/dist/types/snippet.d.ts +24 -0
- package/dist/types/studio.d.ts +161 -0
- package/dist/types/tasks.d.ts +101 -0
- package/dist/types/types.d.ts +45 -0
- package/dist/types/utils.d.ts +21 -0
- package/dist/types/version.d.ts +10 -0
- package/dist/types/visitors.d.ts +29 -0
- package/dist/types/voice.d.ts +304 -0
- package/dist/types/webhooks.d.ts +71 -0
- package/dist/types/workflows.d.ts +229 -0
- package/docs/agents.md +748 -0
- package/docs/api/README.md +165 -0
- package/docs/api/accounts.d.ts +396 -0
- package/docs/api/accounts.md +644 -0
- package/docs/api/adCampaigns.d.ts +707 -0
- package/docs/api/adCampaigns.md +1091 -0
- package/docs/api/adCreatives.d.ts +996 -0
- package/docs/api/adCreatives.md +1708 -0
- package/docs/api/agency.d.ts +556 -0
- package/docs/api/agency.md +845 -0
- package/docs/api/agent.d.ts +330 -0
- package/docs/api/agent.md +514 -0
- package/docs/api/agents.d.ts +1622 -0
- package/docs/api/agents.md +2860 -0
- package/docs/api/aiInbox.d.ts +1984 -0
- package/docs/api/aiInbox.md +3490 -0
- package/docs/api/analytics.d.ts +1273 -0
- package/docs/api/analytics.md +2095 -0
- package/docs/api/apiKeys.d.ts +252 -0
- package/docs/api/apiKeys.md +318 -0
- package/docs/api/appDeployments.d.ts +236 -0
- package/docs/api/appDeployments.md +471 -0
- package/docs/api/appDomains.d.ts +171 -0
- package/docs/api/appDomains.md +281 -0
- package/docs/api/appLogs.d.ts +120 -0
- package/docs/api/appLogs.md +159 -0
- package/docs/api/appObjects.d.ts +415 -0
- package/docs/api/appObjects.md +568 -0
- package/docs/api/appPages.d.ts +557 -0
- package/docs/api/appPages.md +796 -0
- package/docs/api/appPlatformTokens.d.ts +123 -0
- package/docs/api/appPlatformTokens.md +172 -0
- package/docs/api/appointments.d.ts +2361 -0
- package/docs/api/appointments.md +3917 -0
- package/docs/api/apps.d.ts +822 -0
- package/docs/api/apps.md +1342 -0
- package/docs/api/assertUpsert.d.ts +286 -0
- package/docs/api/assertUpsert.md +370 -0
- package/docs/api/audienceSyncs.d.ts +259 -0
- package/docs/api/audienceSyncs.md +395 -0
- package/docs/api/brandKit.d.ts +686 -0
- package/docs/api/brandKit.md +1133 -0
- package/docs/api/bugReports.d.ts +181 -0
- package/docs/api/bugReports.md +268 -0
- package/docs/api/by-path.md +3260 -0
- package/docs/api/calendarInvites.d.ts +117 -0
- package/docs/api/calendarInvites.md +148 -0
- package/docs/api/campaignWorkflows.d.ts +152 -0
- package/docs/api/campaignWorkflows.md +200 -0
- package/docs/api/campaigns.d.ts +721 -0
- package/docs/api/campaigns.md +1236 -0
- package/docs/api/channels.d.ts +171 -0
- package/docs/api/channels.md +235 -0
- package/docs/api/cliCampaigns.d.ts +205 -0
- package/docs/api/cliCampaigns.md +256 -0
- package/docs/api/cliPipelines.d.ts +324 -0
- package/docs/api/cliPipelines.md +562 -0
- package/docs/api/clickHouse.d.ts +115 -0
- package/docs/api/clickHouse.md +138 -0
- package/docs/api/companies.d.ts +1636 -0
- package/docs/api/companies.md +2211 -0
- package/docs/api/companyIntelligence.d.ts +299 -0
- package/docs/api/companyIntelligence.md +488 -0
- package/docs/api/contacts.d.ts +2173 -0
- package/docs/api/contacts.md +3143 -0
- package/docs/api/content.d.ts +968 -0
- package/docs/api/content.md +1667 -0
- package/docs/api/contentGridSkills.d.ts +177 -0
- package/docs/api/contentGridSkills.md +271 -0
- package/docs/api/copilot.d.ts +1017 -0
- package/docs/api/copilot.md +1765 -0
- package/docs/api/crmSyncs.d.ts +215 -0
- package/docs/api/crmSyncs.md +301 -0
- package/docs/api/customerSuccess.d.ts +491 -0
- package/docs/api/customerSuccess.md +776 -0
- package/docs/api/deals.d.ts +1696 -0
- package/docs/api/deals.md +2432 -0
- package/docs/api/deliverability.d.ts +418 -0
- package/docs/api/deliverability.md +677 -0
- package/docs/api/desk.d.ts +1765 -0
- package/docs/api/desk.md +3007 -0
- package/docs/api/dialer.d.ts +1185 -0
- package/docs/api/dialer.md +2166 -0
- package/docs/api/dialerAnalytics.d.ts +187 -0
- package/docs/api/dialerAnalytics.md +257 -0
- package/docs/api/documents.d.ts +895 -0
- package/docs/api/documents.md +1440 -0
- package/docs/api/duplicates.d.ts +195 -0
- package/docs/api/duplicates.md +315 -0
- package/docs/api/eSign.d.ts +38 -0
- package/docs/api/eSign.md +54 -0
- package/docs/api/eSignature.d.ts +242 -0
- package/docs/api/eSignature.md +341 -0
- package/docs/api/enrichment.d.ts +3207 -0
- package/docs/api/enrichment.md +5225 -0
- package/docs/api/events.d.ts +115 -0
- package/docs/api/events.md +105 -0
- package/docs/api/fields.d.ts +482 -0
- package/docs/api/fields.md +566 -0
- package/docs/api/forms.d.ts +1012 -0
- package/docs/api/forms.md +1542 -0
- package/docs/api/gtmCampaigns.d.ts +662 -0
- package/docs/api/gtmCampaigns.md +1044 -0
- package/docs/api/gtmContext.d.ts +1187 -0
- package/docs/api/gtmContext.md +2112 -0
- package/docs/api/gtmDeliverability.d.ts +60 -0
- package/docs/api/gtmDeliverability.md +63 -0
- package/docs/api/gtmKnowledgeBase.d.ts +76 -0
- package/docs/api/gtmKnowledgeBase.md +91 -0
- package/docs/api/gtmLaunchHelpers.d.ts +123 -0
- package/docs/api/gtmLaunchHelpers.md +148 -0
- package/docs/api/gtmLibrary.d.ts +448 -0
- package/docs/api/gtmLibrary.md +780 -0
- package/docs/api/health.d.ts +39 -0
- package/docs/api/health.md +58 -0
- package/docs/api/imageLibrary.d.ts +341 -0
- package/docs/api/imageLibrary.md +569 -0
- package/docs/api/imports.d.ts +157 -0
- package/docs/api/imports.md +174 -0
- package/docs/api/inbox.d.ts +709 -0
- package/docs/api/inbox.md +1067 -0
- package/docs/api/install.d.ts +213 -0
- package/docs/api/install.md +317 -0
- package/docs/api/installedApps.d.ts +131 -0
- package/docs/api/installedApps.md +241 -0
- package/docs/api/integrationStatus.d.ts +142 -0
- package/docs/api/integrationStatus.md +205 -0
- package/docs/api/integrations.d.ts +2327 -0
- package/docs/api/integrations.md +3791 -0
- package/docs/api/intent.d.ts +482 -0
- package/docs/api/intent.md +858 -0
- package/docs/api/knowledge.d.ts +501 -0
- package/docs/api/knowledge.md +843 -0
- package/docs/api/knowledgeBase.d.ts +84 -0
- package/docs/api/knowledgeBase.md +96 -0
- package/docs/api/landingPages.d.ts +1411 -0
- package/docs/api/landingPages.md +2488 -0
- package/docs/api/leads.d.ts +133 -0
- package/docs/api/leads.md +180 -0
- package/docs/api/library.d.ts +217 -0
- package/docs/api/library.md +338 -0
- package/docs/api/linkedIn.d.ts +227 -0
- package/docs/api/linkedIn.md +289 -0
- package/docs/api/linkedInOutreach.d.ts +727 -0
- package/docs/api/linkedInOutreach.md +990 -0
- package/docs/api/lists.d.ts +1106 -0
- package/docs/api/lists.md +1609 -0
- package/docs/api/logs.d.ts +71 -0
- package/docs/api/logs.md +70 -0
- package/docs/api/mailboxes.d.ts +1050 -0
- package/docs/api/mailboxes.md +1690 -0
- package/docs/api/marketingIntelligence.d.ts +256 -0
- package/docs/api/marketingIntelligence.md +454 -0
- package/docs/api/marketplace.d.ts +3173 -0
- package/docs/api/marketplace.md +5953 -0
- package/docs/api/mcp.d.ts +69 -0
- package/docs/api/mcp.md +69 -0
- package/docs/api/me.d.ts +54 -0
- package/docs/api/me.md +56 -0
- package/docs/api/meetings.d.ts +539 -0
- package/docs/api/meetings.md +747 -0
- package/docs/api/newsletter.d.ts +1613 -0
- package/docs/api/newsletter.md +2746 -0
- package/docs/api/notes.d.ts +517 -0
- package/docs/api/notes.md +888 -0
- package/docs/api/notifications.d.ts +94 -0
- package/docs/api/notifications.md +105 -0
- package/docs/api/objects.d.ts +621 -0
- package/docs/api/objects.md +1098 -0
- package/docs/api/openSearch.d.ts +234 -0
- package/docs/api/openSearch.md +297 -0
- package/docs/api/ops.d.ts +299 -0
- package/docs/api/ops.md +339 -0
- package/docs/api/orgGovernance.d.ts +393 -0
- package/docs/api/orgGovernance.md +623 -0
- package/docs/api/orgVideos.d.ts +184 -0
- package/docs/api/orgVideos.md +252 -0
- package/docs/api/organizationSettings.d.ts +626 -0
- package/docs/api/organizationSettings.md +911 -0
- package/docs/api/phoneNumbers.d.ts +484 -0
- package/docs/api/phoneNumbers.md +777 -0
- package/docs/api/profile.d.ts +329 -0
- package/docs/api/profile.md +540 -0
- package/docs/api/programmaticPages.d.ts +400 -0
- package/docs/api/programmaticPages.md +626 -0
- package/docs/api/providerDomains.d.ts +866 -0
- package/docs/api/providerDomains.md +1446 -0
- package/docs/api/providerUsage.d.ts +129 -0
- package/docs/api/providerUsage.md +186 -0
- package/docs/api/public.d.ts +69 -0
- package/docs/api/public.md +78 -0
- package/docs/api/publicCopilot.d.ts +67 -0
- package/docs/api/publicCopilot.md +80 -0
- package/docs/api/publicSignals.d.ts +66 -0
- package/docs/api/publicSignals.md +71 -0
- package/docs/api/publicVisitors.d.ts +97 -0
- package/docs/api/publicVisitors.md +118 -0
- package/docs/api/quotes.d.ts +1564 -0
- package/docs/api/quotes.md +2553 -0
- package/docs/api/radar.d.ts +808 -0
- package/docs/api/radar.md +1431 -0
- package/docs/api/radarReports.d.ts +208 -0
- package/docs/api/radarReports.md +306 -0
- package/docs/api/recordRoles.d.ts +143 -0
- package/docs/api/recordRoles.md +175 -0
- package/docs/api/repos.d.ts +146 -0
- package/docs/api/repos.md +211 -0
- package/docs/api/research.d.ts +295 -0
- package/docs/api/research.md +534 -0
- package/docs/api/revenue.d.ts +402 -0
- package/docs/api/revenue.md +608 -0
- package/docs/api/revenueAnalytics.d.ts +147 -0
- package/docs/api/revenueAnalytics.md +212 -0
- package/docs/api/revenueLifecycle.d.ts +207 -0
- package/docs/api/revenueLifecycle.md +274 -0
- package/docs/api/revenueRecords.d.ts +372 -0
- package/docs/api/revenueRecords.md +563 -0
- package/docs/api/roles.d.ts +431 -0
- package/docs/api/roles.md +812 -0
- package/docs/api/salesCoach.d.ts +877 -0
- package/docs/api/salesCoach.md +1540 -0
- package/docs/api/sandbox.d.ts +210 -0
- package/docs/api/sandbox.md +380 -0
- package/docs/api/scans.d.ts +104 -0
- package/docs/api/scans.md +136 -0
- package/docs/api/scheduleBuy.d.ts +293 -0
- package/docs/api/scheduleBuy.md +431 -0
- package/docs/api/scraping.d.ts +266 -0
- package/docs/api/scraping.md +383 -0
- package/docs/api/sdrAnalytics.d.ts +138 -0
- package/docs/api/sdrAnalytics.md +246 -0
- package/docs/api/search.d.ts +598 -0
- package/docs/api/search.md +866 -0
- package/docs/api/seo.d.ts +447 -0
- package/docs/api/seo.md +660 -0
- package/docs/api/sequenceLifecycle.d.ts +439 -0
- package/docs/api/sequenceLifecycle.md +513 -0
- package/docs/api/sequences.d.ts +1936 -0
- package/docs/api/sequences.md +3232 -0
- package/docs/api/settings.d.ts +448 -0
- package/docs/api/settings.md +731 -0
- package/docs/api/signals.d.ts +1441 -0
- package/docs/api/signals.md +2526 -0
- package/docs/api/signatures.d.ts +719 -0
- package/docs/api/signatures.md +1247 -0
- package/docs/api/skills.d.ts +230 -0
- package/docs/api/skills.md +466 -0
- package/docs/api/snippet.d.ts +85 -0
- package/docs/api/snippet.md +106 -0
- package/docs/api/socialPublishing.d.ts +824 -0
- package/docs/api/socialPublishing.md +1245 -0
- package/docs/api/studioDocuments.d.ts +244 -0
- package/docs/api/studioDocuments.md +348 -0
- package/docs/api/support.d.ts +90 -0
- package/docs/api/support.md +76 -0
- package/docs/api/suppressions.d.ts +241 -0
- package/docs/api/suppressions.md +343 -0
- package/docs/api/surveys.d.ts +847 -0
- package/docs/api/surveys.md +1223 -0
- package/docs/api/tasks.d.ts +813 -0
- package/docs/api/tasks.md +1344 -0
- package/docs/api/teamMembers.d.ts +668 -0
- package/docs/api/teamMembers.md +1040 -0
- package/docs/api/teams.d.ts +784 -0
- package/docs/api/teams.md +1395 -0
- package/docs/api/usage.d.ts +277 -0
- package/docs/api/usage.md +389 -0
- package/docs/api/visitors.d.ts +690 -0
- package/docs/api/visitors.md +1075 -0
- package/docs/api/voice.d.ts +4661 -0
- package/docs/api/voice.md +7905 -0
- package/docs/api/webAnalytics.d.ts +964 -0
- package/docs/api/webAnalytics.md +1452 -0
- package/docs/api/webChat.d.ts +1704 -0
- package/docs/api/webChat.md +2048 -0
- package/docs/api/webhooks.d.ts +251 -0
- package/docs/api/webhooks.md +386 -0
- package/docs/api/websiteEditor.d.ts +324 -0
- package/docs/api/websiteEditor.md +517 -0
- package/docs/api/work.d.ts +2298 -0
- package/docs/api/work.md +3096 -0
- package/docs/api/workbench.d.ts +2962 -0
- package/docs/api/workbench.md +4884 -0
- package/docs/api/workflows.d.ts +1218 -0
- package/docs/api/workflows.md +2302 -0
- package/docs/sdk-clients.md +4339 -0
- package/package.json +10 -3
|
@@ -0,0 +1,2166 @@
|
|
|
1
|
+
<!-- Generated by sdk/js/scripts/generate-agent-docs.ts from developer-contract/openapi.json. Regenerated on every build. -->
|
|
2
|
+
|
|
3
|
+
# `g8.api.dialer`: Dialer
|
|
4
|
+
|
|
5
|
+
46 operations (12 read, 23 write, 2 destructive, 2 billable, 7 external).
|
|
6
|
+
|
|
7
|
+
No hand-written client covers this area. Call it through `g8.api.dialer.*` as shown below, or by operationId with `g8.api.call(operationId, input)`.
|
|
8
|
+
|
|
9
|
+
Every example below assumes this setup (server-side, API key):
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { g8 } from "@graph8/sdk";
|
|
13
|
+
|
|
14
|
+
g8.init({ apiKey: process.env.G8_API_KEY! });
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Example values are placeholders that match each field's type. Only required fields are shown. Every example is type-checked against the SDK in CI.
|
|
18
|
+
|
|
19
|
+
Exact TypeScript types for every operation on this page, and every schema they use: [dialer.d.ts](dialer.d.ts).
|
|
20
|
+
|
|
21
|
+
## Operations
|
|
22
|
+
|
|
23
|
+
| Call | HTTP | Tier | Scope | Summary |
|
|
24
|
+
|---|---|---|---|---|
|
|
25
|
+
| [`backfillGrading`](#op-backfillgrading) | `POST /api/v1/dialer/parallel-calls/grading/backfill` | billable | `voice:run` | Backfill Grading |
|
|
26
|
+
| [`checkCampaignReadiness`](#op-checkcampaignreadiness) | `GET /api/v1/dialer/parallel-calls/grading/campaign-readiness` | read | `voice:read` | Check Campaign Readiness |
|
|
27
|
+
| [`checkRecordingOwnership`](#op-checkrecordingownership) | `GET /api/v1/dialer/parallel-calls/recordings/ownership` | read | `voice:read` | Check Recording Ownership |
|
|
28
|
+
| [`clearSdrTargets`](#op-clearsdrtargets) | `DELETE /api/v1/dialer/parallel-calls/targets/sdr` | destructive | `voice:write` | Clear Sdr Targets |
|
|
29
|
+
| [`createPausedParallelSession`](#op-createpausedparallelsession) | `POST /api/v1/dialer/parallel-calls/sessions` | write | `voice:write` | Create Paused Parallel Session |
|
|
30
|
+
| [`createSessionDraft`](#op-createsessiondraft) | `POST /api/v1/dialer/sessions/draft` | write | `voice:write` | Create Session Draft |
|
|
31
|
+
| [`declineTransfer`](#op-declinetransfer) | `POST /api/v1/dialer/transfer/{call_id}/decline` | write | `voice:write` | Decline Transfer |
|
|
32
|
+
| [`deleteCustomDisposition`](#op-deletecustomdisposition) | `DELETE /api/v1/dialer/dispositions/{disposition_id}` | destructive | `voice:write` | Delete Custom Disposition |
|
|
33
|
+
| [`dialNextBatch`](#op-dialnextbatch) | `POST /api/v1/dialer/sessions/{session_id}/next-batch` | external | `voice:run` | Dial Next Batch |
|
|
34
|
+
| [`dropParallelVoicemail`](#op-dropparallelvoicemail) | `POST /api/v1/dialer/parallel-calls/calls/{livekit_room_name}/drop-voicemail` | external | `voice:run` | Drop Parallel Voicemail |
|
|
35
|
+
| [`dropSessionVoicemail`](#op-dropsessionvoicemail) | `POST /api/v1/dialer/sessions/calls/drop-voicemail` | external | `voice:run` | Drop Session Voicemail |
|
|
36
|
+
| [`hangupParallelCall`](#op-hangupparallelcall) | `POST /api/v1/dialer/parallel-calls/calls/hangup` | write | `voice:write` | Hangup Parallel Call |
|
|
37
|
+
| [`hangupSessionCall`](#op-hangupsessioncall) | `POST /api/v1/dialer/sessions/calls/hangup` | write | `voice:write` | Hangup Session Call |
|
|
38
|
+
| [`listContactIdsByDisposition`](#op-listcontactidsbydisposition) | `GET /api/v1/dialer/parallel-calls/sessions/{session_id}/contact-ids-by-disposition` | read | `voice:read` | List Contact Ids By Disposition |
|
|
39
|
+
| [`listTransferDepartments`](#op-listtransferdepartments) | `GET /api/v1/dialer/transfer/departments` | read | `voice:read` | List Transfer Departments |
|
|
40
|
+
| [`manualDial`](#op-manualdial) | `POST /api/v1/dialer/parallel-calls/manual-dial` | external | `voice:run` | Manual Dial |
|
|
41
|
+
| [`markAllMissedCallbacksSeen`](#op-markallmissedcallbacksseen) | `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/seen-all` | write | `voice:write` | Mark All Missed Callbacks Seen |
|
|
42
|
+
| [`markGradingReviewed`](#op-markgradingreviewed) | `POST /api/v1/dialer/parallel-calls/calls/{livekit_room_name}/grading/review` | write | `voice:write` | Mark Grading Reviewed |
|
|
43
|
+
| [`markMissedCallbacksSeen`](#op-markmissedcallbacksseen) | `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/seen` | write | `voice:write` | Mark Missed Callbacks Seen |
|
|
44
|
+
| [`mintSessionWsTicket`](#op-mintsessionwsticket) | `POST /api/v1/dialer/sessions/{session_id}/ws-ticket` | write | `voice:write` | Mint Session Ws Ticket |
|
|
45
|
+
| [`mintSoftphoneToken`](#op-mintsoftphonetoken) | `GET /api/v1/dialer/sessions/token` | external | `voice:run` | Mint Softphone Token |
|
|
46
|
+
| [`mintTranscriptWsTicket`](#op-minttranscriptwsticket) | `POST /api/v1/dialer/sessions/calls/{call_id}/ws-ticket` | write | `voice:write` | Mint Transcript Ws Ticket |
|
|
47
|
+
| [`muteCall`](#op-mutecall) | `POST /api/v1/dialer/sessions/calls/mute` | write | `voice:write` | Mute Call |
|
|
48
|
+
| [`prewarmVoicemails`](#op-prewarmvoicemails) | `POST /api/v1/dialer/sessions/prewarm-voicemails` | billable | `voice:run` | Prewarm Voicemails |
|
|
49
|
+
| [`readAllSdrTargets`](#op-readallsdrtargets) | `GET /api/v1/dialer/parallel-calls/targets/all-sdrs` | read | `voice:read` | Read All Sdr Targets |
|
|
50
|
+
| [`readDialerPreferences`](#op-readdialerpreferences) | `GET /api/v1/dialer/settings/preferences/{user_email}` | read | `voice:read` | Read Dialer Preferences |
|
|
51
|
+
| [`readDialerReport`](#op-readdialerreport) | `GET /api/v1/dialer/parallel-calls/analytics/dialer-report` | read | `voice:read` | Read Dialer Report |
|
|
52
|
+
| [`readOrgTargets`](#op-readorgtargets) | `GET /api/v1/dialer/parallel-calls/targets` | read | `voice:read` | Read Org Targets |
|
|
53
|
+
| [`readProviderReceipt`](#op-readproviderreceipt) | `GET /api/v1/dialer/sessions/assurance/provider-receipt` | read | `voice:read` | Read Provider Receipt |
|
|
54
|
+
| [`readQueueStats`](#op-readqueuestats) | `GET /api/v1/dialer/sessions/{session_id}/queue-stats` | read | `voice:read` | Read Queue Stats |
|
|
55
|
+
| [`readSessionGrid`](#op-readsessiongrid) | `POST /api/v1/dialer/sessions/{session_id}/grid` | read | `voice:read` | Read Session Grid |
|
|
56
|
+
| [`readTransferStatus`](#op-readtransferstatus) | `GET /api/v1/dialer/transfer/{call_id}` | read | `voice:read` | Read Transfer Status |
|
|
57
|
+
| [`redialContact`](#op-redialcontact) | `POST /api/v1/dialer/parallel-calls/redial-contact` | external | `voice:run` | Redial Contact |
|
|
58
|
+
| [`resolveMissedCallbacks`](#op-resolvemissedcallbacks) | `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/resolve` | write | `voice:write` | Resolve Missed Callbacks |
|
|
59
|
+
| [`setCallDisposition`](#op-setcalldisposition) | `PATCH /api/v1/dialer/parallel-calls/calls/{livekit_room_name}/disposition` | write | `voice:write` | Set Call Disposition |
|
|
60
|
+
| [`setDialerPreferences`](#op-setdialerpreferences) | `PUT /api/v1/dialer/settings/preferences` | write | `voice:write` | Set Dialer Preferences |
|
|
61
|
+
| [`setOrgTargets`](#op-setorgtargets) | `PUT /api/v1/dialer/parallel-calls/targets` | write | `voice:write` | Set Org Targets |
|
|
62
|
+
| [`setSdrTargets`](#op-setsdrtargets) | `PUT /api/v1/dialer/parallel-calls/targets/sdr` | write | `voice:write` | Set Sdr Targets |
|
|
63
|
+
| [`skipContact`](#op-skipcontact) | `POST /api/v1/dialer/sessions/{session_id}/calls/skip-contact` | write | `voice:write` | Skip Contact |
|
|
64
|
+
| [`startParallelSession`](#op-startparallelsession) | `POST /api/v1/dialer/parallel-calls/sessions/start` | external | `voice:run` | Start Parallel Session |
|
|
65
|
+
| [`unresolveMissedCallbacks`](#op-unresolvemissedcallbacks) | `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/unresolve` | write | `voice:write` | Unresolve Missed Callbacks |
|
|
66
|
+
| [`unskipContact`](#op-unskipcontact) | `POST /api/v1/dialer/sessions/{session_id}/calls/unskip-contact` | write | `voice:write` | Unskip Contact |
|
|
67
|
+
| [`updateRedialState`](#op-updateredialstate) | `PATCH /api/v1/dialer/parallel-calls/sessions/{session_id}/redial-state` | write | `voice:write` | Update Redial State |
|
|
68
|
+
| [`updateSessionBookingEventType`](#op-updatesessionbookingeventtype) | `PATCH /api/v1/dialer/sessions/{session_id}/booking-event-type` | write | `voice:write` | Update Session Booking Event Type |
|
|
69
|
+
| [`updateSessionFilter`](#op-updatesessionfilter) | `PATCH /api/v1/dialer/sessions/{session_id}/filter-spec` | write | `voice:write` | Update Session Filter |
|
|
70
|
+
| [`updateSessionHiddenFields`](#op-updatesessionhiddenfields) | `PATCH /api/v1/dialer/sessions/{session_id}/hidden-custom-fields` | write | `voice:write` | Update Session Hidden Fields |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
<a id="op-backfillgrading"></a>
|
|
75
|
+
|
|
76
|
+
### `g8.api.dialer.backfillGrading(input?)`
|
|
77
|
+
|
|
78
|
+
**Backfill Grading**
|
|
79
|
+
|
|
80
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/grading/backfill`
|
|
81
|
+
- operationId: `backfill_grading_dialer_parallel_calls_grading_backfill_post` (also callable as `g8.api.call("backfill_grading_dialer_parallel_calls_grading_backfill_post", input)`)
|
|
82
|
+
- Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
|
|
83
|
+
- API-key scope: `voice:run`
|
|
84
|
+
|
|
85
|
+
CONTACTS NOBODY - but it SPENDS, and it can spend a lot.
|
|
86
|
+
|
|
87
|
+
With `dry_run=false` this runs AI grading over EVERY ungraded call with a
|
|
88
|
+
transcript in the window - a model invocation each, one call every two
|
|
89
|
+
seconds, with no ceiling other than how many calls exist. On a busy
|
|
90
|
+
organisation over 365 days that is an unbounded bill from one request.
|
|
91
|
+
|
|
92
|
+
`dry_run` defaults to TRUE and genuinely short-circuits before any grading
|
|
93
|
+
(`parallel_calls.py:4602`), returning the eligible count and a sample.
|
|
94
|
+
Call it that way first and read the count.
|
|
95
|
+
|
|
96
|
+
Tiered `billable`, not `write`: it reaches a paid model per record.
|
|
97
|
+
|
|
98
|
+
**Input**
|
|
99
|
+
|
|
100
|
+
| Field | Type | Required | Description |
|
|
101
|
+
|---|---|---|---|
|
|
102
|
+
| `query.days` | `integer` | no | How far back to look. default `30` |
|
|
103
|
+
| `query.dry_run` | `boolean` | no | `true` counts and samples; `false` GRADES AND SPENDS. default `true` |
|
|
104
|
+
|
|
105
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
106
|
+
|
|
107
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
108
|
+
|
|
109
|
+
**Example**
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
// billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
|
|
113
|
+
const result = await g8.api.dialer.backfillGrading();
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
<a id="op-checkcampaignreadiness"></a>
|
|
119
|
+
|
|
120
|
+
### `g8.api.dialer.checkCampaignReadiness(input?)`
|
|
121
|
+
|
|
122
|
+
**Check Campaign Readiness**
|
|
123
|
+
|
|
124
|
+
- HTTP: `GET /api/v1/dialer/parallel-calls/grading/campaign-readiness`
|
|
125
|
+
- operationId: `check_campaign_readiness_dialer_parallel_calls_grading_campaign_readiness_get` (also callable as `g8.api.call("check_campaign_readiness_dialer_parallel_calls_grading_campaign_readiness_get", input)`)
|
|
126
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
127
|
+
- API-key scope: `voice:read`
|
|
128
|
+
|
|
129
|
+
CONTACTS NOBODY. Whether this org has enough graded calls to report on.
|
|
130
|
+
|
|
131
|
+
A precondition check for the grading dashboards. Reads only.
|
|
132
|
+
|
|
133
|
+
**Input**: none.
|
|
134
|
+
|
|
135
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
136
|
+
|
|
137
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
138
|
+
|
|
139
|
+
**Example**
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
const result = await g8.api.dialer.checkCampaignReadiness();
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
<a id="op-checkrecordingownership"></a>
|
|
148
|
+
|
|
149
|
+
### `g8.api.dialer.checkRecordingOwnership(input)`
|
|
150
|
+
|
|
151
|
+
**Check Recording Ownership**
|
|
152
|
+
|
|
153
|
+
- HTTP: `GET /api/v1/dialer/parallel-calls/recordings/ownership`
|
|
154
|
+
- operationId: `check_recording_ownership_dialer_parallel_calls_recordings_ownership_get` (also callable as `g8.api.call("check_recording_ownership_dialer_parallel_calls_recordings_ownership_get", input)`)
|
|
155
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
156
|
+
- API-key scope: `voice:read`
|
|
157
|
+
|
|
158
|
+
CONTACTS NOBODY. Does THIS organisation own the recording at `url`?
|
|
159
|
+
|
|
160
|
+
Answered from the call rows rather than the storage prefix, because
|
|
161
|
+
recordings moved between organisations by the merge migration keep the
|
|
162
|
+
SOURCE org's prefix while belonging to the target. Fail-closed: anything
|
|
163
|
+
that goes wrong answers "not owned".
|
|
164
|
+
|
|
165
|
+
The organisation asked about is always the key's own - it is not a
|
|
166
|
+
parameter, so this cannot be used to probe another tenant's storage.
|
|
167
|
+
|
|
168
|
+
**Input**
|
|
169
|
+
|
|
170
|
+
| Field | Type | Required | Description |
|
|
171
|
+
|---|---|---|---|
|
|
172
|
+
| `query.url` | `string` | yes | Stored recording URL. |
|
|
173
|
+
|
|
174
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
175
|
+
|
|
176
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
177
|
+
|
|
178
|
+
**Example**
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
const result = await g8.api.dialer.checkRecordingOwnership({ query: { url: "https://example.com" } });
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
<a id="op-clearsdrtargets"></a>
|
|
187
|
+
|
|
188
|
+
### `g8.api.dialer.clearSdrTargets(input)`
|
|
189
|
+
|
|
190
|
+
**Clear Sdr Targets**
|
|
191
|
+
|
|
192
|
+
- HTTP: `DELETE /api/v1/dialer/parallel-calls/targets/sdr`
|
|
193
|
+
- operationId: `clear_sdr_targets_dialer_parallel_calls_targets_sdr_delete` (also callable as `g8.api.call("clear_sdr_targets_dialer_parallel_calls_targets_sdr_delete", input)`)
|
|
194
|
+
- Tier: `destructive`: deletes or archives data; confirm with a human before calling
|
|
195
|
+
- API-key scope: `voice:write`
|
|
196
|
+
|
|
197
|
+
CONTACTS NOBODY. Removes one rep's override; they fall back to the org goal.
|
|
198
|
+
|
|
199
|
+
Self-gated on the EXISTING `voice:write` scope rather than minting a
|
|
200
|
+
`voice:delete` for two routes - `action_for()` maps DELETE to a `delete`
|
|
201
|
+
action unconditionally otherwise, and a new scope strands every key minted
|
|
202
|
+
before it. Same choice `DELETE /voice/agents/{agent_id}` already made.
|
|
203
|
+
|
|
204
|
+
**Input**
|
|
205
|
+
|
|
206
|
+
| Field | Type | Required | Description |
|
|
207
|
+
|---|---|---|---|
|
|
208
|
+
| `query.sdr_email` | `string` | yes | The rep whose override is removed. |
|
|
209
|
+
|
|
210
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
211
|
+
|
|
212
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
213
|
+
|
|
214
|
+
**Example**
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
// destructive: deletes or archives data; confirm with a human before calling.
|
|
218
|
+
const result = await g8.api.dialer.clearSdrTargets({ query: { sdr_email: "jane@acme.com" } });
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
<a id="op-createpausedparallelsession"></a>
|
|
224
|
+
|
|
225
|
+
### `g8.api.dialer.createPausedParallelSession(input)`
|
|
226
|
+
|
|
227
|
+
**Create Paused Parallel Session**
|
|
228
|
+
|
|
229
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/sessions`
|
|
230
|
+
- operationId: `create_paused_parallel_session_dialer_parallel_calls_sessions_post` (also callable as `g8.api.call("create_paused_parallel_session_dialer_parallel_calls_sessions_post", input)`)
|
|
231
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
232
|
+
- API-key scope: `voice:write`
|
|
233
|
+
|
|
234
|
+
CONTACTS NOBODY. Creates a PAUSED parallel session.
|
|
235
|
+
|
|
236
|
+
The session exists and is configured, and not one telephone rings. This is
|
|
237
|
+
the safe half of the pair - `POST /dialer/parallel-calls/sessions/start`
|
|
238
|
+
is the half that dials.
|
|
239
|
+
|
|
240
|
+
Published as a POST to the collection precisely because that is what a
|
|
241
|
+
customer will reach for first, and the harmless operation should be the
|
|
242
|
+
one they land on by guessing.
|
|
243
|
+
|
|
244
|
+
**Input**
|
|
245
|
+
|
|
246
|
+
| Field | Type | Required | Description |
|
|
247
|
+
|---|---|---|---|
|
|
248
|
+
| `body` | `CreatePausedSessionRequest` | yes | Request body; fields below. |
|
|
249
|
+
|
|
250
|
+
Body fields (`CreatePausedSessionRequest`):
|
|
251
|
+
|
|
252
|
+
| Field | Type | Required | Description |
|
|
253
|
+
|---|---|---|---|
|
|
254
|
+
| `body.from_phone` | `string` | yes | |
|
|
255
|
+
| `body.user_id` | `string` | yes | |
|
|
256
|
+
| `body.campaign_builder_campaign_id` | `string \| null` | no | |
|
|
257
|
+
| `body.campaign_id` | `string \| null` | no | |
|
|
258
|
+
| `body.dialing_mode` | `"power" \| "parallel" \| null` | no | |
|
|
259
|
+
| `body.name` | `string \| null` | no | |
|
|
260
|
+
| `body.parallel_count` | `integer \| null` | no | |
|
|
261
|
+
| `body.session_id` | `string \| null` | no | |
|
|
262
|
+
| `body.session_metadata` | `SessionMetadataIn \| null` | no | |
|
|
263
|
+
| `body.user_email` | `string \| null` | no | |
|
|
264
|
+
|
|
265
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
266
|
+
|
|
267
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
268
|
+
|
|
269
|
+
**Example**
|
|
270
|
+
|
|
271
|
+
```ts
|
|
272
|
+
const result = await g8.api.dialer.createPausedParallelSession({ body: { from_phone: "+15555550100", user_id: "id" } });
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
---
|
|
276
|
+
|
|
277
|
+
<a id="op-createsessiondraft"></a>
|
|
278
|
+
|
|
279
|
+
### `g8.api.dialer.createSessionDraft(input)`
|
|
280
|
+
|
|
281
|
+
**Create Session Draft**
|
|
282
|
+
|
|
283
|
+
- HTTP: `POST /api/v1/dialer/sessions/draft`
|
|
284
|
+
- operationId: `create_session_draft_dialer_sessions_draft_post` (also callable as `g8.api.call("create_session_draft_dialer_sessions_draft_post", input)`)
|
|
285
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
286
|
+
- API-key scope: `voice:write`
|
|
287
|
+
|
|
288
|
+
CONTACTS NOBODY. Creates a DRAFT session and dials no one.
|
|
289
|
+
|
|
290
|
+
The safe first step: it resolves the list or sequence, snapshots the
|
|
291
|
+
filter, and stops. `POST /dialer/sessions/{id}/next-batch` is what turns a
|
|
292
|
+
draft into ringing telephones.
|
|
293
|
+
|
|
294
|
+
Not idempotent in the way it looks: voice REUSES a live session for the
|
|
295
|
+
same list rather than creating a second one, so calling this twice does
|
|
296
|
+
not double-dial - it returns the existing session. `from_phone` is
|
|
297
|
+
optional here and enforced at dial time.
|
|
298
|
+
|
|
299
|
+
**Input**
|
|
300
|
+
|
|
301
|
+
| Field | Type | Required | Description |
|
|
302
|
+
|---|---|---|---|
|
|
303
|
+
| `body` | `SessionDraftRequest` | yes | Request body; fields below. |
|
|
304
|
+
|
|
305
|
+
Body fields (`SessionDraftRequest`):
|
|
306
|
+
|
|
307
|
+
| Field | Type | Required | Description |
|
|
308
|
+
|---|---|---|---|
|
|
309
|
+
| `body.user_id` | `string` | yes | |
|
|
310
|
+
| `body.agent_id` | `string \| null` | no | |
|
|
311
|
+
| `body.campaign_builder_campaign_id` | `string \| null` | no | |
|
|
312
|
+
| `body.campaign_id` | `string \| null` | no | |
|
|
313
|
+
| `body.dialing_mode` | `"power" \| "parallel" \| null` | no | |
|
|
314
|
+
| `body.entity_type` | `string \| null` | no | |
|
|
315
|
+
| `body.filter_spec` | `FilterSpec \| null` | no | |
|
|
316
|
+
| `body.from_phone` | `string \| null` | no | |
|
|
317
|
+
| `body.list_id` | `string \| null` | no | |
|
|
318
|
+
| `body.list_title` | `string \| null` | no | |
|
|
319
|
+
| `body.name` | `string \| null` | no | |
|
|
320
|
+
| `body.order_spec` | `OrderSpec \| null` | no | |
|
|
321
|
+
| `body.parallel_count` | `integer` | no | default `1` |
|
|
322
|
+
| `body.selected_event_type_id` | `integer \| null` | no | |
|
|
323
|
+
| `body.sequence_id` | `string \| null` | no | |
|
|
324
|
+
| `body.sequence_step_order` | `integer \| null` | no | |
|
|
325
|
+
| `body.user_email` | `string \| null` | no | |
|
|
326
|
+
| `body.user_timezone` | `string \| null` | no | default `"America/New_York"` |
|
|
327
|
+
|
|
328
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
329
|
+
|
|
330
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
331
|
+
|
|
332
|
+
**Example**
|
|
333
|
+
|
|
334
|
+
```ts
|
|
335
|
+
const result = await g8.api.dialer.createSessionDraft({ body: { user_id: "id" } });
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
<a id="op-declinetransfer"></a>
|
|
341
|
+
|
|
342
|
+
### `g8.api.dialer.declineTransfer(input)`
|
|
343
|
+
|
|
344
|
+
**Decline Transfer**
|
|
345
|
+
|
|
346
|
+
- HTTP: `POST /api/v1/dialer/transfer/{call_id}/decline`
|
|
347
|
+
- operationId: `decline_transfer_dialer_transfer__call_id__decline_post` (also callable as `g8.api.call("decline_transfer_dialer_transfer__call_id__decline_post", input)`)
|
|
348
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
349
|
+
- API-key scope: `voice:write`
|
|
350
|
+
|
|
351
|
+
AFFECTS A LIVE CALL WITH A PERSON ON IT, but places no new call.
|
|
352
|
+
|
|
353
|
+
The colleague passes on the transfer. The CALLER - a real human - STAYS ON
|
|
354
|
+
HOLD until the ring times out; declining does not hang up on them and does
|
|
355
|
+
not tell them anything. Worth knowing before wiring this to an
|
|
356
|
+
auto-decline rule.
|
|
357
|
+
|
|
358
|
+
**Input**
|
|
359
|
+
|
|
360
|
+
| Field | Type | Required | Description |
|
|
361
|
+
|---|---|---|---|
|
|
362
|
+
| `path.call_id` | `string` | yes | Call being transferred. |
|
|
363
|
+
|
|
364
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
365
|
+
|
|
366
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
367
|
+
|
|
368
|
+
**Example**
|
|
369
|
+
|
|
370
|
+
```ts
|
|
371
|
+
const result = await g8.api.dialer.declineTransfer({ path: { call_id: "id" } });
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
---
|
|
375
|
+
|
|
376
|
+
<a id="op-deletecustomdisposition"></a>
|
|
377
|
+
|
|
378
|
+
### `g8.api.dialer.deleteCustomDisposition(input)`
|
|
379
|
+
|
|
380
|
+
**Delete Custom Disposition**
|
|
381
|
+
|
|
382
|
+
- HTTP: `DELETE /api/v1/dialer/dispositions/{disposition_id}`
|
|
383
|
+
- operationId: `delete_custom_disposition_dialer_dispositions__disposition_id__delete` (also callable as `g8.api.call("delete_custom_disposition_dialer_dispositions__disposition_id__delete", input)`)
|
|
384
|
+
- Tier: `destructive`: deletes or archives data; confirm with a human before calling
|
|
385
|
+
- API-key scope: `voice:write`
|
|
386
|
+
|
|
387
|
+
CONTACTS NOBODY. Deletes one of the organisation's CUSTOM dispositions.
|
|
388
|
+
|
|
389
|
+
The gap `voice_router` named as deliberately absent - "voice's own
|
|
390
|
+
dispositions router never exposed a delete endpoint" - which is no longer
|
|
391
|
+
true: it does, and this publishes it.
|
|
392
|
+
|
|
393
|
+
REFUSED WITH 409 IF ANY CALL IS ALREADY DISPOSITIONED WITH IT. So this
|
|
394
|
+
only ever removes an unused value - history cannot be rewritten by it, and
|
|
395
|
+
a 409 means "this one is in use", not "try again".
|
|
396
|
+
|
|
397
|
+
The organisation is carried in a HEADER, not the path, and voice resolves
|
|
398
|
+
the row with it (`_load_disposition_for_org`). It is the key's own org, so
|
|
399
|
+
one tenant cannot delete another's vocabulary by guessing an id.
|
|
400
|
+
|
|
401
|
+
ADMIN ONLY, and that gate is declared HERE. Voice declares
|
|
402
|
+
`require_org_admin()` on its own route, and for a server-to-server call
|
|
403
|
+
that dependency finds no bearer token and - with
|
|
404
|
+
`ENFORCE_VOICE_PERMISSIONS` off, which is everywhere today - ALLOWS the
|
|
405
|
+
request. `require_org_admin` from `developer_api.dependencies.admin` is
|
|
406
|
+
the one actually protecting this, and it refuses machine keys outright:
|
|
407
|
+
deleting shared org vocabulary needs a personal key held by an Admin or
|
|
408
|
+
Owner.
|
|
409
|
+
|
|
410
|
+
**Input**
|
|
411
|
+
|
|
412
|
+
| Field | Type | Required | Description |
|
|
413
|
+
|---|---|---|---|
|
|
414
|
+
| `path.disposition_id` | `integer` | yes | Custom disposition id. |
|
|
415
|
+
|
|
416
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
417
|
+
|
|
418
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
419
|
+
|
|
420
|
+
**Example**
|
|
421
|
+
|
|
422
|
+
```ts
|
|
423
|
+
// destructive: deletes or archives data; confirm with a human before calling.
|
|
424
|
+
const result = await g8.api.dialer.deleteCustomDisposition({ path: { disposition_id: 123 } });
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
---
|
|
428
|
+
|
|
429
|
+
<a id="op-dialnextbatch"></a>
|
|
430
|
+
|
|
431
|
+
### `g8.api.dialer.dialNextBatch(input)`
|
|
432
|
+
|
|
433
|
+
**Dial Next Batch**
|
|
434
|
+
|
|
435
|
+
- HTTP: `POST /api/v1/dialer/sessions/{session_id}/next-batch`
|
|
436
|
+
- operationId: `dial_next_batch_dialer_sessions__session_id__next_batch_post` (also callable as `g8.api.call("dial_next_batch_dialer_sessions__session_id__next_batch_post", input)`)
|
|
437
|
+
- Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
|
|
438
|
+
- API-key scope: `voice:run`
|
|
439
|
+
|
|
440
|
+
*** CALLS REAL PEOPLE. *** This is the operation that dials.
|
|
441
|
+
|
|
442
|
+
Voice's own words for this handler are "the one-and-only dial path for
|
|
443
|
+
BE-owned queue sessions" (`dialer_sessions.py:2272`). It picks the next
|
|
444
|
+
contacts off the queue and places outbound calls to them, transitioning
|
|
445
|
+
the session DRAFT -> ACTIVE or PAUSED -> ACTIVE on the way.
|
|
446
|
+
|
|
447
|
+
`parallel_count` is HOW MANY PEOPLE ARE CALLED AT ONCE. Sending it with a
|
|
448
|
+
session configured for one is how a power-dial becomes a parallel dial.
|
|
449
|
+
|
|
450
|
+
Each attempt reserves credits and each connected minute charges more, so
|
|
451
|
+
this both spends money and reaches strangers. It is tiered `external`
|
|
452
|
+
rather than `write` for exactly that reason: "dial the next twenty people"
|
|
453
|
+
must not be grantable by the same scope as "rename a session".
|
|
454
|
+
|
|
455
|
+
`filter_spec` sent here CHANGES WHO IS ELIGIBLE before the batch is
|
|
456
|
+
picked. It is not a display filter.
|
|
457
|
+
|
|
458
|
+
**Input**
|
|
459
|
+
|
|
460
|
+
| Field | Type | Required | Description |
|
|
461
|
+
|---|---|---|---|
|
|
462
|
+
| `path.session_id` | `string` | yes | Session to dial. |
|
|
463
|
+
| `body` | `NextBatchRequest` | no | Request body; fields below. |
|
|
464
|
+
|
|
465
|
+
Body fields (`NextBatchRequest`):
|
|
466
|
+
|
|
467
|
+
| Field | Type | Required | Description |
|
|
468
|
+
|---|---|---|---|
|
|
469
|
+
| `body.agent_id` | `string \| null` | no | |
|
|
470
|
+
| `body.campaign_builder_campaign_id` | `string \| null` | no | |
|
|
471
|
+
| `body.campaign_id` | `string \| null` | no | |
|
|
472
|
+
| `body.dialing_mode` | `"power" \| "parallel" \| null` | no | |
|
|
473
|
+
| `body.entity_type` | `string \| null` | no | |
|
|
474
|
+
| `body.filter_spec` | `FilterSpec \| null` | no | |
|
|
475
|
+
| `body.force_next_contact` | `ForceNextContact \| null` | no | |
|
|
476
|
+
| `body.from_phone` | `string \| null` | no | |
|
|
477
|
+
| `body.from_phone_scope` | `string \| null` | no | |
|
|
478
|
+
| `body.order_spec` | `OrderSpec \| null` | no | |
|
|
479
|
+
| `body.parallel_count` | `integer \| null` | no | |
|
|
480
|
+
| `body.previous_batch_id` | `string \| null` | no | |
|
|
481
|
+
| `body.resume_intent` | `boolean` | no | default `false` |
|
|
482
|
+
| `body.user_email` | `string \| null` | no | |
|
|
483
|
+
|
|
484
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
485
|
+
|
|
486
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
487
|
+
|
|
488
|
+
**Example**
|
|
489
|
+
|
|
490
|
+
```ts
|
|
491
|
+
// external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
|
|
492
|
+
const result = await g8.api.dialer.dialNextBatch({ path: { session_id: "id" } });
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
---
|
|
496
|
+
|
|
497
|
+
<a id="op-dropparallelvoicemail"></a>
|
|
498
|
+
|
|
499
|
+
### `g8.api.dialer.dropParallelVoicemail(input)`
|
|
500
|
+
|
|
501
|
+
**Drop Parallel Voicemail**
|
|
502
|
+
|
|
503
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/calls/{livekit_room_name}/drop-voicemail`
|
|
504
|
+
- operationId: `drop_parallel_voicemail_dialer_parallel_calls_calls__livekit_room_name__drop_voicemail_post` (also callable as `g8.api.call("drop_parallel_voicemail_dialer_parallel_calls_calls__livekit_room_name__drop_voicemail_post", input)`)
|
|
505
|
+
- Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
|
|
506
|
+
- API-key scope: `voice:run`
|
|
507
|
+
|
|
508
|
+
*** REACHES A REAL PERSON. *** Leaves a voicemail and hangs up.
|
|
509
|
+
|
|
510
|
+
The script is played in the rep's cloned voice and the call is closed with
|
|
511
|
+
disposition `voicemail`. The person hears it. There is no undo.
|
|
512
|
+
|
|
513
|
+
The command is queued for the agent on the call (a 120-second window), so
|
|
514
|
+
a 200 means "accepted", not "already played". Tiered `external`.
|
|
515
|
+
|
|
516
|
+
**Input**
|
|
517
|
+
|
|
518
|
+
| Field | Type | Required | Description |
|
|
519
|
+
|---|---|---|---|
|
|
520
|
+
| `path.livekit_room_name` | `string` | yes | Room name of the live call. |
|
|
521
|
+
|
|
522
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
523
|
+
|
|
524
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
525
|
+
|
|
526
|
+
**Example**
|
|
527
|
+
|
|
528
|
+
```ts
|
|
529
|
+
// external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
|
|
530
|
+
const result = await g8.api.dialer.dropParallelVoicemail({ path: { livekit_room_name: "Example" } });
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
<a id="op-dropsessionvoicemail"></a>
|
|
536
|
+
|
|
537
|
+
### `g8.api.dialer.dropSessionVoicemail(input)`
|
|
538
|
+
|
|
539
|
+
**Drop Session Voicemail**
|
|
540
|
+
|
|
541
|
+
- HTTP: `POST /api/v1/dialer/sessions/calls/drop-voicemail`
|
|
542
|
+
- operationId: `drop_session_voicemail_dialer_sessions_calls_drop_voicemail_post` (also callable as `g8.api.call("drop_session_voicemail_dialer_sessions_calls_drop_voicemail_post", input)`)
|
|
543
|
+
- Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
|
|
544
|
+
- API-key scope: `voice:run`
|
|
545
|
+
|
|
546
|
+
*** REACHES A REAL PERSON. *** Leaves a voicemail on their phone.
|
|
547
|
+
|
|
548
|
+
The recording is played in the rep's CLONED VOICE and the call is then
|
|
549
|
+
hung up with disposition `voicemail`. The person hears it; there is no
|
|
550
|
+
undo, and a wrong `call_id` leaves the message on the wrong stranger's
|
|
551
|
+
phone.
|
|
552
|
+
|
|
553
|
+
Tiered `external`, not `write`: it reaches a human outside graph8.
|
|
554
|
+
|
|
555
|
+
**Input**
|
|
556
|
+
|
|
557
|
+
| Field | Type | Required | Description |
|
|
558
|
+
|---|---|---|---|
|
|
559
|
+
| `body` | `VoicemailDropRequest` | yes | Request body; fields below. |
|
|
560
|
+
|
|
561
|
+
Body fields (`VoicemailDropRequest`):
|
|
562
|
+
|
|
563
|
+
| Field | Type | Required | Description |
|
|
564
|
+
|---|---|---|---|
|
|
565
|
+
| `body.call_id` | `string` | yes | |
|
|
566
|
+
| `body.session_id` | `string` | yes | |
|
|
567
|
+
|
|
568
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
569
|
+
|
|
570
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
571
|
+
|
|
572
|
+
**Example**
|
|
573
|
+
|
|
574
|
+
```ts
|
|
575
|
+
// external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
|
|
576
|
+
const result = await g8.api.dialer.dropSessionVoicemail({ body: { call_id: "id", session_id: "id" } });
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
<a id="op-hangupparallelcall"></a>
|
|
582
|
+
|
|
583
|
+
### `g8.api.dialer.hangupParallelCall(input)`
|
|
584
|
+
|
|
585
|
+
**Hangup Parallel Call**
|
|
586
|
+
|
|
587
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/calls/hangup`
|
|
588
|
+
- operationId: `hangup_parallel_call_dialer_parallel_calls_calls_hangup_post` (also callable as `g8.api.call("hangup_parallel_call_dialer_parallel_calls_calls_hangup_post", input)`)
|
|
589
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
590
|
+
- API-key scope: `voice:write`
|
|
591
|
+
|
|
592
|
+
CONTACTS NOBODY NEW. Ends one leg of a parallel session.
|
|
593
|
+
|
|
594
|
+
The other legs keep ringing. Gated on `voice:dialer:control`, the same
|
|
595
|
+
permission voice declares - re-declared here because voice's own gate does
|
|
596
|
+
not run for a server-to-server call.
|
|
597
|
+
|
|
598
|
+
**Input**
|
|
599
|
+
|
|
600
|
+
| Field | Type | Required | Description |
|
|
601
|
+
|---|---|---|---|
|
|
602
|
+
| `body` | `HangupCallRequest` | yes | Request body; fields below. |
|
|
603
|
+
|
|
604
|
+
Body fields (`HangupCallRequest`):
|
|
605
|
+
|
|
606
|
+
| Field | Type | Required | Description |
|
|
607
|
+
|---|---|---|---|
|
|
608
|
+
| `body.call_id` | `string` | yes | |
|
|
609
|
+
| `body.session_id` | `string` | yes | |
|
|
610
|
+
|
|
611
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
612
|
+
|
|
613
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
614
|
+
|
|
615
|
+
**Example**
|
|
616
|
+
|
|
617
|
+
```ts
|
|
618
|
+
const result = await g8.api.dialer.hangupParallelCall({ body: { call_id: "id", session_id: "id" } });
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
<a id="op-hangupsessioncall"></a>
|
|
624
|
+
|
|
625
|
+
### `g8.api.dialer.hangupSessionCall(input)`
|
|
626
|
+
|
|
627
|
+
**Hangup Session Call**
|
|
628
|
+
|
|
629
|
+
- HTTP: `POST /api/v1/dialer/sessions/calls/hangup`
|
|
630
|
+
- operationId: `hangup_session_call_dialer_sessions_calls_hangup_post` (also callable as `g8.api.call("hangup_session_call_dialer_sessions_calls_hangup_post", input)`)
|
|
631
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
632
|
+
- API-key scope: `voice:write`
|
|
633
|
+
|
|
634
|
+
CONTACTS NOBODY NEW. Ends a call that is already up.
|
|
635
|
+
|
|
636
|
+
This is the STOP button, not a dial. It gates on `voice:dialer:control`
|
|
637
|
+
rather than the create permission on purpose: hanging up is the action you
|
|
638
|
+
want an operator to be able to take without also being able to start a
|
|
639
|
+
session.
|
|
640
|
+
|
|
641
|
+
The completion record is written by Twilio's status webhook afterwards, so
|
|
642
|
+
the disposition and duration appear a moment later, not in this response.
|
|
643
|
+
|
|
644
|
+
**Input**
|
|
645
|
+
|
|
646
|
+
| Field | Type | Required | Description |
|
|
647
|
+
|---|---|---|---|
|
|
648
|
+
| `body` | `CallControlRequest` | yes | Request body; fields below. |
|
|
649
|
+
|
|
650
|
+
Body fields (`CallControlRequest`):
|
|
651
|
+
|
|
652
|
+
| Field | Type | Required | Description |
|
|
653
|
+
|---|---|---|---|
|
|
654
|
+
| `body.call_id` | `string` | yes | |
|
|
655
|
+
| `body.session_id` | `string` | yes | |
|
|
656
|
+
|
|
657
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
658
|
+
|
|
659
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
660
|
+
|
|
661
|
+
**Example**
|
|
662
|
+
|
|
663
|
+
```ts
|
|
664
|
+
const result = await g8.api.dialer.hangupSessionCall({ body: { call_id: "id", session_id: "id" } });
|
|
665
|
+
```
|
|
666
|
+
|
|
667
|
+
---
|
|
668
|
+
|
|
669
|
+
<a id="op-listcontactidsbydisposition"></a>
|
|
670
|
+
|
|
671
|
+
### `g8.api.dialer.listContactIdsByDisposition(input)`
|
|
672
|
+
|
|
673
|
+
**List Contact Ids By Disposition**
|
|
674
|
+
|
|
675
|
+
- HTTP: `GET /api/v1/dialer/parallel-calls/sessions/{session_id}/contact-ids-by-disposition`
|
|
676
|
+
- operationId: `list_contact_ids_by_disposition_dialer_parallel_calls_sessions__session_id__contact_ids_by_disposition_get` (also callable as `g8.api.call("list_contact_ids_by_disposition_dialer_parallel_calls_sessions__session_id__contact_ids_by_disposition_get", input)`)
|
|
677
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
678
|
+
- API-key scope: `voice:read`
|
|
679
|
+
|
|
680
|
+
CONTACTS NOBODY. Which contacts in a session ended at a given outcome.
|
|
681
|
+
|
|
682
|
+
`latest` and `has_ever` differ for a redialed contact: a `no_answer` that
|
|
683
|
+
later connected is in `has_ever` but not in `latest`. An unrecognised mode
|
|
684
|
+
falls back to `latest` rather than erroring, matching voice.
|
|
685
|
+
|
|
686
|
+
**Input**
|
|
687
|
+
|
|
688
|
+
| Field | Type | Required | Description |
|
|
689
|
+
|---|---|---|---|
|
|
690
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
691
|
+
| `query.disposition` | `string` | yes | Disposition, or several comma-separated. |
|
|
692
|
+
| `query.mode` | `string` | no | `latest` = current outcome; `has_ever` = any attempt. default `"latest"` |
|
|
693
|
+
|
|
694
|
+
**Returns** `ApiResponse_DialerListPayload_`: the envelope `{ data: DialerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
695
|
+
|
|
696
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
697
|
+
|
|
698
|
+
`DialerListPayload` fields:
|
|
699
|
+
|
|
700
|
+
| Field | Type | Required | Description |
|
|
701
|
+
|---|---|---|---|
|
|
702
|
+
| `items` | `Array<unknown>` | no | |
|
|
703
|
+
|
|
704
|
+
**Example**
|
|
705
|
+
|
|
706
|
+
```ts
|
|
707
|
+
const result = await g8.api.dialer.listContactIdsByDisposition({ path: { session_id: "id" }, query: { disposition: "example" } });
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
---
|
|
711
|
+
|
|
712
|
+
<a id="op-listtransferdepartments"></a>
|
|
713
|
+
|
|
714
|
+
### `g8.api.dialer.listTransferDepartments(input?)`
|
|
715
|
+
|
|
716
|
+
**List Transfer Departments**
|
|
717
|
+
|
|
718
|
+
- HTTP: `GET /api/v1/dialer/transfer/departments`
|
|
719
|
+
- operationId: `list_transfer_departments_dialer_transfer_departments_get` (also callable as `g8.api.call("list_transfer_departments_dialer_transfer_departments_get", input)`)
|
|
720
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
721
|
+
- API-key scope: `voice:read`
|
|
722
|
+
|
|
723
|
+
CONTACTS NOBODY. Which departments can take a warm transfer right now.
|
|
724
|
+
|
|
725
|
+
A LITERAL two-segment path beside `/transfer/{call_id}`, so it is declared
|
|
726
|
+
BEFORE it - registered the other way round, `departments` would be read as
|
|
727
|
+
a call id and this route would be unreachable. There is a test that
|
|
728
|
+
`GET /dialer/transfer/<id>` still resolves to the parameter route.
|
|
729
|
+
|
|
730
|
+
**Input**: none.
|
|
731
|
+
|
|
732
|
+
**Returns** `ApiResponse_DialerListPayload_`: the envelope `{ data: DialerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
733
|
+
|
|
734
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
735
|
+
|
|
736
|
+
`DialerListPayload` fields:
|
|
737
|
+
|
|
738
|
+
| Field | Type | Required | Description |
|
|
739
|
+
|---|---|---|---|
|
|
740
|
+
| `items` | `Array<unknown>` | no | |
|
|
741
|
+
|
|
742
|
+
**Example**
|
|
743
|
+
|
|
744
|
+
```ts
|
|
745
|
+
const result = await g8.api.dialer.listTransferDepartments();
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
---
|
|
749
|
+
|
|
750
|
+
<a id="op-manualdial"></a>
|
|
751
|
+
|
|
752
|
+
### `g8.api.dialer.manualDial(input)`
|
|
753
|
+
|
|
754
|
+
**Manual Dial**
|
|
755
|
+
|
|
756
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/manual-dial`
|
|
757
|
+
- operationId: `manual_dial_dialer_parallel_calls_manual_dial_post` (also callable as `g8.api.call("manual_dial_dialer_parallel_calls_manual_dial_post", input)`)
|
|
758
|
+
- Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
|
|
759
|
+
- API-key scope: `voice:run`
|
|
760
|
+
|
|
761
|
+
*** CALLS A REAL PERSON. *** Dials `to_phone` immediately.
|
|
762
|
+
|
|
763
|
+
An arbitrary number, inside an existing PAUSED or COMPLETED session. If
|
|
764
|
+
the session is ACTIVE voice refuses rather than dialing over a running
|
|
765
|
+
campaign.
|
|
766
|
+
|
|
767
|
+
The number does not have to belong to a contact: an unknown number is
|
|
768
|
+
resolved to an existing contact by phone, or a new contact is created for
|
|
769
|
+
it, so the call is attributable afterwards. That means this operation can
|
|
770
|
+
CREATE A CONTACT RECORD as a side effect.
|
|
771
|
+
|
|
772
|
+
Self-dialing is refused. Tiered `external`.
|
|
773
|
+
|
|
774
|
+
**Input**
|
|
775
|
+
|
|
776
|
+
| Field | Type | Required | Description |
|
|
777
|
+
|---|---|---|---|
|
|
778
|
+
| `body` | `ManualDialRequest` | yes | Request body; fields below. |
|
|
779
|
+
|
|
780
|
+
Body fields (`ManualDialRequest`):
|
|
781
|
+
|
|
782
|
+
| Field | Type | Required | Description |
|
|
783
|
+
|---|---|---|---|
|
|
784
|
+
| `body.from_phone` | `string` | yes | |
|
|
785
|
+
| `body.session_id` | `string` | yes | |
|
|
786
|
+
| `body.to_phone` | `string` | yes | |
|
|
787
|
+
| `body.user_id` | `string` | yes | |
|
|
788
|
+
| `body.company` | `string \| null` | no | |
|
|
789
|
+
| `body.contact_id` | `string \| null` | no | |
|
|
790
|
+
| `body.email` | `string \| null` | no | |
|
|
791
|
+
| `body.first_name` | `string \| null` | no | |
|
|
792
|
+
| `body.last_name` | `string \| null` | no | |
|
|
793
|
+
| `body.timezone` | `string \| null` | no | default `"America/New_York"` |
|
|
794
|
+
| `body.user_email` | `string \| null` | no | |
|
|
795
|
+
|
|
796
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
797
|
+
|
|
798
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
799
|
+
|
|
800
|
+
**Example**
|
|
801
|
+
|
|
802
|
+
```ts
|
|
803
|
+
// external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
|
|
804
|
+
const result = await g8.api.dialer.manualDial({
|
|
805
|
+
body: {
|
|
806
|
+
from_phone: "+15555550100",
|
|
807
|
+
session_id: "id",
|
|
808
|
+
to_phone: "+15555550100",
|
|
809
|
+
user_id: "id",
|
|
810
|
+
},
|
|
811
|
+
});
|
|
812
|
+
```
|
|
813
|
+
|
|
814
|
+
---
|
|
815
|
+
|
|
816
|
+
<a id="op-markallmissedcallbacksseen"></a>
|
|
817
|
+
|
|
818
|
+
### `g8.api.dialer.markAllMissedCallbacksSeen(input)`
|
|
819
|
+
|
|
820
|
+
**Mark All Missed Callbacks Seen**
|
|
821
|
+
|
|
822
|
+
- HTTP: `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/seen-all`
|
|
823
|
+
- operationId: `mark_all_missed_callbacks_seen_dialer_parallel_calls_missed_callbacks_seen_all_patch` (also callable as `g8.api.call("mark_all_missed_callbacks_seen_dialer_parallel_calls_missed_callbacks_seen_all_patch", input)`)
|
|
824
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
825
|
+
- API-key scope: `voice:write`
|
|
826
|
+
|
|
827
|
+
CONTACTS NOBODY. Clears the whole missed-callback badge for one rep.
|
|
828
|
+
|
|
829
|
+
The app carries the organisation in the PATH here
|
|
830
|
+
(`/missed-callbacks/seen-all/{org_id}`). That segment is NOT published: a
|
|
831
|
+
caller must never be able to name the tenant it is clearing, so the org
|
|
832
|
+
comes from the key and the path ends at `seen-all`.
|
|
833
|
+
|
|
834
|
+
**Input**
|
|
835
|
+
|
|
836
|
+
| Field | Type | Required | Description |
|
|
837
|
+
|---|---|---|---|
|
|
838
|
+
| `body` | `MissedCallbacksSeenAllRequest` | yes | Request body; fields below. |
|
|
839
|
+
|
|
840
|
+
Body fields (`MissedCallbacksSeenAllRequest`):
|
|
841
|
+
|
|
842
|
+
| Field | Type | Required | Description |
|
|
843
|
+
|---|---|---|---|
|
|
844
|
+
| `body.user_email` | `string` | yes | |
|
|
845
|
+
|
|
846
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
847
|
+
|
|
848
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
849
|
+
|
|
850
|
+
**Example**
|
|
851
|
+
|
|
852
|
+
```ts
|
|
853
|
+
const result = await g8.api.dialer.markAllMissedCallbacksSeen({ body: { user_email: "jane@acme.com" } });
|
|
854
|
+
```
|
|
855
|
+
|
|
856
|
+
---
|
|
857
|
+
|
|
858
|
+
<a id="op-markgradingreviewed"></a>
|
|
859
|
+
|
|
860
|
+
### `g8.api.dialer.markGradingReviewed(input)`
|
|
861
|
+
|
|
862
|
+
**Mark Grading Reviewed**
|
|
863
|
+
|
|
864
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/calls/{livekit_room_name}/grading/review`
|
|
865
|
+
- operationId: `mark_grading_reviewed_dialer_parallel_calls_calls__livekit_room_name__grading_review_post` (also callable as `g8.api.call("mark_grading_reviewed_dialer_parallel_calls_calls__livekit_room_name__grading_review_post", input)`)
|
|
866
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
867
|
+
- API-key scope: `voice:write`
|
|
868
|
+
|
|
869
|
+
CONTACTS NOBODY. Marks a call's AI grading as reviewed by a human.
|
|
870
|
+
|
|
871
|
+
An acknowledgement, not a re-grade: it changes no score and runs no model.
|
|
872
|
+
|
|
873
|
+
**Input**
|
|
874
|
+
|
|
875
|
+
| Field | Type | Required | Description |
|
|
876
|
+
|---|---|---|---|
|
|
877
|
+
| `path.livekit_room_name` | `string` | yes | Room name of the graded call. |
|
|
878
|
+
| `query.sdr_email` | `string` | yes | The rep whose grading was reviewed. |
|
|
879
|
+
|
|
880
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
881
|
+
|
|
882
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
883
|
+
|
|
884
|
+
**Example**
|
|
885
|
+
|
|
886
|
+
```ts
|
|
887
|
+
const result = await g8.api.dialer.markGradingReviewed({
|
|
888
|
+
path: { livekit_room_name: "Example" },
|
|
889
|
+
query: { sdr_email: "jane@acme.com" },
|
|
890
|
+
});
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
---
|
|
894
|
+
|
|
895
|
+
<a id="op-markmissedcallbacksseen"></a>
|
|
896
|
+
|
|
897
|
+
### `g8.api.dialer.markMissedCallbacksSeen(input)`
|
|
898
|
+
|
|
899
|
+
**Mark Missed Callbacks Seen**
|
|
900
|
+
|
|
901
|
+
- HTTP: `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/seen`
|
|
902
|
+
- operationId: `mark_missed_callbacks_seen_dialer_parallel_calls_missed_callbacks_seen_patch` (also callable as `g8.api.call("mark_missed_callbacks_seen_dialer_parallel_calls_missed_callbacks_seen_patch", input)`)
|
|
903
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
904
|
+
- API-key scope: `voice:write`
|
|
905
|
+
|
|
906
|
+
CONTACTS NOBODY. Marks specific missed callbacks as seen.
|
|
907
|
+
|
|
908
|
+
Seen is not resolved: it clears the notification, it does not say anyone
|
|
909
|
+
called back. `resolve` is the separate, meaningful one.
|
|
910
|
+
|
|
911
|
+
**Input**
|
|
912
|
+
|
|
913
|
+
| Field | Type | Required | Description |
|
|
914
|
+
|---|---|---|---|
|
|
915
|
+
| `body` | `MissedCallbacksSeenRequest` | yes | Request body; fields below. |
|
|
916
|
+
|
|
917
|
+
Body fields (`MissedCallbacksSeenRequest`):
|
|
918
|
+
|
|
919
|
+
| Field | Type | Required | Description |
|
|
920
|
+
|---|---|---|---|
|
|
921
|
+
| `body.ids` | `Array<integer>` | yes | |
|
|
922
|
+
| `body.user_email` | `string` | yes | |
|
|
923
|
+
|
|
924
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
925
|
+
|
|
926
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
927
|
+
|
|
928
|
+
**Example**
|
|
929
|
+
|
|
930
|
+
```ts
|
|
931
|
+
const result = await g8.api.dialer.markMissedCallbacksSeen({ body: { ids: [123], user_email: "jane@acme.com" } });
|
|
932
|
+
```
|
|
933
|
+
|
|
934
|
+
---
|
|
935
|
+
|
|
936
|
+
<a id="op-mintsessionwsticket"></a>
|
|
937
|
+
|
|
938
|
+
### `g8.api.dialer.mintSessionWsTicket(input)`
|
|
939
|
+
|
|
940
|
+
**Mint Session Ws Ticket**
|
|
941
|
+
|
|
942
|
+
- HTTP: `POST /api/v1/dialer/sessions/{session_id}/ws-ticket`
|
|
943
|
+
- operationId: `mint_session_ws_ticket_dialer_sessions__session_id__ws_ticket_post` (also callable as `g8.api.call("mint_session_ws_ticket_dialer_sessions__session_id__ws_ticket_post", input)`)
|
|
944
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
945
|
+
- API-key scope: `voice:write`
|
|
946
|
+
|
|
947
|
+
CONTACTS NOBODY. Mints a one-shot ticket for the session event stream.
|
|
948
|
+
|
|
949
|
+
The WebSocket itself is not part of this contract - a socket cannot be
|
|
950
|
+
described as a request/response operation or generated into an SDK method.
|
|
951
|
+
This mints the ticket that opens one, which IS an ordinary POST.
|
|
952
|
+
|
|
953
|
+
**Input**
|
|
954
|
+
|
|
955
|
+
| Field | Type | Required | Description |
|
|
956
|
+
|---|---|---|---|
|
|
957
|
+
| `path.session_id` | `string` | yes | Session to subscribe to. |
|
|
958
|
+
|
|
959
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
960
|
+
|
|
961
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
962
|
+
|
|
963
|
+
**Example**
|
|
964
|
+
|
|
965
|
+
```ts
|
|
966
|
+
const result = await g8.api.dialer.mintSessionWsTicket({ path: { session_id: "id" } });
|
|
967
|
+
```
|
|
968
|
+
|
|
969
|
+
---
|
|
970
|
+
|
|
971
|
+
<a id="op-mintsoftphonetoken"></a>
|
|
972
|
+
|
|
973
|
+
### `g8.api.dialer.mintSoftphoneToken(input)`
|
|
974
|
+
|
|
975
|
+
**Mint Softphone Token**
|
|
976
|
+
|
|
977
|
+
- HTTP: `GET /api/v1/dialer/sessions/token`
|
|
978
|
+
- operationId: `mint_softphone_token_dialer_sessions_token_get` (also callable as `g8.api.call("mint_softphone_token_dialer_sessions_token_get", input)`)
|
|
979
|
+
- Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
|
|
980
|
+
- API-key scope: `voice:run`
|
|
981
|
+
|
|
982
|
+
CONTACTS NOBODY - but the RESPONSE CAN. Mints a softphone credential.
|
|
983
|
+
|
|
984
|
+
Returns a short-lived (1 hour) Twilio access token carrying a VoiceGrant,
|
|
985
|
+
for a browser running the Twilio Voice SDK. Whoever holds it can register a
|
|
986
|
+
device and place and receive calls as `sdr_{user_id}_{org}` until it
|
|
987
|
+
expires. TREAT THE RESPONSE AS A SECRET: it is a bearer credential, not a
|
|
988
|
+
description of one.
|
|
989
|
+
|
|
990
|
+
That is why this is the one GET on this router tiered `external` instead of
|
|
991
|
+
`read`, and why it gates on `voice:calls:place` rather than a read
|
|
992
|
+
permission - a read-only key must not be able to mint the ability to dial.
|
|
993
|
+
|
|
994
|
+
`user_id` is REQUIRED here although voice defaults it. An organisation API
|
|
995
|
+
key has no user of its own, and defaulting would mint a credential for an
|
|
996
|
+
identity nobody named. The organisation half of the identity is always the
|
|
997
|
+
key's own and cannot be supplied.
|
|
998
|
+
|
|
999
|
+
**Input**
|
|
1000
|
+
|
|
1001
|
+
| Field | Type | Required | Description |
|
|
1002
|
+
|---|---|---|---|
|
|
1003
|
+
| `query.user_id` | `string` | yes | The rep this softphone credential is for. |
|
|
1004
|
+
|
|
1005
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1006
|
+
|
|
1007
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1008
|
+
|
|
1009
|
+
**Example**
|
|
1010
|
+
|
|
1011
|
+
```ts
|
|
1012
|
+
// external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
|
|
1013
|
+
const result = await g8.api.dialer.mintSoftphoneToken({ query: { user_id: "id" } });
|
|
1014
|
+
```
|
|
1015
|
+
|
|
1016
|
+
---
|
|
1017
|
+
|
|
1018
|
+
<a id="op-minttranscriptwsticket"></a>
|
|
1019
|
+
|
|
1020
|
+
### `g8.api.dialer.mintTranscriptWsTicket(input)`
|
|
1021
|
+
|
|
1022
|
+
**Mint Transcript Ws Ticket**
|
|
1023
|
+
|
|
1024
|
+
- HTTP: `POST /api/v1/dialer/sessions/calls/{call_id}/ws-ticket`
|
|
1025
|
+
- operationId: `mint_transcript_ws_ticket_dialer_sessions_calls__call_id__ws_ticket_post` (also callable as `g8.api.call("mint_transcript_ws_ticket_dialer_sessions_calls__call_id__ws_ticket_post", input)`)
|
|
1026
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1027
|
+
- API-key scope: `voice:write`
|
|
1028
|
+
|
|
1029
|
+
CONTACTS NOBODY. Mints a one-shot ticket for the live transcript stream.
|
|
1030
|
+
|
|
1031
|
+
Same shape as the session ticket, different stream: this one carries the
|
|
1032
|
+
words of a call as it happens.
|
|
1033
|
+
|
|
1034
|
+
**Input**
|
|
1035
|
+
|
|
1036
|
+
| Field | Type | Required | Description |
|
|
1037
|
+
|---|---|---|---|
|
|
1038
|
+
| `path.call_id` | `string` | yes | Call to stream the transcript of. |
|
|
1039
|
+
|
|
1040
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1041
|
+
|
|
1042
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1043
|
+
|
|
1044
|
+
**Example**
|
|
1045
|
+
|
|
1046
|
+
```ts
|
|
1047
|
+
const result = await g8.api.dialer.mintTranscriptWsTicket({ path: { call_id: "id" } });
|
|
1048
|
+
```
|
|
1049
|
+
|
|
1050
|
+
---
|
|
1051
|
+
|
|
1052
|
+
<a id="op-mutecall"></a>
|
|
1053
|
+
|
|
1054
|
+
### `g8.api.dialer.muteCall(input)`
|
|
1055
|
+
|
|
1056
|
+
**Mute Call**
|
|
1057
|
+
|
|
1058
|
+
- HTTP: `POST /api/v1/dialer/sessions/calls/mute`
|
|
1059
|
+
- operationId: `mute_call_dialer_sessions_calls_mute_post` (also callable as `g8.api.call("mute_call_dialer_sessions_calls_mute_post", input)`)
|
|
1060
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1061
|
+
- API-key scope: `voice:write`
|
|
1062
|
+
|
|
1063
|
+
CONTACTS NOBODY NEW. Mutes the rep on a call already in progress.
|
|
1064
|
+
|
|
1065
|
+
`muted` is explicit rather than a toggle, so a retried request is
|
|
1066
|
+
idempotent instead of un-muting someone mid-sentence.
|
|
1067
|
+
|
|
1068
|
+
**Input**
|
|
1069
|
+
|
|
1070
|
+
| Field | Type | Required | Description |
|
|
1071
|
+
|---|---|---|---|
|
|
1072
|
+
| `query.call_id` | `string` | yes | The live call to mute. |
|
|
1073
|
+
| `query.muted` | `boolean` | no | `true` mutes the rep, `false` unmutes. default `true` |
|
|
1074
|
+
|
|
1075
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1076
|
+
|
|
1077
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1078
|
+
|
|
1079
|
+
**Example**
|
|
1080
|
+
|
|
1081
|
+
```ts
|
|
1082
|
+
const result = await g8.api.dialer.muteCall({ query: { call_id: "id" } });
|
|
1083
|
+
```
|
|
1084
|
+
|
|
1085
|
+
---
|
|
1086
|
+
|
|
1087
|
+
<a id="op-prewarmvoicemails"></a>
|
|
1088
|
+
|
|
1089
|
+
### `g8.api.dialer.prewarmVoicemails(input)`
|
|
1090
|
+
|
|
1091
|
+
**Prewarm Voicemails**
|
|
1092
|
+
|
|
1093
|
+
- HTTP: `POST /api/v1/dialer/sessions/prewarm-voicemails`
|
|
1094
|
+
- operationId: `prewarm_voicemails_dialer_sessions_prewarm_voicemails_post` (also callable as `g8.api.call("prewarm_voicemails_dialer_sessions_prewarm_voicemails_post", input)`)
|
|
1095
|
+
- Tier: `billable`: spends credits; the SDK never blindly retries it; confirm cost before bulk use
|
|
1096
|
+
- API-key scope: `voice:run`
|
|
1097
|
+
|
|
1098
|
+
CONTACTS NOBODY - but it SPENDS. Synthesises voicemail audio in advance.
|
|
1099
|
+
|
|
1100
|
+
Text-to-speech is generated per contact and cached so the audio is ready
|
|
1101
|
+
before a rep clicks Start Dialing. No phone rings and no one hears
|
|
1102
|
+
anything, but it is real generation work per contact, which is why it is
|
|
1103
|
+
tiered `billable` rather than a plain `write`.
|
|
1104
|
+
|
|
1105
|
+
Returns immediately - the work is fired in the background. Duplicates are
|
|
1106
|
+
no-ops (Redis in-flight lock plus a per-contact cache). Voice caps the
|
|
1107
|
+
batch at 20 and so does this contract.
|
|
1108
|
+
|
|
1109
|
+
**Input**
|
|
1110
|
+
|
|
1111
|
+
| Field | Type | Required | Description |
|
|
1112
|
+
|---|---|---|---|
|
|
1113
|
+
| `body` | `PrewarmVoicemailsRequest` | yes | Request body; fields below. |
|
|
1114
|
+
|
|
1115
|
+
Body fields (`PrewarmVoicemailsRequest`):
|
|
1116
|
+
|
|
1117
|
+
| Field | Type | Required | Description |
|
|
1118
|
+
|---|---|---|---|
|
|
1119
|
+
| `body.contacts` | `Array<DialContact>` | yes | min items 1, max items 20 |
|
|
1120
|
+
| `body.agent_id` | `string \| null` | no | |
|
|
1121
|
+
|
|
1122
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1123
|
+
|
|
1124
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1125
|
+
|
|
1126
|
+
**Example**
|
|
1127
|
+
|
|
1128
|
+
```ts
|
|
1129
|
+
// billable: spends credits; the SDK never blindly retries it; confirm cost before bulk use.
|
|
1130
|
+
const result = await g8.api.dialer.prewarmVoicemails({
|
|
1131
|
+
body: { contacts: [{ contact_id: "id", to_phone: "+15555550100" }] },
|
|
1132
|
+
});
|
|
1133
|
+
```
|
|
1134
|
+
|
|
1135
|
+
---
|
|
1136
|
+
|
|
1137
|
+
<a id="op-readallsdrtargets"></a>
|
|
1138
|
+
|
|
1139
|
+
### `g8.api.dialer.readAllSdrTargets(input?)`
|
|
1140
|
+
|
|
1141
|
+
**Read All Sdr Targets**
|
|
1142
|
+
|
|
1143
|
+
- HTTP: `GET /api/v1/dialer/parallel-calls/targets/all-sdrs`
|
|
1144
|
+
- operationId: `read_all_sdr_targets_dialer_parallel_calls_targets_all_sdrs_get` (also callable as `g8.api.call("read_all_sdr_targets_dialer_parallel_calls_targets_all_sdrs_get", input)`)
|
|
1145
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1146
|
+
- API-key scope: `voice:read`
|
|
1147
|
+
|
|
1148
|
+
CONTACTS NOBODY. Per-rep goals for everyone in the organisation.
|
|
1149
|
+
|
|
1150
|
+
A two-segment LITERAL under `/targets`. Nothing registers
|
|
1151
|
+
`/parallel-calls/targets/{something}`, so it cannot be swallowed - and the
|
|
1152
|
+
shadowing test asserts that rather than trusting it.
|
|
1153
|
+
|
|
1154
|
+
**Input**: none.
|
|
1155
|
+
|
|
1156
|
+
**Returns** `ApiResponse_DialerListPayload_`: the envelope `{ data: DialerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1157
|
+
|
|
1158
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1159
|
+
|
|
1160
|
+
`DialerListPayload` fields:
|
|
1161
|
+
|
|
1162
|
+
| Field | Type | Required | Description |
|
|
1163
|
+
|---|---|---|---|
|
|
1164
|
+
| `items` | `Array<unknown>` | no | |
|
|
1165
|
+
|
|
1166
|
+
**Example**
|
|
1167
|
+
|
|
1168
|
+
```ts
|
|
1169
|
+
const result = await g8.api.dialer.readAllSdrTargets();
|
|
1170
|
+
```
|
|
1171
|
+
|
|
1172
|
+
---
|
|
1173
|
+
|
|
1174
|
+
<a id="op-readdialerpreferences"></a>
|
|
1175
|
+
|
|
1176
|
+
### `g8.api.dialer.readDialerPreferences(input)`
|
|
1177
|
+
|
|
1178
|
+
**Read Dialer Preferences**
|
|
1179
|
+
|
|
1180
|
+
- HTTP: `GET /api/v1/dialer/settings/preferences/{user_email}`
|
|
1181
|
+
- operationId: `read_dialer_preferences_dialer_settings_preferences__user_email__get` (also callable as `g8.api.call("read_dialer_preferences_dialer_settings_preferences__user_email__get", input)`)
|
|
1182
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1183
|
+
- API-key scope: `voice:read`
|
|
1184
|
+
|
|
1185
|
+
CONTACTS NOBODY. One rep's dialer preferences.
|
|
1186
|
+
|
|
1187
|
+
The app's path is `/preferences/{org_id}/{user_email}` and its handler
|
|
1188
|
+
reads whichever organisation the path names. The org segment is NOT
|
|
1189
|
+
published - it comes from the key - so this cannot read another tenant's
|
|
1190
|
+
configuration.
|
|
1191
|
+
|
|
1192
|
+
Voice additionally refuses to read a rep other than the authenticated one
|
|
1193
|
+
(`dialer_settings.py:23-41`). An organisation API key is not a rep, so it
|
|
1194
|
+
supplies the rep the caller named: the tenant boundary holds, the
|
|
1195
|
+
rep-versus-rep boundary does not apply to an org credential.
|
|
1196
|
+
|
|
1197
|
+
**Input**
|
|
1198
|
+
|
|
1199
|
+
| Field | Type | Required | Description |
|
|
1200
|
+
|---|---|---|---|
|
|
1201
|
+
| `path.user_email` | `string` | yes | The rep whose preferences to read. |
|
|
1202
|
+
|
|
1203
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1204
|
+
|
|
1205
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1206
|
+
|
|
1207
|
+
**Example**
|
|
1208
|
+
|
|
1209
|
+
```ts
|
|
1210
|
+
const result = await g8.api.dialer.readDialerPreferences({ path: { user_email: "jane@acme.com" } });
|
|
1211
|
+
```
|
|
1212
|
+
|
|
1213
|
+
---
|
|
1214
|
+
|
|
1215
|
+
<a id="op-readdialerreport"></a>
|
|
1216
|
+
|
|
1217
|
+
### `g8.api.dialer.readDialerReport(input?)`
|
|
1218
|
+
|
|
1219
|
+
**Read Dialer Report**
|
|
1220
|
+
|
|
1221
|
+
- HTTP: `GET /api/v1/dialer/parallel-calls/analytics/dialer-report`
|
|
1222
|
+
- operationId: `read_dialer_report_dialer_parallel_calls_analytics_dialer_report_get` (also callable as `g8.api.call("read_dialer_report_dialer_parallel_calls_analytics_dialer_report_get", input)`)
|
|
1223
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1224
|
+
- API-key scope: `voice:read`
|
|
1225
|
+
|
|
1226
|
+
CONTACTS NOBODY. Dial counts, connect rates and outcomes.
|
|
1227
|
+
|
|
1228
|
+
`aggregation` is closed to the app's own two values, so a typo is a 422
|
|
1229
|
+
naming them rather than a silent fallback to daily.
|
|
1230
|
+
|
|
1231
|
+
`client_tz` decides where a day starts. Omitting it on a distributed team
|
|
1232
|
+
is the usual reason two people get different numbers for "yesterday".
|
|
1233
|
+
|
|
1234
|
+
**Input**
|
|
1235
|
+
|
|
1236
|
+
| Field | Type | Required | Description |
|
|
1237
|
+
|---|---|---|---|
|
|
1238
|
+
| `query.session_id` | `string \| null` | no | Restrict to one session. |
|
|
1239
|
+
| `query.user_email` | `string \| null` | no | Restrict to one rep. |
|
|
1240
|
+
| `query.date_from` | `string \| null` | no | ISO date, inclusive. |
|
|
1241
|
+
| `query.date_to` | `string \| null` | no | ISO date, inclusive. |
|
|
1242
|
+
| `query.aggregation` | `"daily" \| "total"` | no | `daily` buckets; `total` collapses. default `"daily"` |
|
|
1243
|
+
| `query.client_tz` | `string \| null` | no | IANA zone the day boundaries are cut on. |
|
|
1244
|
+
|
|
1245
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1246
|
+
|
|
1247
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1248
|
+
|
|
1249
|
+
**Example**
|
|
1250
|
+
|
|
1251
|
+
```ts
|
|
1252
|
+
const result = await g8.api.dialer.readDialerReport();
|
|
1253
|
+
```
|
|
1254
|
+
|
|
1255
|
+
---
|
|
1256
|
+
|
|
1257
|
+
<a id="op-readorgtargets"></a>
|
|
1258
|
+
|
|
1259
|
+
### `g8.api.dialer.readOrgTargets(input?)`
|
|
1260
|
+
|
|
1261
|
+
**Read Org Targets**
|
|
1262
|
+
|
|
1263
|
+
- HTTP: `GET /api/v1/dialer/parallel-calls/targets`
|
|
1264
|
+
- operationId: `read_org_targets_dialer_parallel_calls_targets_get` (also callable as `g8.api.call("read_org_targets_dialer_parallel_calls_targets_get", input)`)
|
|
1265
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1266
|
+
- API-key scope: `voice:read`
|
|
1267
|
+
|
|
1268
|
+
CONTACTS NOBODY. The organisation's daily dial and meeting goals.
|
|
1269
|
+
|
|
1270
|
+
**Input**: none.
|
|
1271
|
+
|
|
1272
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1273
|
+
|
|
1274
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1275
|
+
|
|
1276
|
+
**Example**
|
|
1277
|
+
|
|
1278
|
+
```ts
|
|
1279
|
+
const result = await g8.api.dialer.readOrgTargets();
|
|
1280
|
+
```
|
|
1281
|
+
|
|
1282
|
+
---
|
|
1283
|
+
|
|
1284
|
+
<a id="op-readproviderreceipt"></a>
|
|
1285
|
+
|
|
1286
|
+
### `g8.api.dialer.readProviderReceipt(input?)`
|
|
1287
|
+
|
|
1288
|
+
**Read Provider Receipt**
|
|
1289
|
+
|
|
1290
|
+
- HTTP: `GET /api/v1/dialer/sessions/assurance/provider-receipt`
|
|
1291
|
+
- operationId: `read_provider_receipt_dialer_sessions_assurance_provider_receipt_get` (also callable as `g8.api.call("read_provider_receipt_dialer_sessions_assurance_provider_receipt_get", input)`)
|
|
1292
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1293
|
+
- API-key scope: `voice:read`
|
|
1294
|
+
|
|
1295
|
+
CONTACTS NOBODY. The telephony provider's assurance receipt for this org.
|
|
1296
|
+
|
|
1297
|
+
Declared BEFORE `/sessions/{session_id}/queue-stats` would be a concern if
|
|
1298
|
+
the two overlapped; they do not - `assurance/provider-receipt` and
|
|
1299
|
+
`{session_id}/queue-stats` differ in their second segment, so neither can
|
|
1300
|
+
swallow the other. The org is the key's own and is not a parameter.
|
|
1301
|
+
|
|
1302
|
+
**Input**: none.
|
|
1303
|
+
|
|
1304
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1305
|
+
|
|
1306
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1307
|
+
|
|
1308
|
+
**Example**
|
|
1309
|
+
|
|
1310
|
+
```ts
|
|
1311
|
+
const result = await g8.api.dialer.readProviderReceipt();
|
|
1312
|
+
```
|
|
1313
|
+
|
|
1314
|
+
---
|
|
1315
|
+
|
|
1316
|
+
<a id="op-readqueuestats"></a>
|
|
1317
|
+
|
|
1318
|
+
### `g8.api.dialer.readQueueStats(input)`
|
|
1319
|
+
|
|
1320
|
+
**Read Queue Stats**
|
|
1321
|
+
|
|
1322
|
+
- HTTP: `GET /api/v1/dialer/sessions/{session_id}/queue-stats`
|
|
1323
|
+
- operationId: `read_queue_stats_dialer_sessions__session_id__queue_stats_get` (also callable as `g8.api.call("read_queue_stats_dialer_sessions__session_id__queue_stats_get", input)`)
|
|
1324
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1325
|
+
- API-key scope: `voice:read`
|
|
1326
|
+
|
|
1327
|
+
CONTACTS NOBODY. How much of the queue is left, and what has been worked.
|
|
1328
|
+
|
|
1329
|
+
**Input**
|
|
1330
|
+
|
|
1331
|
+
| Field | Type | Required | Description |
|
|
1332
|
+
|---|---|---|---|
|
|
1333
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
1334
|
+
|
|
1335
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1336
|
+
|
|
1337
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1338
|
+
|
|
1339
|
+
**Example**
|
|
1340
|
+
|
|
1341
|
+
```ts
|
|
1342
|
+
const result = await g8.api.dialer.readQueueStats({ path: { session_id: "id" } });
|
|
1343
|
+
```
|
|
1344
|
+
|
|
1345
|
+
---
|
|
1346
|
+
|
|
1347
|
+
<a id="op-readsessiongrid"></a>
|
|
1348
|
+
|
|
1349
|
+
### `g8.api.dialer.readSessionGrid(input)`
|
|
1350
|
+
|
|
1351
|
+
**Read Session Grid**
|
|
1352
|
+
|
|
1353
|
+
- HTTP: `POST /api/v1/dialer/sessions/{session_id}/grid`
|
|
1354
|
+
- operationId: `read_session_grid_dialer_sessions__session_id__grid_post` (also callable as `g8.api.call("read_session_grid_dialer_sessions__session_id__grid_post", input)`)
|
|
1355
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1356
|
+
- API-key scope: `voice:read`
|
|
1357
|
+
|
|
1358
|
+
CONTACTS NOBODY. Reads a page of the session's contact grid.
|
|
1359
|
+
|
|
1360
|
+
A POST because the filter and sort specification is too large for a query
|
|
1361
|
+
string, not because it changes anything - it mutates nothing and dials
|
|
1362
|
+
nobody. Tiered `read` by an explicit rule for that reason, so a read-only
|
|
1363
|
+
key can page through a queue.
|
|
1364
|
+
|
|
1365
|
+
**Input**
|
|
1366
|
+
|
|
1367
|
+
| Field | Type | Required | Description |
|
|
1368
|
+
|---|---|---|---|
|
|
1369
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
1370
|
+
| `body` | `GridPageRequest` | no | Request body; fields below. |
|
|
1371
|
+
|
|
1372
|
+
Body fields (`GridPageRequest`):
|
|
1373
|
+
|
|
1374
|
+
| Field | Type | Required | Description |
|
|
1375
|
+
|---|---|---|---|
|
|
1376
|
+
| `body.filter_spec` | `FilterSpec \| null` | no | |
|
|
1377
|
+
| `body.include_contact_data` | `boolean` | no | default `false` |
|
|
1378
|
+
| `body.limit` | `integer` | no | default `100` |
|
|
1379
|
+
| `body.offset` | `integer` | no | default `0` |
|
|
1380
|
+
| `body.order_spec` | `OrderSpec \| null` | no | |
|
|
1381
|
+
| `body.sort_model` | `Array<Record<string, string>> \| null` | no | |
|
|
1382
|
+
| `body.valid_phones_only` | `boolean` | no | default `false` |
|
|
1383
|
+
|
|
1384
|
+
**Returns** `ApiResponse_DialerListPayload_`: the envelope `{ data: DialerListPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1385
|
+
|
|
1386
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1387
|
+
|
|
1388
|
+
`DialerListPayload` fields:
|
|
1389
|
+
|
|
1390
|
+
| Field | Type | Required | Description |
|
|
1391
|
+
|---|---|---|---|
|
|
1392
|
+
| `items` | `Array<unknown>` | no | |
|
|
1393
|
+
|
|
1394
|
+
**Example**
|
|
1395
|
+
|
|
1396
|
+
```ts
|
|
1397
|
+
const result = await g8.api.dialer.readSessionGrid({ path: { session_id: "id" } });
|
|
1398
|
+
```
|
|
1399
|
+
|
|
1400
|
+
---
|
|
1401
|
+
|
|
1402
|
+
<a id="op-readtransferstatus"></a>
|
|
1403
|
+
|
|
1404
|
+
### `g8.api.dialer.readTransferStatus(input)`
|
|
1405
|
+
|
|
1406
|
+
**Read Transfer Status**
|
|
1407
|
+
|
|
1408
|
+
- HTTP: `GET /api/v1/dialer/transfer/{call_id}`
|
|
1409
|
+
- operationId: `read_transfer_status_dialer_transfer__call_id__get` (also callable as `g8.api.call("read_transfer_status_dialer_transfer__call_id__get", input)`)
|
|
1410
|
+
- Tier: `read`: reads data; safe to call and to retry
|
|
1411
|
+
- API-key scope: `voice:read`
|
|
1412
|
+
|
|
1413
|
+
CONTACTS NOBODY. Where a warm transfer has got to - ringing, taken, declined.
|
|
1414
|
+
|
|
1415
|
+
**Input**
|
|
1416
|
+
|
|
1417
|
+
| Field | Type | Required | Description |
|
|
1418
|
+
|---|---|---|---|
|
|
1419
|
+
| `path.call_id` | `string` | yes | Call being transferred. |
|
|
1420
|
+
|
|
1421
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1422
|
+
|
|
1423
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1424
|
+
|
|
1425
|
+
**Example**
|
|
1426
|
+
|
|
1427
|
+
```ts
|
|
1428
|
+
const result = await g8.api.dialer.readTransferStatus({ path: { call_id: "id" } });
|
|
1429
|
+
```
|
|
1430
|
+
|
|
1431
|
+
---
|
|
1432
|
+
|
|
1433
|
+
<a id="op-redialcontact"></a>
|
|
1434
|
+
|
|
1435
|
+
### `g8.api.dialer.redialContact(input)`
|
|
1436
|
+
|
|
1437
|
+
**Redial Contact**
|
|
1438
|
+
|
|
1439
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/redial-contact`
|
|
1440
|
+
- operationId: `redial_contact_dialer_parallel_calls_redial_contact_post` (also callable as `g8.api.call("redial_contact_dialer_parallel_calls_redial_contact_post", input)`)
|
|
1441
|
+
- Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
|
|
1442
|
+
- API-key scope: `voice:run`
|
|
1443
|
+
|
|
1444
|
+
*** CALLS A REAL PERSON AGAIN. *** Redials a contact already tried.
|
|
1445
|
+
|
|
1446
|
+
Voice caps attempts per contact (`MAX_REDIAL_ATTEMPTS`) and refuses past
|
|
1447
|
+
it, which is the guard against a retry loop becoming harassment - so treat
|
|
1448
|
+
a 400 here as "stop", not as "retry".
|
|
1449
|
+
|
|
1450
|
+
It runs the same credit preflight the first dial does and can fail with
|
|
1451
|
+
`insufficient_credits`, reserving the attempt fee plus connected minutes.
|
|
1452
|
+
Tiered `external`.
|
|
1453
|
+
|
|
1454
|
+
**Input**
|
|
1455
|
+
|
|
1456
|
+
| Field | Type | Required | Description |
|
|
1457
|
+
|---|---|---|---|
|
|
1458
|
+
| `body` | `RedialContactRequest` | yes | Request body; fields below. |
|
|
1459
|
+
|
|
1460
|
+
Body fields (`RedialContactRequest`):
|
|
1461
|
+
|
|
1462
|
+
| Field | Type | Required | Description |
|
|
1463
|
+
|---|---|---|---|
|
|
1464
|
+
| `body.contact_id` | `string` | yes | |
|
|
1465
|
+
| `body.from_phone` | `string` | yes | |
|
|
1466
|
+
| `body.session_id` | `string` | yes | |
|
|
1467
|
+
| `body.user_id` | `string` | yes | |
|
|
1468
|
+
| `body.campaign_builder_campaign_id` | `string \| null` | no | |
|
|
1469
|
+
| `body.campaign_id` | `string \| null` | no | |
|
|
1470
|
+
| `body.user_email` | `string \| null` | no | |
|
|
1471
|
+
|
|
1472
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1473
|
+
|
|
1474
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1475
|
+
|
|
1476
|
+
**Example**
|
|
1477
|
+
|
|
1478
|
+
```ts
|
|
1479
|
+
// external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
|
|
1480
|
+
const result = await g8.api.dialer.redialContact({
|
|
1481
|
+
body: {
|
|
1482
|
+
contact_id: "id",
|
|
1483
|
+
from_phone: "+15555550100",
|
|
1484
|
+
session_id: "id",
|
|
1485
|
+
user_id: "id",
|
|
1486
|
+
},
|
|
1487
|
+
});
|
|
1488
|
+
```
|
|
1489
|
+
|
|
1490
|
+
---
|
|
1491
|
+
|
|
1492
|
+
<a id="op-resolvemissedcallbacks"></a>
|
|
1493
|
+
|
|
1494
|
+
### `g8.api.dialer.resolveMissedCallbacks(input)`
|
|
1495
|
+
|
|
1496
|
+
**Resolve Missed Callbacks**
|
|
1497
|
+
|
|
1498
|
+
- HTTP: `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/resolve`
|
|
1499
|
+
- operationId: `resolve_missed_callbacks_dialer_parallel_calls_missed_callbacks_resolve_patch` (also callable as `g8.api.call("resolve_missed_callbacks_dialer_parallel_calls_missed_callbacks_resolve_patch", input)`)
|
|
1500
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1501
|
+
- API-key scope: `voice:write`
|
|
1502
|
+
|
|
1503
|
+
CONTACTS NOBODY. Closes a missed callback.
|
|
1504
|
+
|
|
1505
|
+
`resolution` is closed to `manual` (someone called them back) or `ignored`
|
|
1506
|
+
(a decision not to). The two are not interchangeable in reporting, which
|
|
1507
|
+
is why the field exists at all rather than a single "done" flag.
|
|
1508
|
+
|
|
1509
|
+
**Input**
|
|
1510
|
+
|
|
1511
|
+
| Field | Type | Required | Description |
|
|
1512
|
+
|---|---|---|---|
|
|
1513
|
+
| `body` | `MissedCallbacksResolveRequest` | yes | Request body; fields below. |
|
|
1514
|
+
|
|
1515
|
+
Body fields (`MissedCallbacksResolveRequest`):
|
|
1516
|
+
|
|
1517
|
+
| Field | Type | Required | Description |
|
|
1518
|
+
|---|---|---|---|
|
|
1519
|
+
| `body.ids` | `Array<integer>` | yes | |
|
|
1520
|
+
| `body.user_email` | `string` | yes | |
|
|
1521
|
+
| `body.resolution` | `"manual" \| "ignored"` | no | default `"manual"` |
|
|
1522
|
+
|
|
1523
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1524
|
+
|
|
1525
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1526
|
+
|
|
1527
|
+
**Example**
|
|
1528
|
+
|
|
1529
|
+
```ts
|
|
1530
|
+
const result = await g8.api.dialer.resolveMissedCallbacks({ body: { ids: [123], user_email: "jane@acme.com" } });
|
|
1531
|
+
```
|
|
1532
|
+
|
|
1533
|
+
---
|
|
1534
|
+
|
|
1535
|
+
<a id="op-setcalldisposition"></a>
|
|
1536
|
+
|
|
1537
|
+
### `g8.api.dialer.setCallDisposition(input)`
|
|
1538
|
+
|
|
1539
|
+
**Set Call Disposition**
|
|
1540
|
+
|
|
1541
|
+
- HTTP: `PATCH /api/v1/dialer/parallel-calls/calls/{livekit_room_name}/disposition`
|
|
1542
|
+
- operationId: `set_call_disposition_dialer_parallel_calls_calls__livekit_room_name__disposition_patch` (also callable as `g8.api.call("set_call_disposition_dialer_parallel_calls_calls__livekit_room_name__disposition_patch", input)`)
|
|
1543
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1544
|
+
- API-key scope: `voice:write`
|
|
1545
|
+
|
|
1546
|
+
CONTACTS NOBODY. Records how a finished call went.
|
|
1547
|
+
|
|
1548
|
+
`disposition` is an open string rather than a closed enum because the
|
|
1549
|
+
vocabulary is the system set PLUS the org's own custom dispositions -
|
|
1550
|
+
closing it here would refuse a value the customer defined.
|
|
1551
|
+
`GET /voice/dispositions` lists what this organisation accepts.
|
|
1552
|
+
|
|
1553
|
+
Setting `callback_at` schedules the follow-up; it does not place it.
|
|
1554
|
+
|
|
1555
|
+
**Input**
|
|
1556
|
+
|
|
1557
|
+
| Field | Type | Required | Description |
|
|
1558
|
+
|---|---|---|---|
|
|
1559
|
+
| `path.livekit_room_name` | `string` | yes | Room name of the call. |
|
|
1560
|
+
| `body` | `CallDispositionRequest` | yes | Request body; fields below. |
|
|
1561
|
+
|
|
1562
|
+
Body fields (`CallDispositionRequest`):
|
|
1563
|
+
|
|
1564
|
+
| Field | Type | Required | Description |
|
|
1565
|
+
|---|---|---|---|
|
|
1566
|
+
| `body.disposition` | `string` | yes | |
|
|
1567
|
+
| `body.callback_at` | `string (date-time) \| null` | no | |
|
|
1568
|
+
| `body.notes` | `string \| null` | no | |
|
|
1569
|
+
| `body.sentiment` | `string \| null` | no | |
|
|
1570
|
+
|
|
1571
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1572
|
+
|
|
1573
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1574
|
+
|
|
1575
|
+
**Example**
|
|
1576
|
+
|
|
1577
|
+
```ts
|
|
1578
|
+
const result = await g8.api.dialer.setCallDisposition({
|
|
1579
|
+
path: { livekit_room_name: "Example" },
|
|
1580
|
+
body: { disposition: "example" },
|
|
1581
|
+
});
|
|
1582
|
+
```
|
|
1583
|
+
|
|
1584
|
+
---
|
|
1585
|
+
|
|
1586
|
+
<a id="op-setdialerpreferences"></a>
|
|
1587
|
+
|
|
1588
|
+
### `g8.api.dialer.setDialerPreferences(input)`
|
|
1589
|
+
|
|
1590
|
+
**Set Dialer Preferences**
|
|
1591
|
+
|
|
1592
|
+
- HTTP: `PUT /api/v1/dialer/settings/preferences`
|
|
1593
|
+
- operationId: `set_dialer_preferences_dialer_settings_preferences_put` (also callable as `g8.api.call("set_dialer_preferences_dialer_settings_preferences_put", input)`)
|
|
1594
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1595
|
+
- API-key scope: `voice:write`
|
|
1596
|
+
|
|
1597
|
+
CONTACTS NOBODY DIRECTLY - but `call_dnc_contacts` decides WHO MAY BE CALLED.
|
|
1598
|
+
|
|
1599
|
+
Setting it true lets the dialer call numbers on a do-not-call list. That is
|
|
1600
|
+
a COMPLIANCE decision, not a convenience toggle, and it applies to every
|
|
1601
|
+
subsequent dial for this rep.
|
|
1602
|
+
|
|
1603
|
+
PATCH semantics despite the verb: only fields you send are changed, and
|
|
1604
|
+
omitted ones keep their stored value. The verb is the app's.
|
|
1605
|
+
|
|
1606
|
+
**Input**
|
|
1607
|
+
|
|
1608
|
+
| Field | Type | Required | Description |
|
|
1609
|
+
|---|---|---|---|
|
|
1610
|
+
| `body` | `DialerPreferencesRequest` | yes | Request body; fields below. |
|
|
1611
|
+
|
|
1612
|
+
Body fields (`DialerPreferencesRequest`):
|
|
1613
|
+
|
|
1614
|
+
| Field | Type | Required | Description |
|
|
1615
|
+
|---|---|---|---|
|
|
1616
|
+
| `body.user_email` | `string` | yes | |
|
|
1617
|
+
| `body.auto_rotate_numbers` | `boolean \| null` | no | |
|
|
1618
|
+
| `body.call_dnc_contacts` | `boolean \| null` | no | |
|
|
1619
|
+
| `body.parallel_count` | `integer \| null` | no | |
|
|
1620
|
+
| `body.skip_voicemails` | `boolean \| null` | no | |
|
|
1621
|
+
|
|
1622
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1623
|
+
|
|
1624
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1625
|
+
|
|
1626
|
+
**Example**
|
|
1627
|
+
|
|
1628
|
+
```ts
|
|
1629
|
+
const result = await g8.api.dialer.setDialerPreferences({ body: { user_email: "jane@acme.com" } });
|
|
1630
|
+
```
|
|
1631
|
+
|
|
1632
|
+
---
|
|
1633
|
+
|
|
1634
|
+
<a id="op-setorgtargets"></a>
|
|
1635
|
+
|
|
1636
|
+
### `g8.api.dialer.setOrgTargets(input)`
|
|
1637
|
+
|
|
1638
|
+
**Set Org Targets**
|
|
1639
|
+
|
|
1640
|
+
- HTTP: `PUT /api/v1/dialer/parallel-calls/targets`
|
|
1641
|
+
- operationId: `set_org_targets_dialer_parallel_calls_targets_put` (also callable as `g8.api.call("set_org_targets_dialer_parallel_calls_targets_put", input)`)
|
|
1642
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1643
|
+
- API-key scope: `voice:write`
|
|
1644
|
+
|
|
1645
|
+
CONTACTS NOBODY. Sets the organisation's daily goals. Upserts.
|
|
1646
|
+
|
|
1647
|
+
Voice takes these as QUERY parameters and applies its defaults (250 dials,
|
|
1648
|
+
3 meetings) to anything omitted, so a partial update SILENTLY RESETS the
|
|
1649
|
+
field you left out. That behaviour is preserved rather than papered over -
|
|
1650
|
+
but it is a body here, and the defaults are stated, so the reset is at
|
|
1651
|
+
least visible in the contract. Send both fields every time.
|
|
1652
|
+
|
|
1653
|
+
**Input**
|
|
1654
|
+
|
|
1655
|
+
| Field | Type | Required | Description |
|
|
1656
|
+
|---|---|---|---|
|
|
1657
|
+
| `body` | `OrgDialerTargetsRequest` | yes | Request body; fields below. |
|
|
1658
|
+
|
|
1659
|
+
Body fields (`OrgDialerTargetsRequest`):
|
|
1660
|
+
|
|
1661
|
+
| Field | Type | Required | Description |
|
|
1662
|
+
|---|---|---|---|
|
|
1663
|
+
| `body.daily_dials_target` | `integer` | no | default `250`, min 0 |
|
|
1664
|
+
| `body.daily_meetings_target` | `integer` | no | default `3`, min 0 |
|
|
1665
|
+
| `body.updated_by` | `string \| null` | no | |
|
|
1666
|
+
|
|
1667
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1668
|
+
|
|
1669
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1670
|
+
|
|
1671
|
+
**Example**
|
|
1672
|
+
|
|
1673
|
+
```ts
|
|
1674
|
+
const result = await g8.api.dialer.setOrgTargets({ body: {} });
|
|
1675
|
+
```
|
|
1676
|
+
|
|
1677
|
+
---
|
|
1678
|
+
|
|
1679
|
+
<a id="op-setsdrtargets"></a>
|
|
1680
|
+
|
|
1681
|
+
### `g8.api.dialer.setSdrTargets(input)`
|
|
1682
|
+
|
|
1683
|
+
**Set Sdr Targets**
|
|
1684
|
+
|
|
1685
|
+
- HTTP: `PUT /api/v1/dialer/parallel-calls/targets/sdr`
|
|
1686
|
+
- operationId: `set_sdr_targets_dialer_parallel_calls_targets_sdr_put` (also callable as `g8.api.call("set_sdr_targets_dialer_parallel_calls_targets_sdr_put", input)`)
|
|
1687
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1688
|
+
- API-key scope: `voice:write`
|
|
1689
|
+
|
|
1690
|
+
CONTACTS NOBODY. Overrides one rep's daily goals.
|
|
1691
|
+
|
|
1692
|
+
Both targets are REQUIRED here although voice would accept either -
|
|
1693
|
+
the org-level route's silent-reset behaviour is the reason, and requiring
|
|
1694
|
+
both makes a partial write impossible rather than merely documented.
|
|
1695
|
+
|
|
1696
|
+
**Input**
|
|
1697
|
+
|
|
1698
|
+
| Field | Type | Required | Description |
|
|
1699
|
+
|---|---|---|---|
|
|
1700
|
+
| `body` | `SdrDialerTargetsRequest` | yes | Request body; fields below. |
|
|
1701
|
+
|
|
1702
|
+
Body fields (`SdrDialerTargetsRequest`):
|
|
1703
|
+
|
|
1704
|
+
| Field | Type | Required | Description |
|
|
1705
|
+
|---|---|---|---|
|
|
1706
|
+
| `body.daily_dials_target` | `integer` | yes | min 0 |
|
|
1707
|
+
| `body.daily_meetings_target` | `integer` | yes | min 0 |
|
|
1708
|
+
| `body.sdr_email` | `string` | yes | |
|
|
1709
|
+
| `body.updated_by` | `string \| null` | no | |
|
|
1710
|
+
|
|
1711
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1712
|
+
|
|
1713
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1714
|
+
|
|
1715
|
+
**Example**
|
|
1716
|
+
|
|
1717
|
+
```ts
|
|
1718
|
+
const result = await g8.api.dialer.setSdrTargets({
|
|
1719
|
+
body: {
|
|
1720
|
+
daily_dials_target: 0,
|
|
1721
|
+
daily_meetings_target: 0,
|
|
1722
|
+
sdr_email: "jane@acme.com",
|
|
1723
|
+
},
|
|
1724
|
+
});
|
|
1725
|
+
```
|
|
1726
|
+
|
|
1727
|
+
---
|
|
1728
|
+
|
|
1729
|
+
<a id="op-skipcontact"></a>
|
|
1730
|
+
|
|
1731
|
+
### `g8.api.dialer.skipContact(input)`
|
|
1732
|
+
|
|
1733
|
+
**Skip Contact**
|
|
1734
|
+
|
|
1735
|
+
- HTTP: `POST /api/v1/dialer/sessions/{session_id}/calls/skip-contact`
|
|
1736
|
+
- operationId: `skip_contact_dialer_sessions__session_id__calls_skip_contact_post` (also callable as `g8.api.call("skip_contact_dialer_sessions__session_id__calls_skip_contact_post", input)`)
|
|
1737
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1738
|
+
- API-key scope: `voice:write`
|
|
1739
|
+
|
|
1740
|
+
CONTACTS NOBODY. Marks a contact so the queue stops offering them.
|
|
1741
|
+
|
|
1742
|
+
Queue bookkeeping. Reversible with `unskip-contact`, which is why this is
|
|
1743
|
+
an ordinary `write` and not a destructive tier.
|
|
1744
|
+
|
|
1745
|
+
**Input**
|
|
1746
|
+
|
|
1747
|
+
| Field | Type | Required | Description |
|
|
1748
|
+
|---|---|---|---|
|
|
1749
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
1750
|
+
| `body` | `SkipContactRequest` | yes | Request body; fields below. |
|
|
1751
|
+
|
|
1752
|
+
Body fields (`SkipContactRequest`):
|
|
1753
|
+
|
|
1754
|
+
| Field | Type | Required | Description |
|
|
1755
|
+
|---|---|---|---|
|
|
1756
|
+
| `body.contact_id` | `string` | yes | |
|
|
1757
|
+
|
|
1758
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1759
|
+
|
|
1760
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1761
|
+
|
|
1762
|
+
**Example**
|
|
1763
|
+
|
|
1764
|
+
```ts
|
|
1765
|
+
const result = await g8.api.dialer.skipContact({ path: { session_id: "id" }, body: { contact_id: "id" } });
|
|
1766
|
+
```
|
|
1767
|
+
|
|
1768
|
+
---
|
|
1769
|
+
|
|
1770
|
+
<a id="op-startparallelsession"></a>
|
|
1771
|
+
|
|
1772
|
+
### `g8.api.dialer.startParallelSession(input)`
|
|
1773
|
+
|
|
1774
|
+
**Start Parallel Session**
|
|
1775
|
+
|
|
1776
|
+
- HTTP: `POST /api/v1/dialer/parallel-calls/sessions/start`
|
|
1777
|
+
- operationId: `start_parallel_session_dialer_parallel_calls_sessions_start_post` (also callable as `g8.api.call("start_parallel_session_dialer_parallel_calls_sessions_start_post", input)`)
|
|
1778
|
+
- Tier: `external`: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first
|
|
1779
|
+
- API-key scope: `voice:run`
|
|
1780
|
+
|
|
1781
|
+
*** CALLS REAL PEOPLE. *** Dials every contact in the body, at once.
|
|
1782
|
+
|
|
1783
|
+
One request can ring a lot of telephones. The only ceiling is voice's
|
|
1784
|
+
per-org `MAX_LIMIT_OF_CALLS_PER_ORG_ID`; this contract does not cap
|
|
1785
|
+
`contacts` itself, because a cap here that disagreed with voice's would
|
|
1786
|
+
reject batches voice would have accepted.
|
|
1787
|
+
|
|
1788
|
+
Contacts whose number cannot be parsed are SKIPPED, not rejected - the
|
|
1789
|
+
batch proceeds without them and the response names who was dropped. Read
|
|
1790
|
+
it; do not assume every contact you sent was dialed.
|
|
1791
|
+
|
|
1792
|
+
Attempts reserve credits and connected minutes charge more. Tiered
|
|
1793
|
+
`external`: this reaches strangers on the customer's behalf.
|
|
1794
|
+
|
|
1795
|
+
**Input**
|
|
1796
|
+
|
|
1797
|
+
| Field | Type | Required | Description |
|
|
1798
|
+
|---|---|---|---|
|
|
1799
|
+
| `body` | `StartParallelSessionRequest` | yes | Request body; fields below. |
|
|
1800
|
+
|
|
1801
|
+
Body fields (`StartParallelSessionRequest`):
|
|
1802
|
+
|
|
1803
|
+
| Field | Type | Required | Description |
|
|
1804
|
+
|---|---|---|---|
|
|
1805
|
+
| `body.contacts` | `Array<DialContact>` | yes | |
|
|
1806
|
+
| `body.from_phone` | `string` | yes | |
|
|
1807
|
+
| `body.user_id` | `string` | yes | |
|
|
1808
|
+
| `body.campaign_builder_campaign_id` | `string \| null` | no | |
|
|
1809
|
+
| `body.campaign_id` | `string \| null` | no | |
|
|
1810
|
+
| `body.name` | `string \| null` | no | |
|
|
1811
|
+
| `body.session_id` | `string \| null` | no | |
|
|
1812
|
+
| `body.session_metadata` | `SessionMetadataIn \| null` | no | |
|
|
1813
|
+
| `body.user_email` | `string \| null` | no | |
|
|
1814
|
+
|
|
1815
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1816
|
+
|
|
1817
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1818
|
+
|
|
1819
|
+
**Example**
|
|
1820
|
+
|
|
1821
|
+
```ts
|
|
1822
|
+
// external: reaches real people (sends email/SMS, places a call, launches a send); the SDK never blindly retries it; confirm with a human first.
|
|
1823
|
+
const result = await g8.api.dialer.startParallelSession({
|
|
1824
|
+
body: {
|
|
1825
|
+
contacts: [{ contact_id: "id", to_phone: "+15555550100" }],
|
|
1826
|
+
from_phone: "+15555550100",
|
|
1827
|
+
user_id: "id",
|
|
1828
|
+
},
|
|
1829
|
+
});
|
|
1830
|
+
```
|
|
1831
|
+
|
|
1832
|
+
---
|
|
1833
|
+
|
|
1834
|
+
<a id="op-unresolvemissedcallbacks"></a>
|
|
1835
|
+
|
|
1836
|
+
### `g8.api.dialer.unresolveMissedCallbacks(input)`
|
|
1837
|
+
|
|
1838
|
+
**Unresolve Missed Callbacks**
|
|
1839
|
+
|
|
1840
|
+
- HTTP: `PATCH /api/v1/dialer/parallel-calls/missed-callbacks/unresolve`
|
|
1841
|
+
- operationId: `unresolve_missed_callbacks_dialer_parallel_calls_missed_callbacks_unresolve_patch` (also callable as `g8.api.call("unresolve_missed_callbacks_dialer_parallel_calls_missed_callbacks_unresolve_patch", input)`)
|
|
1842
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1843
|
+
- API-key scope: `voice:write`
|
|
1844
|
+
|
|
1845
|
+
CONTACTS NOBODY. Reopens a missed callback closed by mistake.
|
|
1846
|
+
|
|
1847
|
+
**Input**
|
|
1848
|
+
|
|
1849
|
+
| Field | Type | Required | Description |
|
|
1850
|
+
|---|---|---|---|
|
|
1851
|
+
| `body` | `MissedCallbacksUnresolveRequest` | yes | Request body; fields below. |
|
|
1852
|
+
|
|
1853
|
+
Body fields (`MissedCallbacksUnresolveRequest`):
|
|
1854
|
+
|
|
1855
|
+
| Field | Type | Required | Description |
|
|
1856
|
+
|---|---|---|---|
|
|
1857
|
+
| `body.ids` | `Array<integer>` | yes | |
|
|
1858
|
+
| `body.user_email` | `string` | yes | |
|
|
1859
|
+
|
|
1860
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1861
|
+
|
|
1862
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1863
|
+
|
|
1864
|
+
**Example**
|
|
1865
|
+
|
|
1866
|
+
```ts
|
|
1867
|
+
const result = await g8.api.dialer.unresolveMissedCallbacks({ body: { ids: [123], user_email: "jane@acme.com" } });
|
|
1868
|
+
```
|
|
1869
|
+
|
|
1870
|
+
---
|
|
1871
|
+
|
|
1872
|
+
<a id="op-unskipcontact"></a>
|
|
1873
|
+
|
|
1874
|
+
### `g8.api.dialer.unskipContact(input)`
|
|
1875
|
+
|
|
1876
|
+
**Unskip Contact**
|
|
1877
|
+
|
|
1878
|
+
- HTTP: `POST /api/v1/dialer/sessions/{session_id}/calls/unskip-contact`
|
|
1879
|
+
- operationId: `unskip_contact_dialer_sessions__session_id__calls_unskip_contact_post` (also callable as `g8.api.call("unskip_contact_dialer_sessions__session_id__calls_unskip_contact_post", input)`)
|
|
1880
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1881
|
+
- API-key scope: `voice:write`
|
|
1882
|
+
|
|
1883
|
+
CONTACTS NOBODY. Puts a skipped contact back in the queue.
|
|
1884
|
+
|
|
1885
|
+
It does NOT call them - it only makes them eligible again, so the next
|
|
1886
|
+
`next-batch` may.
|
|
1887
|
+
|
|
1888
|
+
**Input**
|
|
1889
|
+
|
|
1890
|
+
| Field | Type | Required | Description |
|
|
1891
|
+
|---|---|---|---|
|
|
1892
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
1893
|
+
| `body` | `SkipContactRequest` | yes | Request body; fields below. |
|
|
1894
|
+
|
|
1895
|
+
Body fields (`SkipContactRequest`):
|
|
1896
|
+
|
|
1897
|
+
| Field | Type | Required | Description |
|
|
1898
|
+
|---|---|---|---|
|
|
1899
|
+
| `body.contact_id` | `string` | yes | |
|
|
1900
|
+
|
|
1901
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1902
|
+
|
|
1903
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1904
|
+
|
|
1905
|
+
**Example**
|
|
1906
|
+
|
|
1907
|
+
```ts
|
|
1908
|
+
const result = await g8.api.dialer.unskipContact({ path: { session_id: "id" }, body: { contact_id: "id" } });
|
|
1909
|
+
```
|
|
1910
|
+
|
|
1911
|
+
---
|
|
1912
|
+
|
|
1913
|
+
<a id="op-updateredialstate"></a>
|
|
1914
|
+
|
|
1915
|
+
### `g8.api.dialer.updateRedialState(input)`
|
|
1916
|
+
|
|
1917
|
+
**Update Redial State**
|
|
1918
|
+
|
|
1919
|
+
- HTTP: `PATCH /api/v1/dialer/parallel-calls/sessions/{session_id}/redial-state`
|
|
1920
|
+
- operationId: `update_redial_state_dialer_parallel_calls_sessions__session_id__redial_state_patch` (also callable as `g8.api.call("update_redial_state_dialer_parallel_calls_sessions__session_id__redial_state_patch", input)`)
|
|
1921
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1922
|
+
- API-key scope: `voice:write`
|
|
1923
|
+
|
|
1924
|
+
CONTACTS NOBODY. Records how far a bulk redial sweep has got.
|
|
1925
|
+
|
|
1926
|
+
Bookkeeping so a sweep can resume where it stopped. `reset: true` clears
|
|
1927
|
+
it, which makes the NEXT sweep start from the beginning - it does not
|
|
1928
|
+
itself redial anyone.
|
|
1929
|
+
|
|
1930
|
+
**Input**
|
|
1931
|
+
|
|
1932
|
+
| Field | Type | Required | Description |
|
|
1933
|
+
|---|---|---|---|
|
|
1934
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
1935
|
+
| `body` | `UpdateRedialStateRequest` | yes | Request body; fields below. |
|
|
1936
|
+
|
|
1937
|
+
Body fields (`UpdateRedialStateRequest`):
|
|
1938
|
+
|
|
1939
|
+
| Field | Type | Required | Description |
|
|
1940
|
+
|---|---|---|---|
|
|
1941
|
+
| `body.redial_state` | `RedialState \| null` | no | |
|
|
1942
|
+
| `body.reset` | `boolean` | no | default `false` |
|
|
1943
|
+
|
|
1944
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1945
|
+
|
|
1946
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1947
|
+
|
|
1948
|
+
**Example**
|
|
1949
|
+
|
|
1950
|
+
```ts
|
|
1951
|
+
const result = await g8.api.dialer.updateRedialState({ path: { session_id: "id" }, body: {} });
|
|
1952
|
+
```
|
|
1953
|
+
|
|
1954
|
+
---
|
|
1955
|
+
|
|
1956
|
+
<a id="op-updatesessionbookingeventtype"></a>
|
|
1957
|
+
|
|
1958
|
+
### `g8.api.dialer.updateSessionBookingEventType(input)`
|
|
1959
|
+
|
|
1960
|
+
**Update Session Booking Event Type**
|
|
1961
|
+
|
|
1962
|
+
- HTTP: `PATCH /api/v1/dialer/sessions/{session_id}/booking-event-type`
|
|
1963
|
+
- operationId: `update_session_booking_event_type_dialer_sessions__session_id__booking_event_type_patch` (also callable as `g8.api.call("update_session_booking_event_type_dialer_sessions__session_id__booking_event_type_patch", input)`)
|
|
1964
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
1965
|
+
- API-key scope: `voice:write`
|
|
1966
|
+
|
|
1967
|
+
CONTACTS NOBODY. Sets which meeting type a booking on this session creates.
|
|
1968
|
+
|
|
1969
|
+
Null clears the selection and falls back to the org default.
|
|
1970
|
+
|
|
1971
|
+
**Input**
|
|
1972
|
+
|
|
1973
|
+
| Field | Type | Required | Description |
|
|
1974
|
+
|---|---|---|---|
|
|
1975
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
1976
|
+
| `body` | `BookingEventTypePatchRequest` | yes | Request body; fields below. |
|
|
1977
|
+
|
|
1978
|
+
Body fields (`BookingEventTypePatchRequest`):
|
|
1979
|
+
|
|
1980
|
+
| Field | Type | Required | Description |
|
|
1981
|
+
|---|---|---|---|
|
|
1982
|
+
| `body.selected_event_type_id` | `integer \| null` | no | |
|
|
1983
|
+
|
|
1984
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
1985
|
+
|
|
1986
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
1987
|
+
|
|
1988
|
+
**Example**
|
|
1989
|
+
|
|
1990
|
+
```ts
|
|
1991
|
+
const result = await g8.api.dialer.updateSessionBookingEventType({ path: { session_id: "id" }, body: {} });
|
|
1992
|
+
```
|
|
1993
|
+
|
|
1994
|
+
---
|
|
1995
|
+
|
|
1996
|
+
<a id="op-updatesessionfilter"></a>
|
|
1997
|
+
|
|
1998
|
+
### `g8.api.dialer.updateSessionFilter(input)`
|
|
1999
|
+
|
|
2000
|
+
**Update Session Filter**
|
|
2001
|
+
|
|
2002
|
+
- HTTP: `PATCH /api/v1/dialer/sessions/{session_id}/filter-spec`
|
|
2003
|
+
- operationId: `update_session_filter_dialer_sessions__session_id__filter_spec_patch` (also callable as `g8.api.call("update_session_filter_dialer_sessions__session_id__filter_spec_patch", input)`)
|
|
2004
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
2005
|
+
- API-key scope: `voice:write`
|
|
2006
|
+
|
|
2007
|
+
CONTACTS NOBODY DIRECTLY - but it decides WHO IS CALLED NEXT.
|
|
2008
|
+
|
|
2009
|
+
The filter is the queue's eligibility rule, not a view. Widening it on a
|
|
2010
|
+
running session adds people who will then be dialed by the next
|
|
2011
|
+
`next-batch`; narrowing it removes people mid-campaign. No call is placed
|
|
2012
|
+
by this request itself.
|
|
2013
|
+
|
|
2014
|
+
**Input**
|
|
2015
|
+
|
|
2016
|
+
| Field | Type | Required | Description |
|
|
2017
|
+
|---|---|---|---|
|
|
2018
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
2019
|
+
| `body` | `FilterSpecPatchRequest` | yes | Request body; fields below. |
|
|
2020
|
+
|
|
2021
|
+
Body fields (`FilterSpecPatchRequest`):
|
|
2022
|
+
|
|
2023
|
+
| Field | Type | Required | Description |
|
|
2024
|
+
|---|---|---|---|
|
|
2025
|
+
| `body.filter_spec` | `FilterSpec \| null` | no | |
|
|
2026
|
+
| `body.order_spec` | `OrderSpec \| null` | no | |
|
|
2027
|
+
|
|
2028
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
2029
|
+
|
|
2030
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
2031
|
+
|
|
2032
|
+
**Example**
|
|
2033
|
+
|
|
2034
|
+
```ts
|
|
2035
|
+
const result = await g8.api.dialer.updateSessionFilter({ path: { session_id: "id" }, body: {} });
|
|
2036
|
+
```
|
|
2037
|
+
|
|
2038
|
+
---
|
|
2039
|
+
|
|
2040
|
+
<a id="op-updatesessionhiddenfields"></a>
|
|
2041
|
+
|
|
2042
|
+
### `g8.api.dialer.updateSessionHiddenFields(input)`
|
|
2043
|
+
|
|
2044
|
+
**Update Session Hidden Fields**
|
|
2045
|
+
|
|
2046
|
+
- HTTP: `PATCH /api/v1/dialer/sessions/{session_id}/hidden-custom-fields`
|
|
2047
|
+
- operationId: `update_session_hidden_fields_dialer_sessions__session_id__hidden_custom_fields_patch` (also callable as `g8.api.call("update_session_hidden_fields_dialer_sessions__session_id__hidden_custom_fields_patch", input)`)
|
|
2048
|
+
- Tier: `write`: creates or changes records; the SDK sends an Idempotency-Key and retries transient failures
|
|
2049
|
+
- API-key scope: `voice:write`
|
|
2050
|
+
|
|
2051
|
+
CONTACTS NOBODY. Hides columns in the rep's grid. Display only.
|
|
2052
|
+
|
|
2053
|
+
PUT semantics: the list REPLACES whatever was hidden before, so send the
|
|
2054
|
+
whole set rather than the delta. Hiding a field does not remove the data.
|
|
2055
|
+
|
|
2056
|
+
**Input**
|
|
2057
|
+
|
|
2058
|
+
| Field | Type | Required | Description |
|
|
2059
|
+
|---|---|---|---|
|
|
2060
|
+
| `path.session_id` | `string` | yes | Session id. |
|
|
2061
|
+
| `body` | `HiddenCustomFieldsPatchRequest` | yes | Request body; fields below. |
|
|
2062
|
+
|
|
2063
|
+
Body fields (`HiddenCustomFieldsPatchRequest`):
|
|
2064
|
+
|
|
2065
|
+
| Field | Type | Required | Description |
|
|
2066
|
+
|---|---|---|---|
|
|
2067
|
+
| `body.hidden_custom_fields` | `Array<string>` | yes | |
|
|
2068
|
+
|
|
2069
|
+
**Returns** `ApiResponse_DialerPayload_`: the envelope `{ data: DialerPayload, ... }`. `g8.api` returns the envelope as-is, so read `result.data`.
|
|
2070
|
+
|
|
2071
|
+
Other envelope fields: `pagination` (PaginationMeta).
|
|
2072
|
+
|
|
2073
|
+
**Example**
|
|
2074
|
+
|
|
2075
|
+
```ts
|
|
2076
|
+
const result = await g8.api.dialer.updateSessionHiddenFields({
|
|
2077
|
+
path: { session_id: "id" },
|
|
2078
|
+
body: { hidden_custom_fields: ["example"] },
|
|
2079
|
+
});
|
|
2080
|
+
```
|
|
2081
|
+
|
|
2082
|
+
---
|
|
2083
|
+
|
|
2084
|
+
## Referenced types
|
|
2085
|
+
|
|
2086
|
+
Named types that appear in the tables above. Full TypeScript definitions: `G8Contract.<Name>` (`import type { G8Contract } from "@graph8/sdk"`).
|
|
2087
|
+
|
|
2088
|
+
<a id="type-dialcontact"></a>
|
|
2089
|
+
|
|
2090
|
+
### `DialContact`
|
|
2091
|
+
|
|
2092
|
+
One person to call. `to_phone` is a REAL phone number of a REAL human. An unparseable number is SKIPPED rather than rejecting the batch, so read the response to learn who was actually dialed.
|
|
2093
|
+
|
|
2094
|
+
| Field | Type | Required | Description |
|
|
2095
|
+
|---|---|---|---|
|
|
2096
|
+
| `contact_id` | `string` | yes | |
|
|
2097
|
+
| `to_phone` | `string` | yes | |
|
|
2098
|
+
| `all_phones` | `Array<Record<string, unknown>> \| null` | no | |
|
|
2099
|
+
| `company` | `string \| null` | no | |
|
|
2100
|
+
| `default_region` | `string \| null` | no | |
|
|
2101
|
+
| `dynamic_columns` | `Record<string, unknown> \| null` | no | |
|
|
2102
|
+
| `email` | `string \| null` | no | |
|
|
2103
|
+
| `first_name` | `string \| null` | no | |
|
|
2104
|
+
| `is_redial` | `boolean \| null` | no | default `false` |
|
|
2105
|
+
| `last_name` | `string \| null` | no | |
|
|
2106
|
+
| `original_call_id` | `string \| null` | no | |
|
|
2107
|
+
| `phone_index` | `integer \| null` | no | |
|
|
2108
|
+
| `redial_count` | `integer \| null` | no | default `0` |
|
|
2109
|
+
| `timezone` | `string` | no | default `"America/New_York"` |
|
|
2110
|
+
| `title` | `string \| null` | no | |
|
|
2111
|
+
|
|
2112
|
+
<a id="type-filterspec"></a>
|
|
2113
|
+
|
|
2114
|
+
### `FilterSpec`
|
|
2115
|
+
|
|
2116
|
+
Which contacts in the list are eligible to be dialed. Narrowing this on a RUNNING session changes who gets called next. It is not a display filter.
|
|
2117
|
+
|
|
2118
|
+
| Field | Type | Required | Description |
|
|
2119
|
+
|---|---|---|---|
|
|
2120
|
+
| `exclude_dispositions` | `Array<string>` | no | |
|
|
2121
|
+
| `predicates` | `Array<FilterPredicate>` | no | |
|
|
2122
|
+
| `search` | `string \| null` | no | |
|
|
2123
|
+
|
|
2124
|
+
<a id="type-forcenextcontact"></a>
|
|
2125
|
+
|
|
2126
|
+
### `ForceNextContact`
|
|
2127
|
+
|
|
2128
|
+
Jump one specific contact to the front of the next batch.
|
|
2129
|
+
|
|
2130
|
+
| Field | Type | Required | Description |
|
|
2131
|
+
|---|---|---|---|
|
|
2132
|
+
| `contact_id` | `string` | yes | |
|
|
2133
|
+
| `phone_field` | `string` | yes | |
|
|
2134
|
+
|
|
2135
|
+
<a id="type-orderspec"></a>
|
|
2136
|
+
|
|
2137
|
+
### `OrderSpec`
|
|
2138
|
+
|
|
2139
|
+
The order the queue is worked in, and which phone field is tried first.
|
|
2140
|
+
|
|
2141
|
+
| Field | Type | Required | Description |
|
|
2142
|
+
|---|---|---|---|
|
|
2143
|
+
| `mode` | `"natural_skip_dialed" \| "dialed_first"` | no | default `"natural_skip_dialed"` |
|
|
2144
|
+
| `phone_priority` | `Array<string>` | no | |
|
|
2145
|
+
| `sort_model` | `Array<Record<string, string>>` | no | |
|
|
2146
|
+
|
|
2147
|
+
<a id="type-redialstate"></a>
|
|
2148
|
+
|
|
2149
|
+
### `RedialState`
|
|
2150
|
+
|
|
2151
|
+
Where a bulk redial sweep got to, so it can resume.
|
|
2152
|
+
|
|
2153
|
+
| Field | Type | Required | Description |
|
|
2154
|
+
|---|---|---|---|
|
|
2155
|
+
| `filters_snapshot` | `Record<string, unknown>` | yes | |
|
|
2156
|
+
| `started_at` | `string` | yes | |
|
|
2157
|
+
| `last_contact_id` | `integer` | no | default `0` |
|
|
2158
|
+
| `processed_count` | `integer` | no | default `0` |
|
|
2159
|
+
|
|
2160
|
+
<a id="type-sessionmetadatain"></a>
|
|
2161
|
+
|
|
2162
|
+
### `SessionMetadataIn`
|
|
2163
|
+
|
|
2164
|
+
Free-form session context. Open: voice grows this per release.
|
|
2165
|
+
|
|
2166
|
+
Type: `Record<string, unknown>`.
|