Skip to content
↑↓ to move · Enter to openEsc to close
Glossary · Identity

ULID: the sortable identifier behind every AgenID

Updated

ULIDs solve a practical problem: identifiers that are unique without a central counter, safe to put in a URL, and sortable by creation time. The format is defined in the public ULID specification.

In AgenID, every agent is agenid:<ULID>, and every operator key has its own ULID, written agenid:key:<ULID> inside signed payloads and as the bare ULID in HTTP paths.

Definition

A ULID (Universally Unique Lexicographically Sortable Identifier) is a 128-bit identifier made of a 48-bit millisecond timestamp and 80 bits of randomness, written as 26 Crockford base32 characters. AgenID uses ULIDs for agent and key identifiers.

Also known as: Universally Unique Lexicographically Sortable Identifier

How it works in AgenID

The first 10 characters encode the timestamp and the last 16 the randomness. Crockford base32 omits I, L, O and U, which avoids look-alike characters and makes every character path-safe. That is why a key can be fetched at https://www.agenid.com/v1/keys/<key-ulid> with no escaping. The registry still checks uniqueness before committing a new identifier rather than relying on collision resistance alone.

Because ULIDs sort by time, a list of identifiers ordered as text is also ordered by creation, which keeps registry indexes and logs readable without a separate timestamp column.

Why it matters

An earlier draft of the specification named keys with a URI fragment, which HTTP never sends to a server, so keys collided. Giving each key its own ULID fixed that. ULIDs are also non-semantic: they carry no operator name or platform, so an AgenID identifier cannot be forged by guessing a meaningful pattern or confused with a platform's own ID.

What it does not mean

A ULID is a name, not a credential. It proves nothing about who created it and grants no permission; what an agent is allowed to do is a separate question the identifier does not answer. Because the leading characters are a timestamp, a ULID also reveals roughly when it was generated, which is public by design in AgenID.

Frequently asked questions

Is a ULID the same as a UUID?

Both are 128 bits. A ULID sorts by creation time and uses a shorter base32 text form; a random UUID does not sort.

Can two agents get the same ULID?

The 80 random bits make it vanishingly unlikely, and AgenID also checks uniqueness at registration.

Do I generate the ULID myself?

The flow at /issue produces it before signing, because the identifier is part of what the operator signs. Check any identifier at /verify.

What agenid.com issues today

The reference deployment at agenid.com issues DECLARED and L1_REGISTERED only. L2_DOMAIN_VERIFIED and higher require a VerificationAssertion signed by a root authority key, and that key has not been created yet. L5 is reserved by the specification and is not issuable at all.

Identity is not permission

Which agent is acting and who declared it is one question. What that agent is allowed to do is another, and it stays with the party on the other side and with the operator. Protocol v1.1.1 defines no signed authorization object.

Sources

  1. ULID specification
  2. AgenID protocol specification (public repository)

Give your agent an identity

Register an agent in the browser — the signing key is generated on your device and never sent to AgenID — or resolve an existing AgenID and re-check its signature yourself.