ID generators

ULID Generator and Decoder

Create lexicographically sortable ULIDs one at a time or a thousand at once, read the timestamp inside any ULID, and convert between ULID and UUID.

  • Free foreverNo trial, no paywall, no usage limits.
  • No sign-upOpen the page and start. We never ask for an email to use a tool.
  • PrivateEverything runs in your browser. Your input is never uploaded or stored on our servers.
  • Works offlineOnce the page has loaded, the tool keeps working without a connection.
Generate 1 to 1,000 ULIDs at once. All of them appear in the list below, ready to copy or download.
ULIDs made in the same millisecond get the previous random part plus one, so a batch is guaranteed to sort in the order it was generated. Off: each ULID gets fresh randomness, and same-millisecond ULIDs sort randomly among themselves.

Your ULID

Monotonic
00000000000000000000000000

Format

How each ULID is written. Changing the format never changes the IDs themselves.
ULIDs are case-insensitive and canonically uppercase. Lowercase reads more easily in URLs and logs, and still decodes to the same value.
How the batch is joined: one per line for scripts, a JSON array for code and fixtures, a CSV column for spreadsheets, or a comma list to paste into SQL IN (…).
Wrap each ID in quotes, e.g. single quotes for SQL string literals. JSON arrays always use double quotes.
Double quotes, as JSON and most languages use.Single quotes, as SQL string literals use.
A single-key shortcut that works anywhere on the page except in text fields. Turn it off if you use speech input or keyboard tools that could press R by accident.

ULIDs

Every ID in the batch, formatted with your options. Copy them all or download a file.
Copy allDownload ulids.txt

ULID decoder and validator

Paste a ULID to check it and read its timestamp, or paste a UUID to see it written as a ULID.
Clear
Case-insensitive. I, L and O are read as 1, 1 and 0, as Crockford Base32 allows. Nothing leaves your browser.

Need a secure web app built around this? Talk to our team

Quick answer

A ULID (Universally Unique Lexicographically Sortable Identifier) is a 128-bit ID written as 26 Crockford Base32 characters: a 48-bit millisecond timestamp followed by 80 random bits, such as 01ARYZ6S41TSV4RRFFQ69G5FAV. Because the time comes first, ULIDs sort by creation time as plain strings. In Playxoft's ULID generator, choose how many you need, keep Monotonic on to guarantee order within a millisecond, and copy or download the batch.

  • Monotonic ordering
  • Bulk up to 1,000
  • Timestamp decoder
  • ULID to UUID
  • Crockford validation
  • JSON, CSV and SQL lists
  • Copy and download

How to use the ULID Generator

  1. 1Set How many ULIDs you need, from 1 to 1,000.
  2. 2Keep Monotonic on so ULIDs created in the same millisecond still sort in the order they were made.
  3. 3Pick the Format: canonical uppercase or Lowercase, quotes, and a list layout such as a JSON array or a CSV column.
  4. 4Copy the highlighted ULID, or use Copy all and Download for the batch. Click Generate new or press R for fresh ones.
  5. 5Paste any ULID into the ULID decoder and validator to read its timestamp, or paste a UUID to see it written as a ULID.

What is a ULID?

A ULID is a 128-bit identifier designed to be unique like a UUID but sortable by creation time, defined by the community ULID specification. It has two parts:

 01ARYZ6S41        TSV4RRFFQ69G5FAV
 └─ timestamp ─┘   └─── randomness ───┘
  10 characters       16 characters
  48 bits (ms)        80 bits

The text form uses Crockford Base32: the digits 0–9 and the letters A–Z without I, L, O and U. That makes ULIDs 26 characters long (10 fewer than a hyphenated UUID), case-insensitive, URL-safe without escaping, and easy to read aloud. Because 26 characters hold 130 bits but a ULID has only 128, the first character is always 0–7; the largest possible ULID is 7ZZZZZZZZZZZZZZZZZZZZZZZZZ, which covers timestamps until the year 10889.

Since the timestamp comes first and Base32 digits are in ASCII order, sorting ULIDs as strings sorts them by time. No parsing needed.

ULID vs UUID v7: which should I use?

UUID v7 (standardized in RFC 9562 in 2024) borrowed the ULID idea, so the two are close cousins:

ULIDUUID v7
Defined byCommunity spec on GitHubIETF standard (RFC 9562)
Size128 bits128 bits
Timestamp48-bit Unix milliseconds48-bit Unix milliseconds
Random bits8074 (some may be a counter)
Text form26 characters, Crockford Base3236 characters, hex with hyphens
CaseInsensitive, uppercase canonicalInsensitive, lowercase canonical
Native database typeNone (store as text or 16 bytes)uuid in PostgreSQL, uniqueidentifier in SQL Server
Built-in generatorsLibraries onlyPython 3.14, PostgreSQL 18, .NET 9

