# Event App Integration

Use `at://{organizerDid}/community.lexicon.calendar.event/{rkey}` as the
public event anchor. Social RSVP/Going is not ticket ownership or admission.

The implementation recipe is maintained in [APP_INTEGRATION.md](APP_INTEGRATION.md)
and [AUTH_MODEL.md](AUTH_MODEL.md); exact schemas and HTTP verbs are in
[LEXICONS.md](LEXICONS.md) and the generated reference.

1. Configure the app and organizer's selling approval in the chosen environment.
2. Create the event shell and ticket types with current organizer authority.
3. Read `getTicketAvailability` from the trusted backend and render `ticketTypes`.
4. Reserve paid capacity with `createTicketHold`; persist `holdId`/`statusToken`
   and redirect to the returned top-level `url`.
5. For free types, use `claimFreeTicket` with verified buyer assertion, private
   delivery email and `items: [{ ticketTypeId, quantity }]`.
6. Show tickets after verified issuance or an authorized private ticket read.
7. Verify opaque tokens and perform idempotent check-in through ATM Tickets.
8. Reconcile refunds, voids, cancellation and free releases through ATM lifecycle
   state, never through app-local seat counters.

Apps own event editing, discovery, SEO, widgets, selection and presentation.
ATM Tickets owns canonical capacity, holds, issued tickets, forms, waitlists,
grants, delivery and audit. Public catalog discovery does not automatically
authorize another app to sell or inspect another channel's private rows.

`atmosphere.tickets` is this static docs site. Optional hosted event selection
lives at `events.atmosphere.tickets`, buyer passes at
`tickets.atmosphere.tickets`, and staff scanning at `scan.atmosphere.tickets`.
All three runtime hosts are served by ATM. Event apps can retain their own
buyer/scanner UX and use ATM-returned organizer/scanner locators.
