import {z} from 'zod' export type GetApiPartnerCustomerCustomerUserIdPricingArgs = {customerUserId: string}; export type GetApiPartnerCustomerCustomerUserIdPricingOptions = {baseUrl?: string | undefined, AccessKey?: string | undefined, fetch?: typeof fetch | undefined}; export const balanceAdjustmentSource = z.union([z.literal(1000), z.literal(1100), z.literal(1101), z.literal(1102), z.literal(1103), z.literal(1104), z.literal(1105), z.literal(1106), z.literal(1200), z.literal(1201), z.literal(1202), z.literal(1203), z.literal(1204), z.literal(1205), z.literal(1206), z.literal(1300), z.literal(1301), z.literal(1302), z.literal(1303), z.literal(1304), z.literal(1305), z.literal(1306), z.literal(1400), z.literal(1401), z.literal(1402), z.literal(1403), z.literal(1404), z.literal(1405), z.literal(1406), z.literal(1500), z.literal(1501), z.literal(1502), z.literal(1503), z.literal(1504), z.literal(1505), z.literal(1506), z.literal(1510), z.literal(1511), z.literal(1512), z.literal(1513), z.literal(1514), z.literal(1515), z.literal(1516), z.literal(1600), z.literal(1605), z.literal(1610), z.literal(1615), z.literal(1620), z.literal(1630), z.literal(1700), z.literal(1701), z.literal(1702), z.literal(1703), z.literal(1704), z.literal(1705), z.literal(1706), z.literal(1710), z.literal(1711), z.literal(1712), z.literal(1713), z.literal(1714), z.literal(1715), z.literal(1716), z.literal(1800), z.literal(1801), z.literal(1802), z.literal(1803), z.literal(1804), z.literal(1805), z.literal(1806), z.literal(1810), z.literal(1811), z.literal(1812), z.literal(1813), z.literal(1814), z.literal(1815), z.literal(1816), z.literal(2000), z.literal(2100), z.literal(2200), z.literal(2300), z.literal(2400), z.literal(3000), z.literal(3100), z.literal(3200), z.literal(4000), z.literal(4100), z.literal(4200), z.literal(4300), z.literal(4400), z.literal(4501), z.literal(4502), z.literal(4503), z.literal(5000), z.literal(5100), z.literal(5200), z.literal(5300), z.literal(6000), z.literal(6100), z.literal(7000), z.literal(7001), z.literal(7002), z.literal(7003), z.literal(7004), z.literal(8000), z.literal(9000), z.literal(10000), z.literal(10100), z.literal(10200), z.literal(10300), z.literal(10301), z.literal(10400), z.literal(10401), z.literal(10410), z.literal(10411), z.literal(10412), z.literal(10413), z.literal(10414), z.literal(10415), z.literal(10416), z.literal(10417), z.literal(10420), z.literal(10421), z.literal(10422), z.literal(10423), z.literal(10424), z.literal(10425), z.literal(10426), z.literal(10427), z.literal(10500), z.literal(10510), z.literal(11000), z.literal(11005), z.literal(11100), z.literal(11105), z.literal(11110), z.literal(11115), z.literal(11120), z.literal(11125), z.literal(12000), z.literal(12100), z.literal(12200), z.literal(12300), z.literal(12400), z.literal(13000), z.literal(13100), z.literal(14000), z.literal(14100), z.literal(14200), z.literal(14300), z.literal(14400)]); export const pricingTierModel = z.object({ThresholdFrom: z.number().int().optional(), ThresholdTo: z.number().int().nullable().optional(), PricePerUnit: z.number().optional(), TierOrder: z.number().int().optional(), Description: z.string().nullable().optional()}); export const expiringOverrideModel = z.object({ProductId: balanceAdjustmentSource.optional(), ProductName: z.string().nullable().optional(), Label: z.string().nullable().optional(), PricePerUnit: z.number().nullable().optional(), Tiers: z.array(pricingTierModel).nullable().optional(), ValidTo: z.string().optional(), DaysLeft: z.number().int().optional()}); export const cdnTierPricingModel = z.object({PricePerGb: z.number().optional(), DefaultPricePerGb: z.number().optional(), IsOverridden: z.boolean().optional(), EnabledPops: z.string().nullable().optional(), DisabledPops: z.string().nullable().optional(), ExtraPops: z.string().nullable().optional()}); export const cdnStandardTierDiscountModel = z.object({NorthAmericaEuropePercent: z.number().optional(), AsiaOceaniaPercent: z.number().optional(), SouthAmericaPercent: z.number().optional(), AfricaPercent: z.number().optional()}); export const cdnVolumeTierPricingModel = z.object({Under100TbPerGb: z.number().nullable().optional(), From100TbPerGb: z.number().nullable().optional(), From500TbPerGb: z.number().nullable().optional(), From1000TbPerGb: z.number().nullable().optional(), From2000TbPerGb: z.number().nullable().optional()}); export const storagePricingModel = z.object({DiscountPercent: z.number().optional(), EdgePerTbMonth: z.number().optional(), DefaultEdgePerTbMonth: z.number().optional(), EdgeIsOverridden: z.boolean().optional(), StandardPerTbMonth: z.number().optional(), DefaultStandardPerTbMonth: z.number().optional(), StandardIsOverridden: z.boolean().optional()}); export const optimizerPricingModel = z.object({PerZoneMonth: z.number().optional(), DefaultPerZoneMonth: z.number().optional(), IsOverridden: z.boolean().optional()}); export const extraZonePricingModel = z.object({FreePullZones: z.number().int().optional(), ExtraPullZonePrice: z.number().nullable().optional(), FreeStorageZones: z.number().int().optional(), ExtraStorageZonePrice: z.number().nullable().optional(), FreeDnsZones: z.number().int().optional(), ExtraDnsZonePrice: z.number().nullable().optional(), FreeVideoLibraries: z.number().int().optional(), ExtraVideoLibraryPrice: z.number().nullable().optional()}); export const bunnyShieldTierModel = z.object({MonthlyCost: z.number().optional(), DefaultMonthlyCost: z.number().optional(), OveragesCostPerMillion: z.number().optional(), DefaultOveragesCostPerMillion: z.number().optional(), IncludedRequests: z.number().int().optional()}); export const bunnyShieldPricingModel = z.object({Basic: bunnyShieldTierModel.nullable().optional(), Advanced: bunnyShieldTierModel.nullable().optional(), Business: bunnyShieldTierModel.nullable().optional(), Enterprise: bunnyShieldTierModel.nullable().optional()}); export const drmPricingModel = z.object({BaseFeePerLibraryMonth: z.number().optional(), DefaultBaseFeePerLibraryMonth: z.number().optional(), LicenseCost: z.number().nullable().optional(), DefaultLicenseCost: z.number().optional()}); export const tieredUnitPriceModel = z.object({PricePerUnit: z.number().nullable().optional(), DefaultPricePerUnit: z.number().nullable().optional(), Unit: z.string().nullable().optional(), IsOverridden: z.boolean().optional(), Tiers: z.array(pricingTierModel).nullable().optional()}); export const edgeScriptingPricingModel = z.object({RequestsPerMillion: z.number().optional(), DefaultRequestsPerMillion: z.number().optional(), RequestsIsOverridden: z.boolean().optional(), CpuPer1000Seconds: z.number().optional(), DefaultCpuPer1000Seconds: z.number().optional(), CpuIsOverridden: z.boolean().optional()}); export const bunnyDbPricingModel = z.object({ColdStorage: tieredUnitPriceModel.nullable().optional(), ActiveStorage: tieredUnitPriceModel.nullable().optional(), RowReads: tieredUnitPriceModel.nullable().optional(), RowWrites: tieredUnitPriceModel.nullable().optional()}); export const partnerCustomerPricingModel = z.object({CustomOverrideCount: z.number().int().optional(), ExpiringSoon: z.array(expiringOverrideModel).nullable().optional(), CdnStandardTier: cdnTierPricingModel.nullable().optional(), CdnVolumeTier: cdnTierPricingModel.nullable().optional(), CdnStandardTierDiscount: cdnStandardTierDiscountModel.nullable().optional(), CdnVolumeTierPricing: cdnVolumeTierPricingModel.nullable().optional(), Storage: storagePricingModel.nullable().optional(), Optimizer: optimizerPricingModel.nullable().optional(), ExtraZones: extraZonePricingModel.nullable().optional(), BunnyShield: bunnyShieldPricingModel.nullable().optional(), Drm: drmPricingModel.nullable().optional(), Transcribing: tieredUnitPriceModel.nullable().optional(), PremiumEncoding: tieredUnitPriceModel.nullable().optional(), EdgeScripting: edgeScriptingPricingModel.nullable().optional(), WebSockets: tieredUnitPriceModel.nullable().optional(), BunnyDb: bunnyDbPricingModel.nullable().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 Customer Pricing * * GET /partner/customer/{customerUserId}/pricing * * Also accepts auth: bearer */ export const getApiPartnerCustomerCustomerUserIdPricing = async (args: GetApiPartnerCustomerCustomerUserIdPricingArgs, options?: GetApiPartnerCustomerCustomerUserIdPricingOptions) => { const {baseUrl = "https://api.bunny.net", fetch: fetchFn = fetch, AccessKey} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (AccessKey !== undefined) headers.set("AccessKey", AccessKey) const url = `${baseUrl.replace(/\/+$/, '')}/partner/customer/${encodeURIComponent(String(args.customerUserId))}/pricing${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(partnerCustomerPricingModel, await res.json()) };