ValidationError

Client-side validation error type for card field form validation. Unlike RevolutCheckoutError which occurs during payment processing and is handled via onError callbacks, ValidationError occurs during real-time form field validation in the card field widget and is handled via onValidation callbacks. Validation error messages are automatically localised based on the widget's locale setting.

Type signature

interface ValidationError extends Error {
name: 'Validation'
type: ValidationErrorType
message: string
}

type ValidationErrorType =
| 'validation.card.number.incomplete'
| 'validation.card.number.invalid'
| 'validation.card.number.required'
| 'validation.card.expiry.expired'
| 'validation.card.expiry.incomplete'
| 'validation.card.expiry.required'
| 'validation.card.cvv.invalid'
| 'validation.card.cvv.required'
| 'validation.card.type.invalid'
| 'validation.postcode.invalid'
| 'validation.postcode.country-invalid'
| 'validation.postcode.required'
| 'validation.email.incomplete'
| 'validation.email.invalid'
| 'validation.email.required'
| 'validation.phone.code.required'
| 'validation.phone.number.invalid'
| 'validation.phone.number.required'

Properties

PropertyDescriptionTypeRequired
nameAlways set to 'Validation' to identify validation errors'Validation'Yes
typeSpecific validation error type identifierValidationErrorTypeYes
messageHuman-readable error description (localised based on widget locale)stringYes

Validation error types

Card number errors

Error typeDescriptionUser action
validation.card.number.incompleteCard number is partially enteredComplete card number
validation.card.number.invalidCard number fails format validationCheck card number and re-enter
validation.card.number.requiredCard number field is emptyEnter card number
validation.card.type.invalidCard type not supported by merchantTry a different card

Card expiry errors

Error typeDescriptionUser action
validation.card.expiry.expiredCard expiration date is in the pastUse a different card
validation.card.expiry.incompleteExpiry date is partially enteredComplete expiry date (MM/YY)
validation.card.expiry.requiredExpiry date field is emptyEnter expiry date

CVV/CVC errors

Error typeDescriptionUser action
validation.card.cvv.invalidCVV/CVC code format is invalidCheck CVV (3-4 digits on back/front of card)
validation.card.cvv.requiredCVV/CVC field is emptyEnter CVV code

Postcode errors

Error typeDescriptionUser action
validation.postcode.invalidPostcode format doesn't match country formatCheck postcode format for selected country
validation.postcode.country-invalidPostcode doesn't match selected countryVerify country and postcode match
validation.postcode.requiredPostcode field is emptyEnter postcode/ZIP code

Email errors

Error typeDescriptionUser action
validation.email.incompleteEmail is partially enteredComplete email address
validation.email.invalidEmail format is invalidCheck email format (e.g., [email protected])
validation.email.requiredEmail field is emptyEnter email address

Phone errors

Error typeDescriptionUser action
validation.phone.code.requiredCountry code missing from phone numberSelect country code
validation.phone.number.invalidPhone number format is invalidCheck phone number format
validation.phone.number.requiredPhone number field is emptyEnter phone number

Usage

Basic validation handling

import RevolutCheckout from '@revolut/checkout'
import type { ValidationError } from '@revolut/checkout'

const instance = await RevolutCheckout(orderToken, 'prod')

const cardField = instance.createCardField({
target: document.getElementById('card-field'),

onValidation: (errors: ValidationError[]) => {
if (errors.length === 0) {
// All fields valid
console.log('Card details valid')
} else {
// Show validation errors
console.log('Validation errors:', errors)
displayErrors(errors)
}
}
})

Displaying field-specific errors

import type { ValidationError } from '@revolut/checkout'

function displayErrors(errors: ValidationError[]): void {
errors.forEach((error) => {
// Check error type prefix to determine which field has the error
if (error.type.startsWith('validation.card.number')) {
showFieldError('card-number', error.message)
} else if (error.type.startsWith('validation.card.expiry')) {
showFieldError('card-expiry', error.message)
} else if (error.type.startsWith('validation.card.cvv')) {
showFieldError('card-cvv', error.message)
} else if (error.type.startsWith('validation.postcode')) {
showFieldError('postcode', error.message)
} else if (error.type.startsWith('validation.email')) {
showFieldError('email', error.message)
} else if (error.type.startsWith('validation.phone')) {
showFieldError('phone', error.message)
}
})
}

Usage scenarios

The SDK provides validation errors via the onValidation callback, which fires in real-time as the customer interacts with the card field widget. Common scenarios include:

  • Submit button control: Disable the submit button when errors.length > 0 to prevent submission of invalid data
  • Field-specific error display: Check the error.type prefix to determine which field has the error and display the message near that field
  • Error prioritisation: Filter errors by type suffix (.required, .invalid, .incomplete) to show critical errors first
  • Localised messages: Use error.message directly as it's automatically localised based on the widget's locale setting
  • Custom error messages: Override the SDK's error messages by mapping error.type to custom messages
  • Analytics tracking: Log validation errors to track which fields cause the most issues for customers

See also

Was this page helpful?