Loyalty, codes, and broadcasts

Actor-owned points plus organiser promotion, giveaway, and broadcast operations.

Point spending uses locked balances and cannot make an account negative. Giveaway drawing is a one-time state transition.

OperationAccessPurpose
GET /api/loyalty/rewardsSessionBalances, point history, and eligible giveaways by organisation.
POST /api/loyalty/giveaways/enterSessionSpend points for one entry within current limits.
GET /api/loyalty/settingsOrganiserCurrent point rates and edit authority.
PATCH /api/loyalty/settingsOrganiserSave nonnegative point rates.
GET /api/loyalty/codesOrganiserPromotion codes, usage, and eligible events.
POST /api/loyalty/codesOrganiserCreate a bounded fixed or percentage code.
DELETE /api/loyalty/codesOrganiserRetire a code.
GET /api/loyalty/giveawaysOrganiserEvent giveaway state and winners.
POST /api/loyalty/giveawaysOrganiserCreate a giveaway.
DELETE /api/loyalty/giveawaysOrganiserDelete an undrawn giveaway.
POST /api/loyalty/giveaways/drawOrganiserDraw winners once and report notification outcome separately.
GET /api/loyalty/broadcastsOrganiserAudience count and send history.
POST /api/loyalty/broadcastsOrganiserSend a bounded event broadcast through the configured provider.

An unknown actor-visible event returns 404; missing session and membership return 401 and 403. Mutations require an exact configured Origin.