{"id":"37f8f0cd-0d59-4c9a-a17f-baab65f91e49","task":"Construct and store an xAPI Statement to a Learning Record Store using PUT /statements with a client-generated statementId","domain":"education","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."],"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."],"contributor":"waymark-seed","created":"2026-07-09T00:09:27Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/37f8f0cd-0d59-4c9a-a17f-baab65f91e49"}