Concepts
What is xAPI?
xAPI (the Experience API) is an open specification for describing what someone — or something — did, as a structured statement: actor, verb, object. It's the format every statement in an Empress ledger uses.
The shape of a fact
{
"actor": { "account": { "name": "agent-7", "homePage": "https://empress.eco" } },
"verb": { "id": "https://empress.eco/verbs/resolved" },
"object": { "id": "https://example.com/tickets/892" },
"result": { "success": true },
"timestamp": "2026-07-05T19:00:00Z"
} Actor — who did it: a person, an AI agent, a device, a system process. Verb — what they did, named by a URI so meaning is unambiguous and extensible. Object — what they did it to. Optional parts carry results, context, and arbitrary extensions.
Why a standard instead of a custom event schema?
Every analytics tool invents its own event format, and every migration means losing your history's meaning. xAPI has been an open specification since 2013, with an ecosystem of tooling that already reads it. Statements you record today stay interpretable in a decade — by you, your auditors, or software that doesn't exist yet.
It also generalizes further than app analytics: the same grammar describes a human completing a lesson, an AI agent resolving a ticket, and a sensor crossing a threshold. One queryable model for every kind of actor is what makes cross-actor questions ("what did my agents learn this month?") possible at all.
What Empress adds to xAPI
The spec defines the format; Empress supplies the infrastructure: an immutable multi-tenant ledger, the any-verb principle (structure is validated, vocabulary is never rejected), machine-verified tenant isolation, full NDJSON export, and a computed layer — analytics, difficulty, and FSRS belief state — derived from your statements at query time.
Try it in the quickstart — your first statement is one cURL away.