import {z} from 'zod' export type PriorAuthorizationTypeEnum = 'assessment' | 'treatment' | 'reassessment' | 'reassessment_and_treatment'; export type PatientInlineData = {first_name: string, last_name: string, date_of_birth: string}; export type PayorInlineData = {insurance_id: string, member_id?: (string | null) | undefined, insurance_display_name?: (string | null) | undefined}; export type PriorAuthorizationSpecialtyEnum = 'aba' | 'speech_therapy' | 'occupational_therapy' | 'physical_therapy' | 'mental_behavioral_health'; export type PriorAuthorizationUnitTypeEnum = 'units' | 'visits' | 'hours'; export type CptModifier = 'cf' | 'hm' | 'ho' | 'hn' | 'ad' | 'ae' | 'pt' | 'af' | 'ot' | 'hp' | 'gt' | 'u1' | 'u2' | 'u3' | 'u4' | 'u5' | 'u6' | 'u7' | 'u8' | 'gp' | 'go' | 'gn' | 'cq' | 'co' | 'kx' | 'gq' | 'fq' | 'ga' | 'gx' | 'gy' | 'gz' | 'lt' | 'rt' | 'xe' | 'xs' | 'xu' | '59' | '76' | '77' | '93' | '95' | '96' | '97'; export type ServiceCptCode = {code: string, units: string, unit_type?: PriorAuthorizationUnitTypeEnum | undefined, modifiers?: (Array | null) | undefined}; export type PlaceOfService = 'telehealth_other_home' | 'school' | 'telehealth_home' | 'office' | 'home' | 'independent_clinic' | 'community_mental_health_center' | 'other'; export type ServiceBlock = {specialty?: (PriorAuthorizationSpecialtyEnum | null) | undefined, service_type_codes?: (Array | null) | undefined, start_date?: (string | null) | undefined, end_date?: (string | null) | undefined, cpt_codes?: (Array | null) | undefined, requested_visits?: (number | null) | undefined, requested_weeks?: (number | null) | undefined, locations?: (Array | null) | undefined}; export type PriorAuthorizationCreateRequest = {type: PriorAuthorizationTypeEnum, patient_id?: (string | null) | undefined, patient_data?: (PatientInlineData | null) | undefined, payor_id?: (string | null) | undefined, payor_data?: (PayorInlineData | null) | undefined, service?: (ServiceBlock | null) | undefined, requesting_provider_id: string, servicing_provider_id?: (string | null) | undefined, servicing_location_id?: (string | null) | undefined, organization_id?: (string | null) | undefined, notes?: (string | null) | undefined, scheduled_submission_date?: (string | null) | undefined, copy_files_from_prior_authorization_id?: (string | null) | undefined}; export type CreateApiV1PriorAuthorizationsArgs = {body: PriorAuthorizationCreateRequest}; export type CreateApiV1PriorAuthorizationsOptions = {baseUrl: string, APIKeyHeader?: string | undefined, fetch?: typeof fetch | undefined}; export const priorAuthorizationTypeEnum = z.enum(["assessment", "treatment", "reassessment", "reassessment_and_treatment"]); export const priorAuthorizationStatusEnum = z.enum(["pending", "submitted", "information_needed", "decided", "cancelled"]); export const priorAuthorizationDecisionEnum = z.enum(["approved", "partially_approved", "denied", "no_authorization_required"]); export const priorAuthorizationAppealStatusEnum = z.enum(["requested", "appealing", "appeal_approved", "appeal_denied", "not_appealing"]); export const appealAvailabilitySlot = z.object({day: z.string(), start: z.string(), end: z.string()}); export const priorAuthorizationInsurance = z.object({id: z.string(), name: z.string(), trading_partner_service_id: z.string().nullable().optional()}); export const priorAuthorizationProviderLocation = z.object({id: z.string(), name: z.string()}); export const priorAuthorizationProvider = z.object({id: z.string(), name: z.string(), npi: z.string(), tax_id: z.string().nullable().optional(), type: z.string(), is_active: z.boolean(), location: priorAuthorizationProviderLocation.nullable().optional()}); export const priorAuthorizationServicingLocation = z.object({id: z.string(), name: z.string(), address: z.string(), address_2: z.string().nullable().optional(), city: z.string(), state: z.string(), zip_code: z.string()}); export const priorAuthorizationUser = z.object({id: z.string(), name: z.string().nullable().optional(), email: z.string().nullable().optional(), image: z.string().nullable().optional(), user_type: z.string().nullable().optional()}); export const priorAuthorizationSpecialtyEnum = z.enum(["aba", "speech_therapy", "occupational_therapy", "physical_therapy", "mental_behavioral_health"]); export const priorAuthorizationUnitTypeEnum = z.enum(["units", "visits", "hours"]); export const cptModifier = z.enum(["cf", "hm", "ho", "hn", "ad", "ae", "pt", "af", "ot", "hp", "gt", "u1", "u2", "u3", "u4", "u5", "u6", "u7", "u8", "gp", "go", "gn", "cq", "co", "kx", "gq", "fq", "ga", "gx", "gy", "gz", "lt", "rt", "xe", "xs", "xu", "59", "76", "77", "93", "95", "96", "97"]); export const serviceCptCode = z.object({code: z.string(), units: z.string(), unit_type: priorAuthorizationUnitTypeEnum.optional(), modifiers: z.array(cptModifier).nullable().optional()}); export const placeOfService = z.enum(["telehealth_other_home", "school", "telehealth_home", "office", "home", "independent_clinic", "community_mental_health_center", "other"]); export const priorAuthorizationServiceResponse = z.object({specialty: priorAuthorizationSpecialtyEnum.nullable().optional(), service_type_codes: z.array(z.string()).nullable().optional(), start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional(), requested_visits: z.number().int().nullable().optional(), requested_weeks: z.number().int().nullable().optional(), cpt_codes: z.array(serviceCptCode).nullable().optional(), locations: z.array(placeOfService).nullable().optional()}); export const priorAuthorizationResultResponse = z.object({start_date: z.string().nullable().optional(), end_date: z.string().nullable().optional(), approved_visits: z.number().int().nullable().optional(), approved_weeks: z.number().int().nullable().optional(), cpt_codes: z.array(serviceCptCode).nullable().optional(), locations: z.array(placeOfService).nullable().optional(), authorization_number: z.string().nullable().optional(), cpt_authorization_numbers: z.record(z.string(), z.string()).nullable().optional(), reference_number: z.string().nullable().optional(), notes: z.string().nullable().optional(), ai_summary: z.string().nullable().optional(), ai_summary_generated_at: z.string().nullable().optional()}); export const documentType = z.enum(["referral", "authorization", "intake_documents", "legal_documents", "financial_documents", "insurance_card", "billing", "spam", "plan_of_care", "diagnosis", "medical_records", "other"]); export const priorAuthorizationFile = z.object({id: z.string(), name: z.string(), display_name: z.string().nullable().optional(), path: z.string(), type: z.string().nullable().optional(), size: z.number().int().nullable().optional(), document_type: documentType.nullable().optional(), metadata: z.record(z.string(), z.unknown()).nullable().optional(), created_at: z.string(), url: z.string().nullable().optional()}); export const priorAuthorizationCancellationReasonEnum = z.enum(["duplicate_already_submitted", "no_longer_needed", "submitted_directly_to_payor", "patient_no_longer_active", "entered_in_error", "other"]); export const priorAuthorizationResponse = z.object({id: z.string(), company_id: z.string(), created_by_user_id: z.string().nullable().optional(), type: priorAuthorizationTypeEnum, status: priorAuthorizationStatusEnum, decision: priorAuthorizationDecisionEnum.nullable().optional(), appeal_status: priorAuthorizationAppealStatusEnum.nullable().optional(), appeal_notes: z.string().nullable().optional(), appeal_number: z.string().nullable().optional(), appeal_availability: z.array(appealAvailabilitySlot).nullable().optional(), notes: z.string().nullable().optional(), patient_id: z.string(), patient_first_name: z.string(), patient_last_name: z.string(), patient_date_of_birth: z.string(), payor_member_id: z.string().nullable().optional(), payor_insurance_id: z.string().nullable().optional(), payor_insurance_display_name: z.string().nullable().optional(), payor_insurance: priorAuthorizationInsurance.nullable().optional(), requesting_provider_id: z.string().nullable().optional(), servicing_provider_id: z.string().nullable().optional(), servicing_location_id: z.string().nullable().optional(), organization_id: z.string().nullable().optional(), requesting_provider: priorAuthorizationProvider.nullable().optional(), servicing_provider: priorAuthorizationProvider.nullable().optional(), servicing_location: priorAuthorizationServicingLocation.nullable().optional(), created_by_user: priorAuthorizationUser.nullable().optional(), service: priorAuthorizationServiceResponse.nullable().optional(), result: priorAuthorizationResultResponse.nullable().optional(), files: z.array(priorAuthorizationFile).nullable().optional(), file_count: z.number().int().nullable().optional(), submitted_at: z.string().nullable().optional(), decided_at: z.string().nullable().optional(), appeal_submitted_at: z.string().nullable().optional(), last_followed_up_at: z.string().nullable().optional(), scheduled_submission_date: z.string().nullable().optional(), completed: z.boolean().optional(), completed_at: z.string().nullable().optional(), completed_by_user_id: z.string().nullable().optional(), completed_by_user: priorAuthorizationUser.nullable().optional(), cancellation_reason: priorAuthorizationCancellationReasonEnum.nullable().optional(), cancellation_note: z.string().nullable().optional(), cancelled_at: z.string().nullable().optional(), active: z.boolean(), created_at: z.string(), updated_at: z.string()}); 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 a prior authorization * * POST /v1/prior-authorizations * * Also accepts auth: HTTPBearer */ export const createApiV1PriorAuthorizations = async (args: CreateApiV1PriorAuthorizationsArgs, options: CreateApiV1PriorAuthorizationsOptions) => { const {baseUrl, fetch: fetchFn = fetch, APIKeyHeader} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (APIKeyHeader !== undefined) headers.set("X-API-Key", APIKeyHeader) const url = `${baseUrl.replace(/\/+$/, '')}/v1/prior-authorizations${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(priorAuthorizationResponse, await res.json()) };