import {z} from 'zod' export type GetApiV1CustomerPortalSeatsSubscriptionsArgs = {page?: number | undefined, limit?: number | undefined}; export type GetApiV1CustomerPortalSeatsSubscriptionsOptions = {baseUrl?: string | undefined, customerSession?: string | undefined, fetch?: typeof fetch | undefined}; export const recurringInterval = z.enum(["day", "week", "month", "year"]); export const subscriptionStatus = z.enum(["incomplete", "incomplete_expired", "trialing", "active", "past_due", "canceled", "unpaid", "paused"]); export const customerCancellationReason = z.enum(["customer_service", "low_quality", "missing_features", "switched_service", "too_complex", "too_expensive", "unused", "other"]); export const trialInterval = z.enum(["day", "week", "month", "year"]); export const productVisibility = z.enum(["draft", "private", "public"]); export const productPriceSource = z.enum(["catalog", "ad_hoc"]); export const taxBehaviorOption = z.enum(["location", "inclusive", "exclusive"]); export const legacyRecurringProductPriceFixed = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), source: productPriceSource, amount_type: z.literal("fixed"), price_currency: z.string(), tax_behavior: taxBehaviorOption.nullable(), is_archived: z.boolean(), product_id: z.string(), type: z.literal("recurring"), recurring_interval: recurringInterval, price_amount: z.number().int(), legacy: z.literal(true)}); export const legacyRecurringProductPriceCustom = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), source: productPriceSource, amount_type: z.literal("custom"), price_currency: z.string(), tax_behavior: taxBehaviorOption.nullable(), is_archived: z.boolean(), product_id: z.string(), type: z.literal("recurring"), recurring_interval: recurringInterval, minimum_amount: z.number().int(), maximum_amount: z.number().int().nullable(), preset_amount: z.number().int().nullable(), legacy: z.literal(true)}); export const legacyRecurringProductPrice = z.discriminatedUnion("amount_type", [legacyRecurringProductPriceFixed, legacyRecurringProductPriceCustom]); export const productPriceFixed = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), source: productPriceSource, amount_type: z.literal("fixed"), price_currency: z.string(), tax_behavior: taxBehaviorOption.nullable(), is_archived: z.boolean(), product_id: z.string(), price_amount: z.number().int()}); export const productPriceCustom = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), source: productPriceSource, amount_type: z.literal("custom"), price_currency: z.string(), tax_behavior: taxBehaviorOption.nullable(), is_archived: z.boolean(), product_id: z.string(), minimum_amount: z.number().int(), maximum_amount: z.number().int().nullable(), preset_amount: z.number().int().nullable()}); export const seatTierType = z.enum(["volume", "graduated"]); export const productPriceSeatTier = z.object({min_seats: z.number().int().gte(1), max_seats: z.number().int().gte(1).nullable().optional(), price_per_seat: z.number().int().gte(0)}); export const productPriceSeatTiersOutput = z.object({seat_tier_type: seatTierType.optional(), tiers: z.array(productPriceSeatTier), minimum_seats: z.number().int(), maximum_seats: z.number().int().nullable()}); export const productPriceSeatBased = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), source: productPriceSource, amount_type: z.literal("seat_based"), price_currency: z.string(), tax_behavior: taxBehaviorOption.nullable(), is_archived: z.boolean(), product_id: z.string(), seat_tiers: productPriceSeatTiersOutput}); export const meterUnit = z.enum(["scalar", "token", "custom"]); export const productPriceMeter = z.object({id: z.string(), name: z.string(), unit: meterUnit, custom_label: z.string().nullable(), custom_multiplier: z.number().int().nullable()}); export const productPriceMeteredUnit = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), source: productPriceSource, amount_type: z.literal("metered_unit"), price_currency: z.string(), tax_behavior: taxBehaviorOption.nullable(), is_archived: z.boolean(), product_id: z.string(), unit_amount: z.string(), cap_amount: z.number().int().nullable(), meter_id: z.string(), meter: productPriceMeter}); export const productPrice = z.discriminatedUnion("amount_type", [productPriceFixed, productPriceCustom, productPriceSeatBased, productPriceMeteredUnit]); export const benefitType = z.enum(["custom", "discord", "github_repository", "downloadables", "license_keys", "meter_credit", "feature_flag", "slack_shared_channel"]); export const benefitPublic = z.object({id: z.string(), created_at: z.string(), modified_at: z.string().nullable(), type: benefitType, description: z.string(), selectable: z.boolean(), deletable: z.boolean(), is_deleted: z.boolean(), organization_id: z.string()}); export const productMediaFileRead = z.object({id: z.string(), organization_id: z.string(), name: z.string(), path: z.string(), mime_type: z.string(), size: z.number().int(), storage_version: z.string().nullable(), checksum_etag: z.string().nullable(), checksum_sha256_base64: z.string().nullable(), checksum_sha256_hex: z.string().nullable(), last_modified_at: z.string().nullable(), version: z.string().nullable(), service: z.literal("product_media"), is_uploaded: z.boolean(), created_at: z.string(), size_readable: z.string(), public_url: z.string()}); export const subscriptionProrationBehavior = z.enum(["invoice", "prorate", "next_period", "reset"]); export const customerPortalUsageSettings = z.object({show: z.boolean()}); export const customerPortalSubscriptionSettings = z.object({update_seats: z.boolean(), update_plan: z.boolean(), pause: z.boolean().optional()}); export const customerPortalCustomerSettings = z.object({allow_email_change: z.boolean().optional()}); export const organizationCustomerPortalSettings = z.object({usage: customerPortalUsageSettings, subscription: customerPortalSubscriptionSettings, customer: customerPortalCustomerSettings.optional()}); export const customerOrganizationFeatureSettings = z.object({member_model_enabled: z.boolean().optional(), checkout_localization_enabled: z.boolean().optional()}); export const customerOrganization = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), name: z.string(), slug: z.string(), avatar_url: z.string().nullable(), proration_behavior: subscriptionProrationBehavior, allow_customer_updates: z.boolean(), customer_portal_settings: organizationCustomerPortalSettings, organization_features: customerOrganizationFeatureSettings.optional()}); export const customerSubscriptionProduct = z.object({id: z.string(), created_at: z.string(), modified_at: z.string().nullable(), trial_interval: trialInterval.nullable(), trial_interval_count: z.number().int().nullable(), name: z.string(), description: z.string().nullable(), visibility: productVisibility, recurring_interval: recurringInterval.nullable(), recurring_interval_count: z.number().int().nullable(), meter_interval: recurringInterval.nullable(), meter_interval_count: z.number().int().nullable(), is_recurring: z.boolean(), is_archived: z.boolean(), organization_id: z.string(), prices: z.array(z.union([legacyRecurringProductPrice, productPrice])), benefits: z.array(benefitPublic), medias: z.array(productMediaFileRead), organization: customerOrganization}); export const customerSubscriptionMeterMeter = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), name: z.string()}); export const customerSubscriptionMeter = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), consumed_units: z.number(), credited_units: z.number().int(), amount: z.number().int(), meter_id: z.string(), meter: customerSubscriptionMeterMeter}); export const pendingSubscriptionUpdate = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), applies_at: z.string(), product_id: z.string().nullable(), seats: z.number().int().nullable()}); export const customerSubscription = z.object({created_at: z.string(), modified_at: z.string().nullable(), id: z.string(), amount: z.number().int(), currency: z.string(), recurring_interval: recurringInterval, recurring_interval_count: z.number().int(), status: subscriptionStatus, current_period_start: z.string(), current_period_end: z.string(), current_meter_period_start: z.string().nullable(), current_meter_period_end: z.string().nullable(), trial_start: z.string().nullable(), trial_end: z.string().nullable(), cancel_at_period_end: z.boolean(), canceled_at: z.string().nullable(), started_at: z.string().nullable(), ends_at: z.string().nullable(), ended_at: z.string().nullable(), past_due_at: z.string().nullable().optional(), pause_at_period_end: z.boolean(), paused_at: z.string().nullable(), resumes_at: z.string().nullable(), customer_id: z.string(), product_id: z.string(), discount_id: z.string().nullable(), checkout_id: z.string().nullable(), seats: z.number().int().nullable().optional(), customer_cancellation_reason: customerCancellationReason.nullable(), customer_cancellation_comment: z.string().nullable(), product: customerSubscriptionProduct, prices: z.array(z.union([legacyRecurringProductPrice, productPrice])), meters: z.array(customerSubscriptionMeter), pending_update: pendingSubscriptionUpdate.nullable()}); export const pagination = z.object({total_count: z.number().int(), max_page: z.number().int()}); export const listResourceCustomerSubscription = z.object({items: z.array(customerSubscription), pagination: pagination}); 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 }; /** * List Claimed Subscriptions * * GET /v1/customer-portal/seats/subscriptions * * Also accepts auth: member_session */ export const getApiV1CustomerPortalSeatsSubscriptions = async (args: GetApiV1CustomerPortalSeatsSubscriptionsArgs, options?: GetApiV1CustomerPortalSeatsSubscriptionsOptions) => { const {baseUrl = "https://api.polar.sh", fetch: fetchFn = fetch, customerSession} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('accept', "application/json") if (args.page != null) query.append("page", String(args.page)) if (args.limit != null) query.append("limit", String(args.limit)) if (customerSession !== undefined) headers.set('authorization', `Bearer ${customerSession}`) const url = `${baseUrl.replace(/\/+$/, '')}/v1/customer-portal/seats/subscriptions${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(listResourceCustomerSubscription, await res.json()) };