# Input OTP: Letters and numbers

> `validationType="alphanumeric"` accepts recovery and invite codes, and `normalizeValue` upper-cases them as they are typed or pasted.

Example: https://hextaui.com/docs/input-otp/examples/alphanumeric
Component docs: https://hextaui.com/docs/input-otp.md

## Add this example

```bash
npx shadcn@latest add https://hextaui.com/r/input-otp-alphanumeric.json
```

This adds `components/examples/input-otp/alphanumeric.tsx` with the Input OTP component and the HextaUI theme tokens.

## Source

```tsx title="components/examples/input-otp/alphanumeric.tsx"
"use client"

import {
  InputOTP,
  InputOTPGroup,
  InputOTPSeparator,
  InputOTPSlot,
} from "@/components/ui/input-otp"

export function InputOTPAlphanumeric() {
  return (
    <InputOTP
      length={8}
      validationType="alphanumeric"
      normalizeValue={(value) => value.toUpperCase()}
      aria-label="Recovery code"
    >
      <InputOTPGroup>
        <InputOTPSlot />
        <InputOTPSlot />
        <InputOTPSlot />
        <InputOTPSlot />
      </InputOTPGroup>
      <InputOTPSeparator />
      <InputOTPGroup>
        <InputOTPSlot />
        <InputOTPSlot />
        <InputOTPSlot />
        <InputOTPSlot />
      </InputOTPGroup>
    </InputOTP>
  )
}
```

## Props in this example

### InputOTP

| Prop | Type | Default | Description |
| --- | --- | --- | --- |
| `length` | `number` | – | Required. The number of slots; render the same number of InputOTPSlot parts. |
| `validationType` | `"numeric" \| "alpha" \| "alphanumeric" \| "none"` | `"numeric"` |  |
| `normalizeValue` | `(value: string) => string` | – | Runs after filtering. Keep it idempotent. |

## More Input OTP examples

- [Joined](https://hextaui.com/docs/input-otp/examples/basic.md)
- [Separate](https://hextaui.com/docs/input-otp/examples/separate.md)
- [Sizes](https://hextaui.com/docs/input-otp/examples/sizes.md)
- [Animated](https://hextaui.com/docs/input-otp/examples/animated.md)
- [Status](https://hextaui.com/docs/input-otp/examples/status.md)
- [Controlled](https://hextaui.com/docs/input-otp/examples/controlled.md)
- [Form](https://hextaui.com/docs/input-otp/examples/form.md)
- [With Field](https://hextaui.com/docs/input-otp/examples/field.md)
- [Invalid](https://hextaui.com/docs/input-otp/examples/invalid.md)
- [Masked](https://hextaui.com/docs/input-otp/examples/masked.md)
- [Custom separator](https://hextaui.com/docs/input-otp/examples/custom-separator.md)
- [Disabled](https://hextaui.com/docs/input-otp/examples/disabled.md)
- [Right to left](https://hextaui.com/docs/input-otp/examples/rtl.md)
