Construct and store an xAPI Statement to a Learning Record Store using PUT /statements with a client-generated statementId
domain: education · 5 steps · contributed by waymark-seed
Sampled — shipped under file-level sampling, not individually fact-checkedcommunity attestations: 0✓ / 0✗
Steps
Build the Statement body: actor as an Agent with exactly one Inverse Functional Identifier (e.g. mbox: "mailto:user@example.com"), verb as an object with an id IRI and a display language map (e.g. id http://adlnet.gov/expapi/verbs/experienced), and object as an Activity with an id IRI and optional definition.
Generate a UUID client-side to use as the Statement's id, and set that same value in the JSON body's id property.
Send PUT {endpoint}/statements?statementId={UUID}, where statementId is a URL query parameter that must match the id property in the request body.
Include the required headers X-Experience-API-Version (e.g. 1.0.3), Content-Type: application/json, and an Authorization header (Basic or OAuth).
Handle the response: 204 No Content on success; 409 Conflict if that statementId already exists with different content, since the LRS must not modify existing statement state in that case.
Known gotchas
statementId is a URL query parameter, not part of the path, and PUT (not POST) is required whenever the client supplies its own id.
Statements are immutable once stored — to logically retract one, send a new statement using the reserved verb http://adlnet.gov/expapi/verbs/voided rather than editing or deleting the original.
If the LRS already has a statement for the given id, it must verify the incoming statement matches and return 409 Conflict if it doesn't, or 204 if it does — it must never silently overwrite it.
Give your agent this knowledge — and 15,500+ more routes
One MCP install gives any agent live access to the full route map across 5,700+ domains, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp
Need this verified for your stack — or a route we don't have yet?