import { ClerkError } from "../errors/clerkError.mjs";
import { DeletedObjectResource } from "./deletedObject.mjs";
import { ClerkPaginatedResponse, ClerkPaginationParams } from "./pagination.mjs";
import { ClerkResource } from "./resource.mjs";
import { ForceNull, RemoveFunctions, Simplify } from "./utils.mjs";
import { SetActiveNavigate } from "./clerk.mjs";

//#region src/types/billing.d.ts
/**
 * Intersects `T` with an optional organization scope (`orgId`) for billing and related requests.
 *
 * @interface
 */
type WithOptionalOrgType<T> = T & {
  /**
   * The Organization ID to perform the request on.
   */
  orgId?: string;
};
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingNamespace {
  /**
   * Gets a list of payment attempts for the current user or supplied Organization.
   * @returns A [`ClerkPaginatedResponse`](/docs/reference/types/clerk-paginated-response) of [`BillingPaymentResource`](/docs/reference/types/billing-payment-resource) objects.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getPaymentAttempts: (params: GetPaymentAttemptsParams) => Promise<ClerkPaginatedResponse<BillingPaymentResource>>;
  /**
   * Gets details of a specific payment attempt for the current user or supplied Organization.
   * @returns A [`BillingPaymentResource`](https://clerk.com/docs/reference/types/billing-payment-resource) object.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getPaymentAttempt: (params: GetPaymentAttemptParams) => Promise<BillingPaymentResource>;
  /**
   * Gets a list of all publically visible Billing Plans.
   * @returns A [`ClerkPaginatedResponse`](/docs/reference/types/clerk-paginated-response) of [`BillingPlanResource`](/docs/reference/types/billing-plan-resource) objects.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getPlans: (params?: GetPlansParams) => Promise<ClerkPaginatedResponse<BillingPlanResource>>;
  /**
   * Gets a given Billing Plan.
   * @returns A [`BillingPlanResource`](/docs/reference/types/billing-plan-resource) object.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getPlan: (params: GetPlanParams) => Promise<BillingPlanResource>;
  /**
   * Gets the main Billing Subscription for the current user or supplied Organization.
   * @returns A [`BillingSubscriptionResource`](/docs/reference/types/billing-subscription-resource) object.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getSubscription: (params: GetSubscriptionParams) => Promise<BillingSubscriptionResource>;
  /**
   * Gets a list of Billing Statements for the current user or supplied Organization.
   * @returns A [`ClerkPaginatedResponse`](/docs/reference/types/clerk-paginated-response) of [`BillingStatementResource`](/docs/reference/types/billing-statement-resource) objects.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getStatements: (params: GetStatementsParams) => Promise<ClerkPaginatedResponse<BillingStatementResource>>;
  /**
   * Gets a given Billing Statement.
   * @returns A [`BillingStatementResource`](/docs/reference/types/billing-statement-resource) object.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getStatement: (params: GetStatementParams) => Promise<BillingStatementResource>;
  /**
   * Creates a new Billing checkout for the current user or supplied Organization.
   * @returns A [`BillingCheckoutResource`](/docs/reference/types/billing-checkout-resource) object.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  startCheckout: (params: CreateCheckoutParams) => Promise<BillingCheckoutResource>;
  /**
   * Gets the credit balance for the current payer.
   * @returns A [`BillingCreditBalanceResource`](https://clerk.com/docs/reference/types/billing-credit-balance-resource) object.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getCreditBalance: (params: GetCreditBalanceParams) => Promise<BillingCreditBalanceResource>;
  /**
   * Gets the credit history for the current payer.
   * @returns A [`ClerkPaginatedResponse`](https://clerk.com/docs/reference/types/clerk-paginated-response) of [`BillingCreditLedgerResource`](https://clerk.com/docs/reference/types/billing-credit-ledger-resource) objects.
   *
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getCreditHistory: (params: GetCreditHistoryParams) => Promise<ClerkPaginatedResponse<BillingCreditLedgerResource>>;
}
/**
 * @inline
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type BillingPayerResourceType = 'org' | 'user';
/**
 * @inline
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type ForPayerType = 'organization' | 'user';
/**
 * @inline
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type BillingSubscriptionStatus = 'active' | 'ended' | 'upcoming' | 'past_due';
/**
 * The billing period for the Plan.
 *
 * @inline
 */
type BillingSubscriptionPlanPeriod = 'month' | 'annual';
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPayerMethods {
  /**
   * Initializes a payment method.
   * @returns A [`BillingInitializedPaymentMethodResource`](https://clerk.com/docs/reference/types/billing-initialized-payment-method-resource) object.
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  initializePaymentMethod: (params: InitializePaymentMethodParams) => Promise<BillingInitializedPaymentMethodResource>;
  /**
   * Adds a payment method.
   * @returns A [`BillingPaymentMethodResource`](https://clerk.com/docs/reference/types/billing-payment-method-resource) object.
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  addPaymentMethod: (params: AddPaymentMethodParams) => Promise<BillingPaymentMethodResource>;
  /**
   * Gets a list of payment methods that have been stored.
   * @returns A [`ClerkPaginatedResponse`](https://clerk.com/docs/reference/types/clerk-paginated-response) of [`BillingPaymentMethodResource`](https://clerk.com/docs/reference/types/billing-payment-method-resource) objects.
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
   */
  getPaymentMethods: (params?: GetPaymentMethodsParams) => Promise<ClerkPaginatedResponse<BillingPaymentMethodResource>>;
}
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetPlanParams = {
  /**
   * The ID of the Billing Plan to get.
   */
  id: string;
};
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetPlansParams = ClerkPaginationParams<{
  /**
   * The type of payer for the Plans.
   */
  for?: ForPayerType;
  /**
   * The organization ID to fetch plans for (needs to match the current [Active Organization](!active-organization) ID). Providing this parameter will populate the `availablePrices` field with the prices that are available to the authenticated organization.
   */
  orgId?: string;
  /**
   * The minimum number of seats that the returned plans needs to support.
   */
  minSeats?: number;
}>;
/**
 * The `BillingPlanResource` type represents a Subscription Plan with its details.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPlanResource extends ClerkResource {
  /**
   * The unique identifier for the Plan.
   */
  id: string;
  /**
   * The name of the Plan.
   */
  name: string;
  /**
   * The monthly price of the Plan.
   */
  fee: BillingMoneyAmount | null;
  /**
   * The annual price of the Plan or `null` if the Plan is not annual.
   */
  annualFee: BillingMoneyAmount | null;
  /**
   * The effective monthly price when billed annually or `null` if the Plan is not annual.
   */
  annualMonthlyFee: BillingMoneyAmount | null;
  /**
   * A short description of what the Plan offers, or `null` if no description is provided.
   */
  description: string | null;
  /**
   * Whether the Plan is the default Plan.
   */
  isDefault: boolean;
  /**
   * Whether the Plan is recurring.
   */
  isRecurring: boolean;
  /**
   * Whether the Plan has a base fee.
   */
  hasBaseFee: boolean;
  /**
   * Specifies the subscriber type this Plan is designed for.
   *
   * Each Plan is exclusively created for either individual users or Organizations, and cannot be used interchangeably.
   */
  forPayerType: BillingPayerResourceType;
  /**
   * Whether the Plan is visible to the public.
   */
  publiclyVisible: boolean;
  /**
   * The URL-friendly identifier of the Plan.
   */
  slug: string;
  /**
   * The URL of the Plan's avatar image, or `null` if not set.
   */
  avatarUrl: string | null;
  /**
   * The Features the Plan offers.
   */
  features: FeatureResource[];
  /**
   * Per-unit pricing tiers for this Plan (e.g., seats).
   */
  unitPrices?: BillingPlanUnitPrice[];
  /**
   * The prices that are available to be used to checkout for the associated plan. Can be used to select
   * non-default prices.
   */
  availablePrices?: BillingPlanPrice[];
  /**
   * The number of days of the free trial for the Plan. `null` if the Plan does not have a free trial.
   */
  freeTrialDays: number | null;
  /**
   * Whether the Plan has a free trial.
   */
  freeTrialEnabled: boolean;
}
/**
 * The `BillingSubscriptionItemSeats` type represents seat entitlements attached to a subscription item.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingSubscriptionItemSeats {
  /**
   * The seat limit active while the parent subscription item was active. `null` means unlimited.
   */
  quantity: number | null;
  /**
   * The tier-level breakdown of seats for this subscription item.
   */
  tiers?: BillingPerUnitTotalTier[];
}
/**
 * The `BillingPlanUnitPriceTier` type represents a single pricing tier for a unit type on a plan.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPlanUnitPriceTier {
  /**
   * The unique identifier of the unit price tier.
   */
  id: string;
  /**
   * The first block number this tier applies to.
   */
  startsAtBlock: number;
  /**
   * The final block this tier applies to. `null` means unlimited.
   */
  endsAfterBlock: number | null;
  /**
   * The fee charged for each block in this tier.
   */
  feePerBlock: BillingMoneyAmount;
}
/**
 * The `BillingPlanUnitPrice` type represents unit pricing for a specific unit type (e.g., seats) on a plan.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPlanUnitPrice {
  /**
   * The unit name, for example `seats`.
   */
  name: string;
  /**
   * Number of units represented by one billable block.
   */
  blockSize: number;
  /**
   * Tiers that define how each block range is priced.
   */
  tiers: BillingPlanUnitPriceTier[];
}
/**
 * The `BillingPlanPrice` type represents a specific possible price for a given Clerk Billing Plan.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPlanPrice {
  /** The unique identifier of the price */
  id: string;
  /** The monthly price or `null` if the price is not monthly. */
  fee: BillingMoneyAmount | null;
  /** The effective monthly price when billed annually or `null` if the price is not annual. */
  annualMonthlyFee: BillingMoneyAmount | null;
  /** Whether this price is the default price for the plan it's associated with. */
  isDefault: boolean;
  /** The individual unit prices applicable to this price. */
  unitPrices?: BillingPlanUnitPrice[];
}
/**
 * The `BillingPerUnitTotalTier` type represents the cost breakdown for a single tier in checkout totals.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPerUnitTotalTier {
  /** The quantity billed within this tier. `null` means unlimited. */
  quantity: number | null;
  /** The fee charged per block for this tier. */
  feePerBlock: BillingMoneyAmount;
  /** The total billed amount for this tier. */
  total: BillingMoneyAmount;
}
/**
 * The `BillingPerUnitTotal` type represents the per-unit cost breakdown in checkout totals.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPerUnitTotal {
  /** The unit name, for example `seats`. */
  name: string;
  /** The number of units represented by one billable block. */
  blockSize: number;
  /** The tiers breakdown for this unit total. */
  tiers: BillingPerUnitTotalTier[];
}
/**
 * The `FeatureResource` type represents a Feature of a Plan.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface FeatureResource extends ClerkResource {
  /** The unique identifier for the Feature. */
  id: string;
  /** The display name of the Feature. */
  name: string;
  /** A short description of what the Feature provides, or `null` if not provided. */
  description: string | null;
  /** A unique, URL-friendly identifier for the Feature. */
  slug: string;
  /** The URL of the Feature's avatar image, or `null` if not set. */
  avatarUrl: string | null;
}
/**
 * The status of a payment method.
 *
 * @inline
 */
