Title: Rooster LRS
Author: Oxford Metadata Ltd
Published: <strong>November 10, 2026</strong>
Last modified: November 10, 2026

---

Search plugins

![](https://ps.w.org/rooster-lrs/assets/banner-772x250.png?rev=3794902)

![](https://ps.w.org/rooster-lrs/assets/icon.svg?rev=3794902)

# Rooster LRS

 By [Oxford Metadata Ltd](https://profiles.wordpress.org/oxfordmetadata/)

[Download](https://downloads.wordpress.org/plugin/rooster-lrs.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/rooster-lrs/#description)
 * [Reviews](https://wordpress.org/plugins/rooster-lrs/#reviews)
 *  [Installation](https://wordpress.org/plugins/rooster-lrs/#installation)
 * [Development](https://wordpress.org/plugins/rooster-lrs/#developers)

 [Support](https://wordpress.org/support/plugin/rooster-lrs/)

## Description

**Rooster LRS makes your WordPress site an xAPI Learning Record Store (LRS).** Learning
applications, e-learning packages (xAPI and cmi5), simulators and learning management
systems send their xAPI statements to it, and reporting tools read them back. The
records stay in your own database, in the plugin’s own tables, and nothing is sent
anywhere else.

**[Website](https://rooster.systems/get-rooster-lrs/) · [Documentation](https://rooster.systems/category/en/documentation/rooster-lrs/)·
[Rooster LMS](https://wordpress.org/plugins/rooster-lms/)**

#### What it does

 * The xAPI resources under `/wp-json/rooster-lrs/xapi/`: statements (store, query,
   void), State, Activity Profile, Agent Profile, Activities, Agents and About.
 * xAPI 1.0.3 and xAPI 2.0 (IEEE 9274.1.1) at the same endpoint, chosen by the `
   X-Experience-API-Version` header.
 * Strict statement validation with clear error messages that name the property 
   and the rule.
 * xAPI Profiles: statements that follow the Rooster assessment or adaptive profile(
   quiz attempts and answers, from Rooster LMS Pro or any platform that emits them)
   have the profile’s extensions checked against their schemas. The profiles are
   bundled with the plugin, so nothing is fetched.
 * Every statement query parameter: agent, verb, activity, registration, related
   activities and agents, since and until, limit, ascending, formats exact, ids 
   and canonical, paging with `more`, and statements that refer to other statements.
 * Attachments (multipart/mixed) and signed statements (JWS structure, payload, 
   and the signature when the certificate is included).
 * Documents with ETags and concurrency control (If-Match / If-None-Match).
 * The 1.0.3 alternate request syntax and CORS for browser-based content.
 * Credentials per application (HTTP Basic): a key and a secret shown once, xAPI
   scopes, an authority, an expiry, revocation.
 * LRS  Statements: a statement browser with filters and a “Void” action. LRS  Credentials
   and LRS  Settings.
 * Privacy: personal-data export and erasure, erasure of one person’s records by
   e-mail address or xAPI agent, a retention period.
 * Built for large stores: its own tables, an index for every query parameter, keyset
   paging (tested with 100,000 statements).
 * WordPress Abilities: read-only reports (activity per course, lesson, verb or 
   learner, time spent, unfinished activities, quiz answers per question) that AI
   assistants on your own site, such as Rooster One’s Insights Chat, can ask for;
   learners are pseudonymised.

Rooster LRS implements xAPI 1.0.3 and 2.0 and is tested against its own conformance
suite; it has not yet been certified with the ADL LRS Conformance Test Suite.

When Rooster LMS is active, the screens use its design system. Rooster LRS works
without it.

#### Endpoint and credentials

 1. Go to LRS  Credentials and create a credential with the scopes the application 
    needs.
 2. Copy the key and the secret (the secret is shown once).
 3. Give the application the endpoint shown on that screen (for example `https://example.
    com/wp-json/rooster-lrs/xapi/`), the key as the user name and the secret as the
    password.

To forward statements from Rooster LMS Pro, create a credential with the scopes `
statements/write` and `define`, and choose a custom authority with Rooster LMS Pro’s
LMS agent.

#### Caching and security plugins

xAPI requests must never be cached. If your site uses a page cache, a CDN or a caching
plugin, exclude `/wp-json/rooster-lrs/` (and `?rest_route=/rooster-lrs/` on sites
without pretty permalinks).

Some security plugins block REST API requests from visitors who are not logged in;
allow `/wp-json/rooster-lrs/` for xAPI clients. Some servers remove the `Authorization`
header before PHP sees it; Rooster LRS also reads `REDIRECT_HTTP_AUTHORIZATION` 
and `PHP_AUTH_USER`.

#### Multi-tenant mode

For the Rooster Adaptive LMS service only, which keeps the statements of many sites
in one store. It is off on every other site, where it costs nothing and nothing 
changes. `wp rooster-lrs multi-tenant on` turns it on (`status` and `off` too; off
is refused while tenants exist). In this mode:

 * Every stored row belongs to a tenant. A credential reads and writes its own tenant
   only; another tenant’s statement, document or activity answers 404, and the same
   statement id sent by two tenants is two statements.
 * Tenants and their signed credentials are created by the service’s own plugin 
   on the same site, through Rooster LRS’s PHP API (`RoosterLRS\Tenancy\TenantRegistry`,`
   TenantCredentials`): there is no provisioning endpoint. A tenant credential may
   send statements and activity definitions only, at most 300 requests a minute.
 * Quiz answers and engagement statements that follow the Rooster profiles are also
   written, in the same transaction, to two tables the service’s models read (`rooster_lrs_responses`,`
   rooster_lrs_exposures`). `wp rooster-lrs projection rebuild --tenant=<id>` derives
   them again from the statements.
 * Each tenant has its own retention period; a person’s records and a whole tenant
   are erased through `RoosterLRS\Privacy\TenantEraser`.
 * LRS  Statements and LRS  Credentials show every tenant, with a tenant filter 
   and column.

### External services

Rooster LRS does not connect to any external service. Your site never sends anything
anywhere because of it: it only answers the xAPI requests that the applications 
you give a credential send to it. The links below open in the browser only when 
someone clicks them, and the addresses after them are identifiers that are never
contacted.

#### rooster.systems: links (on click only)

The Rooster LRS header and Home page link to the website of Oxford Metadata Ltd,
the makers of Rooster LRS: the manual (`https://rooster.systems/category/en/documentation/
rooster-lrs/`), [help](https://rooster.systems/help-and-support/), [feedback](https://rooster.systems/help-and-support/feedback/)
and [rooster.systems](https://rooster.systems/). Nothing is sent before the click.
[Terms and conditions](https://rooster.systems/terms-and-conditions/) · [Privacy policy](https://rooster.systems/privacy-policy/)

#### wordpress.org and Viber links (on click only)

The Rooster LRS header links to this plugin’s [page](https://wordpress.org/plugins/rooster-lrs/)
and [review form](https://wordpress.org/support/plugin/rooster-lrs/reviews/) on 
wordpress.org, and to the Rooster community’s chat on Viber (`https://invite.viber.
com/`). [WordPress.org privacy](https://wordpress.org/about/privacy/) · [Viber terms](https://www.viber.com/en/terms/viber-terms-use/)·
[Viber privacy](https://www.viber.com/en/terms/viber-privacy-policy/)

#### xAPI identifiers (never contacted)

xAPI names verbs, activity types, extensions and profiles with IRIs that look like
web addresses. Rooster LRS compares them as text and never opens them: the ADL verbs(`
http://adlnet.gov/expapi/verbs/...` and `https://w3id.org/xapi/adl/verbs/...`), 
and the Rooster profiles’ own identifiers (`https://rooster.systems/xapi/...`), 
whose definitions are bundled in `data/xapi-profiles/`.

### Privacy

Rooster LRS stores the learning records that authorised applications send: xAPI 
statements and documents. A statement names a learner by the identifier the sending
application chose (an e-mail address, a hashed e-mail address, an OpenID or an account)
and describes an activity and its result. Records stay until the site owner deletes
them, a person’s records are erased, or the retention period set under LRS  Settings
ends. Nothing is sent to other services. The plugin adds suggested text to the privacy
policy guide and registers a personal-data exporter and eraser.

## Installation

 1. Install and activate Rooster LRS from Plugins  Add New, or upload the `rooster-
    lrs` folder to `/wp-content/plugins/`.
 2. Go to LRS  Credentials and create a credential for each application that sends 
    or reads statements.
 3. Give each application the endpoint shown on that screen, its key and its secret.

## FAQ

### Does Rooster LRS send data anywhere?

No. It makes no outbound requests. Its screens show links (to the manual, help and
wordpress.org) that open only when you click them.

### Which authentication methods are supported?

HTTP Basic with a credential per application. OAuth is planned.

### How do I delete a person’s records?

Use Tools  Erase Personal Data with their e-mail address, or LRS  Settings  “Erase
a person’s learning records” with an e-mail address or an xAPI agent. Other systems
can call `POST /wp-json/rooster-lrs/v1/erasure` with a credential that has the `
rooster:erase` scope.

### What happens to the records when I delete the plugin?

They stay, unless “Delete all Rooster LRS data when the plugin is deleted” is ticked
under LRS  Settings: then deleting the plugin removes its tables, settings and capabilities.

### Is it fast with many statements?

Every query parameter has its own index and the lists page by key, so a query reads
only the rows it returns. The suite stores 100,000 statements and checks the number
of database queries each request makes.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Rooster LRS” is open source software. The following people have contributed to 
this plugin.

Contributors

 *   [ Oxford Metadata Ltd ](https://profiles.wordpress.org/oxfordmetadata/)

[Translate “Rooster LRS” into your language.](https://translate.wordpress.org/projects/wp-plugins/rooster-lrs)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/rooster-lrs/), check
out the [SVN repository](https://plugins.svn.wordpress.org/rooster-lrs/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/rooster-lrs/) by
[RSS](https://plugins.trac.wordpress.org/log/rooster-lrs/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * First version: the core LRS, xAPI 1.0.3 and 2.0 (statements, documents, attachments,
   signed statements, every query parameter), credentials per application, the statement
   browser, privacy tools and retention.
 * The Rooster assessment and adaptive xAPI Profiles (JSON-LD, bundled): statements
   that name them have their extension values checked.
 * Read-only reports as WordPress Abilities for AI assistants on the site (Rooster
   One’s Insights Chat): activity per course, lesson, verb or learner, time spent,
   activities launched but never completed, and quiz answers per question, quiz,
   item or skill; learners pseudonymised.
 * Multi-tenant mode for the Rooster Adaptive LMS service (off by default): tenant
   scoping, tenant credentials issued in-process, the answer and exposure tables
   with their rebuild, erasure and retention per tenant.

## Meta

 *  Version **1.0.0**
 *  Last updated **16 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.7 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 8.1 or higher **
 * Tags
 * [elearning](https://wordpress.org/plugins/tags/elearning/)[LRS](https://wordpress.org/plugins/tags/lrs/)
   [Tin Can](https://wordpress.org/plugins/tags/tin-can/)[xAPI](https://wordpress.org/plugins/tags/xapi/)
 *  [Advanced View](https://wordpress.org/plugins/rooster-lrs/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/rooster-lrs/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/rooster-lrs/reviews/)

## Contributors

 *   [ Oxford Metadata Ltd ](https://profiles.wordpress.org/oxfordmetadata/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/rooster-lrs/)