Choose UUID v7 when IDs live in a database with a native UUID type, cross system boundaries, or must pass UUID validators. Choose ULID when the string form matters: shorter URLs, file names and log lines, case-insensitive matching, or an existing system already built on ULIDs. Both give you time-ordered inserts and the same index benefits.

What does monotonic mode do?

Within one millisecond, plain ULIDs share a timestamp and differ only in their random part, so a batch created in the same millisecond sorts in random order. The spec's monotonic mode fixes that: when the timestamp has not changed, the generator takes the previous ULID's random part and adds one.

  • A batch of 1,000 ULIDs therefore sorts exactly in creation order.
  • If the system clock moves backwards, the last timestamp is reused, so the sequence never goes down.
  • Overflowing the 80-bit random part within one millisecond is an error per the spec. Because it starts at a random value, that takes about 2^79 increments on average, far beyond any real workload.

The trade-off: in monotonic mode, the next ULID from the same generator is predictable (previous plus one). ULIDs are identifiers, not secrets, so never use them as tokens either way.

Can I store a ULID in a UUID column?

Yes. A ULID and a UUID are both 128 bits, so any ULID can be written in UUID notation and stored in a native uuid column, which takes 16 bytes instead of 26 characters. The decoder above shows this As UUID form for every ULID, and converts the other way when you paste a UUID.

Two caveats. First, the result does not set UUID version or variant bits, so strict validators that require v4 or v7 may reject it. Second, ordering is preserved only if the database compares UUIDs byte by byte from the start, as PostgreSQL does; SQL Server's uniqueidentifier sorts by its last bytes first. Going the other way, a UUID v7 written as a ULID keeps its timestamp, because both put Unix milliseconds in the first 48 bits.

How do I generate a ULID in code?

There is no built-in ULID generator in mainstream runtimes, but well-maintained libraries exist for every language:

// JavaScript — npm install ulid
import { ulid, monotonicFactory } from "ulid";
ulid();                          // "01ARYZ6S41TSV4RRFFQ69G5FAV"
const next = monotonicFactory();
next();                          // sorted even within one ms

# Python — pip install python-ulid
from ulid import ULID
str(ULID())                      # new ULID
ULID.from_str("01ARYZ6S41TSV4RRFFQ69G5FAV").datetime

// Go — github.com/oklog/ulid/v2
id := ulid.Make()                // monotonic within the process
fmt.Println(id.String(), ulid.Time(id.Time()))

// C# — dotnet add package Ulid
var id = Ulid.NewUlid();
Guid asGuid = id.ToGuid();

To check what a library produced, paste its output into the decoder above: it validates the alphabet, length and first character, and shows the exact timestamp.

Frequently asked questions

It depends on the job. A ULID sorts by creation time and is shorter as text, which beats a random UUID v4 for database keys and logs. UUID v7 offers the same time ordering as an IETF standard with native database types, so it is usually the better choice for new database schemas.
No. ULIDs are case-insensitive and canonically uppercase, so 01arz3ndektsv4rrffq69g5fav and 01ARZ3NDEKTSV4RRFFQ69G5FAV are the same value. Normalize to uppercase before comparing them as strings or using them as unique keys.
ULIDs use Crockford Base32, which leaves out I, L and O because they are easily confused with 1 and 0, and leaves out U to reduce the chance of accidental obscene words. Decoders read I and L as 1 and O as 0, as this tool does.
The 48-bit millisecond timestamp lasts until the year 10889. The largest valid ULID is 7ZZZZZZZZZZZZZZZZZZZZZZZZZ, which is why the first character of every ULID is between 0 and 7.
Yes. The first 10 characters are the creation time in Unix milliseconds, and anyone can decode them. Paste a ULID into the decoder to see its exact date. If creation time is sensitive, use a fully random ID such as a UUID v4 or a nanoid for public references.
The 80-bit random part allows about 1.2 septillion (2 to the power of 80) distinct ULIDs in every millisecond, so collisions between independently generated ULIDs are practically impossible.
No. ULIDs are generated and decoded entirely in your browser, and nothing you paste is uploaded, logged or stored.

Last updated by the Playxoft engineering team.

From the engineers who built this tool

Building something bigger than a quick fix?

Auth, payments, dashboards and security are where web apps get hard. We have shipped them many times. Share your idea and we will map out a realistic plan and estimate, free and with no obligation.

More free tools

See all tools

UUID Generator

Generate v4 and v7 UUIDs in bulk, and decode any UUID's version and timestamp.

Open tool

Nanoid Generator

Generate nanoid IDs with any alphabet and length, and check how long until a collision.

Open tool

JWT Decoder

Decode JWTs, explain every claim and expiry, verify signatures and sign new tokens.

Open tool

Base64 Encoder and Decoder

Encode text or files to Base64 and back, with Base64url, data URIs and type-detected downloads.

Open tool

URL Encoder and Decoder

Percent-encode or decode URLs and query values, and inspect every parameter.

Open tool

Hash Generator

MD5, SHA-1, SHA-256, SHA-384 and SHA-512 for text or files, with HMAC and checksum verify.

Open tool