import {z} from 'zod' export type GetApiApiV4ReportingCdrsCdrIdArgs = {cdr_id: string}; export type GetApiApiV4ReportingCdrsCdrIdOptions = {baseUrl: string, StaticKey?: string | undefined, fetch?: typeof fetch | undefined}; export const cdrCallDisposition = z.enum(["busy", "answered", "vm_answered", "machine_answered", "abandoned", "dialer_abandoned", "system_abandoned", "rejected", "system_rejected", "no_answer", "missed", "failed"]); export const cdrPartyPhoneNumber = z.object({type: z.literal("phone_number").optional(), phone_number: z.string().optional()}); export const wrapupCodeSnapshot = z.object({code_snapshot: z.string().optional()}); export const cdrRecordCall = z.object({id: z.string().optional(), type: z.literal("call").optional(), subtype: z.enum(["inbound", "outbound", "click_to_call", "dialer", "scheduled_callback", "queue_callback"]).optional(), disposition: cdrCallDisposition.optional(), from: cdrPartyPhoneNumber.nullable().optional(), to: cdrPartyPhoneNumber.nullable().optional(), account_id: z.string().nullable().optional(), user: z.object({id: z.number().int().optional(), name: z.string().optional(), email: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), cost: z.string().nullable().optional(), tags: z.array(z.enum(["barge_in", "blind_transfer", "call_score", "conference", "consult_transfer", "forward", "intercept", "monitor", "terminate", "whisper"])).nullable().optional(), started_at: z.string().optional(), ended_at: z.string().nullable().optional(), data: z.object({queue: z.object({id: z.number().int().optional(), name: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), campaign: z.object({id: z.number().int().optional(), name: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), campaign_lead_id: z.number().int().nullable().optional(), destination_country: z.string().nullable().optional(), durations: z.object({overall: z.number().optional(), dialing: z.number().optional(), ivr: z.number().optional(), queue: z.number().optional(), talk: z.number().optional(), hold: z.number().optional()}).optional(), end_reason: z.enum(["agent", "busy", "customer", "dncr_failure", "dncr_restricted", "failed", "machine", "machine_answered", "manager", "no_answer", "rejected", "remote_party", "system_reject", "timeout"]).nullable().optional(), wrapup_code: wrapupCodeSnapshot.nullable().optional(), summary: z.string().nullable().optional(), conversation_score: z.number().nullable().optional(), mos: z.number().nullable().optional(), mos_tc: z.number().nullable().optional()}).optional()}); export const cdrPartyChannelAccount = z.object({type: z.literal("channel_account").optional(), channel_account: z.object({id: z.string().optional(), channel: z.enum(["chat", "facebook", "instagram", "telegram", "viber", "whatsapp"]).optional(), identifier: z.string().optional(), data: z.object({name: z.string().nullable(), username: z.string().nullable().optional()}).optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).optional()}); export const cdrPartyChannelProfile = z.object({type: z.literal("channel_profile").optional(), channel_profile: z.object({id: z.number().int().optional(), channel: z.enum(["chat", "facebook", "instagram", "telegram", "viber", "whatsapp"]).optional(), identifier: z.string().nullable().optional(), name: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).optional()}); export const cdrServiceLevelAgreement = z.object({value: z.number().optional(), status: z.enum(["ok", "strained", "failed"]).optional()}); export const cdrRecordConversation = z.object({id: z.string().optional(), type: z.literal("conversation").optional(), subtype: z.enum(["chat", "facebook", "instagram", "telegram", "viber", "whatsapp"]).optional(), disposition: z.enum(["active", "archived", "initiated", "waiting"]).optional(), from: z.discriminatedUnion("type", [cdrPartyChannelAccount, cdrPartyChannelProfile]).nullable().optional(), to: z.discriminatedUnion("type", [cdrPartyChannelAccount, cdrPartyChannelProfile]).nullable().optional(), account_id: z.string().nullable().optional(), user: z.object({id: z.number().int().optional(), name: z.string().optional(), email: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), cost: z.string().nullable().optional(), tags: z.array(z.enum(["barge_in", "blind_transfer", "call_score", "conference", "consult_transfer", "forward", "intercept", "monitor", "terminate", "whisper"])).nullable().optional(), started_at: z.string().optional(), ended_at: z.string().nullable().optional(), data: z.object({channel: z.string().optional(), flow: z.object({id: z.string().optional(), name: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), queue: z.object({id: z.number().int().optional(), name: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), wrapup_code: wrapupCodeSnapshot.nullable().optional(), durations: z.object({overall: z.number().optional(), queue: z.number().optional(), talk: z.number().optional()}).optional(), service_level_agreements: z.object({first_response: cdrServiceLevelAgreement.nullable().optional(), resolution: cdrServiceLevelAgreement.nullable().optional(), avg_reply: cdrServiceLevelAgreement.nullable().optional()}).optional()}).optional()}); export const callShort = z.object({id: z.string().optional()}); export const cdrRecordHlrLookup = z.object({id: z.string().optional(), type: z.literal("hlr_lookup").optional(), subtype: z.literal("hlr_lookup").optional(), disposition: z.enum(["available", "unavailable", "unknown"]).optional(), from: cdrPartyPhoneNumber.nullable().optional(), to: cdrPartyPhoneNumber.nullable().optional(), account_id: z.string().nullable().optional(), user: z.object({id: z.number().int().optional(), name: z.string().optional(), email: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), cost: z.string().nullable().optional(), tags: z.array(z.enum(["barge_in", "blind_transfer", "call_score", "conference", "consult_transfer", "forward", "intercept", "monitor", "terminate", "whisper"])).nullable().optional(), started_at: z.string().optional(), ended_at: z.string().nullable().optional(), data: z.object({reachable: z.boolean().optional(), roaming: z.boolean().nullable().optional(), related_call: callShort.nullable().optional()}).optional()}); export const cdrRecordSms = z.object({id: z.string().optional(), type: z.literal("sms").optional(), subtype: z.literal("outbound_sms").optional(), disposition: z.enum(["sent", "delivered", "not_sent", "not_delivered", "route_unavailable"]).optional(), from: cdrPartyPhoneNumber.nullable().optional(), to: cdrPartyPhoneNumber.nullable().optional(), account_id: z.string().nullable().optional(), user: z.object({id: z.number().int().optional(), name: z.string().optional(), email: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), cost: z.string().nullable().optional(), tags: z.array(z.enum(["barge_in", "blind_transfer", "call_score", "conference", "consult_transfer", "forward", "intercept", "monitor", "terminate", "whisper"])).nullable().optional(), started_at: z.string().optional(), ended_at: z.string().nullable().optional(), data: z.object({sent: z.boolean().optional(), segments_count: z.number().int().optional(), message: z.string().optional(), canned_message: z.object({id: z.number().int().optional(), name: z.string().optional(), name_snapshot: z.string().nullable().optional(), deleted: z.boolean().optional()}).nullable().optional(), related_call: callShort.nullable().optional()}).optional()}); export const cdr = z.discriminatedUnion("type", [cdrRecordCall, cdrRecordConversation, cdrRecordHlrLookup, cdrRecordSms]); export const getApiApiV4ReportingCdrsCdrIdResponse = z.object({cdr: cdr.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 }; /** * Get CDR * * GET /api/v4/reporting/cdrs/{cdr_id} */ export const getApiApiV4ReportingCdrsCdrId = async (args: GetApiApiV4ReportingCdrsCdrIdArgs, options: GetApiApiV4ReportingCdrsCdrIdOptions) => { const {baseUrl, fetch: fetchFn = fetch, StaticKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (StaticKey !== undefined) headers.set('authorization', `Bearer ${StaticKey}`) const url = `${baseUrl.replace(/\/+$/, '')}/api/v4/reporting/cdrs/${encodeURIComponent(String(args.cdr_id))}${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "GET", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(getApiApiV4ReportingCdrsCdrIdResponse, await res.json()) };