{ ULID Validator }

// verify ulid structure and extract embedded timestamp

Validate ULID structure, verify format compliance, and extract the embedded timestamp from any ULID string instantly in your browser.

Enter one or more ULIDs, one per line
🔍

Ready to validate

Paste a ULID and click Validate

HOW TO USE

  1. 01
    Paste your ULIDs

    Enter one or more ULID strings in the input box, one per line.

  2. 02
    Click Validate

    The tool checks structure, character set, length, and timestamp range instantly.

  3. 03
    Read the results

    Each ULID shows validity status plus the decoded UTC timestamp embedded in its first 10 characters.

FEATURES

Format Check Timestamp Decode Crockford B32 Batch Input Length Verify Copy Report

USE CASES

  • 🔧 Debug ULID values in API responses
  • 🔧 Verify ULID generation libraries
  • 🔧 Extract creation timestamps from stored IDs
  • 🔧 Audit database primary keys for ULID compliance
  • 🔧 Confirm sort-safe ordering in distributed systems

WHAT IS THIS?

A ULID (Universally Unique Lexicographically Sortable Identifier) is a 128-bit identifier encoded as a 26-character Crockford Base32 string. The first 10 characters encode a 48-bit millisecond-precision Unix timestamp, and the remaining 16 characters are 80 bits of randomness. This tool validates the structure and decodes the timestamp portion.

RELATED TOOLS

FREQUENTLY ASKED QUESTIONS

What characters are valid in a ULID?

ULIDs use Crockford's Base32 encoding: the digits 0–9 and uppercase letters A–Z, excluding I, L, O, and U to avoid visual ambiguity. Valid characters are: 0123456789ABCDEFGHJKMNPQRSTVWXYZ.

How long is a valid ULID?

A ULID is always exactly 26 characters long. The first 10 characters encode the timestamp, and the remaining 16 characters are random. Any ULID that is shorter or longer is invalid.

Are ULIDs case-sensitive?

Officially, ULIDs are uppercase. However, many implementations accept lowercase input and normalize it. This validator checks both and will flag mixed-case or lowercase as a warning while still decoding the timestamp.

What timestamp range can a ULID encode?

The 48-bit timestamp component can encode times from the Unix epoch (January 1, 1970) up to the year 10889. In practice, any ULID with a timestamp far in the future may indicate a generation error or test data.

How is a ULID different from a UUID?

Unlike UUIDs, ULIDs are lexicographically sortable — a list of ULIDs, when sorted alphabetically, is also sorted by creation time. They are also more compact (26 chars vs 36 for a UUID with hyphens) and URL-safe without encoding.

Can this tool validate ULIDv2 or custom variants?

This validator checks against the original ULID specification. Non-standard variants (such as seeded or monotonic implementations that modify the random portion) will still pass validation if the format and character set are correct.

What Is a ULID and Why Does Validation Matter?

A ULID — Universally Unique Lexicographically Sortable Identifier — is a modern alternative to UUID designed for distributed systems that need both uniqueness and meaningful sort order. Introduced by Alizain Feerasta, the ULID specification defines a 128-bit identifier encoded as a 26-character Crockford Base32 string. The key innovation is that the first 48 bits encode a millisecond-precision Unix timestamp, meaning that ULIDs generated in chronological order are also in alphabetical order when sorted as strings.

💡 Looking for premium web development assets? MonsterONE offers unlimited downloads of templates, UI kits, and developer assets — worth checking out.

The Anatomy of a ULID

Every ULID is exactly 26 characters, split into two logical parts. The timestamp component occupies the first 10 characters and encodes 48 bits representing milliseconds elapsed since the Unix epoch (January 1, 1970, 00:00:00 UTC). This gives a range from the epoch all the way to the year 10889, far exceeding any practical requirement. The randomness component fills the remaining 16 characters with 80 bits of cryptographically random data, providing collision resistance even when multiple ULIDs are generated within the same millisecond.

The character set used is Crockford's Base32: the ten digits (0–9) plus 22 uppercase letters (A–Z), deliberately excluding I, L, O, and U to prevent confusion with the digits 1, 1, 0, and the letter V in various fonts. This results in exactly 32 symbols, making the encoding both compact and visually unambiguous — important when ULIDs appear in logs, URLs, or printed documents.

Why Validate ULIDs?

In production systems, data integrity problems often trace back to malformed identifiers. ULID validation catches several categories of errors early:

How to Extract the Timestamp from a ULID

Decoding the timestamp portion of a ULID is a straightforward Base32 decoding step. Take the first 10 characters of the ULID and decode them using Crockford's alphabet, treating the result as a big-endian 48-bit integer. That integer is the number of milliseconds since the Unix epoch. Convert it to a Date object in JavaScript using new Date(timestampMs), or to a datetime in Python using datetime.fromtimestamp(ts_ms / 1000, tz=timezone.utc).

For example, the ULID 01ARZ3NDEKTSV4RRFFQ69G5FAV starts with 01ARZ3NDEK. Decoding this segment yields a timestamp of approximately 1469918176385 milliseconds, which corresponds to 2016-07-30T22:36:16.385Z — the moment that ULID was generated.

ULIDs vs. UUIDs: When to Use Which

Both ULIDs and UUIDs solve the distributed uniqueness problem, but they have different trade-offs. UUID v4 is entirely random — it provides no information about when or where it was created, and a list of random UUIDs in any sort order is just as arbitrary as any other order. This makes UUID v4 ideal when you explicitly want no correlation between identifiers and insertion time.

ULIDs shine when sort order matters. Because the timestamp is encoded in the most-significant bits, a B-tree index on a ULID column in PostgreSQL, MySQL, or similar databases will naturally cluster recently inserted rows together on the same index pages, dramatically reducing write amplification compared to random UUIDs. This is the same benefit that UUID v7 (draft RFC) aims to bring to the UUID ecosystem, and ULIDs have been solving this problem since 2016.

Monotonic ULIDs and the Random Overflow Problem

Standard ULID generation is not strictly monotonic within a single millisecond — two ULIDs generated at the same timestamp could theoretically sort in either order due to randomness. To guarantee strict ordering, some libraries implement a monotonic ULID mode: when a new ULID is generated within the same millisecond as the previous one, the random component is incremented by one rather than freshly randomized. This guarantees that every ULID is strictly greater than the previous, at the cost of a small risk of random component overflow (which is handled gracefully by incrementing into the timestamp field).

Our validator checks the format and timestamp but does not assess monotonicity, since that property is only meaningful when examining a sequence of ULIDs in context.

ULID Support Across Programming Languages

ULID libraries are available for virtually every major language. In JavaScript/TypeScript, the ulid package on npm is the de facto standard and provides both standard and monotonic generation. Python developers typically use the python-ulid package or ulid-py. Go has github.com/oklog/ulid, the original reference implementation. Java and Kotlin can use com.github.f4b6a3:ulid-creator. Rust developers have the ulid crate on crates.io. In all cases, this validator can be used to verify that the output of any library conforms to the specification.