type BillingPaymentMethodStatus = 'active' | 'expired' | 'disconnected';
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetPaymentMethodsParams = ClerkPaginationParams;
/**
 * @inline
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type PaymentGateway = 'stripe';
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type InitializePaymentMethodParams = {
  /**
   * The payment gateway to use.
   */
  gateway: PaymentGateway;
};
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type AddPaymentMethodParams = {
  /**
   * The payment gateway to use.
   */
  gateway: PaymentGateway;
  /**
   * A token representing payment details, usually from a payment form.
   */
  paymentToken: string;
};
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type RemovePaymentMethodParams = WithOptionalOrgType<unknown>;
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type MakeDefaultPaymentMethodParams = WithOptionalOrgType<unknown>;
/**
 * The `BillingPaymentMethodResource` type represents a payment method for a checkout session.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPaymentMethodResource extends ClerkResource {
  /**
   * The unique identifier for the payment method.
   */
  id: string;
  /**
   * The last four digits of the payment method.
   */
  last4: string | null;
  /**
   * The type of payment method. For example, `'card'`.
   */
  paymentType?: 'card';
  /**
   * The brand or type of card. For example, `'visa'` or `'mastercard'`.
   */
  cardType: string | null;
  /**
   * Whether the payment method is set as the default for the account.
   */
  isDefault?: boolean;
  /**
   * Whether the payment method can be removed by the user.
   */
  isRemovable?: boolean;
  /**
   * The current status of the payment method.
   */
  status: BillingPaymentMethodStatus;
  /**
   * The type of digital wallet, if applicable. For example, `'apple_pay'`, or `'google_pay'`.
   */
  walletType?: string | null;
  /**
   * The card expiration year, if available.
   */
  expiryYear?: number | null;
  /**
   * The card expiration month, if available.
   */
  expiryMonth?: number | null;
  /**
   * The date the payment method was created, if available.
   */
  createdAt?: Date | null;
  /**
   * The date the payment method was last updated, if available.
   */
  updatedAt?: Date | null;
  /**
   * A function that removes this payment method from the account. Accepts the following parameters:
   * <ul>
   *  <li>`orgId?` (`string`): The ID of the Organization to remove the payment method from.</li>
   * </ul>
   *
   * @param params - The parameters for the remove operation.
   * @returns A promise that resolves to a `DeletedObjectResource` object.
   */
  remove: (params?: RemovePaymentMethodParams) => Promise<DeletedObjectResource>;
  /**
   * A function that sets this payment method as the default for the account. Accepts the following parameters:
   * <ul>
   *  <li>`orgId?` (`string`): The ID of the Organization to set as the default.</li>
   * </ul>
   *
   * @param params - The parameters for the make default operation.
   * @returns A promise that resolves to `null`.
   */
  makeDefault: (params?: MakeDefaultPaymentMethodParams) => Promise<null>;
}
/**
 * The `BillingInitializedPaymentMethodResource` type represents a payment method that has been initialized for checkout session.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingInitializedPaymentMethodResource extends ClerkResource {
  /**
   * A client secret from an external payment provider (such as Stripe) used to complete the payment on the client-side.
   */
  externalClientSecret: string;
  /**
   * The unique identifier for the external payment gateway used for this checkout session.
   */
  externalGatewayId: string;
  /**
   * The order the payment methods will be displayed in when [`<PaymentElement/>`](/docs/nextjs/reference/hooks/use-payment-element#payment-element) renders.
   */
  paymentMethodOrder: string[];
}
/**
 * @inline
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type BillingPaymentChargeType = 'checkout' | 'recurring';
/**
 * @inline
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type BillingPaymentStatus = 'pending' | 'paid' | 'failed';
/**
 * The `BillingPaymentTotals` type represents the per-payment cost breakdown, including any base fee
 * and per-unit (e.g., seats) subtotals.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPaymentTotals {
  /**
   * The price of the items before taxes, credits, or discounts are applied.
   */
  subtotal: BillingMoneyAmount;
  /**
   * The total amount for the payment, including taxes and after credits/discounts are applied.
   */
  grandTotal: BillingMoneyAmount;
  /**
   * The amount of tax included in the payment.
   */
  taxTotal: BillingMoneyAmount;
  /**
   * The flat base fee charged on top of any per-unit fees.
   */
  baseFee?: BillingMoneyAmount | null;
  /**
   * Per-unit cost breakdown for this payment (e.g., seats).
   */
  perUnitTotals?: BillingPerUnitTotal[];
  /**
   * Discounts applied to this payment such as mid-cycle prorated seat discounts. `null` when no discounts apply.
   */
  discounts?: BillingDiscounts | null;
}
/**
 * The `BillingPaymentResource` type represents a payment attempt for a user or Organization.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPaymentResource extends ClerkResource {
  /**
   * The unique identifier for the payment.
   */
  id: string;
  /**
   * The amount of the payment.
   */
  amount: BillingMoneyAmount;
  /**
   * The date and time when the payment was successfully completed.
   */
  paidAt: Date | null;
  /**
   * The date and time when the payment failed.
   */
  failedAt: Date | null;
  /**
   * The date and time when the payment was last updated.
   */
  updatedAt: Date;
  /**
   * The payment method being used for the payment, such as credit card or bank account.
   */
  paymentMethod: BillingPaymentMethodResource | null;
  /**
   * The subscription item being paid for.
   */
  subscriptionItem: BillingSubscriptionItemResource;
  /**
   * The type of charge this payment represents. Can be `'checkout'` for one-time payments or `'recurring'` for subscription payments.
   */
  chargeType: BillingPaymentChargeType;
  /**
   * The current status of the payment.
   */
  status: BillingPaymentStatus;
  /**
   * Per-payment breakdown with optional base fee and per-unit (e.g., seats) subtotals.
   * Absent on older responses.
   */
  totals?: BillingPaymentTotals | null;
}
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetPaymentAttemptsParams = WithOptionalOrgType<ClerkPaginationParams>;
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetPaymentAttemptParams = {
  /**
   * The unique identifier for the payment attempt to get.
   */
  id: string;
} & WithOptionalOrgType<ClerkPaginationParams>;
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetStatementParams = {
  /**
   * The ID of the statement to get.
   */
  id: string;
} & WithOptionalOrgType<ClerkPaginationParams>;
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetStatementsParams = WithOptionalOrgType<ClerkPaginationParams>;
/**
 * @inline
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type BillingStatementStatus = 'open' | 'closed';
/**
 * The `BillingStatementResource` type represents a billing statement for a user or Organization.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingStatementResource extends ClerkResource {
  /**
   * The unique identifier for the statement.
   */
  id: string;
  /**
   * An object containing the financial totals for the statement, including subtotal, grand total, tax total, credit, and past due amounts.
   */
  totals: BillingStatementTotals;
  /**
   * The current status of the statement. Statements can be either `'open'` (still accumulating charges) or `'closed'` (finalized).
   */
  status: BillingStatementStatus;
  /**
   * The date and time when the statement was created or last updated.
   */
  timestamp: Date;
  /**
   * An array of statement groups, where each group contains payment items organized by timestamp.
   */
  groups: BillingStatementGroup[];
}
/**
 * The `BillingStatementGroup` type represents a group of payment items within a statement.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingStatementGroup {
  /**
   * The date and time when this group of payment items was created or last updated.
   */
  timestamp: Date;
  /**
   * An array of payment resources that belong to this group.
   */
  items: BillingPaymentResource[];
}
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetSubscriptionParams = {
  /**
   * The unique identifier for the Organization to get the subscription for.
   */
  orgId?: string;
};
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type CancelSubscriptionParams = WithOptionalOrgType<unknown>;
/**
 * The `BillingSubscriptionNextPayment` type represents the upcoming payment details for a subscription.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingSubscriptionNextPayment {
  /**
   * The amount of the next payment.
   */
  amount: BillingMoneyAmount;
  /**
   * The date when the next payment is due.
   */
  date: Date;
  /**
   * Per-unit cost breakdown for the next payment (e.g., seats).
   */
  perUnitTotals?: BillingPerUnitTotal[];
  /**
   * Full cost breakdown for the next payment.
   */
  totals?: BillingTotals;
}
/**
 * The `BillingSubscriptionItemNextPayment` type represents the upcoming payment details for a subscription item.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingSubscriptionItemNextPayment {
  /**
   * The amount of the next payment.
   */
  amount: BillingMoneyAmount;
  /**
   * The date when the next payment is due.
   */
  date: Date;
  /**
   * Per-unit cost breakdown for the next payment (e.g., seats).
   */
  perUnitTotals?: BillingPerUnitTotal[];
  /**
   * Full cost breakdown for the next payment.
   */
  totals?: BillingTotals;
}
/**
 * The `BillingSubscriptionItemResource` type represents an item in a subscription.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingSubscriptionItemResource extends ClerkResource {
  /**
   * The unique identifier for the subscription item.
   */
  id: string;
  /**
   * The Plan associated with the subscription item.
   */
  plan: BillingPlanResource;
  /**
   * The billing period for the subscription item.
   */
  planPeriod: BillingSubscriptionPlanPeriod;
  /**
   * The ID of the price that this subscription item is associated with.
   */
  priceId: string;
  /**
   * The status of the subscription item.
   */
  status: BillingSubscriptionStatus;
  /**
   * The date and time when the subscription item was created.
   */
  createdAt: Date;
  /**
   * The date and time when the subscription item became past due. `null` if the subscription item is not past due.
   */
  pastDueAt: Date | null;
  /**
   * The date and time when the current billing period starts.
   */
  periodStart: Date;
  /**
   * The date and time when the current billing period ends. `null` if not set.
   */
  periodEnd: Date | null;
  /**
   * The date and time when the subscription item was canceled. `null` if the subscription item is not canceled.
   */
  canceledAt: Date | null;
  /**
   * The amount charged for the subscription item.
   */
  amount?: BillingMoneyAmount;
  /**
   * Information about the next payment for this subscription item.
   */
  nextPayment?: BillingSubscriptionItemNextPayment | null;
  /**
   * The credit from a previous purchase that is being applied to the subscription item.
   */
  credit?: {
    /**
     * The amount of credit from a previous purchase that is being applied to the subscription item.
     */
    amount: BillingMoneyAmount;
  };
  credits?: BillingCredits;
  /**
   * Seat entitlement details for this subscription item. Only set for organization subscription items with
   * seat-based billing.
   */
  seats?: BillingSubscriptionItemSeats;
  /**
   * A function to cancel the subscription item. Accepts the following parameters:
   * <ul>
   *  <li>`orgId?` (`string`): The ID of the Organization to cancel the subscription item from.</li>
   * </ul>
   *
   * @param params - The parameters for the cancel operation.
   * @returns A promise that resolves to a `DeletedObjectResource` object.
   */
  cancel: (params: CancelSubscriptionParams) => Promise<DeletedObjectResource>;
  /**
   * Whether the subscription item is for a free trial.
   */
  isFreeTrial: boolean;
}
/**
 * The `BillingSubscriptionResource` type represents a subscription to a plan.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingSubscriptionResource extends ClerkResource {
  /**
   * The unique identifier for the subscription.
   */
  id: string;
  /**
   * The date when the subscription became active.
   */
  activeAt: Date;
  /**
   * The date when the subscription was created.
   */
  createdAt: Date;
  /**
   * Information about the next payment, including the amount and the date it's due. Returns null if there is no upcoming payment.
   */
  nextPayment?: BillingSubscriptionNextPayment | null;
  /**
   * The date when the subscription became past due, or `null` if the subscription is not past due.
   */
  pastDueAt: Date | null;
  /**
   * The current status of the subscription. Due to the free plan subscription item, the top level subscription can either be `active` or `past_due`.
   */
  status: Extract<BillingSubscriptionStatus, 'active' | 'past_due'>;
  /**
   * The list of subscription items included in this subscription.
   */
  subscriptionItems: BillingSubscriptionItemResource[];
  /**
   * The date when the subscription was last updated, or `null` if it hasn't been updated.
   */
  updatedAt: Date | null;
  /**
   * Whether the payer is eligible for a free trial.
   */
  eligibleForFreeTrial: boolean;
}
/**
 * The `BillingCreditBalanceResource` type represents the credit balance for a payer.
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingCreditBalanceResource {
  /** The balance of the credit. */
  balance: BillingMoneyAmount | null;
}
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetCreditBalanceParams = {
  /** The ID of the Organization to get the credit balance for. */orgId?: string;
};
/**
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type GetCreditHistoryParams = {
  /**
   * The ID of the Organization to get the credit history for.
   */
  orgId?: string;
};
/**
 * The `BillingCreditLedgerResource` type represents a credit ledger entry for the current payer or given Organization.
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingCreditLedgerResource {
  /** The ID of the credit ledger entry. */
  id: string;
  /** The amount of the credit ledger entry. */
  amount: BillingMoneyAmount;
  /** The type of the source of the credit ledger entry. */
  sourceType: string;
  /** The ID of the source of the credit ledger entry. */
  sourceId: string;
  /** The date when the credit ledger entry was created. */
  createdAt: Date;
}
/**
 * The `BillingMoneyAmount` type represents a monetary value with currency information.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingMoneyAmount {
  /**
   * The raw amount as a number, usually in the smallest unit of the currency (like cents for USD). For example, `1000` for $10.00.
   */
  amount: number;
  /**
   * The amount as a formatted string. For example, `10.00` for $10.00.
   */
  amountFormatted: string;
  /**
   * The ISO currency code for this amount. For example, `USD`.
   */
  currency: string;
  /**
   * The symbol for the currency. For example, `$`.
   */
  currencySymbol: string;
}
interface BillingProrationCreditDetail {
  amount: BillingMoneyAmount;
  cycleDaysRemaining: number;
  cycleDaysTotal: number;
  cycleRemainingPercent: number;
}
interface BillingPayerCredit {
  remainingBalance: BillingMoneyAmount;
  appliedAmount: BillingMoneyAmount;
}
interface BillingCredits {
  proration: BillingProrationCreditDetail | null;
  payer: BillingPayerCredit | null;
  total: BillingMoneyAmount;
}
/**
 * Details about a prorated discount applied when adding a seat mid-cycle. The discount covers the part of the
 * billing period that has already passed, so the payer is only charged for the time remaining in the cycle.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingProrationDiscount {
  /**
   * The amount of the proration discount.
   */
  amount: BillingMoneyAmount;
  /**
   * The number of days that have passed in the billing cycle for which this proration discount represents.
   */
  cycleDaysPassed: number;
  /**
   * The total number of days in the billing cycle.
   */
  cycleDaysTotal: number;
  /**
   * The percentage of the billing cycle that has passed.
   */
  cyclePassedPercent: number;
}
/**
 * Discounts applied to the checkout, such as prorated discounts for mid-cycle seat additions.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingDiscounts {
  /**
   * The prorated discount for the part of the billing period that has already passed when adding a seat mid-cycle.
   * Unlike the proration credit (which refunds the unused remainder of a plan you already paid for), this discount
   * means you are not charged for the portion of the new seat's cycle that has already elapsed.
   */
  proration: BillingProrationDiscount | null;
  /**
   * The total of all discounts applied to the checkout.
   */
  total: BillingMoneyAmount;
}
/**
 * Per-period renewal totals, describing what the subscription renewal charge will look like after the current checkout.
 * Unlike the top-level checkout totals (which only reflect the items actively being purchased),
 * this object contains the full renewal breakdown including all seats and the base plan fee.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPeriodTotals {
  /**
   * The subtotal for the billing period.
   */
  subtotal: BillingMoneyAmount;
  /**
   * The base fee for the billing period.
   */
  baseFee: BillingMoneyAmount;
  /**
   * The tax total for the billing period.
   */
  taxTotal: BillingMoneyAmount;
  /**
   * The grand total for the billing period.
   */
  grandTotal: BillingMoneyAmount;
  /**
   * Per-unit cost breakdown for the renewal period, covering all units purchased to date
   * (not just the ones being added in this checkout).
   */
  perUnitTotals?: BillingPerUnitTotal[];
}
/**
 * The `BillingTotals` type represents a granular breakdown of the total amount that will be charged, either during
 * checkout or at renewal.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingTotals {
  /**
   * Subtotal before adjustments
   */
  subtotal: BillingMoneyAmount;
  /**
   * Base fee component before per-unit charges and adjustments
   */
  baseFee: BillingMoneyAmount | null;
  /**
   * Total tax amount
   */
  taxTotal: BillingMoneyAmount;
  /**
   * Grand total amount
   */
  grandTotal: BillingMoneyAmount;
  /**
   * Total amount due after free trial ends
   */
  totalDueAfterFreeTrial?: BillingMoneyAmount | null;
  /**
   * Credit amount
   */
  credit?: BillingMoneyAmount | null;
  /**
   * Unified credits breakdown
   */
  credits: BillingCredits | null;
  /**
   * Information about the discounts applied to the payment
   */
  discounts: BillingDiscounts | null;
  /**
   * Past due amount
   */
  pastDue?: BillingMoneyAmount | null;
  /**
   * Total amount due now
   */
  totalDueNow?: BillingMoneyAmount;
  /**
   * Per-unit total breakdown (e.g., seats)
   */
  perUnitTotals?: BillingPerUnitTotal[];
  /**
   * Per-period renewal totals, broken down granularly
   */
  totalsDuePerPeriod?: BillingPeriodTotals;
  /**
   * The expected total payment for each future billing period
   */
  totalDuePerPeriod?: BillingMoneyAmount;
}
/**
 * The `BillingCheckoutTotals` type represents the total costs, taxes, and other pricing details for a checkout session.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingCheckoutTotals {
  /**
   * The price of items actively being purchased in this checkout, before taxes and discounts.
   * When only adding seats mid-cycle, this reflects just the new seats and excludes the base plan fee and
   * seats that were already paid for.
   */
  subtotal: BillingMoneyAmount;
  /**
   * The base plan fee portion of the totals, before per-unit charges and adjustments.
   */
  baseFee?: BillingMoneyAmount;
  /**
   * The total amount for the checkout, including taxes and after credits/discounts are applied. This is the final amount due.
   */
  grandTotal: BillingMoneyAmount;
  /**
   * The amount of tax included in the checkout.
   */
  taxTotal: BillingMoneyAmount;
  /**
   * Per-unit cost breakdown for items actively being purchased in this checkout (e.g., seats being added).
   * When only adding seats mid-cycle, this only covers the seats being added, not seats already paid for.
   */
  perUnitTotals?: BillingPerUnitTotal[];
  /**
   * The amount that needs to be immediately paid to complete the checkout.
   */
  totalDueNow: BillingMoneyAmount;
  /**
   * The amount that will be charged per period for this subscription.
   */
  totalDuePerPeriod: BillingMoneyAmount;
  /**
   * Any credits (like account balance or promo credits) that are being applied to the checkout.
   */
  credit: BillingMoneyAmount | null;
  credits: BillingCredits | null;
  /**
   * Any outstanding amount from previous unpaid invoices that is being collected as part of the checkout.
   */
  pastDue: BillingMoneyAmount | null;
  /**
   * The amount that becomes due after a free trial ends.
   */
  totalDueAfterFreeTrial: BillingMoneyAmount | null;
  /**
   * Discounts applied to this checkout such as mid-cycle prorated seat discounts.
   */
  discounts?: BillingDiscounts | null;
  /**
   * Full renewal period totals after this checkout completes.
   * Contains the complete breakdown of what the next recurring charge will look like,
   * including all seats and the base plan fee.
   */
  totalsDuePerPeriod?: BillingPeriodTotals;
}
/**
 * The `BillingStatementTotals` type represents the total costs, taxes, and other pricing details for a statement.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingStatementTotals {
  /**
   * The price of the items or Plan before taxes, credits, or discounts are applied.
   */
  subtotal: BillingMoneyAmount;
  /**
   * The total amount for the checkout, including taxes and after credits/discounts are applied. This is the final amount due.
   */
  grandTotal: BillingMoneyAmount;
  /**
   * The amount of tax included in the checkout.
   */
  taxTotal: BillingMoneyAmount;
}
/**
 * The `startCheckout()` method accepts the following parameters.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type CreateCheckoutParams = WithOptionalOrgType<{
  /**
   * The unique identifier for the Plan.
   */
  planId: string;
  /**
   * The billing period for the Plan.
   */
  planPeriod: BillingSubscriptionPlanPeriod;
  /**
   * The number of total seats to check out for
   */
  seatsQuantity?: number;
  /**
   * The specific price ID to check out for, used when the desired price ID is not the current default price
   */
  priceId?: string;
}>;
/**
 * The `confirm()` method accepts the following parameters. **Only one of `paymentMethodId`, `paymentToken`, or `useTestCard` should be provided.**
 *
 * @unionReturnHeadings
 * ["paymentMethodId", "paymentToken", "useTestCard"]
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
type ConfirmCheckoutParams = {
  /**
   * The ID of a saved payment method to use for this checkout.
   */
  paymentMethodId?: string;
} | {
  /**
   * A token representing payment details, usually from a payment form. **Requires** `gateway` to be provided.
   */
  paymentToken?: string;
  /**
   * The payment gateway to use. **Required** if `paymentToken` or `useTestCard` is provided.
   */
  gateway?: PaymentGateway;
} | {
  /**
   * The payment gateway to use. **Required** if `paymentToken` or `useTestCard` is provided.
   */
  gateway?: PaymentGateway;
  /**
   * If true, uses a test card for the checkout. **Requires** `gateway` to be provided.
   */
  useTestCard?: boolean;
};
/**
 * The `BillingCheckoutResource` type represents information about a checkout session.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingCheckoutResource extends ClerkResource {
  /**
   * The unique identifier for the checkout session.
   */
  id: string;
  /**
   * A client secret from an external payment provider (such as Stripe) used to complete the payment on the client-side.
   */
  externalClientSecret: string;
  /**
   * The identifier for the external payment gateway used for this checkout session.
   */
  externalGatewayId: string;
  /**
   * The payment method being used for the checkout, such as a credit card or bank account.
   */
  paymentMethod?: BillingPaymentMethodResource;
  /**
   * The Subscription Plan details for the checkout.
   */
  plan: BillingPlanResource;
  /**
   * The billing period for the Plan.
   */
  planPeriod: BillingSubscriptionPlanPeriod;
  /**
   * The start date of the Plan period, represented as a Unix timestamp.
   */
  planPeriodStart?: number;
  /**
   * The current status of the checkout session.
   */
  status: 'needs_confirmation' | 'completed';
  /**
   * The total costs, taxes, and other pricing details for the checkout.
   */
  totals: BillingTotals;
  /**
   * A function to confirm and finalize the checkout process, usually after payment information has been provided and validated. [Learn more.](#confirm)
   */
  confirm: (params: ConfirmCheckoutParams) => Promise<BillingCheckoutResource>;
  /**
   * Whether the Plan change will take effect immediately after checkout.
   */
  isImmediatePlanChange: boolean;
  /**
   * Unix timestamp (milliseconds) of when the free trial ends.
   */
  freeTrialEndsAt?: Date;
  /**
   * The payer associated with the checkout.
   */
  payer: BillingPayerResource;
  /**
   * Whether a payment method is required for this checkout.
   */
  needsPaymentMethod: boolean;
}
/**
 * The `BillingPayerResource` type represents a payer associated with a Billing Subscription.
 *
 * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change. It is advised to [pin](https://clerk.com/docs/pinning) the SDK version and the clerk-js version to avoid breaking changes.
 */
