Created
June 18, 2025 17:46
-
-
Save sergiojoker11/7e2da7fa97a67cba799f1e75a2e530c4 to your computer and use it in GitHub Desktop.
Stripe Schemas. Event and EventType
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint-disable camelcase */ | |
import type Stripe from 'stripe'; | |
import { z } from 'zod'; | |
type ValidateEventTypes<T extends ReadonlyArray<string>> = Stripe.Event['type'] extends T[number] | |
? T | |
: T & { | |
ERROR: `Missing Stripe event types`; | |
MISSING: Exclude<Stripe.Event['type'], T[number]>; | |
HINT: 'Add the missing types to the array above'; | |
}; | |
function createExhaustiveEventList<T extends ReadonlyArray<Stripe.Event['type']>>( | |
events: ValidateEventTypes<T> | |
): T { | |
return events as T; | |
} | |
export const stripeEventTypes = createExhaustiveEventList([ | |
'account.application.authorized', | |
'account.application.deauthorized', | |
'account.external_account.created', | |
'account.external_account.deleted', | |
'account.external_account.updated', | |
'account.updated', | |
'application_fee.created', | |
'application_fee.refund.updated', | |
'application_fee.refunded', | |
'balance.available', | |
'billing.alert.triggered', | |
'billing.credit_balance_transaction.created', | |
'billing.credit_grant.created', | |
'billing.credit_grant.updated', | |
'billing.meter.created', | |
'billing.meter.deactivated', | |
'billing.meter.reactivated', | |
'billing.meter.updated', | |
'billing_portal.configuration.created', | |
'billing_portal.configuration.updated', | |
'billing_portal.session.created', | |
'capability.updated', | |
'cash_balance.funds_available', | |
'charge.captured', | |
'charge.dispute.closed', | |
'charge.dispute.created', | |
'charge.dispute.funds_reinstated', | |
'charge.dispute.funds_withdrawn', | |
'charge.dispute.updated', | |
'charge.expired', | |
'charge.failed', | |
'charge.pending', | |
'charge.refund.updated', | |
'charge.refunded', | |
'charge.succeeded', | |
'charge.updated', | |
'checkout.session.async_payment_failed', | |
'checkout.session.async_payment_succeeded', | |
'checkout.session.completed', | |
'checkout.session.expired', | |
'climate.order.canceled', | |
'climate.order.created', | |
'climate.order.delayed', | |
'climate.order.delivered', | |
'climate.order.product_substituted', | |
'climate.product.created', | |
'climate.product.pricing_updated', | |
'coupon.created', | |
'coupon.deleted', | |
'coupon.updated', | |
'credit_note.created', | |
'credit_note.updated', | |
'credit_note.voided', | |
'customer.created', | |
'customer.deleted', | |
'customer.discount.created', | |
'customer.discount.deleted', | |
'customer.discount.updated', | |
'customer.source.created', | |
'customer.source.deleted', | |
'customer.source.expiring', | |
'customer.source.updated', | |
'customer.subscription.created', | |
'customer.subscription.deleted', | |
'customer.subscription.paused', | |
'customer.subscription.pending_update_applied', | |
'customer.subscription.pending_update_expired', | |
'customer.subscription.resumed', | |
'customer.subscription.trial_will_end', | |
'customer.subscription.updated', | |
'customer.tax_id.created', | |
'customer.tax_id.deleted', | |
'customer.tax_id.updated', | |
'customer.updated', | |
'customer_cash_balance_transaction.created', | |
'entitlements.active_entitlement_summary.updated', | |
'file.created', | |
'financial_connections.account.created', | |
'financial_connections.account.deactivated', | |
'financial_connections.account.disconnected', | |
'financial_connections.account.reactivated', | |
'financial_connections.account.refreshed_balance', | |
'financial_connections.account.refreshed_ownership', | |
'financial_connections.account.refreshed_transactions', | |
'identity.verification_session.canceled', | |
'identity.verification_session.created', | |
'identity.verification_session.processing', | |
'identity.verification_session.redacted', | |
'identity.verification_session.requires_input', | |
'identity.verification_session.verified', | |
'invoice.created', | |
'invoice.deleted', | |
'invoice.finalization_failed', | |
'invoice.finalized', | |
'invoice.marked_uncollectible', | |
'invoice.overdue', | |
'invoice.overpaid', | |
'invoice.paid', | |
'invoice.payment_action_required', | |
'invoice.payment_failed', | |
'invoice.payment_succeeded', | |
'invoice.sent', | |
'invoice.upcoming', | |
'invoice.updated', | |
'invoice.voided', | |
'invoice.will_be_due', | |
'invoice_payment.paid', | |
'invoiceitem.created', | |
'invoiceitem.deleted', | |
'issuing_authorization.created', | |
'issuing_authorization.request', | |
'issuing_authorization.updated', | |
'issuing_card.created', | |
'issuing_card.updated', | |
'issuing_cardholder.created', | |
'issuing_cardholder.updated', | |
'issuing_dispute.closed', | |
'issuing_dispute.created', | |
'issuing_dispute.funds_reinstated', | |
'issuing_dispute.funds_rescinded', | |
'issuing_dispute.submitted', | |
'issuing_dispute.updated', | |
'issuing_personalization_design.activated', | |
'issuing_personalization_design.deactivated', | |
'issuing_personalization_design.rejected', | |
'issuing_personalization_design.updated', | |
'issuing_token.created', | |
'issuing_token.updated', | |
'issuing_transaction.created', | |
'issuing_transaction.purchase_details_receipt_updated', | |
'issuing_transaction.updated', | |
'mandate.updated', | |
'payment_intent.amount_capturable_updated', | |
'payment_intent.canceled', | |
'payment_intent.created', | |
'payment_intent.partially_funded', | |
'payment_intent.payment_failed', | |
'payment_intent.processing', | |
'payment_intent.requires_action', | |
'payment_intent.succeeded', | |
'payment_link.created', | |
'payment_link.updated', | |
'payment_method.attached', | |
'payment_method.automatically_updated', | |
'payment_method.detached', | |
'payment_method.updated', | |
'payout.canceled', | |
'payout.created', | |
'payout.failed', | |
'payout.paid', | |
'payout.reconciliation_completed', | |
'payout.updated', | |
'person.created', | |
'person.deleted', | |
'person.updated', | |
'plan.created', | |
'plan.deleted', | |
'plan.updated', | |
'price.created', | |
'price.deleted', | |
'price.updated', | |
'product.created', | |
'product.deleted', | |
'product.updated', | |
'promotion_code.created', | |
'promotion_code.updated', | |
'quote.accepted', | |
'quote.canceled', | |
'quote.created', | |
'quote.finalized', | |
'radar.early_fraud_warning.created', | |
'radar.early_fraud_warning.updated', | |
'refund.created', | |
'refund.failed', | |
'refund.updated', | |
'reporting.report_run.failed', | |
'reporting.report_run.succeeded', | |
'reporting.report_type.updated', | |
'review.closed', | |
'review.opened', | |
'setup_intent.canceled', | |
'setup_intent.created', | |
'setup_intent.requires_action', | |
'setup_intent.setup_failed', | |
'setup_intent.succeeded', | |
'sigma.scheduled_query_run.created', | |
'source.canceled', | |
'source.chargeable', | |
'source.failed', | |
'source.mandate_notification', | |
'source.refund_attributes_required', | |
'source.transaction.created', | |
'source.transaction.updated', | |
'subscription_schedule.aborted', | |
'subscription_schedule.canceled', | |
'subscription_schedule.completed', | |
'subscription_schedule.created', | |
'subscription_schedule.expiring', | |
'subscription_schedule.released', | |
'subscription_schedule.updated', | |
'tax.settings.updated', | |
'tax_rate.created', | |
'tax_rate.updated', | |
'terminal.reader.action_failed', | |
'terminal.reader.action_succeeded', | |
'test_helpers.test_clock.advancing', | |
'test_helpers.test_clock.created', | |
'test_helpers.test_clock.deleted', | |
'test_helpers.test_clock.internal_failure', | |
'test_helpers.test_clock.ready', | |
'topup.canceled', | |
'topup.created', | |
'topup.failed', | |
'topup.reversed', | |
'topup.succeeded', | |
'transfer.created', | |
'transfer.reversed', | |
'transfer.updated', | |
'treasury.credit_reversal.created', | |
'treasury.credit_reversal.posted', | |
'treasury.debit_reversal.completed', | |
'treasury.debit_reversal.created', | |
'treasury.debit_reversal.initial_credit_granted', | |
'treasury.financial_account.closed', | |
'treasury.financial_account.created', | |
'treasury.financial_account.features_status_updated', | |
'treasury.inbound_transfer.canceled', | |
'treasury.inbound_transfer.created', | |
'treasury.inbound_transfer.failed', | |
'treasury.inbound_transfer.succeeded', | |
'treasury.outbound_payment.canceled', | |
'treasury.outbound_payment.created', | |
'treasury.outbound_payment.expected_arrival_date_updated', | |
'treasury.outbound_payment.failed', | |
'treasury.outbound_payment.posted', | |
'treasury.outbound_payment.returned', | |
'treasury.outbound_payment.tracking_details_updated', | |
'treasury.outbound_transfer.canceled', | |
'treasury.outbound_transfer.created', | |
'treasury.outbound_transfer.expected_arrival_date_updated', | |
'treasury.outbound_transfer.failed', | |
'treasury.outbound_transfer.posted', | |
'treasury.outbound_transfer.returned', | |
'treasury.outbound_transfer.tracking_details_updated', | |
'treasury.received_credit.created', | |
'treasury.received_credit.failed', | |
'treasury.received_credit.succeeded', | |
'treasury.received_debit.created' | |
] as const satisfies ReadonlyArray<Stripe.Event['type']>); | |
export const stripeEventTypeSchema = z.enum(stripeEventTypes); | |
export const stripeEventBaseSchema = z | |
.object({ | |
id: z.string(), | |
object: z.literal('event'), | |
created: z.number(), | |
type: stripeEventTypeSchema, | |
livemode: z.boolean(), | |
pending_webhooks: z.number(), | |
request: z | |
.object({ | |
id: z.string().nullable(), | |
idempotency_key: z.string().nullable() | |
}) | |
.nullable(), | |
data: z.object({ | |
object: z.unknown(), | |
previous_attributes: z.record(z.unknown()).optional() | |
}), | |
api_version: z.string().nullable() | |
}) | |
.transform((data) => { | |
return data as Stripe.Event; | |
}); | |
export type StripeEventType = z.infer<typeof stripeEventTypeSchema>; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment