Reference

Tickets reference.

Generated XRPC reference, field-level schemas, payload schemas, lexicons, errors, security, public review, and glossary.

Developer beta SDK beta 0.0.0-beta.2 29 ticket lexicons Multi-app shared config roadmap

Lexicons

Atmosphere Tickets publishes under the reverse-DNS namespace tickets.atmosphere.*. Public lexicons describe portable catalog semantics and safe service contracts, not buyer PII or checkout secrets.

Record

tickets.atmosphere.ticketTier

Public ticket tier metadata linked to a community event and optional ATM product or price refs.

Record

tickets.atmosphere.capacityGroup

Public label and visibility metadata for tiers that share capacity. Exact counters stay private.

Record

tickets.atmosphere.checkInList

Public scanner-list metadata. Staff permissions and scan history stay private.

Record

tickets.atmosphere.publicOffer

Intentional public offer metadata for discounts, presales, affiliates, or access windows.

Config

createTicketEvent / updateTicketEvent

App-scoped ticketed-event config shell used by the ATM Tickets runtime.

Operations

Forms, waitlists, collaborations

Service methods cover attendee questions, waitlist entries/offers, and co-organizer collaboration records.

Generated XRPC reference

This table is generated from lexicons/tickets/atmosphere so it stays aligned with the contract set used by the ATM runtime. The JSON lexicons remain the source of truth; this reference is the human-readable index.

