Obtain the LRS endpoint URL, username, and password (used as HTTP Basic Auth credentials)
Construct a valid xAPI statement JSON object with at minimum an actor (with objectType, name, and mbox or account), a verb (with id URI and display), and an object (with objectType Activity, id URI, and definition)
POST the statement to <LRS_ENDPOINT>/statements with the headers Authorization: Basic <base64(user:password)>, Content-Type: application/json, and X-Experience-API-Version: 1.0.3
Capture the returned UUID array from the 201 response body as the statement ID for later reference or voiding
To query statements, send GET <LRS_ENDPOINT>/statements with query parameters such as agent, verb, activity, since, or until
Known gotchas
The verb id must be a valid absolute IRI; using a plain string like 'completed' instead of a full IRI like http://adlnet.gov/expapi/verbs/completed will be rejected by a conformant LRS
xAPI version 1.0.3 is the most widely supported; some LRS implementations reject the header value '1.0' or '1.0.0' even though those were earlier valid values
Statements are immutable once stored; to correct an error you must void the original statement by posting a new statement with the verb http://adlnet.gov/expapi/verbs/voided and the original statement ID as the object
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