import {z} from 'zod' export type CreateApiPrintMailV1TargetedListBuildsIdConfirmArgs = {id: string}; export type CreateApiPrintMailV1TargetedListBuildsIdConfirmOptions = {baseUrl?: string | undefined, PrintMailApiKeyAuth?: string | undefined, fetch?: typeof fetch | undefined}; export const targetedListBuildStatus = z.enum(["generating_quote", "quote_ready", "creating_list", "completed", "failed"]); export const uSZipsAroundFilter = z.object({zipCode: z.string(), radiusInMiles: z.number().gte(0.1).lte(100)}); export const uSConsumerAge = z.number().int().gte(18).lte(80); export const uSConsumerIncomeUSD = z.number().int().gte(0).lte(200000); export const uSConsumerGender = z.enum(["male", "female"]); export const uSConsumerEducationLevel = z.enum(["high_school", "college", "grad_school", "vocational_training"]); export const uSConsumerOccupation = z.enum(["professional_technical", "administration_management", "sales_service", "clerical_white_collar", "craftsmen_blue_collar", "student", "homemaker", "retired", "farmer", "military", "religious", "self_employed", "self_employed_professional_technical", "self_employed_administration_management", "self_employed_sales_service", "self_employed_clerical_white_collar", "self_employed_craftsmen_blue_collar", "self_employed_student", "self_employed_homemaker", "self_employed_retired", "self_employed_other", "educator", "financial_professional", "legal_professional", "medical_professional", "other"]); export const uSConsumerNumChildren = z.number().int().gte(0).lte(8); export const uSConsumerHomeValueUSD = z.number().int().gte(0).lte(1000000); export const uSConsumerListFilters = z.object({zipCodesAround: uSZipsAroundFilter.optional(), cityStates: z.array(z.string()).optional(), zipCodes: z.array(z.string()).optional(), ageRange: z.array(uSConsumerAge).optional(), incomeRange: z.array(uSConsumerIncomeUSD).optional(), gender: uSConsumerGender.optional(), educationLevels: z.array(uSConsumerEducationLevel).optional(), occupations: z.array(uSConsumerOccupation).optional(), numChildrenRange: z.array(uSConsumerNumChildren).optional(), homeValueRange: z.array(uSConsumerHomeValueUSD).optional()}); export const uSCompanyType = z.enum(["public", "private", "educational", "government", "nonprofit", "public_subsidiary"]); export const uSCompanyEmployeeCount = z.number().int().gte(1).lte(1000000); export const uSCompanyFoundedYear = z.number().int().gte(1600).lte(2100); export const uSCompanyListFilters = z.object({postalCodes: z.array(z.string()), companyTypes: z.array(uSCompanyType).optional(), industries: z.array(z.string()).optional(), tags: z.array(z.string()).optional(), naicsCodes: z.array(z.string()).optional(), employeeCount: z.array(uSCompanyEmployeeCount).optional(), foundedYear: z.array(uSCompanyFoundedYear).optional()}); export const targetedListBuildQuote = z.object({generatedAt: z.string(), count: z.number().int(), pricePerContactCents: z.number()}); export const targetedListBuildPreviewRecord = z.object({name: z.string(), formattedAddress: z.string()}); export const targetedListBuildErrorType = z.enum(["not_enough_info_to_quote", "insufficient_credits", "internal_service_error"]); export const targetedListBuildError = z.object({type: targetedListBuildErrorType, message: z.string()}); export const targetedListBuild = z.object({id: z.string(), description: z.string().optional(), metadata: z.record(z.string(), z.unknown()).optional(), live: z.boolean(), createdAt: z.string(), updatedAt: z.string(), organization: z.string(), status: targetedListBuildStatus, usConsumers: uSConsumerListFilters.optional(), usCompanies: uSCompanyListFilters.optional(), limit: z.number().int().gte(1).optional(), quote: targetedListBuildQuote.optional(), previewRecords: z.array(targetedListBuildPreviewRecord).optional(), confirmedAt: z.string().optional(), completedAt: z.string().optional(), buildProgressPercent: z.number().gte(0).lte(100).optional(), mailingList: z.string().optional(), errors: z.array(targetedListBuildError).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 }; /** * Confirm Targeted List Build * * POST /print-mail/v1/targeted_list_builds/{id}/confirm */ export const createApiPrintMailV1TargetedListBuildsIdConfirm = async (args: CreateApiPrintMailV1TargetedListBuildsIdConfirmArgs, options?: CreateApiPrintMailV1TargetedListBuildsIdConfirmOptions) => { const {baseUrl = "https://api.postgrid.com", fetch: fetchFn = fetch, PrintMailApiKeyAuth} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (PrintMailApiKeyAuth !== undefined) headers.set("X-API-Key", PrintMailApiKeyAuth) const url = `${baseUrl.replace(/\/+$/, '')}/print-mail/v1/targeted_list_builds/${encodeURIComponent(String(args.id))}/confirm${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(targetedListBuild, await res.json()) };