interface BillingPayerResource extends ClerkResource {
  /**
   * The unique identifier for the payer.
   */
  id: string;
  /**
   * The date and time when the payer was created.
   */
  createdAt?: Date;
  /**
   * The date and time when the payer was last updated.
   */
  updatedAt?: Date;
  /**
   * The URL of the payer's avatar image.
   */
  imageUrl?: string;
  /**
   * The unique identifier for the payer.
   */
  userId: string | null;
  /**
   * The email address of the payer.
   */
  email?: string | null;
  /**
   * The first name of the payer.
   */
  firstName?: string | null;
  /**
   * The last name of the payer.
   */
  lastName?: string | null;
  /**
   * The unique identifier for the Organization that the payer belongs to.
   */
  organizationId: string | null;
  /**
   * The name of the Organization that the payer belongs to.
   */
  organizationName?: string | null;
}
interface CheckoutFlowProperties {
  /**
   * A client secret from an external payment provider (such as Stripe) used to complete the payment on the client-side.
   */
  externalClientSecret: string;
  /**
   * The identifier for the external payment gateway used for this checkout session.
   */
  externalGatewayId: string;
  /**
   * The payment source being used for the checkout, such as a credit card or bank account.
   */
  paymentMethod: Simplify<RemoveFunctions<BillingPaymentMethodResource>> | null;
  /**
   * The subscription plan details for the checkout.
   */
  plan: Simplify<RemoveFunctions<BillingPlanResource>>;
  /**
   * The billing period for the plan.
   */
  planPeriod: BillingSubscriptionPlanPeriod;
  /**
   * Unix timestamp (milliseconds) of when the current period starts.
   */
  planPeriodStart: number | undefined;
  /**
   * The total costs, taxes, and other pricing details for the checkout.
   */
  totals: BillingTotals;
  /**
   * Whether the plan change will take effect immediately after checkout.
   */
  isImmediatePlanChange: boolean;
  /**
   * Unix timestamp (milliseconds) of when the free trial ends.
   */
  freeTrialEndsAt?: Date;
  /**
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
   * It is advised to pin the SDK version and the clerk-js version to a specific version to avoid breaking changes.
   *
   * @example
   * ```tsx
   * <ClerkProvider clerkJsVersion="x.x.x" />
   * ```
   */
  payer: Simplify<RemoveFunctions<BillingPayerResource>>;
  /**
   * Whether a payment method is required for this checkout.
   */
  needsPaymentMethod: boolean;
}
/**
 * Checkout flow in uninitialized state. All properties are null until `start()` is called.
 */
