Marketing Consent¶
Learners taking FSA content through your LMS are asked once whether UL Research Institutes (ULRI) may send them news and updates. You own the prompt UI; the API owns the wording and the record.
The flow¶
-
Read the consent state before launching content.
GET /users/{uuid}returns two fields:Field Type Meaning marketingConsentstring unset(never asked),granted, ordeclinedmarketingConsentAtISO 8601 timestamp, or nullWhen the decision was recorded; nullwhileunsetShow your prompt only when
marketingConsentisunset: ask once, never again after any answer. -
Fetch the prompt wording and version:
{ "consentType": "ulri-marketing", "version": "2026-08-07.v2", "text": "…the sentence to display, verbatim…", "presentation": "Render as a checkbox that is unchecked by default, so the learner makes an explicit choice. Submit the learner's answer either way: leaving it unticked records a decline, which is a different fact from never having been asked." }Render
textverbatim — do not paraphrase, translate or reformat it. Fetching it rather than hardcoding the sentence is what allows ULRI legal to change the wording without every partner shipping a release. Keepversion: you echo it back on submit, and it records exactly which wording each learner saw. -
Render the prompt — a modal, an inline panel, whatever fits your product — with a checkbox that is unchecked by default, per the
presentationvalue. The learner must make an explicit choice: an unticked box is recorded as a decline, which is a different fact from never having been asked. A single Submit button records whichever state they chose. Consent requirements vary by jurisdiction, and compliance for your own learners remains your responsibility. -
Submit the answer:
Both fields are required.
promptVersionmust be a version this API has issued: send back the one you rendered. An older version is still accepted, so a learner who answered just before the wording changed is recorded against the wording they actually saw. A version the API never issued returns400, with a message pointing you toGET /consents/ulri-marketing.Call this whichever way they answered — omitting the call for a decline leaves the learner as "never asked", and every partner will keep prompting them. Requires the
partner-api/writescope. The partner identity and timestamp are stamped server side and cannot be supplied.The response tells you the decision that now governs:
{ "consentType": "ulri-marketing", "state": "declined", "recordedAt": "2026-09-17T14:02:11+00:00", "promptVersion": "2026-08-07.v2" }statemay not match what you just submittedThe learner may have a more recent decision recorded on the Fire Safety Academy itself. The latest decision wins, whichever side it was made on. Treat the returned
stateas authoritative rather than assuming your submission won.Status Cause 400Missing or invalid granted, or a missing or unissuedpromptVersion401Missing or invalid JWT 403Your client lacks the partner-api/writescope404No such learner, or the learner belongs to another partner
Rules that matter¶
- Ask at first content launch, not at registration — registration is often a bulk or SSO operation with no learner present. The canonical moment is the first time the learner opens a lesson.
-
The value can change without you. Consent is collected in two places, and the most recent decision wins:
- Through you: the unchecked checkbox above. The learner may change their answer through you later; re-submission is allowed, and earlier answers are kept as the record of what they said before.
- On the Fire Safety Academy itself: agreeing to ULRI communications is part of creating an FSA account, or linking one to the learner's record from your LMS. There is no checkbox there; submitting the form records a grant. Learners can change their preference afterwards in their FSA profile.
So a learner you recorded as
declinedcan later readgranted, for example after they create or link an FSA account, and agrantedcan later readdeclined. Read the current state withGET /users/{uuid}rather than caching it. -
Erasure includes consent.
DELETE /users/{uuid}erases the consent record along with the learner.
Reference implementation¶
The reference partner LMS demonstrates the canonical flow: a modal at first lesson open, unchecked checkbox, single Submit, recorded with the prompt version.