Method or recordKindAuthPurposeLinks
tickets.atmosphere.acceptCollaborationprocedureapp service-authAccept a pending co-organizer invitation (dual-consent: app service-auth plus the co-organizer's own assertion).
tickets.atmosphere.archiveTicketTierprocedureapp service-auth + organizer assertionArchive an organizer-owned ATM Tickets tier.
tickets.atmosphere.capacityGrouprecordorganizer/app write pathOrganizer-owned portable capacity group for a ticketed event.
tickets.atmosphere.checkInListrecordorganizer/app write pathPublic check-in list label for an event.
tickets.atmosphere.checkInTicketprocedurescanner/app authorityVerify and check in a private ATM Tickets scan token.
tickets.atmosphere.claimFreeTicketprocedureapp service-auth + buyer assertionAtomically claim zero-price scarce tickets for a verified buyer without checkout redirect.
tickets.atmosphere.claimWaitlistOfferprocedureapp service-authClaim a ticket waitlist OFFER by starting checkout against its already-reserved offer hold.
tickets.atmosphere.createCapacityGroupprocedureapp service-auth + organizer assertionCreate an organizer-owned capacity group for a ticketed event.
tickets.atmosphere.createTicketEventprocedureapp service-authCreate or upsert an organizer-owned ATM ticketed-event config shell.
tickets.atmosphere.createTicketHoldprocedureapp service-auth + buyer assertionAtomically reserve ticket capacity and return an ATM checkout URL.
tickets.atmosphere.createTicketTierprocedureapp service-auth + organizer assertionCreate an organizer-owned ATM Tickets tier and optional public ticket-tier refs for an event.
tickets.atmosphere.defsdefsapp service-authNo description in lexicon yet.
tickets.atmosphere.getTicketAvailabilityqueryapp service-authRead app-scoped ticket availability derived from private ATM holds and issued tickets.
tickets.atmosphere.inviteOrganizerCollaborationprocedureapp service-authInvite a co-organizer to operationally co-run a ticketed event (Part A: operational delegation only).
tickets.atmosphere.joinWaitlistprocedureapp service-authJoin the FIFO waitlist for a sold-out ticket tier/capacity group.
tickets.atmosphere.listBuyerTicketsqueryapp service-authList app-scoped issued tickets for a buyer or payment.
tickets.atmosphere.listCollaborationsqueryapp service-authList organizer collaborations for an event (authorized via event control) or the calling co-organizer's own collaboration rows.
tickets.atmosphere.listEventWaitlistqueryapp service-authList an organizer's event waitlist: a per-capacity-group rollup plus the paginated FIFO queue, each entry with its position and current offer status.
tickets.atmosphere.listOrganizerTicketsqueryapp service-authList app-scoped issued tickets for an organizer or event.
tickets.atmosphere.listTicketFormResponsesqueryapp service-authList the full private attendee form responses for an organizer's own event.
tickets.atmosphere.publicOfferrecordorganizer/app write pathPublic offer grouping for event tickets.
tickets.atmosphere.releaseTicketHoldprocedureapp service-authRelease an active ticket hold before checkout completes.
tickets.atmosphere.revokeCollaborationprocedureapp service-authRevoke a co-organizer collaboration.
tickets.atmosphere.setTierFormprocedureapp service-authSet (or clear) the private per-tier attendee form for a ticketed event.
tickets.atmosphere.ticketTierrecordorganizer/app write pathOrganizer-owned portable ticket tier metadata for an AT Protocol event.
tickets.atmosphere.updateCapacityGroupprocedureapp service-auth + organizer assertionUpdate an organizer-owned capacity group for a ticketed event.
tickets.atmosphere.updateTicketEventprocedureapp service-authUpdate an app-scoped ATM ticketed-event config shell.
tickets.atmosphere.updateTicketTierprocedureapp service-auth + organizer assertionUpdate organizer-owned ATM Tickets tier metadata.
tickets.atmosphere.verifyTicketprocedurescanner/app authorityVerify a private ATM Tickets scan token without mutating check-in state.

Generated field reference

This section is regenerated from lexicons/tickets/atmosphere. It expands the contract index into field-level schema tables with location, type, required/nullable status, limits, and descriptions.

tickets.atmosphere.acceptCollaboration5 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputcollaborationIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputcoOrganizerDidstringyesnoformat:didThe accepting co-organizer.
inputcoOrganizerAssertionJwtstringyesnomaxLength:8192REQUIRED short-lived user service-auth JWT issued BY coOrganizerDid to ATM, scoped to tickets.atmosphere.acceptCollaboration.
outputcollaborationref:tickets.atmosphere.defs#organizerCollaborationyesnononeNo description in lexicon yet.
tickets.atmosphere.archiveTicketTier5 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputtierIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
outputtierref:#tieryesnononeNo description in lexicon yet.
def:tieridstringyesnomaxLength:300No description in lexicon yet.
def:tierstatusstringyesnomaxLength:32No description in lexicon yet.
tickets.atmosphere.capacityGroup6 fields
LocationFieldTypeRequiredNullableLimitsDescription
recordeventref:com.atproto.repo.strongRefyesnononeNo description in lexicon yet.
recordnamestringyesnominLength:1, maxLength:1000, maxGraphemes:100No description in lexicon yet.
recordtotalCapacityintegernonominimum:1, maximum:250000Organizer-configured capacity ceiling for this shared inventory pool.
recordarchivedbooleannonononeNo description in lexicon yet.
recordcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
recordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.checkInList5 fields
LocationFieldTypeRequiredNullableLimitsDescription
recordeventref:com.atproto.repo.strongRefyesnononeNo description in lexicon yet.
recordnamestringyesnominLength:1, maxLength:1000, maxGraphemes:100No description in lexicon yet.
recordarchivedbooleannonononeNo description in lexicon yet.
recordcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
recordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.checkInTicket8 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputticketTokenstringyesnominLength:1, maxLength:4000No description in lexicon yet.
inputcheckInListIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputscannerDidstringnonoformat:didNo description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputstatusstringyesnomaxLength:32No description in lexicon yet.
outputcheckedInAtstringnonoformat:datetimeNo description in lexicon yet.
outputticketref:tickets.atmosphere.defs#issuedTicketnonononeNo description in lexicon yet.
tickets.atmosphere.claimFreeTicket15 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputeventUristringnonoformat:at-uriNo description in lexicon yet.
inputbuyerDidstringyesnoformat:didNo description in lexicon yet.
inputbuyerAssertionJwtstringyesnomaxLength:8192Required short-lived user service-auth JWT from buyerDid to ATM, scoped to tickets.atmosphere.claimFreeTicket.
inputcustomerEmailstringnonomaxLength:320Private delivery/receipt hint for ticket emails.
inputitemsarrayyesnominLength:1, maxLength:20No description in lexicon yet.
inputidempotencyKeystringnonominLength:1, maxLength:200No description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputclaimIdstringyesnomaxLength:300No description in lexicon yet.
outputholdIdstringyesnomaxLength:300No description in lexicon yet.
outputenvironmentstringyesnomaxLength:16No description in lexicon yet.
outputitemsarrayyesnominLength:1, maxLength:20No description in lexicon yet.
outputticketsarrayyesnominLength:1, maxLength:50No description in lexicon yet.
outputreusedbooleannonononeNo description in lexicon yet.
tickets.atmosphere.claimWaitlistOffer15 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputwaitlistIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputbuyerDidstringnonoformat:didNo description in lexicon yet.
inputbuyerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from buyerDid to ATM, scoped to tickets.atmosphere.claimWaitlistOffer.
inputcustomerEmailstringnonomaxLength:320Private delivery/receipt hint.
inputreturnUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
inputcancelUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
outputwaitlistIdstringyesnomaxLength:300No description in lexicon yet.
outputholdIdstringyesnomaxLength:300No description in lexicon yet.
outputtokenstringyesnomaxLength:500No description in lexicon yet.
outputurlstringyesnomaxLength:2000, format:uriNo description in lexicon yet.
outputenvironmentstringnonomaxLength:16No description in lexicon yet.
outputexpiresAtstringyesnoformat:datetimeNo description in lexicon yet.
outputamountCentsintegeryesnominimum:0No description in lexicon yet.
outputcurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
tickets.atmosphere.createCapacityGroup9 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputorganizerDidstringyesnoformat:didNo description in lexicon yet.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from organizerDid to ATM, scoped to tickets.atmosphere.createCapacityGroup.
inputeventref:tickets.atmosphere.defs#eventInputyesnononeNo description in lexicon yet.
inputnamestringyesnominLength:1, maxLength:200No description in lexicon yet.
inputtotalCapacityintegeryesnominimum:1, maximum:250000No description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputeventref:tickets.atmosphere.defs#eventSummaryyesnononeNo description in lexicon yet.
outputcapacityGroupref:tickets.atmosphere.defs#capacityGroupSummaryyesnononeNo description in lexicon yet.
tickets.atmosphere.createTicketEvent7 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputorganizerDidstringyesnoformat:didNo description in lexicon yet.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from organizerDid to ATM, scoped to tickets.atmosphere.createTicketEvent.
inputeventref:tickets.atmosphere.defs#eventInputyesnononeNo description in lexicon yet.
inputstatusstringnonomaxLength:32No description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputeventref:tickets.atmosphere.defs#eventSummaryyesnononeNo description in lexicon yet.
tickets.atmosphere.createTicketHold20 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputeventUristringnonoformat:at-uriNo description in lexicon yet.
inputbuyerDidstringnonoformat:didNo description in lexicon yet.
inputbuyerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from buyerDid to ATM.
inputcustomerEmailstringnonomaxLength:320Private delivery/receipt hint for ticket emails.
inputitemsarrayyesnominLength:1, maxLength:20No description in lexicon yet.
inputreturnUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
inputcancelUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
inputidempotencyKeystringnonominLength:1, maxLength:200No description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputholdIdstringyesnomaxLength:300No description in lexicon yet.
outputtokenstringyesnomaxLength:500No description in lexicon yet.
outputurlstringyesnomaxLength:2000, format:uriNo description in lexicon yet.
outputenvironmentstringnonomaxLength:16No description in lexicon yet.
outputexpiresAtstringyesnoformat:datetimeNo description in lexicon yet.
outputamountCentsintegeryesnominimum:0No description in lexicon yet.
outputcurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
outputitemsarrayyesnominLength:1, maxLength:20No description in lexicon yet.
outputreusedbooleannonononeNo description in lexicon yet.
tickets.atmosphere.createTicketTier19 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputorganizerDidstringyesnoformat:didNo description in lexicon yet.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from organizerDid to ATM, scoped to tickets.atmosphere.createTicketTier.
inputeventref:tickets.atmosphere.defs#eventInputyesnononeNo description in lexicon yet.
inputtitlestringyesnominLength:1, maxLength:200No description in lexicon yet.
inputdescriptionstringnonomaxLength:5000No description in lexicon yet.
inputcurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
inputunitAmountintegeryesnominimum:0, maximum:2000000No description in lexicon yet.
inputmaxPerOrderintegernonominimum:1, maximum:50No description in lexicon yet.
inputsaleStartsAtstringnonoformat:datetimeNo description in lexicon yet.
inputsaleEndsAtstringnonoformat:datetimeNo description in lexicon yet.
inputtierRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
inputproductRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
inputpriceRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
inputquantityTotalintegeryesnominimum:1, maximum:250000No description in lexicon yet.
outputeventref:tickets.atmosphere.defs#eventSummaryyesnononeNo description in lexicon yet.
outputcapacityGroupref:tickets.atmosphere.defs#capacityGroupSummaryyesnononeNo description in lexicon yet.
outputtierref:tickets.atmosphere.defs#ticketTierSummaryyesnononeNo description in lexicon yet.
tickets.atmosphere.defs114 fields
LocationFieldTypeRequiredNullableLimitsDescription
def:priceAmountcurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
def:priceAmountunitAmountintegeryesnominimum:0No description in lexicon yet.
def:eventInputuristringyesnoformat:at-uriNo description in lexicon yet.
def:eventInputcidstringnonoformat:cidNo description in lexicon yet.
def:eventInputtitlestringyesnominLength:1, maxLength:3000, maxGraphemes:300No description in lexicon yet.
def:eventInputstartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:eventInputimageUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
def:ticketHoldItemRequesttierIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
def:ticketHoldItemRequestquantityintegeryesnominimum:1, maximum:50No description in lexicon yet.
def:ticketHoldItemtierIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketHoldItemtitlestringyesnomaxLength:300No description in lexicon yet.
def:ticketHoldItemquantityintegeryesnominimum:1, maximum:50No description in lexicon yet.
def:ticketHoldItemunitAmountintegeryesnominimum:0No description in lexicon yet.
def:ticketHoldItemcurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
def:ticketTierSummaryidstringyesnomaxLength:300No description in lexicon yet.
def:ticketTierSummaryeventIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketTierSummarycapacityGroupIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketTierSummarytitlestringyesnomaxLength:300No description in lexicon yet.
def:ticketTierSummarycurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
def:ticketTierSummaryunitAmountintegeryesnominimum:0No description in lexicon yet.
def:ticketTierSummarystatusstringyesnomaxLength:32No description in lexicon yet.
def:capacityGroupSummaryidstringyesnomaxLength:300No description in lexicon yet.
def:capacityGroupSummaryeventIdstringnonomaxLength:300No description in lexicon yet.
def:capacityGroupSummarynamestringyesnomaxLength:300No description in lexicon yet.
def:capacityGroupSummarytotalCapacityintegeryesnominimum:1No description in lexicon yet.
def:capacityGroupSummarystatusstringyesnomaxLength:32No description in lexicon yet.
def:eventSummaryidstringyesnomaxLength:300No description in lexicon yet.
def:eventSummaryuristringyesnoformat:at-uriNo description in lexicon yet.
def:eventSummarytitlestringnonomaxLength:300No description in lexicon yet.
def:eventSummarystartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:organizerCollaborationidstringyesnomaxLength:300No description in lexicon yet.
def:organizerCollaborationeventIdstringyesnomaxLength:300No description in lexicon yet.
def:organizerCollaborationprimaryOrganizerDidstringyesnoformat:didNo description in lexicon yet.
def:organizerCollaborationcoOrganizerDidstringyesnoformat:didNo description in lexicon yet.
def:organizerCollaborationrolestringyesnomaxLength:32No description in lexicon yet.
def:organizerCollaborationstatusstringyesnomaxLength:16No description in lexicon yet.
def:organizerCollaborationrevenueShareBpsintegernonominimum:0, maximum:10000Recorded revenue-share INTENT in basis points, for MANUAL RECONCILIATION ONLY.
def:organizerCollaborationinvitedAtstringyesnoformat:datetimeNo description in lexicon yet.
def:organizerCollaborationacceptedAtstringnonoformat:datetimeNo description in lexicon yet.
def:organizerCollaborationrevokedAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketAvailabilitytierIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketAvailabilityeventIdstringnonomaxLength:300No description in lexicon yet.
def:ticketAvailabilitytitlestringyesnomaxLength:300No description in lexicon yet.
def:ticketAvailabilitydescriptionstringnonomaxLength:5000No description in lexicon yet.
def:ticketAvailabilitycurrencystringnonominLength:3, maxLength:3No description in lexicon yet.
def:ticketAvailabilityunitAmountintegernonominimum:0No description in lexicon yet.
def:ticketAvailabilitystatusstringyesnomaxLength:32No description in lexicon yet.
def:ticketAvailabilityavailableQuantityintegeryesnominimum:0No description in lexicon yet.
def:ticketAvailabilityheldQuantityintegernonominimum:0Quantity currently reserved by active holds.
def:ticketAvailabilitysoldQuantityintegernonominimum:0Quantity already issued/sold.
def:ticketAvailabilitymaxPerOrderintegeryesnominimum:1, maximum:50No description in lexicon yet.
def:ticketAvailabilitysaleStartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketAvailabilitysaleEndsAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketHoldCheckoutholdIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketHoldCheckouttokenstringyesnomaxLength:500No description in lexicon yet.
def:ticketHoldCheckouturlstringyesnomaxLength:2000, format:uriNo description in lexicon yet.
def:ticketHoldCheckoutenvironmentstringnonomaxLength:16No description in lexicon yet.
def:ticketHoldCheckoutexpiresAtstringyesnoformat:datetimeNo description in lexicon yet.
def:ticketHoldCheckoutamountCentsintegeryesnominimum:0No description in lexicon yet.
def:ticketHoldCheckoutcurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
def:ticketHoldCheckoutitemsarrayyesnominLength:1, maxLength:20No description in lexicon yet.
def:ticketHoldCheckoutreusedbooleannonononeNo description in lexicon yet.
def:ticketPresentationiconUrlstringyesnomaxLength:2000, format:uriNo description in lexicon yet.
def:ticketPresentationqrref:#ticketPresentationQryesnononeNo description in lexicon yet.
def:ticketPresentationappref:tickets.atmosphere.defs#brandyesnononeNo description in lexicon yet.
def:ticketPresentationorganizerref:tickets.atmosphere.defs#brandyesnononeNo description in lexicon yet.
def:ticketPresentationeventref:#ticketPresentationEventyesnononeNo description in lexicon yet.
def:ticketPresentationtierref:#ticketPresentationTieryesnononeNo description in lexicon yet.
def:branddidstringyesnoformat:didNo description in lexicon yet.
def:brandhandlestringnonomaxLength:300No description in lexicon yet.
def:brandnamestringyesnomaxLength:300No description in lexicon yet.
def:brandavatarUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
def:issuedTicketidstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketeventIdstringyesnomaxLength:300No description in lexicon yet.
def:issuedTickettierIdstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketpaymentIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketclaimIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketenvironmentstringyesnomaxLength:16No description in lexicon yet.
def:issuedTicketownerDidstringnonoformat:didNo description in lexicon yet.
def:issuedTicketstatusstringyesnomaxLength:32No description in lexicon yet.
def:issuedTicketticketNumberstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketscanTokenstringnonomaxLength:4000Private scan token returned only to authorized clients.
def:issuedTicketscanUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
def:issuedTicketcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
def:issuedTicketupdatedAtstringyesnoformat:datetimeNo description in lexicon yet.
def:issuedTicketWithContextidstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketWithContexteventIdstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketWithContexttierIdstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketWithContextpaymentIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketWithContextclaimIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketWithContextenvironmentstringyesnomaxLength:16No description in lexicon yet.
def:issuedTicketWithContextownerDidstringnonoformat:didNo description in lexicon yet.
def:issuedTicketWithContextstatusstringyesnomaxLength:32No description in lexicon yet.
def:issuedTicketWithContextticketNumberstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketWithContextscanTokenstringnonomaxLength:4000No description in lexicon yet.
def:issuedTicketWithContextscanUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
def:issuedTicketWithContextcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
def:issuedTicketWithContextupdatedAtstringyesnoformat:datetimeNo description in lexicon yet.
def:issuedTicketWithContextpresentationref:tickets.atmosphere.defs#ticketPresentationnonononeNo description in lexicon yet.
def:issuedTicketWithContexteventref:tickets.atmosphere.defs#eventSummarynonononeNo description in lexicon yet.
def:issuedTicketWithContexttierref:tickets.atmosphere.defs#ticketTierSummarynonononeNo description in lexicon yet.
def:verificationResultvalidbooleanyesnononeNo description in lexicon yet.
def:verificationResultreasonstringnonomaxLength:100No description in lexicon yet.
def:verificationResultticketref:tickets.atmosphere.defs#issuedTicketnonononeNo description in lexicon yet.
def:verificationResultpresentationref:tickets.atmosphere.defs#ticketPresentationnonononeNo description in lexicon yet.
def:verificationResulteventref:tickets.atmosphere.defs#eventSummarynonononeNo description in lexicon yet.
def:verificationResulttierref:tickets.atmosphere.defs#ticketTierSummarynonononeNo description in lexicon yet.
def:ticketPresentationQrenabledbooleanyesnononeNo description in lexicon yet.
def:ticketPresentationQrlabelstringyesnomaxLength:100No description in lexicon yet.
def:ticketPresentationEventuristringyesnoformat:at-uriNo description in lexicon yet.
def:ticketPresentationEventtitlestringyesnomaxLength:300No description in lexicon yet.
def:ticketPresentationEventstartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketPresentationEventimageUrlstringnonomaxLength:2000, format:uriNo description in lexicon yet.
def:ticketPresentationTiertitlestringyesnomaxLength:300No description in lexicon yet.
tickets.atmosphere.getTicketAvailability2 fields
LocationFieldTypeRequiredNullableLimitsDescription
outputeventref:tickets.atmosphere.defs#eventSummarynonononeNo description in lexicon yet.
outputtiersarrayyesnomaxLength:250No description in lexicon yet.
tickets.atmosphere.inviteOrganizerCollaboration8 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputeventUristringnonoformat:at-uriNo description in lexicon yet.
inputorganizerDidstringyesnoformat:didThe inviting PRIMARY organizer (or an already-accepted co-organizer) authorizing this invite.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from organizerDid to ATM, scoped to tickets.atmosphere.inviteOrganizerCollaboration.
inputcoOrganizerDidstringyesnoformat:didThe DID being invited to co-organize the event.
inputrevenueShareBpsintegernonominimum:0, maximum:10000OPTIONAL recorded revenue-share INTENT in basis points (0..10000), for MANUAL RECONCILIATION ONLY between the primary organizer and the co-organizer.
outputcollaborationref:tickets.atmosphere.defs#organizerCollaborationyesnononeNo description in lexicon yet.
tickets.atmosphere.joinWaitlist15 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputeventUristringnonoformat:at-uriNo description in lexicon yet.
inputtierIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputbuyerDidstringnonoformat:didNo description in lexicon yet.
inputbuyerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from buyerDid to ATM, scoped to tickets.atmosphere.joinWaitlist.
inputcustomerEmailstringnonomaxLength:320Private delivery hint for the offer email.
inputquantityintegernonominimum:1, maximum:50No description in lexicon yet.
outputwaitlistIdstringyesnomaxLength:300No description in lexicon yet.
outputstatusstringyesnomaxLength:16No description in lexicon yet.
outputpositionintegeryesnominimum:0No description in lexicon yet.
outputquantityintegeryesnominimum:1No description in lexicon yet.
outputeventIdstringyesnomaxLength:300No description in lexicon yet.
outputcapacityGroupIdstringyesnomaxLength:300No description in lexicon yet.
outputreusedbooleannonononeNo description in lexicon yet.
tickets.atmosphere.listBuyerTickets2 fields
LocationFieldTypeRequiredNullableLimitsDescription
outputticketsarrayyesnomaxLength:100No description in lexicon yet.
outputcursorstringnonomaxLength:512No description in lexicon yet.
tickets.atmosphere.listCollaborations2 fields
LocationFieldTypeRequiredNullableLimitsDescription
outputcollaborationsarrayyesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:512No description in lexicon yet.
tickets.atmosphere.listEventWaitlist22 fields
LocationFieldTypeRequiredNullableLimitsDescription
outputsummariesarrayyesnomaxLength:1000No description in lexicon yet.
outputentriesarrayyesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:512No description in lexicon yet.
def:summarieseventIdstringyesnomaxLength:300No description in lexicon yet.
def:summariescapacityGroupIdstringyesnomaxLength:300No description in lexicon yet.
def:summariescapacityGroupNamestringyesnomaxLength:200No description in lexicon yet.
def:summariesactiveCountintegeryesnominimum:0No description in lexicon yet.
def:summarieswaitingCountintegeryesnominimum:0No description in lexicon yet.
def:summariesofferedCountintegeryesnominimum:0No description in lexicon yet.
def:summariesactiveQuantityintegeryesnominimum:0No description in lexicon yet.
def:entrieswaitlistIdstringyesnomaxLength:300No description in lexicon yet.
def:entrieseventIdstringyesnomaxLength:300No description in lexicon yet.
def:entriescapacityGroupIdstringyesnomaxLength:300No description in lexicon yet.
def:entriespositionintegeryesnominimum:0No description in lexicon yet.
def:entriesquantityintegeryesnominimum:0No description in lexicon yet.
def:entriesstatusstringyesnomaxLength:16No description in lexicon yet.
def:entriesbuyerDidstringnonoformat:didNo description in lexicon yet.
def:entriescustomerEmailHintstringnonomaxLength:200No description in lexicon yet.
def:entriesofferHoldIdstringnonomaxLength:300No description in lexicon yet.
def:entriesofferedAtstringnonoformat:datetimeNo description in lexicon yet.
def:entriesofferExpiresAtstringnonoformat:datetimeNo description in lexicon yet.
def:entriescreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.listOrganizerTickets2 fields
LocationFieldTypeRequiredNullableLimitsDescription
outputticketsarrayyesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:512No description in lexicon yet.
tickets.atmosphere.listTicketFormResponses8 fields
LocationFieldTypeRequiredNullableLimitsDescription
outputresponsesarrayyesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:512No description in lexicon yet.
def:responsesticketIdstringyesnomaxLength:300No description in lexicon yet.
def:responsestierIdstringyesnomaxLength:300No description in lexicon yet.
def:responsesfieldKeystringyesnomaxLength:64No description in lexicon yet.
def:responsesvaluestringyesnomaxLength:2000No description in lexicon yet.
def:responsesshowAtCheckInbooleanyesnononeNo description in lexicon yet.
def:responsescreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.publicOffer9 fields
LocationFieldTypeRequiredNullableLimitsDescription
recordeventref:com.atproto.repo.strongRefyesnononeNo description in lexicon yet.
recordtiersarrayyesnononeNo description in lexicon yet.
recordtitlestringnonomaxLength:1000, maxGraphemes:100No description in lexicon yet.
recorddescriptionstringnonomaxLength:10000, maxGraphemes:1000No description in lexicon yet.
recordstartsAtstringnonoformat:datetimeNo description in lexicon yet.
recordendsAtstringnonoformat:datetimeNo description in lexicon yet.
recordarchivedbooleannonononeNo description in lexicon yet.
recordcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
recordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.releaseTicketHold6 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputholdIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputreasonstringnonomaxLength:200No description in lexicon yet.
outputholdref:#holdyesnononeNo description in lexicon yet.
def:holdidstringyesnomaxLength:300No description in lexicon yet.
def:holdstatusstringyesnomaxLength:32No description in lexicon yet.
tickets.atmosphere.revokeCollaboration5 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputcollaborationIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringyesnoformat:didThe revoking PRIMARY organizer (or accepted co-organizer) authorizing this revocation via event control.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from organizerDid to ATM, scoped to tickets.atmosphere.revokeCollaboration.
outputcollaborationref:tickets.atmosphere.defs#organizerCollaborationyesnononeNo description in lexicon yet.
tickets.atmosphere.setTierForm15 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputtierIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringyesnoformat:didNo description in lexicon yet.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional short-lived user service-auth JWT from organizerDid to ATM, scoped to tickets.atmosphere.setTierForm.
inputformref:#formnoyesnoneThe attendee form schema.
outputtierIdstringyesnomaxLength:300No description in lexicon yet.
outputfieldCountintegeryesnominimum:0No description in lexicon yet.
def:formversioninteger<1>yesnononeNo description in lexicon yet.
def:formfieldsarrayyesnomaxLength:30No description in lexicon yet.
def:formFieldskeystringyesnominLength:1, maxLength:64No description in lexicon yet.
def:formFieldslabelstringyesnominLength:1, maxLength:200No description in lexicon yet.
def:formFieldstypestringyesnomaxLength:16No description in lexicon yet.
def:formFieldsrequiredbooleannonononeNo description in lexicon yet.
def:formFieldsshowAtCheckInbooleannonononeShow this answer at check-in.
def:formFieldsoptionsarraynonomaxLength:50No description in lexicon yet.
tickets.atmosphere.ticketTier14 fields
LocationFieldTypeRequiredNullableLimitsDescription
recordeventref:com.atproto.repo.strongRefyesnononeNo description in lexicon yet.
recordtitlestringyesnominLength:1, maxLength:1000, maxGraphemes:100No description in lexicon yet.
recorddescriptionstringnonomaxLength:10000, maxGraphemes:1000No description in lexicon yet.
recordcurrencystringyesnominLength:3, maxLength:3No description in lexicon yet.
recordunitAmountintegeryesnominimum:0No description in lexicon yet.
recordcapacityGroupref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
recordmaxPerOrderintegernonominimum:1, maximum:50Organizer-configured per-order limit for this tier.
recordproductref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
recordpriceref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
recordsaleStartsAtstringnonoformat:datetimeNo description in lexicon yet.
recordsaleEndsAtstringnonoformat:datetimeNo description in lexicon yet.
recordarchivedbooleannonononeNo description in lexicon yet.
recordcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
recordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.updateCapacityGroup7 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputcapacityGroupIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputnamestringnonominLength:1, maxLength:200No description in lexicon yet.
inputtotalCapacityintegernonominimum:1, maximum:250000No description in lexicon yet.
inputstatusstringnonomaxLength:32No description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputcapacityGroupref:tickets.atmosphere.defs#capacityGroupSummaryyesnononeNo description in lexicon yet.
tickets.atmosphere.updateTicketEvent9 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputeventIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputtitlestringnonominLength:1, maxLength:300No description in lexicon yet.
inputstartsAtstringnoyesformat:datetimeNo description in lexicon yet.
inputeventCidstringnoyesformat:cidNo description in lexicon yet.
inputimageUrlstringnoyesmaxLength:2000, format:uriNo description in lexicon yet.
inputstatusstringnonomaxLength:32No description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputeventref:tickets.atmosphere.defs#eventSummaryyesnononeNo description in lexicon yet.
tickets.atmosphere.updateTicketTier15 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputtierIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputtitlestringnonominLength:1, maxLength:200No description in lexicon yet.
inputdescriptionstringnoyesmaxLength:5000No description in lexicon yet.
inputcurrencystringnonominLength:3, maxLength:3No description in lexicon yet.
inputunitAmountintegernonominimum:0, maximum:2000000No description in lexicon yet.
inputmaxPerOrderintegernonominimum:1, maximum:50No description in lexicon yet.
inputsaleStartsAtstringnoyesformat:datetimeNo description in lexicon yet.
inputsaleEndsAtstringnoyesformat:datetimeNo description in lexicon yet.
inputtierRefref:com.atproto.repo.strongRefnoyesnoneNo description in lexicon yet.
inputproductRefref:com.atproto.repo.strongRefnoyesnoneNo description in lexicon yet.
inputpriceRefref:com.atproto.repo.strongRefnoyesnoneNo description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
inputstatusstringnonomaxLength:32No description in lexicon yet.
outputtierref:tickets.atmosphere.defs#ticketTierSummaryyesnononeNo description in lexicon yet.
tickets.atmosphere.verifyTicket8 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstringnonomaxLength:16No description in lexicon yet.
inputticketTokenstringyesnominLength:1, maxLength:4000No description in lexicon yet.
outputvalidbooleanyesnononeNo description in lexicon yet.
outputreasonstringnonomaxLength:100No description in lexicon yet.
outputticketref:tickets.atmosphere.defs#issuedTicketnonononeNo description in lexicon yet.
outputpresentationref:tickets.atmosphere.defs#ticketPresentationnonononeNo description in lexicon yet.
outputeventref:tickets.atmosphere.defs#eventSummarynonononeNo description in lexicon yet.
outputtierref:tickets.atmosphere.defs#ticketTierSummarynonononeNo description in lexicon yet.

Contract tests

Tickets docs are checked against lexicons/tickets/atmosphere. Regenerate the reference after lexicon edits and run the contract check before sharing docs with app developers.

node scripts/generate-docs-reference.mjs
node scripts/check-docs-contracts.mjs
node scripts/check-examples.mjs
  • Every tickets.atmosphere NSID appears in docs.html and docs/generated-reference.json.
  • Real docs pages are generated for overview, build, callbacks, reference, and operations.
  • API examples document auth mode, request shape, and common failure behavior.
  • Example server files include typecheck and smoke scripts for copied starter-kit code.

API reference

GET

tickets.atmosphere.getTicketAvailability

Read app-scoped availability derived from private holds, issued tickets, sale windows, and capacity groups.

GET /xrpc/tickets.atmosphere.getTicketAvailability?eventUri=at://...&environment=test
POST

tickets.atmosphere.createTicketHold

Atomically reserve ticket capacity and return an ATM checkout URL for paid tickets.

{
  "eventUri": "at://...",
  "buyerDid": "did:plc:buyer",
  "buyerAssertionJwt": "...",
  "items": [{ "ticketTierId": "tier_...", "quantity": 2 }]
}
POST

tickets.atmosphere.claimFreeTicket

Claim a limited free ticket in-place using app service-auth plus a buyer assertion.

{
  "eventUri": "at://...",
  "buyerDid": "did:plc:buyer",
  "buyerAssertionJwt": "...",
  "ticketTierId": "tier_..."
}
POST

tickets.atmosphere.checkInTicket

Verify and check in a private scan token. Repeat scans should return the existing check-in state.

{
  "ticketToken": "opaque_scan_token",
  "checkInListId": "list_..."
}

XRPC methods

Use service calls for private inventory and ticket operations. ATM remains responsible for checkout initiation, settlement, receipts, app fees, and payment proofs.

POST tickets.atmosphere.createTicketEvent
POST tickets.atmosphere.updateTicketEvent
POST tickets.atmosphere.createTicketTier
POST tickets.atmosphere.updateTicketTier
POST tickets.atmosphere.archiveTicketTier
POST tickets.atmosphere.createCapacityGroup
POST tickets.atmosphere.updateCapacityGroup
POST tickets.atmosphere.setTierForm
GET  tickets.atmosphere.getTicketAvailability
POST tickets.atmosphere.createTicketHold
POST tickets.atmosphere.releaseTicketHold
POST tickets.atmosphere.claimFreeTicket
POST tickets.atmosphere.joinWaitlist
POST tickets.atmosphere.claimWaitlistOffer
GET  tickets.atmosphere.listEventWaitlist
GET  tickets.atmosphere.listTicketFormResponses
POST tickets.atmosphere.inviteOrganizerCollaboration
POST tickets.atmosphere.acceptCollaboration
GET  tickets.atmosphere.listCollaborations
POST tickets.atmosphere.revokeCollaboration
GET  tickets.atmosphere.listBuyerTickets
GET  tickets.atmosphere.listOrganizerTickets
POST tickets.atmosphere.verifyTicket
POST tickets.atmosphere.checkInTicket

Error codes

Ticketing errors should be stable enough for app developers to branch on, while still giving humans calm recovery copy.

CodeHTTPRetryDeveloper action
TicketHoldUnavailable409noRefresh availability and ask the buyer to choose a valid quantity.
TicketHoldExpired410noCreate a fresh hold before sending the buyer to checkout.
TicketAlreadyCheckedIn200noReturn the existing check-in state; do not record a second entry.
TicketTokenInvalid404noDo not admit entry. Ask the organizer to inspect the ticket.
TicketVoided409noDo not admit entry. The ticket was refunded, voided, or revoked.
OrganizerAssertionInvalid401noMint a fresh organizer assertion for tier or capacity setup.
BuyerAssertionInvalid401noMint a fresh buyer assertion for the claim or hold action.
ReceiverUnavailable502yesFix the app endpoint and redrive stored delivery attempts.

Error decision trees

01

Sold out or hold unavailable

Refresh authoritative availability, ask the buyer to choose a lower quantity, and never proceed to checkout without a successful hold.

02

Buyer assertion invalid

Ask the app to mint a fresh assertion; fall back to guest-like checkout only if the app can safely fulfill without buyer DID binding.

03

Hold expired

Create a new hold and checkout. Do not reuse expired URLs or tokens.

04

Webhook failed

Fix receiver signature/raw-body handling, then redrive the stored delivery from ATM.

05

Duplicate check-in

Return the previous check-in state and show the scanner that the ticket was already used.

Security model

Tickets centralizes scarce private state while event apps keep the public event UX. Public records can describe safe catalog facts; private service state enforces capacity, issuance, verification, refunds, and check-in.

PublicEvent refs, public ticket tier metadata, safe capacity-group labels, public offers, and check-in list metadata.
PrivateExact inventory counters, holds, issued ticket ids, buyer emails, attendee answers, QR secrets, scan tokens, check-in logs, refunds, and fraud/risk state.
App authApp service-auth controls module access, app fees, webhook routing, environment, and app-scoped visibility.
User assertionsBuyer and organizer assertions prove user intent without forcing another ATM sign-in or granting ATM an OAuth write session.
  • Never use public repo records or relay ordering to enforce scarce inventory.
  • Never put raw scan tokens, buyer PII, attendee answers, or processor ids on protocol.
  • Deduplicate webhooks and XRPC receiver events by delivery id.
  • Use opaque QR/pass tokens and verify them through Tickets.

Threat model

ThreatRiskPrimary control
OversellConcurrent buyers exceed capacity.Private transactional holds and issued-ticket rows.
Buyer spoofingApp lies about buyer DID.Short-lived buyer assertion with aud/lxm/jti checks.
ReplayDuplicate webhook or claim mutates twice.Delivery ids and idempotency keys before side effects.
QR leakageTicket or buyer data leaks from passes.Opaque scan tokens only; hash secrets privately.
Visibility creepApps see unrelated payment or attendee data.App-scoped events, dashboards, and module permissions.

Security diagrams

01

App service-auth

App DID mints a short-lived token for an exact Tickets method; ATM verifies issuer, audience, lxm, expiry, signature, and jti.

02

Organizer assertion

Organizer authorizes the event app to configure ticket tiers and capacity for a specific event context.

03

Buyer assertion

Buyer DID assertion binds a signed-in event-app buyer to a hold or free claim without forcing checkout re-auth.

04

QR verification

Opaque token is checked against private issued-ticket state; check-in mutates once and repeat scans return existing state.

05

Private/public boundary

Public event and tier refs are display/catalog only; holds, issued tickets, scan tokens, attendee answers, and check-ins stay private.

Compliance boundaries

ATM owns payment processing and processor coordination. Event apps own event UX and app-specific fulfillment. Tickets owns scarce ticket truth. Keep those boundaries visible in support, dashboards, and app developer docs.

ActorCan seeMust not see
Event appPayments it originated, app fee data, ticket/order status needed for fulfillment.Organizer KYC, bank details, connected-account ids, or other-app payments.
OrganizerTicket sales, payouts, disputes, taxes, attendee data needed for the event.App secrets, app webhook signatures, unrelated app fee routing.
ScannerOpaque token status, event/tier display, check-in result.Buyer email, payment id, processor id, raw QR secrets.
Public protocolSafe event, tier, offer, and payment proof refs.Attendee answers, exact counters, check-in logs, customer PII, fraud/risk state.

Data ownership

The safest model is public where portability helps, private where scarcity or personal data matters. Apps can build rich event UX on public records while relying on Tickets for transactional truth.

DataWhere it livesWhy
Event pageCommunity event lexicons and app-local display statePortable event discovery and app-specific UX.
Ticket tier metadataPublic tickets.atmosphere.ticketTier plus private mirrorsSafe catalog facts can be public protocol state.
Inventory countersPrivate Tickets tablesNeeds transactions, locks, idempotency, and audit trails.
Buyer contact and attendee answersPrivate app/Tickets statePersonal or fulfillment data should not be public protocol state.
Payment truthATM payment ledger and public proof stateUnified checkout, refunds, receipts, app fees, and policy-driven public payment proof state.
QR/wallet tokenPrivate hashed token rowsOpaque, revocable scan authority.

Feature map

Atmosphere Tickets can support Hi.Events-style capabilities, but the ownership split should stay sharp: centralized only where ticketing correctness requires it, public/on-protocol where portability helps, and app-owned where UX differs.

CapabilityOwnerNotes
Ticket tiers and capacityTicketsScarce inventory must be transactional and shared across apps.
Promo codes and public offersTickets + ATMPublic offer metadata can be portable; redemption counters stay private.
Event SEO and discoveryEvent appsApps own social discovery, event pages, and product-specific presentation.
Organizer dashboardEvent apps + ATMEvent-specific tools in apps, money/payment controls in ATM.
Order managementTickets + appsTicket status in Tickets; attendee messaging and presentation in apps.
AnalyticsATM + appsMoney ledger in ATM, traffic/social/product analytics in the app.
Affiliate/campaign UXAppsPublic offer refs can connect back to Tickets/ATM for redemption truth.

Lexicon review

The ticket lexicons are designed for public catalog and service contracts, not ticket secrets. Community feedback should focus on whether records are portable, minimal, and safe to publish.

QuestionWhy it matters
Are tier/capacity records generic enough?Multiple event apps should be able to display and sell against the same event.
Should public offers stay in tickets.atmosphere?Ticket offers may differ from generic product discounts.
Do assertion fields belong in service methods only?Assertions are private action proofs and should not leak into public records.
Are check-in list records safe?Scanner permissions and logs must remain private even if list metadata is public.
Is the namespace shape correct?tickets.atmosphere.* should stay distinct from money.atmosphere.* payment contracts.

Public review bundle

Share the raw lexicons, generated reference, threat model, integration flow, and open questions when asking the AT Protocol community to review Tickets contracts.

Raw contracts

lexicons/tickets/atmosphere

Record and XRPC schemas for tier, capacity, offer, hold, availability, issuance, verification, and check-in.

Generated reference

docs/generated-reference.json

Machine-readable index for docs and review tools.

Review questions

Privacy and interoperability

Check public/private boundaries, app/user auth, and whether another event app can integrate without private assumptions.

After review

Regenerate docs

Update raw schemas, regenerate reference, run checks, and record feedback-driven changes.

Glossary

Event appThe app that owns public event pages, discovery, organizer UX, buyer UX, and scanner screens.
OrganizerThe user or project receiving ticket revenue and configuring ticketing for an event.
RepoA user's public AT Protocol repository of signed records, such as event or ticket metadata records.
PDSPersonal Data Server: the service that hosts a user's account and repo.
Service-authAT Protocol Inter-Service Authentication: a short-lived JWT scoped to one XRPC method.
Ticket tierA sellable or claimable ticket type for an event.
Capacity groupA private inventory bucket that one or more ticket tiers can share.
HoldA short-lived transactional reservation before checkout or free claim completion.
Issued ticketThe private ticket truth created after payment confirmation or free claim success.
Buyer assertionA short-lived user service-auth JWT proving the app saw this buyer for this action.
Organizer assertionA short-lived user service-auth JWT proving the organizer authorized ticket configuration.
Scan tokenAn opaque private token embedded in a QR code, wallet pass, or scan URL.
Check-in listThe scanner context for verifying and recording entry.