import {z} from 'zod' export type UserClaimCodeRequestUserProperties = {is_trial?: (boolean | null) | undefined, is_premium?: (boolean | null) | undefined, first_seen_at?: (string | null) | undefined, metadata?: (Record | null) | undefined, stripe_customer_id?: (string | null) | undefined}; export type UserClaimCodeRequest = {code: string, user?: (UserClaimCodeRequestUserProperties | null) | undefined}; export type CreateApiUsersAppUserIdClaimCodeArgs = {app_user_id: string, 'x-api-key': string, body: UserClaimCodeRequest}; export type CreateApiUsersAppUserIdClaimCodeOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const basicReward = z.object({key: z.string(), name: z.string(), description: z.string().nullable(), metadata: z.object({}).nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const userBasicRewardActive = z.object({reward: basicReward, expires_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const creditReward = z.object({key: z.string(), credits: z.number().int(), name: z.string(), description: z.string().nullable(), metadata: z.object({}).nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const userCreditRewardActive = z.object({reward: creditReward, credits: z.number().int(), expires_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const offerCodeReward = z.object({key: z.string(), offer_code_id: z.string(), offer_code_ref_name: z.string(), subscription_product_id: z.string(), name: z.string(), description: z.string().nullable(), metadata: z.object({}).nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const offerCodeValue = z.object({value: z.string(), link: z.string(), expires_at: z.string()}); export const userOfferCodeRewardActive = z.object({reward: offerCodeReward, value: offerCodeValue.nullable(), expires_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const googlePlayPromoCodeReward = z.object({key: z.string(), name: z.string(), description: z.string().nullable(), metadata: z.object({}).nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const googlePlayPromoCodeValue = z.object({value: z.string(), expires_at: z.string()}); export const userGooglePlayPromoCodeRewardActive = z.object({reward: googlePlayPromoCodeReward, value: googlePlayPromoCodeValue.nullable(), expires_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const revenueCatEntitlementReward = z.object({key: z.string(), entitlement_id: z.string(), entitlement_key: z.string(), name: z.string(), description: z.string().nullable(), metadata: z.object({}).nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const userRevenueCatEntitlementRewardActive = z.object({reward: revenueCatEntitlementReward, expires_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const revenueCatOfferingReward = z.object({key: z.string(), offering_id: z.string(), offering_key: z.string(), name: z.string(), description: z.string().nullable(), metadata: z.object({}).nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const userRevenueCatOfferingRewardActive = z.object({reward: revenueCatOfferingReward, expires_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const userRewardsGranted = z.object({basic: z.array(userBasicRewardActive), credit: z.array(userCreditRewardActive), offer_code: z.array(userOfferCodeRewardActive), googleplay_promo_code: z.array(userGooglePlayPromoCodeRewardActive), revenuecat_entitlement: z.array(userRevenueCatEntitlementRewardActive), revenuecat_offering: z.array(userRevenueCatOfferingRewardActive)}); export const userClaimCodeEligibility = z.object({eligible: z.boolean(), eligible_until: z.string().nullable()}); export const userReferredBy = z.object({code: z.string().nullable(), type: z.enum(["affiliate", "promo", "referral"]), claimed_at: z.string()}); export const userStats = z.object({claims: z.number().int(), conversions: z.number().int(), churns: z.number().int()}); export const userRewardsActive = z.object({basic: z.array(userBasicRewardActive), credit: z.array(userCreditRewardActive), offer_code: z.array(userOfferCodeRewardActive), googleplay_promo_code: z.array(userGooglePlayPromoCodeRewardActive), revenuecat_entitlement: z.array(userRevenueCatEntitlementRewardActive), revenuecat_offering: z.array(userRevenueCatOfferingRewardActive)}); export const userBasicRewardExpired = z.object({reward: basicReward, expired_at: z.string(), created_at: z.string(), updated_at: z.string().nullable()}); export const userCreditRewardExpired = z.object({reward: creditReward, expired_at: z.string(), created_at: z.string(), updated_at: z.string().nullable()}); export const userOfferCodeRewardExpired = z.object({reward: offerCodeReward, expired_at: z.string(), created_at: z.string(), updated_at: z.string().nullable()}); export const userGooglePlayPromoCodeRewardExpired = z.object({reward: googlePlayPromoCodeReward, expired_at: z.string(), created_at: z.string(), updated_at: z.string().nullable()}); export const userRevenueCatEntitlementRewardExpired = z.object({reward: revenueCatEntitlementReward, expired_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const userRevenueCatOfferingRewardExpired = z.object({reward: revenueCatOfferingReward, expired_at: z.string().nullable(), created_at: z.string(), updated_at: z.string().nullable()}); export const userRewardsExpired = z.object({basic: z.array(userBasicRewardExpired), credit: z.array(userCreditRewardExpired), offer_code: z.array(userOfferCodeRewardExpired), googleplay_promo_code: z.array(userGooglePlayPromoCodeRewardExpired), revenuecat_entitlement: z.array(userRevenueCatEntitlementRewardExpired), revenuecat_offering: z.array(userRevenueCatOfferingRewardExpired)}); export const userRewards = z.object({active: userRewardsActive, expired: userRewardsExpired}); export const referralProgramSenderBasicRewardActivation = z.object({variant: z.enum(["claim", "conversion"]), amount: z.number().int()}); export const referralProgramSenderBasicRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramSenderBasicRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramSenderBasicReward = z.object({reward: basicReward, activation: referralProgramSenderBasicRewardActivation, deactivation: z.union([referralProgramSenderBasicRewardNeverDeactivation, referralProgramSenderBasicRewardIntervalDeactivation])}); export const referralProgramSenderCreditRewardActivation = z.object({variant: z.enum(["claim", "conversion"]), amount: z.number().int(), limit: z.number().int()}); export const referralProgramSenderCreditRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramSenderCreditRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramSenderCreditReward = z.object({reward: creditReward, activation: referralProgramSenderCreditRewardActivation, deactivation: z.union([referralProgramSenderCreditRewardNeverDeactivation, referralProgramSenderCreditRewardIntervalDeactivation])}); export const referralProgramSenderOfferCodeRewardActivation = z.object({variant: z.enum(["claim", "conversion"]), amount: z.number().int(), limit: z.number().int()}); export const referralProgramSenderOfferCodeRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramSenderOfferCodeRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramSenderOfferCodeReward = z.object({reward: offerCodeReward, activation: referralProgramSenderOfferCodeRewardActivation, deactivation: z.union([referralProgramSenderOfferCodeRewardNeverDeactivation, referralProgramSenderOfferCodeRewardIntervalDeactivation])}); export const referralProgramSenderGooglePlayPromoCodeRewardActivation = z.object({variant: z.enum(["claim", "conversion"]), amount: z.number().int(), limit: z.number().int()}); export const referralProgramSenderGooglePlayPromoCodeRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramSenderGooglePlayPromoCodeRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramSenderGooglePlayPromoCodeReward = z.object({reward: googlePlayPromoCodeReward, activation: referralProgramSenderGooglePlayPromoCodeRewardActivation, deactivation: z.union([referralProgramSenderGooglePlayPromoCodeRewardNeverDeactivation, referralProgramSenderGooglePlayPromoCodeRewardIntervalDeactivation])}); export const referralProgramSenderRevenueCatEntitlementRewardActivation = z.object({variant: z.enum(["claim", "conversion"]), amount: z.number().int()}); export const referralProgramSenderRevenueCatEntitlementRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramSenderRevenueCatEntitlementRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramSenderRevenueCatEntitlementReward = z.object({reward: revenueCatEntitlementReward, activation: referralProgramSenderRevenueCatEntitlementRewardActivation, deactivation: z.union([referralProgramSenderRevenueCatEntitlementRewardNeverDeactivation, referralProgramSenderRevenueCatEntitlementRewardIntervalDeactivation])}); export const referralProgramSenderRevenueCatOfferingRewardActivation = z.object({variant: z.enum(["claim", "conversion"]), amount: z.number().int()}); export const referralProgramSenderRevenueCatOfferingRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramSenderRevenueCatOfferingRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramSenderRevenueCatOfferingReward = z.object({reward: revenueCatOfferingReward, activation: referralProgramSenderRevenueCatOfferingRewardActivation, deactivation: z.union([referralProgramSenderRevenueCatOfferingRewardNeverDeactivation, referralProgramSenderRevenueCatOfferingRewardIntervalDeactivation])}); export const referralProgramSenderRewards = z.object({basic: z.array(referralProgramSenderBasicReward), credit: z.array(referralProgramSenderCreditReward), offer_code: z.array(referralProgramSenderOfferCodeReward), googleplay_promo_code: z.array(referralProgramSenderGooglePlayPromoCodeReward), revenuecat_entitlement: z.array(referralProgramSenderRevenueCatEntitlementReward), revenuecat_offering: z.array(referralProgramSenderRevenueCatOfferingReward)}); export const referralProgramReceiverBasicRewardActivation = z.object({variant: z.enum(["claim", "conversion"])}); export const referralProgramReceiverBasicRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramReceiverBasicRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramReceiverBasicReward = z.object({reward: basicReward, activation: referralProgramReceiverBasicRewardActivation, deactivation: z.union([referralProgramReceiverBasicRewardNeverDeactivation, referralProgramReceiverBasicRewardIntervalDeactivation])}); export const referralProgramReceiverCreditRewardActivation = z.object({variant: z.enum(["claim", "conversion"])}); export const referralProgramReceiverCreditRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramReceiverCreditRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramReceiverCreditReward = z.object({reward: creditReward, activation: referralProgramReceiverCreditRewardActivation, deactivation: z.union([referralProgramReceiverCreditRewardNeverDeactivation, referralProgramReceiverCreditRewardIntervalDeactivation])}); export const referralProgramReceiverOfferCodeRewardActivation = z.object({variant: z.literal("claim")}); export const referralProgramReceiverOfferCodeRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramReceiverOfferCodeRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramReceiverOfferCodeReward = z.object({reward: offerCodeReward, activation: referralProgramReceiverOfferCodeRewardActivation, deactivation: z.union([referralProgramReceiverOfferCodeRewardNeverDeactivation, referralProgramReceiverOfferCodeRewardIntervalDeactivation])}); export const referralProgramReceiverGooglePlayPromoCodeRewardActivation = z.object({variant: z.literal("claim")}); export const referralProgramReceiverGooglePlayPromoCodeRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramReceiverGooglePlayPromoCodeRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramReceiverGooglePlayPromoCodeReward = z.object({reward: googlePlayPromoCodeReward, activation: referralProgramReceiverGooglePlayPromoCodeRewardActivation, deactivation: z.union([referralProgramReceiverGooglePlayPromoCodeRewardNeverDeactivation, referralProgramReceiverGooglePlayPromoCodeRewardIntervalDeactivation])}); export const referralProgramReceiverRevenueCatEntitlementRewardActivation = z.object({variant: z.enum(["claim", "conversion"])}); export const referralProgramReceiverRevenueCatEntitlementRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramReceiverRevenueCatEntitlementRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramReceiverRevenueCatEntitlementReward = z.object({reward: revenueCatEntitlementReward, activation: referralProgramReceiverRevenueCatEntitlementRewardActivation, deactivation: z.union([referralProgramReceiverRevenueCatEntitlementRewardNeverDeactivation, referralProgramReceiverRevenueCatEntitlementRewardIntervalDeactivation])}); export const referralProgramReceiverRevenueCatOfferingRewardActivation = z.object({variant: z.literal("claim")}); export const referralProgramReceiverRevenueCatOfferingRewardNeverDeactivation = z.object({variant: z.literal("never")}); export const referralProgramReceiverRevenueCatOfferingRewardIntervalDeactivation = z.object({variant: z.literal("interval"), duration: z.number().int(), period: z.enum(["days", "months", "years"])}); export const referralProgramReceiverRevenueCatOfferingReward = z.object({reward: revenueCatOfferingReward, activation: referralProgramReceiverRevenueCatOfferingRewardActivation, deactivation: z.union([referralProgramReceiverRevenueCatOfferingRewardNeverDeactivation, referralProgramReceiverRevenueCatOfferingRewardIntervalDeactivation])}); export const referralProgramReceiverRewards = z.object({basic: z.array(referralProgramReceiverBasicReward), credit: z.array(referralProgramReceiverCreditReward), offer_code: z.array(referralProgramReceiverOfferCodeReward), googleplay_promo_code: z.array(referralProgramReceiverGooglePlayPromoCodeReward), revenuecat_entitlement: z.array(referralProgramReceiverRevenueCatEntitlementReward), revenuecat_offering: z.array(referralProgramReceiverRevenueCatOfferingReward)}); export const referralProgramRewards = z.object({sender: referralProgramSenderRewards, receiver: referralProgramReceiverRewards}); export const referralProgram = z.object({id: z.string(), name: z.string(), description: z.string().nullable(), metadata: z.object({}).nullable(), distribution_percentage: z.number().int(), limit: z.number().int(), rewards: referralProgramRewards, created_at: z.string(), updated_at: z.string().nullable()}); export const userAffiliateCode = z.object({code: z.string(), code_link: z.string().nullable()}); export const userAffiliateStats = z.object({claims: z.number().int(), conversions: z.number().int(), earnings: z.number().int()}); export const userAffiliate = z.object({id: z.string(), status: z.enum(["pending", "withdrawn", "approved", "rejected", "archived", "deactivated", "banned"]), codes: z.array(userAffiliateCode), stats: userAffiliateStats}); export const user = z.object({app_user_id: z.string(), referral_code: z.string().nullable(), referral_code_link: z.string().nullable(), is_trial: z.boolean().nullable(), is_premium: z.boolean().nullable(), first_seen_at: z.string().nullable(), last_seen_at: z.string().nullable(), metadata: z.object({}).nullable(), stripe_customer_id: z.string().nullable(), claim_code_eligibility: userClaimCodeEligibility, referred_by: userReferredBy.nullable(), stats: userStats, rewards: userRewards, referral_program: referralProgram.nullable(), affiliate: userAffiliate.nullable()}); export const userClaimCodeResponseData = z.object({rewards_granted: userRewardsGranted, user: user}); export const userClaimCodeResponse = z.object({data: userClaimCodeResponseData}); 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 }; /** * Claim Code * * POST /users/{app_user_id}/claim-code */ export const createApiUsersAppUserIdClaimCode = async (args: CreateApiUsersAppUserIdClaimCodeArgs, options?: CreateApiUsersAppUserIdClaimCodeOptions) => { const {baseUrl = "https://api.winwinkit.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") if (args['x-api-key'] != null) headers.set("x-api-key", String(args['x-api-key'])) const url = `${baseUrl.replace(/\/+$/, '')}/users/${encodeURIComponent(String(args.app_user_id))}/claim-code${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(userClaimCodeResponse, await res.json()) };