type CheckoutFlowUninitialized = {
  status: 'needs_initialization';
} & ForceNull<CheckoutFlowProperties>;
/**
 * Checkout flow in initialized state. All properties are populated after `start()` is called.
 */
type CheckoutFlowInitialized = {
  status: 'needs_confirmation' | 'completed';
} & CheckoutFlowProperties;
/**
 * Discriminated union of checkout flow states based on status.
 */
type CheckoutPropertiesPerStatus = CheckoutFlowUninitialized | CheckoutFlowInitialized;
interface CheckoutFlowFinalizeParams {
  navigate: SetActiveNavigate;
}
/**
 * Common methods available on all checkout flow instances.
 */
interface CheckoutFlowMethods {
  /**
   * A function to confirm and finalize the checkout process, usually after payment information has been provided and validated. [Learn more.](#confirm)
   */
  confirm: (params: ConfirmCheckoutParams) => Promise<{
    error: ClerkError | null;
  }>;
  /**
   * @experimental This is an experimental API for the Billing feature that is available under a public beta, and the API is subject to change.
   * It is advised to pin the SDK version and the clerk-js version to a specific version to avoid breaking changes.
   *
   * @example
   * ```tsx
   * <ClerkProvider clerkJsVersion="x.x.x" />
   * ```
   */
  start: () => Promise<{
    error: ClerkError | null;
  }>;
  /**
   * Used to convert a checkout with `status === 'completed'` into an active subscription. Will cause anything observing the
   * subscription state (such as the `useSubscription()` hook) to update automatically.
   */
  finalize: (params?: CheckoutFlowFinalizeParams) => Promise<{
    error: ClerkError | null;
  }>;
}
/**
 * @interface
 */
