Construct an xAPI statement object with required fields: id (UUID v4), actor (Agent with mbox or account IFI), verb (id IRI and display map), and object (Activity with id IRI and definition)
Add a result object if reporting outcomes: score (scaled 0.0 to 1.0), success boolean, completion boolean, and duration in ISO 8601 duration format
Add a context object if linking to a parent activity, grouping activity, or registration UUID for session correlation
Set the timestamp field to the ISO 8601 UTC time the experience occurred, not the time of submission
POST the statement (or array of statements) to the LRS /statements endpoint with Content-Type application/json and X-Experience-API-Version header set to 1.0.3
Authenticate using HTTP Basic auth (username/password from LRS credentials) or OAuth 1.0 depending on the LRS's supported auth methods
Known gotchas
The X-Experience-API-Version header is mandatory; LRS implementations may reject requests that omit it even if the JSON body is valid
Actor IFIs (mbox, mbox_sha1sum, openid, account) must be consistent across statements for the same learner; mixing IFI types for the same person fragments the activity stream
The LRS may return a 204 No Content for single statement POSTs or a 200 with a UUID array for batch POSTs; do not rely on a body being present for success detection
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp