Type-safe, K-sortable, globally unique identifier inspired by Stripe IDs
TypeID
A type-safe, K-sortable, globally unique identifier inspired by Stripe IDs
What is it?
TypeIDs are a modern, type-safe extension of UUIDv7. Inspired by a similar use of prefixes in Stripe's APIs.
TypeIDs are canonically encoded as lowercase strings consisting of three parts:
- A type prefix (at most 63 characters in all lowercase snake_case ASCII
- An underscore '\_' separator
- A 128-bit UUIDv7 encoded as a 26-character string using a modified base32
Here's an example of a TypeID of type user:
user_2x4y6z8a0b1c2d3e4f5g6h7j8k
ββββ ββββββββββββββββββββββββββ
type uuid suffix (base32)
A formal specification defines the encoding in more detail.
Online Converter
You can try converting UUID to TypeID and back using Jetify's TypeID Converter. Paste your TypeID string to convert to UUID or put your prefix and UUID in this format: prefix:UUID to convert to TypeID.
jetify.com/typeid
Benefits
- Type-safe: you can't accidentally use a
userID where apostID is
- Compatible with UUIDs: TypeIDs are a superset of UUIDs. They are based on
- K-Sortable: TypeIDs are K-sortable and can be used as the primary key in a
- Thoughtful encoding: the base32 encoding is URL safe, case-insensitive,
Implementations
Implementations should adhere to the formal specification.
Latest spec version: v0.3.0
Official Implementations by jetify
| Language | Status | Spec Version | | ----------------------------------------------------- | ------------- | ------------ | | Go | β Implemented | v0.3 | | SQL | β Implemented | v0.2 | | TypeScript | β Implemented | v0.3 |
Community Provided Implementations
| Language | Author | Spec Version | | ------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | | C# (.Net) | @TenCoKaciStromy | v0.2 on 2023-06-30 | | C# (.Net Standard 2.1) | @cbuctok | v0.2 on 2023-07-03 | | C# (.NET) | @firenero | v0.3 on 2024-04-15 | | Dart | @mistermoe @tbd54566975 | v0.3 on 2024-07-02 | | Elixir | @sloanelybutsurely | v0.3 on 2024-04-22 | | Elixir | @xinz | v0.1 on 2024-06-03 | | Erlang | @eproxus | v0.3 on 2024-09-25 | | Gleam | @okkdev | v0.3 on 2025-07-09 | | Haskell | @MMZK1526 | v0.3 on 2024-04-19 | | Java | @fxlae | v0.3 on 2024-04-14 | | Java | @softprops | v0.2 on 2023-07-04 | | Kotlin | @aleris | v0.3 on 2024-05-18 | | Lua | @pushcx | v0.3 on 2025-05-21 | | OCaml | @titouancreach | v0.3 on 2024-04-22 | | PHP | @BaseCodeOy | v0.3 on 2024-12-06 | | Postgres | @blitss | v0.3 on 2024-06-24 | | Python | @akhundMurad | v0.3 on 2024-04-19 | | Ruby | @broothie | v0.3 on 2024-04-13 | | Rust | @conradludgate | v0.3 on 2024-04-12 | | Rust | @johnnynotsolucky | v0.3 on 2024-05-17 | | Rust | @Govcraft | v0.3 on 2024-07-15 | | Scala | @ant8e | v0.3 on 2024-04-19 | | Scala | @guizmaii | Not validated yet | | Swift | @Frizlab | v0.3 on 2024-04-19 | | T-SQL | @uniteeio | v0.2 on 2023-08-25 | | TypeScript | @ongteckwu | v0.2 on 2023-06-30 | | Zig | @nikoksr | v0.3 on 2024-12-29 |
We are looking for community contributions to implement TypeIDs in other languages.
Command-line Tool
This repo includes a command-line tool for generating TypeIDs. To install it, run:
curl -fsSL https://get.jetify.com/typeid | bash
To generate a new TypeID, run:
$ typeid new prefix
prefix_01h2xcejqtf2nbrexx3vqjhp41
To decode an existing TypeID into a UUID run:
$ typeid decode prefix_01h2xcejqtf2nbrexx3vqjhp41
type: prefix
uuid: 0188bac7-4afa-78aa-bc3b-bd1eef28d881
And to encode an existing UUID into a TypeID run:
$ typeid encode prefix 0188bac7-4afa-78aa-bc3b-bd1eef28d881
prefix_01h2xcejqtf2nbrexx3vqjhp41
Related Work
- UUIDv7 -
Alternatives to UUIDv7 that are also worth considering (but not type-safe like TypeIDs):