type CheckoutFlowResource = CheckoutPropertiesPerStatus & CheckoutFlowMethods;
/**
 * Non-strict version of checkout flow resource. All properties are always present,
 * allowing the class implementation to access properties regardless of status.
 * This is the type that the `CheckoutFlow` class implements.
 *
 * @internal
 */
type CheckoutFlowResourceNonStrict = CheckoutFlowProperties & {
  status: 'needs_initialization' | 'needs_confirmation' | 'completed';
} & CheckoutFlowMethods;
//#endregion
export { AddPaymentMethodParams, BillingCheckoutResource, BillingCheckoutTotals, BillingCreditBalanceResource, BillingCreditLedgerResource, BillingCredits, BillingDiscounts, BillingInitializedPaymentMethodResource, BillingMoneyAmount, BillingNamespace, BillingPayerCredit, BillingPayerMethods, BillingPayerResource, BillingPayerResourceType, BillingPaymentChargeType, BillingPaymentMethodResource, BillingPaymentMethodStatus, BillingPaymentResource, BillingPaymentStatus, BillingPaymentTotals, BillingPerUnitTotal, BillingPerUnitTotalTier, BillingPeriodTotals, BillingPlanPrice, BillingPlanResource, BillingPlanUnitPrice, BillingPlanUnitPriceTier, BillingProrationCreditDetail, BillingProrationDiscount, BillingStatementGroup, BillingStatementResource, BillingStatementStatus, BillingStatementTotals, BillingSubscriptionItemNextPayment, BillingSubscriptionItemResource, BillingSubscriptionItemSeats, BillingSubscriptionNextPayment, BillingSubscriptionPlanPeriod, BillingSubscriptionResource, BillingSubscriptionStatus, BillingTotals, CancelSubscriptionParams, CheckoutFlowFinalizeParams, CheckoutFlowResource, CheckoutFlowResourceNonStrict, ConfirmCheckoutParams, CreateCheckoutParams, FeatureResource, ForPayerType, GetCreditBalanceParams, GetCreditHistoryParams, GetPaymentAttemptParams, GetPaymentAttemptsParams, GetPaymentMethodsParams, GetPlanParams, GetPlansParams, GetStatementParams, GetStatementsParams, GetSubscriptionParams, InitializePaymentMethodParams, MakeDefaultPaymentMethodParams, PaymentGateway, RemovePaymentMethodParams, WithOptionalOrgType };