import {z} from 'zod' export type AllQuietApiIntegrationsModelsSnoozeSettingsTimeFilter = {selectedDays?: (Array | null) | undefined, from?: (string | null) | undefined, until?: (string | null) | undefined, snoozeWindowInMinutes?: (number | null) | undefined, snoozeUntilAbsolute?: (string | null) | undefined, snoozeUntilWeekdayAbsolute?: (string | null) | undefined}; export type AllQuietApiIntegrationsModelsSnoozeSettings = {snoozeWindowInMinutes?: (number | null) | undefined, filters?: (Array | null) | undefined}; export type AllQuietApiIntegrationsModelsWebhookAuthenticationBearer = {token?: (string | null) | undefined}; export type AllQuietApiIntegrationsModelsWebhookAuthentication = {privateIpFilter?: (string | null) | undefined, type: string, bearer?: AllQuietApiIntegrationsModelsWebhookAuthenticationBearer | undefined}; export type AllQuietApiIntegrationsHttpMonitoringIntegrationSettingsHttpMonitoring = {url: string, method: string, overrideAcceptedStatusCodes?: (Array | null) | undefined, timeoutInMilliseconds: number, intervalInSeconds: number, maxRetries?: number | undefined, authenticationType?: (string | null) | undefined, basicAuthenticationUserName?: (string | null) | undefined, basicAuthenticationPassword?: (string | null) | undefined, bearerAuthenticationToken?: (string | null) | undefined, headers?: ({[key: string]: string} | null) | undefined, body?: (string | null) | undefined, isPaused?: boolean | undefined, contentTest?: (string | null) | undefined, contentTestMode?: (string | null) | undefined, sslCertificateMaxAgeInDaysDegraded?: (number | null) | undefined, sslCertificateMaxAgeInDaysDown?: (number | null) | undefined, severityDegraded?: (string | null) | undefined, severityDown?: (string | null) | undefined, logResponseBody?: boolean | undefined, ignoreNonHttpErrors?: boolean | undefined, disableFollowRedirect?: boolean | undefined}; export type AllQuietApiIntegrationsHeartbeatMonitorIntegrationSettingsHeartbeatMonitor = {intervalInSec: number, gracePeriodInSec: number, severity: string}; export type AllQuietApiIntegrationsCronJobMonitorIntegrationSettingsCronJobMonitor = {gracePeriodInSec: number, severity: string, cronExpression: string, timeZoneId: string}; export type AllQuietApiIntegrationsPingMonitorIntegrationSettingsPingMonitor = {host: string, timeoutInMilliseconds: number, intervalInSeconds: number, maxRetries?: number | undefined, isPaused?: boolean | undefined, severityDegraded?: (string | null) | undefined, severityDown?: (string | null) | undefined}; export type AllQuietApiPublicInboundIntegrationsIntegrationSettingsEmailRequest = {aliases?: (Array | null) | undefined}; export type AllQuietApiIntegrationsModelsTwilioInboundNumberSettings = {apiBaseDomain?: (string | null) | undefined, accountSid?: (string | null) | undefined, authToken?: (string | null) | undefined, phoneNumber: string, phoneNumberSid?: (string | null) | undefined}; export type AllQuietApiCallRoutingModelsInboundNumberAudioFile = {objectKey?: (string | null) | undefined, fileName?: (string | null) | undefined, contentType?: (string | null) | undefined, fileSizeBytes?: (number | null) | undefined, durationSeconds?: (number | null) | undefined, uploadedAt?: (string | null) | undefined, uploadedByUserId?: (string | null) | undefined}; export type AllQuietApiCallRoutingModelsInboundNumberPrompt = {type?: (string | null) | undefined, text?: (string | null) | undefined, locale?: (string | null) | undefined, voice?: (string | null) | undefined, audioFile?: AllQuietApiCallRoutingModelsInboundNumberAudioFile | undefined}; export type AllQuietApiCallRoutingModelsInboundNumberRouteConfig = {teamId?: (string | null) | undefined, incidentSeverity?: (string | null) | undefined, directVoicemail?: boolean | undefined, sendToVoicemailIfNoResponse?: boolean | undefined, voicemailMessage?: AllQuietApiCallRoutingModelsInboundNumberPrompt | undefined, closingMessage?: AllQuietApiCallRoutingModelsInboundNumberPrompt | undefined, autoResolveOnAnswer?: boolean | undefined, skipAlreadyDialedNumbers?: boolean | undefined, maxUsersToTry?: number | undefined, dialTimeoutPerUserInSeconds?: number | undefined, acceptCallPrompt?: AllQuietApiCallRoutingModelsInboundNumberPrompt | undefined, targetConfirmGatherTimeoutSeconds?: number | undefined, targetConfirmMaxAttempts?: number | undefined}; export type AllQuietApiCallRoutingModelsInboundNumberMenuOption = {key?: (string | null) | undefined, route?: AllQuietApiCallRoutingModelsInboundNumberRouteConfig | undefined}; export type AllQuietApiCallRoutingModelsInboundNumberMenuConfig = {options?: (Array | null) | undefined, menuMaxAttempts?: number | undefined, menuGatherTimeoutSeconds?: number | undefined}; export type AllQuietApiCallRoutingModelsInboundNumberCallFlowConfig = {welcomeMessage?: AllQuietApiCallRoutingModelsInboundNumberPrompt | undefined, callDisplayMode?: (string | null) | undefined, attachVoicemailTranscript?: boolean | undefined, callerAllowlist?: (Array | null) | undefined, callerBlocklist?: (Array | null) | undefined, route?: AllQuietApiCallRoutingModelsInboundNumberRouteConfig | undefined, menu?: AllQuietApiCallRoutingModelsInboundNumberMenuConfig | undefined}; export type AllQuietApiCallRoutingModelsCallRoutingConfigurationStatus = {lastUpdated?: (string | null) | undefined, validationStatus?: (string | null) | undefined, resolvedPhoneNumber?: (string | null) | undefined}; export type AllQuietApiIntegrationsModelsIntegrationSettingsTwilio = {accessSettings?: AllQuietApiIntegrationsModelsTwilioInboundNumberSettings | undefined, callFlowConfig?: AllQuietApiCallRoutingModelsInboundNumberCallFlowConfig | undefined, providerWebhookId?: (string | null) | undefined, configurationStatus?: AllQuietApiCallRoutingModelsCallRoutingConfigurationStatus | undefined}; export type AllQuietApiIntegrationsModelsBirdInboundNumberSettings = {apiBaseDomain?: (string | null) | undefined, accessKey?: (string | null) | undefined, webhookSigningKey?: (string | null) | undefined, workspaceId?: (string | null) | undefined, channelId?: (string | null) | undefined, phoneNumber?: (string | null) | undefined}; export type AllQuietApiIntegrationsModelsIntegrationSettingsBird = {accessSettings?: AllQuietApiIntegrationsModelsBirdInboundNumberSettings | undefined, callFlowConfig?: AllQuietApiCallRoutingModelsInboundNumberCallFlowConfig | undefined, providerWebhookId?: (string | null) | undefined, configurationStatus?: AllQuietApiCallRoutingModelsCallRoutingConfigurationStatus | undefined}; export type AllQuietApiPublicInboundIntegrationsInboundIntegrationResourceIntegrationSettingsRequest = {httpMonitoring?: AllQuietApiIntegrationsHttpMonitoringIntegrationSettingsHttpMonitoring | undefined, heartbeatMonitor?: AllQuietApiIntegrationsHeartbeatMonitorIntegrationSettingsHeartbeatMonitor | undefined, cronJobMonitor?: AllQuietApiIntegrationsCronJobMonitorIntegrationSettingsCronJobMonitor | undefined, pingMonitor?: AllQuietApiIntegrationsPingMonitorIntegrationSettingsPingMonitor | undefined, email?: AllQuietApiPublicInboundIntegrationsIntegrationSettingsEmailRequest | undefined, twilio?: AllQuietApiIntegrationsModelsIntegrationSettingsTwilio | undefined, bird?: AllQuietApiIntegrationsModelsIntegrationSettingsBird | undefined}; export type AllQuietApiPublicInboundIntegrationsInboundIntegrationResourceCreateRequest = {displayName: string, teamId: string, type: string, isMuted?: boolean | undefined, isInMaintenance?: boolean | undefined, snoozeSettings?: AllQuietApiIntegrationsModelsSnoozeSettings | undefined, noiseLimitInSeconds?: (number | null) | undefined, webhookAuthentication?: AllQuietApiIntegrationsModelsWebhookAuthentication | undefined, integrationSettings?: AllQuietApiPublicInboundIntegrationsInboundIntegrationResourceIntegrationSettingsRequest | undefined, labels?: (Array | null) | undefined}; export type CreateApiApiPublicV1InboundIntegrationArgs = {provision?: boolean | undefined, body: AllQuietApiPublicInboundIntegrationsInboundIntegrationResourceCreateRequest}; export type CreateApiApiPublicV1InboundIntegrationOptions = {baseUrl: string, ApiKey?: string | undefined, fetch?: typeof fetch | undefined}; export const allQuietApiIntegrationsModelsSnoozeSettingsTimeFilter = z.object({selectedDays: z.array(z.string()).nullable().optional(), from: z.string().nullable().optional(), until: z.string().nullable().optional(), snoozeWindowInMinutes: z.number().int().gte(0).lte(1440).nullable().optional(), snoozeUntilAbsolute: z.string().nullable().optional(), snoozeUntilWeekdayAbsolute: z.string().nullable().optional()}); export const allQuietApiIntegrationsModelsSnoozeSettings = z.object({snoozeWindowInMinutes: z.number().int().gte(0).lte(1440).nullable().optional(), filters: z.array(allQuietApiIntegrationsModelsSnoozeSettingsTimeFilter).nullable().optional()}); export const allQuietApiIntegrationsModelsWebhookAuthenticationBearer = z.object({token: z.string().nullable().optional()}); export const allQuietApiIntegrationsModelsWebhookAuthentication = z.object({privateIpFilter: z.string().nullable().optional(), type: z.string().min(1), bearer: allQuietApiIntegrationsModelsWebhookAuthenticationBearer.optional()}); export const allQuietApiIntegrationsHttpMonitoringIntegrationSettingsHttpMonitoring = z.object({url: z.string().min(1), method: z.string().min(1), overrideAcceptedStatusCodes: z.array(z.number().int()).nullable().optional(), timeoutInMilliseconds: z.number().int(), intervalInSeconds: z.number().int(), maxRetries: z.number().int().gte(0).lte(5).optional(), authenticationType: z.string().nullable().optional(), basicAuthenticationUserName: z.string().nullable().optional(), basicAuthenticationPassword: z.string().nullable().optional(), bearerAuthenticationToken: z.string().nullable().optional(), headers: z.record(z.string(), z.string()).nullable().optional(), body: z.string().nullable().optional(), isPaused: z.boolean().optional(), contentTest: z.string().max(1024).nullable().optional(), contentTestMode: z.string().nullable().optional(), sslCertificateMaxAgeInDaysDegraded: z.number().int().nullable().optional(), sslCertificateMaxAgeInDaysDown: z.number().int().nullable().optional(), severityDegraded: z.string().nullable().optional(), severityDown: z.string().nullable().optional(), logResponseBody: z.boolean().optional(), ignoreNonHttpErrors: z.boolean().optional(), disableFollowRedirect: z.boolean().optional()}); export const allQuietApiIntegrationsHeartbeatMonitorIntegrationSettingsHeartbeatMonitor = z.object({intervalInSec: z.number().int().gte(0).lte(31536000), gracePeriodInSec: z.number().int().gte(0).lte(31536000), severity: z.string().min(1)}); export const allQuietApiIntegrationsCronJobMonitorIntegrationSettingsCronJobMonitor = z.object({gracePeriodInSec: z.number().int().gte(0).lte(31536000), severity: z.string().min(1), cronExpression: z.string().min(1), timeZoneId: z.string().min(1)}); export const allQuietApiIntegrationsPingMonitorIntegrationSettingsPingMonitor = z.object({host: z.string().min(1), timeoutInMilliseconds: z.number().int(), intervalInSeconds: z.number().int(), maxRetries: z.number().int().gte(0).lte(5).optional(), isPaused: z.boolean().optional(), severityDegraded: z.string().nullable().optional(), severityDown: z.string().nullable().optional()}); export const allQuietApiIntegrationsModelsIntegrationSettingsEmail = z.object({emailAddress: z.string().nullable().optional(), aliases: z.array(z.string()).nullable().optional()}); export const allQuietApiIntegrationsModelsTwilioInboundNumberSettings = z.object({apiBaseDomain: z.string().nullable().optional(), accountSid: z.string().nullable().optional(), authToken: z.string().nullable().optional(), phoneNumber: z.string().min(1), phoneNumberSid: z.string().nullable().optional()}); export const allQuietApiCallRoutingModelsInboundNumberAudioFile = z.object({objectKey: z.string().nullable().optional(), fileName: z.string().nullable().optional(), contentType: z.string().nullable().optional(), fileSizeBytes: z.number().int().nullable().optional(), durationSeconds: z.number().int().nullable().optional(), uploadedAt: z.string().nullable().optional(), uploadedByUserId: z.string().nullable().optional()}); export const allQuietApiCallRoutingModelsInboundNumberPrompt = z.object({type: z.string().nullable().optional(), text: z.string().nullable().optional(), locale: z.string().nullable().optional(), voice: z.string().nullable().optional(), audioFile: allQuietApiCallRoutingModelsInboundNumberAudioFile.optional()}); export const allQuietApiCallRoutingModelsInboundNumberRouteConfig = z.object({teamId: z.string().nullable().optional(), incidentSeverity: z.string().nullable().optional(), directVoicemail: z.boolean().optional(), sendToVoicemailIfNoResponse: z.boolean().optional(), voicemailMessage: allQuietApiCallRoutingModelsInboundNumberPrompt.optional(), closingMessage: allQuietApiCallRoutingModelsInboundNumberPrompt.optional(), autoResolveOnAnswer: z.boolean().optional(), skipAlreadyDialedNumbers: z.boolean().optional(), maxUsersToTry: z.number().int().optional(), dialTimeoutPerUserInSeconds: z.number().int().optional(), acceptCallPrompt: allQuietApiCallRoutingModelsInboundNumberPrompt.optional(), targetConfirmGatherTimeoutSeconds: z.number().int().optional(), targetConfirmMaxAttempts: z.number().int().optional()}); export const allQuietApiCallRoutingModelsInboundNumberMenuOption = z.object({key: z.string().nullable().optional(), route: allQuietApiCallRoutingModelsInboundNumberRouteConfig.optional()}); export const allQuietApiCallRoutingModelsInboundNumberMenuConfig = z.object({options: z.array(allQuietApiCallRoutingModelsInboundNumberMenuOption).nullable().optional(), menuMaxAttempts: z.number().int().optional(), menuGatherTimeoutSeconds: z.number().int().optional()}); export const allQuietApiCallRoutingModelsInboundNumberCallFlowConfig = z.object({welcomeMessage: allQuietApiCallRoutingModelsInboundNumberPrompt.optional(), callDisplayMode: z.string().nullable().optional(), attachVoicemailTranscript: z.boolean().optional(), callerAllowlist: z.array(z.string()).nullable().optional(), callerBlocklist: z.array(z.string()).nullable().optional(), route: allQuietApiCallRoutingModelsInboundNumberRouteConfig.optional(), menu: allQuietApiCallRoutingModelsInboundNumberMenuConfig.optional()}); export const allQuietApiCallRoutingModelsCallRoutingConfigurationStatus = z.object({lastUpdated: z.string().nullable().optional(), validationStatus: z.string().nullable().optional(), resolvedPhoneNumber: z.string().nullable().optional()}); export const allQuietApiIntegrationsModelsIntegrationSettingsTwilio = z.object({accessSettings: allQuietApiIntegrationsModelsTwilioInboundNumberSettings.optional(), callFlowConfig: allQuietApiCallRoutingModelsInboundNumberCallFlowConfig.optional(), providerWebhookId: z.string().nullable().optional(), configurationStatus: allQuietApiCallRoutingModelsCallRoutingConfigurationStatus.optional()}); export const allQuietApiIntegrationsModelsBirdInboundNumberSettings = z.object({apiBaseDomain: z.string().nullable().optional(), accessKey: z.string().nullable().optional(), webhookSigningKey: z.string().nullable().optional(), workspaceId: z.string().nullable().optional(), channelId: z.string().nullable().optional(), phoneNumber: z.string().nullable().optional()}); export const allQuietApiIntegrationsModelsIntegrationSettingsBird = z.object({accessSettings: allQuietApiIntegrationsModelsBirdInboundNumberSettings.optional(), callFlowConfig: allQuietApiCallRoutingModelsInboundNumberCallFlowConfig.optional(), providerWebhookId: z.string().nullable().optional(), configurationStatus: allQuietApiCallRoutingModelsCallRoutingConfigurationStatus.optional()}); export const allQuietApiPublicInboundIntegrationsInboundIntegrationResourceIntegrationSettingsResponse = z.object({httpMonitoring: allQuietApiIntegrationsHttpMonitoringIntegrationSettingsHttpMonitoring.optional(), heartbeatMonitor: allQuietApiIntegrationsHeartbeatMonitorIntegrationSettingsHeartbeatMonitor.optional(), cronJobMonitor: allQuietApiIntegrationsCronJobMonitorIntegrationSettingsCronJobMonitor.optional(), pingMonitor: allQuietApiIntegrationsPingMonitorIntegrationSettingsPingMonitor.optional(), email: allQuietApiIntegrationsModelsIntegrationSettingsEmail.optional(), twilio: allQuietApiIntegrationsModelsIntegrationSettingsTwilio.optional(), bird: allQuietApiIntegrationsModelsIntegrationSettingsBird.optional()}); export const allQuietApiPublicInboundIntegrationsInboundIntegrationResourceResponse = z.object({id: z.string().optional(), isProvisioned: z.boolean().optional(), displayName: z.string().nullable().optional(), type: z.string().nullable().optional(), teamId: z.string().optional(), labels: z.array(z.string()).nullable().optional(), isMuted: z.boolean().optional(), isInMaintenance: z.boolean().optional(), webhookUrl: z.string().nullable().optional(), snoozeSettings: allQuietApiIntegrationsModelsSnoozeSettings.optional(), noiseLimitInSeconds: z.number().int().nullable().optional(), webhookAuthentication: allQuietApiIntegrationsModelsWebhookAuthentication.optional(), integrationSettings: allQuietApiPublicInboundIntegrationsInboundIntegrationResourceIntegrationSettingsResponse.optional(), isRedacted: z.boolean().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Create an inbound integration * * POST /api/public/v1/inbound-integration */ export const createApiApiPublicV1InboundIntegration = async (args: CreateApiApiPublicV1InboundIntegrationArgs, options: CreateApiApiPublicV1InboundIntegrationOptions) => { const {baseUrl, fetch: fetchFn = fetch, ApiKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args.provision != null) query.append("provision", String(args.provision)) if (ApiKey !== undefined) headers.set("Authorization", ApiKey) const url = `${baseUrl.replace(/\/+$/, '')}/api/public/v1/inbound-integration${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(allQuietApiPublicInboundIntegrationsInboundIntegrationResourceResponse, await res.json()) };