Reference

Tickets reference.

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

Read as Markdown · Agent build guide

Developer beta SDK beta 0.0.0-beta.5 30 ticket lexicons Multi-app shared config roadmap

Lexicons

The 30 copied schemas come from ATM's canonical generated output. Public records describe safe catalog metadata; private service contracts describe authorized operations. This is separate from authoritative namespace publication and deployed release readiness.

ticketTypePublic event/type metadata and optional Product/default Price refs. Paid service configuration requires a matching active organizer-owned ticket Product; free/RSVP types may omit it.
ticketedEventPublic event anchor and optional display-ordered ticketTypes refs. Live availability, codes and eligibility stay private.
checkInListPublic label only; scanner permissions, logs and pass secrets stay private.
CapacityPrivate type pools plus optional shared event cap through setEventCapacity; no public capacity-pool record.
Public discoveryUnauthenticated listPublicConfig on ATM AppView requires organizer and optional same-organizer eventUri. It is not live inventory.

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-auth + required co-organizer assertionAccept a pending co-organizer invitation (dual-consent: app service-auth plus the co-organizer's own assertion).
tickets.atmosphere.archiveTicketTypeprocedureapp service-auth + primary-organizer authorityArchive an organizer-owned ATM ticket type.
tickets.atmosphere.cancelTicketEventprocedureapp service-auth + primary-organizer authorityIrreversibly cancel an ATM ticketed event.
tickets.atmosphere.checkInListrecordorganizer repo writePublic check-in list label for an event.
tickets.atmosphere.checkInTicketprocedureapp service-authVerify and check in a private ATM Tickets scan token.
tickets.atmosphere.claimFreeTicketprocedureapp service-auth + required buyer assertionAtomically claim zero-price scarce tickets for a verified buyer without checkout redirect.
tickets.atmosphere.claimWaitlistOfferprocedureapp service-auth + buyer assertion when buyerDid is suppliedClaim a ticket waitlist OFFER by starting checkout against its already-reserved offer hold.
tickets.atmosphere.createTicketEventprocedureapp service-auth + organizer assertion unless app is organizerCreate or upsert an organizer-owned ATM ticketed-event config shell for a public event.
tickets.atmosphere.createTicketHoldprocedureapp service-auth + buyer assertion when buyerDid is suppliedAtomically reserve ticket capacity and return an ATM checkout URL.
tickets.atmosphere.createTicketTypeprocedureapp service-auth + organizer assertion unless app is organizerCreate an organizer-owned ATM ticket type and optional public ticket-type record refs for an event.
tickets.atmosphere.defsdefsshared definitionsNo 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-auth + primary-organizer authorityInvite a co-organizer to operationally co-run a ticketed event (Part A: operational delegation only).
tickets.atmosphere.joinWaitlistprocedureapp service-auth + buyer assertion when buyerDid is suppliedJoin the FIFO waitlist for a sold-out ticket type.
tickets.atmosphere.listBuyerTicketsqueryapp service-authList app-scoped issued tickets for a buyer or payment.
tickets.atmosphere.listCollaborationsprocedureapp service-auth + event control or co-organizer assertionList organizer collaborations for an event (authorized via event control) or the calling co-organizer's own collaboration rows.
tickets.atmosphere.listEventWaitlistprocedureapp service-auth + current event-control authorityList an organizer's event waitlist: a per-ticket-type 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.listPublicConfigquerypublic AppView readList indexed public tickets.atmosphere ticket config records.
tickets.atmosphere.listTicketFormResponsesprocedureapp service-auth + current event-control authorityList the full private attendee form responses for an organizer's own event.
tickets.atmosphere.releaseFreeTicketprocedureapp service-auth + required buyer assertionRelease a buyer's free-claim tickets back to capacity — the inverse of claimFreeTicket for un-RSVP flows.
tickets.atmosphere.releaseTicketHoldprocedureapp service-authRelease an active ticket hold before checkout completes.
tickets.atmosphere.revokeCollaborationprocedureapp service-auth + primary-organizer authority (co-organizer may self-revoke)Revoke a co-organizer collaboration.
tickets.atmosphere.setEventCapacityprocedureapp service-auth + primary-organizer authoritySet, change, or clear the shared EVENT capacity — one pool every ticket type of the event draws from, in addition to any per-type caps.
tickets.atmosphere.setTicketTypeFormprocedureapp service-auth + current event-control authoritySet (or clear) the private per-ticket-type attendee form for a ticketed event.
tickets.atmosphere.ticketedEventrecordorganizer repo writeOrganizer-published ticketing anchor for an event: marks the event as ticketed and optionally discloses its ticket types in display order.
tickets.atmosphere.ticketTyperecordorganizer repo writeOrganizer-owned portable ticket type metadata for an AT Protocol event.
tickets.atmosphere.updateTicketEventprocedureapp service-auth + current event-control authorityUpdate an app-scoped ATM ticketed-event config shell for a public event.
tickets.atmosphere.updateTicketTypeprocedureapp service-auth + current event-control authorityUpdate organizer-owned ATM ticket type metadata.
tickets.atmosphere.verifyTicketprocedureapp service-authVerify 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
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputcollaborationIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputcoOrganizerDidstringyesnoformat:didThe accepting co-organizer. Must match the invitation's named coOrganizerDid.
inputcoOrganizerAssertionJwtstringyesnomaxLength:8192REQUIRED short-lived user service-auth JWT issued BY coOrganizerDid to ATM, scoped to tickets.atmosphere.acceptCollaboration. This is the co-organizer's consent: ATM verifies iss === coOrganizerDid and the route-scoped lxm before flipping the row to accepted.
outputcollaborationref:tickets.atmosphere.defs#organizerCollaborationyesnononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; CollaborationNotFound — Collaboration invitation not found.; CollaborationConsentRequired — A valid co-organizer assertion (coOrganizerAssertionJwt) issued by coOrganizerDid is required to accept this invitation.; CollaborationNotAcceptable — This collaboration is not in a pending state, or coOrganizerDid does not match the named invitee.; UserDidMismatch — coOrganizerAssertionJwt issuer does not match coOrganizerDid.

tickets.atmosphere.archiveTicketType7 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputticketTypeIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringnonoformat:didThe current primary organizer authorizing this mutation. Omit only when the calling app is itself the event's primary organizer.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional only for an app archiving its own event's ticket type. Otherwise, a short-lived user service-auth JWT from organizerDid to ATM scoped to tickets.atmosphere.archiveTicketType.
outputticketTyperef:#ticketTypeyesnononeNo description in lexicon yet.
def:ticketTypeidstringyesnomaxLength:300No description in lexicon yet.
def:ticketTypestatusstring<archived>yesnomaxLength:32No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; TicketTypeNotFound — Ticket type not found.; EventControlRequired — A verified current event-controller authorization is required for this event.; PrimaryOrganizerRequired — Only the current primary organizer can archive a ticket type.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.cancelTicketEvent13 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringnonoformat:didThe current primary organizer authorizing cancellation. Omit only when the calling app is itself the event's primary organizer.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional only for an app canceling its own event. Otherwise, a short-lived user service-auth JWT from organizerDid to ATM scoped to tickets.atmosphere.cancelTicketEvent.
inputreasonstringyesnominLength:3, maxLength:10000, maxGraphemes:1000No description in lexicon yet.
outputcancellationref:#cancellationyesnononeNo description in lexicon yet.
def:cancellationidstringyesnomaxLength:300No description in lexicon yet.
def:cancellationeventIdstringyesnomaxLength:300No description in lexicon yet.
def:cancellationstatusstring<requested | already-canceled>yesnomaxLength:32No description in lexicon yet.
def:cancellationticketCountintegeryesnominimum:0No description in lexicon yet.
def:cancellationpaidTicketCountintegeryesnominimum:0No description in lexicon yet.
def:cancellationfreeTicketCountintegeryesnominimum:0No description in lexicon yet.
def:cancellationreleasedHoldCountintegeryesnominimum:0No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; TicketEventNotFound — Ticketed event config not found.; EventControlRequired — A verified current primary-organizer authorization is required for this event.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.; InvalidCancellationReason — Cancellation reason must be between 3 and 1000 characters.

tickets.atmosphere.checkInList5 fields
LocationFieldTypeRequiredNullableLimitsDescription
recordeventref:com.atproto.repo.strongRefyesnononeCID-pinned strongRef to the canonical public community.lexicon.calendar.event record.
recordnamestringyesnominLength:1, maxLength:1000, maxGraphemes:100No description in lexicon yet.
recordarchivedbooleannonononeTrue when this check-in list is archived. Omitted or false means it is not archived.
recordcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
recordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.checkInTicket8 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputticketTokenstringyesnominLength:1, maxLength:4000No description in lexicon yet.
inputcheckInListIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputscannerDidstringnonoformat:didApp-asserted staff DID recorded in the private check-in audit log. ATM does not independently verify this DID; the calling app is responsible for its scanner authentication.
inputmetadataunknownnonononeNo description in lexicon yet.
outputstatusstring<checked-in | already-checked-in | not-valid>yesnomaxLength:32No description in lexicon yet.
outputcheckedInAtstringnonoformat:datetimeNo description in lexicon yet.
outputticketref:tickets.atmosphere.defs#issuedTicketnonononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; TicketNotFound — Ticket not found or verification failed.; CheckInListNotFound — checkInListId does not exist for this event.; CheckInListMismatch — The ticket belongs to a different check-in list.; InvalidCheckInList — checkInListId is not usable for this ticket's event.

tickets.atmosphere.claimFreeTicket18 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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:320Required delivery address for every new free-ticket claim. It remains wire-optional only so an exact idempotent replay of a legacy completed claim that had no email can still return that immutable result; omitting it for any fresh claim fails with CustomerEmailRequired. ATM normalizes and stores it privately and never writes it to protocol records.
inputcustomerNamestringnonominLength:1, maxLength:300Private attendee display name supplied by the buyer/app. Stored on the claim and issued tickets; never written to protocol records.
inputeventCodestringnonominLength:3, maxLength:64Preferred buyer-entered event code. ATM applies its hidden-ticket unlock effect when required by the claim.
inputitemsarray<ref:tickets.atmosphere.defs#ticketHoldItemRequest>yesnominLength:1, maxLength:20No description in lexicon yet.
inputaccessCodestringnonominLength:3, maxLength:64Legacy visibility-only input. New storefronts should use eventCode. Required when a requested hidden type is not unlocked by eventCode.
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.
outputenvironmentstring<test | live>yesnomaxLength:16No description in lexicon yet.
outputitemsarray<ref:tickets.atmosphere.defs#ticketHoldItem>yesnominLength:1, maxLength:20No description in lexicon yet.
outputticketsarray<ref:tickets.atmosphere.defs#issuedTicketWithContext>yesnominLength:1, maxLength:1000No description in lexicon yet.
outputreusedbooleannonononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.; UserAssertionRequired — A verified buyer assertion (buyerAssertionJwt) is required to claim free tickets.; AuthVerificationFailed — The service-auth token could not be verified.; UserDidMismatch — buyerAssertionJwt issuer does not match buyerDid.; InvalidItems — At least one ticket type is required.; InvalidQuantity — Ticket quantity must be at least 1.; InvalidCustomerEmail — customerEmail is present but is not a valid delivery address.; CustomerEmailRequired — Every fresh free-ticket claim requires a delivery email; omission is accepted only for an exact replay of a legacy completed no-email claim.; IdempotencyConflict — This idempotency key was already used for a different buyer.; FreeClaimBindingMismatch — This idempotency key is already bound to a claim with different ticket types, quantities, attendee name, or delivery email.; IdempotencyKeyInFlight — A claim for this idempotency key is already being processed; retry to resume it.; TicketTypeNotFound — One or more ticket types were not found.; MixedEvents — A ticket claim can only contain ticket types from one event.; MixedCurrency — A ticket claim can only use one currency.; TicketsUnavailable — The ticket type is not currently available.; PaidTicketRequiresCheckout — Paid ticket types must use tickets.atmosphere.createTicketHold.; QuantityTooHigh — Requested quantity exceeds the per-claim maximum.; InsufficientTicketCapacity — Not enough capacity remains for the claim.; TicketClaimMissing — Claimed tickets could not be loaded after issuance.; ClaimLimitReached — This buyer already claimed the per-buyer maximum for a ticket type.; InvalidEventCode — The event code is invalid, unavailable, expired, or exhausted.; EventCodeConflict — eventCode was combined with a different legacy accessCode.; AccessCodeRequired — One or more requested ticket types are hidden and require an access code.; InvalidAccessCode — The access code is invalid, paused, expired, exhausted, or does not unlock every hidden ticket type in the request.; TicketsBusy — The inventory row is contended; retry shortly.

tickets.atmosphere.claimWaitlistOffer17 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputwaitlistIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputbuyerDidstringnonoformat:didNo description in lexicon yet.
inputbuyerAssertionJwtstringnonomaxLength:8192Required whenever buyerDid is supplied: a short-lived user service-auth JWT from buyerDid to ATM, scoped to tickets.atmosphere.claimWaitlistOffer. Omit both buyer fields for a guest email claim.
inputcustomerEmailstringnonomaxLength:320Private delivery/receipt hint. Stored privately by ATM; never written to protocol records.
inputcustomerNamestringnonominLength:1, maxLength:300Private attendee name for the issued ticket. Stored privately by ATM; never written to protocol records.
inputreturnUrlstringnonoformat:uriNo description in lexicon yet.
inputcancelUrlstringnonoformat:uriNo description in lexicon yet.
outputwaitlistIdstringyesnomaxLength:300No description in lexicon yet.
outputholdIdstringyesnomaxLength:300No description in lexicon yet.
outputstatusTokenstringyesnomaxLength:500Stable app-only capability for polling payment status. Persist it before redirecting; never place it in a browser URL.
outputtokenstringyesnomaxLength:500Rotatable browser checkout bearer. Prefer url for navigation; never persist this as the payment-status capability.
outputurlstringyesnoformat:uriATM browser checkout URL. Its embedded bearer may be retired when the payer changes accounts.
outputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
outputexpiresAtstringyesnoformat:datetimeNo description in lexicon yet.
outputamountintegeryesnominimum:0No description in lexicon yet.
outputcurrencystringyesnominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; UserAssertionRequired — A verified buyer assertion is required whenever buyerDid is supplied.; AuthVerificationFailed — The buyer assertion could not be verified.; InvalidRequest — buyerDid and buyerAssertionJwt must be supplied together, or both omitted for a guest.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.; WaitlistEntryNotFound — Waitlist entry not found.; WaitlistOfferNotClaimable — This waitlist entry has no active offer to claim.; WaitlistOfferExpired — This waitlist offer has expired.; WaitlistOfferAlreadyClaimed — This waitlist offer was already claimed.; WaitlistClaimIdentityMismatch — The claiming identity does not match the waitlist entry's buyer.; LiveModeNotEnabled — This app may not start live-environment checkouts yet.; TicketCurrencyUnsupportedForFee — This paid ticket currency is incompatible with the app's fixed ticket-fee denomination.; UserDidMismatch — buyerAssertionJwt issuer does not match buyerDid.

tickets.atmosphere.createTicketEvent8 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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. Proves the app is configuring ticketing with organizer consent.
inputeventref:tickets.atmosphere.defs#eventInputyesnononeNo description in lexicon yet.
inputstatusstring<active | paused | archived>nonomaxLength:32ATM ticket-sales lifecycle state. It does not control visibility of the public event record.
inputeventCapacityintegernonominimum:1, maximum:250000Optional creation-time convenience for tickets.atmosphere.setEventCapacity: the shared capacity every ticket type of this event draws from. Omit for unlimited (the default).
inputmetadataunknownnonononeNo description in lexicon yet.
outputeventref:tickets.atmosphere.defs#eventSummaryyesnononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; OrganizerNotRegistered — Organizer has not signed in to ATM yet.; PaymentSetupIncomplete — Organizer has not finished ATM payment setup.; OrganizerConsentRequired — A verified organizer authorization (organizerAssertionJwt) is required to configure ticketing for this organizer.; OrganizerReassignmentNotAllowed — This event already belongs to a different organizer; a fresh organizer authorization is required to reassign it.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.createTicketHold26 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputeventUristringnonoformat:at-uriNo description in lexicon yet.
inputbuyerDidstringnonoformat:didSigned-in buyer DID. Must be accompanied by buyerAssertionJwt; omit both fields for guest checkout. ATM-hosted Tickets OAuth identity is resolved only from ATM's private server session and is never accepted through this field.
inputbuyerAssertionJwtstringnonomaxLength:8192Short-lived user service-auth JWT from buyerDid to ATM, scoped to lxm money.atmosphere.payment.assertPayer. Must be accompanied by buyerDid; omit both fields for guest checkout. ATM verifies it inside the private checkout envelope.
inputpayerBindingstring<switchable | fixed>nonomaxLength:32Defaults to fixed when buyerDid and a matching verified buyerAssertionJwt are supplied; otherwise defaults to switchable. Explicit switchable permits changing accounts inside checkout and requires the app to reconcile CheckoutPayerChanged. Frozen with the hold; reusing an idempotency key cannot change it.
inputcustomerEmailstringnonomaxLength:320Private delivery/receipt hint for ticket emails. Stored privately by ATM; never written to protocol records.
inputcustomerNamestringnonominLength:1, maxLength:300Private attendee display name supplied by the buyer/app. Stored on the hold and issued tickets; never written to protocol records.
inputeventCodestringnonominLength:3, maxLength:64Preferred buyer-entered event code. ATM resolves and enforces any discount, hidden-ticket unlock, or combined effects while creating the hold.
inputofferCodestringnonominLength:3, maxLength:64Legacy discount-only input. New storefronts should use eventCode. ATM enforces eligibility, schedule, and usage limits while reserving the hold.
inputaccessCodestringnonominLength:3, maxLength:64Legacy visibility-only input. New storefronts should use eventCode. Required when a requested hidden type is not unlocked by eventCode.
inputitemsarray<ref:tickets.atmosphere.defs#ticketHoldItemRequest>yesnominLength:1, maxLength:20No description in lexicon yet.
inputreturnUrlstringnonoformat:uriNo description in lexicon yet.
inputcancelUrlstringnonoformat:uriNo description in lexicon yet.
inputidempotencyKeystringnonominLength:1, maxLength:200No description in lexicon yet.
inputmetadataunknownnonononeNo description in lexicon yet.
outputholdIdstringyesnomaxLength:300No description in lexicon yet.
outputstatusTokenstringyesnomaxLength:500Stable app-only capability for polling payment status. Persist it before redirecting; never place it in a browser URL.
outputtokenstringyesnomaxLength:500Rotatable browser checkout bearer. Prefer url for navigation; never persist this as the payment-status capability.
outputurlstringyesnoformat:uriATM browser checkout URL. Its embedded bearer may be retired when the payer changes accounts.
outputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
outputexpiresAtstringyesnoformat:datetimeNo description in lexicon yet.
outputamountintegeryesnominimum:0Final buyer checkout amount in minor units after any order-level offer and passed-through ATM ticket fee. This may differ from the sum of item price snapshots.
outputcurrencystringyesnominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.
outputitemsarray<ref:tickets.atmosphere.defs#ticketHoldItem>yesnominLength:1, maxLength:20No description in lexicon yet.
outputreusedbooleannonononeNo description in lexicon yet.

Declared errors: UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.; InvalidBuyerIdentity — buyerDid and buyerAssertionJwt were not supplied together, fixed binding lacked authenticated buyer identity, or trusted and app-supplied buyer identity were combined.; InvalidPayerBinding — The reservation's frozen payer-binding policy is missing or inconsistent.; InvalidCustomerEmail — customerEmail is not a valid delivery email address.; AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; OrganizerNotRegistered — Organizer has not signed in to ATM yet.; PaymentSetupIncomplete — Organizer has not finished ATM payment setup.; OrganizerConsentRequired — A verified organizer authorization (organizerAssertionJwt) is required to configure ticketing for this organizer.; OrganizerReassignmentNotAllowed — This event already belongs to a different organizer; a fresh organizer authorization is required to reassign it.; RecipientAppApprovalRequired — The organizer has not approved this app to originate ticket payments.; RecipientAppReapprovalRequired — The app's ticket checkout terms changed and require renewed organizer approval.; RecipientAppApprovalBlocked — The organizer has blocked or revoked this app's ticket-payment approval.; TicketProtocolRefsRequired — Every paid ticket type requires a portable ticket or catalog reference.; InvalidItems — At least one ticket type is required.; InvalidQuantity — Ticket quantity must be at least 1.; TicketTypeNotFound — One or more ticket types were not found.; MixedEvents — A ticket hold can only contain ticket types from one event.; MixedCurrency — A ticket hold can only use one currency.; TicketCurrencyUnsupportedForFee — This paid ticket currency is incompatible with the app's fixed ticket-fee denomination.; TicketsUnavailable — The ticket type is not currently on sale.; FreeTicketRequiresClaim — Free ticket types must use tickets.atmosphere.claimFreeTicket.; QuantityTooHigh — Requested quantity exceeds the per-order maximum.; InsufficientTicketCapacity — Not enough capacity remains for the request.; InvalidEventCode — The event code is invalid, unavailable, expired, or exhausted.; EventCodeConflict — eventCode was combined with a different legacy offerCode or accessCode.; OfferCodeInvalid — The offer code is invalid, unavailable, expired, or does not apply to the requested ticket type.; OfferRequiresSingleTicketType — An offer code may currently be applied to only one ticket type per checkout.; OfferNotAvailableForPayWhatYouWant — Offer codes cannot be combined with pay-what-you-want ticket pricing.; OfferCodeBusy — The offer reservation is contended; retry shortly.; AccessCodeRequired — One or more requested ticket types are hidden and require an access code.; InvalidAccessCode — The access code is invalid, paused, expired, exhausted, or does not unlock every hidden ticket type in the request.; IdempotencyKeyConflict — The idempotency key was already used for a different ticket purchase.; IdempotencyKeyInFlight — A hold for this idempotency key is already being created; retry to resume it.; CheckoutPayerChanged — The payer changed accounts in ATM checkout; the initiating app must keep polling with the statusToken from the original result and cannot recover the rotated buyer bearer.; LiveModeNotEnabled — This app may not create live-environment holds yet.; TicketsBusy — The inventory row is contended; retry shortly.

tickets.atmosphere.createTicketType19 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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.createTicketType. Proves the app is configuring ticketing with organizer consent.
inputeventref:tickets.atmosphere.defs#eventInputyesnononeNo description in lexicon yet.
inputtitlestringyesnominLength:1, maxLength:1000, maxGraphemes:100No description in lexicon yet.
inputdescriptionstringnonomaxLength:10000, maxGraphemes:1000No description in lexicon yet.
inputcurrencystringyesnominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.
inputunitAmountintegeryesnominimum:0, maximum:2000000Amount in the smallest unit of currency. 0 creates a free ticket type (claimed via tickets.atmosphere.claimFreeTicket). A resulting paid ticket type must have an exact organizer-owned kind=ticket Product; paid amounts must also meet the processor minimum charge.
inputmaxPerOrderintegernonominimum:1, maximum:50No description in lexicon yet.
inputsaleStartsAtstringnonoformat:datetimeNo description in lexicon yet.
inputsaleEndsAtstringnonoformat:datetimeNo description in lexicon yet.
inputticketTypeRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
inputproductref:com.atproto.repo.strongRefnonononeExact current organizer-owned money.atmosphere.product with kind=ticket. createTicketType requires it whenever unitAmount is greater than 0; a free type may omit it. updateTicketType requires the resulting paid type to retain or receive one, may attach or repoint it, and cannot clear it. The Product must be active and its exact default Price must be one-time, per-unit, and match the ticket amount and currency.
inputdefaultPriceref:com.atproto.repo.strongRefnonononeLegacy direct-Price compatibility only. New callers using product MUST omit defaultPrice; ATM derives and verifies Product.defaultPrice and rejects both fields together. Readers still accept this field on Product-less historical ticket types.
inputmetadataunknownnonononeNo description in lexicon yet.
inputvisibilitystring<public | hidden>nonomaxLength:16Private buyer-facing visibility (default public). Hidden types are excluded from availability and buyer surfaces until unlocked by a ticket access code; organizer surfaces always see them.
inputquantityTotalintegernonominimum:1, maximum:250000Optional per-type cap. Omit for an unlimited type (the default). An event capacity set via tickets.atmosphere.setEventCapacity additionally bounds every type.
outputeventref:tickets.atmosphere.defs#eventSummaryyesnononeNo description in lexicon yet.
outputticketTyperef:tickets.atmosphere.defs#ticketTypeSummaryyesnononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; OrganizerNotRegistered — Organizer has not signed in to ATM yet.; PaymentSetupIncomplete — Organizer has not finished ATM payment setup.; OrganizerConsentRequired — A verified organizer authorization (organizerAssertionJwt) is required to configure ticketing for this organizer.; OrganizerReassignmentNotAllowed — This event already belongs to a different organizer; a fresh organizer authorization is required to reassign it.; RecipientNotPayable — The organizer has not completed payment setup for this environment.; RecipientCurrencyUnavailable — ATM could not verify the organizer's primary settlement currency.; RecipientCurrencyUnsupported — The organizer's primary settlement currency is not supported by ATM's current payment processor.; RecipientCurrencyNotEnabled — The organizer's primary settlement currency is not enabled in this ATM environment.; RecipientCurrencyMismatch — The paid ticket currency does not match the organizer's primary settlement currency.; InvalidAmount — Ticket price is invalid: negative, above the maximum, or a paid amount below the processor minimum charge (use 0 for free ticket types).; TicketCurrencyUnsupportedForFee — This paid ticket currency is incompatible with the app's fixed ticket-fee denomination.; InvalidCapacity — Ticket quantity must be at least 1.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.defs109 fields
LocationFieldTypeRequiredNullableLimitsDescription
def:eventInputuristringyesnoformat:at-uriAT URI of the canonical public community.lexicon.calendar.event record.
def:eventInputcidstringnonoformat:cidCID of the exact public event record revision represented by this snapshot.
def:eventInputtitlestringyesnominLength:1, maxLength:3000, maxGraphemes:300No description in lexicon yet.
def:eventInputstartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:eventInputimageUrlstringnonoformat:uriNo description in lexicon yet.
def:ticketHoldItemRequestticketTypeIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
def:ticketHoldItemRequestquantityintegeryesnominimum:1, maximum:50No description in lexicon yet.
def:ticketHoldItemticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketHoldItemtitlestringyesnomaxLength:1000, maxGraphemes:100No description in lexicon yet.
def:ticketHoldItemquantityintegeryesnominimum:1, maximum:50No description in lexicon yet.
def:ticketHoldItemunitAmountintegeryesnominimum:0No description in lexicon yet.
def:ticketHoldItemcurrencystringyesnominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.
def:ticketHoldItemticketTypeRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:ticketHoldItemdefaultPriceref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:ticketTypeSummaryidstringyesnomaxLength:300No description in lexicon yet.
def:ticketTypeSummaryeventIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketTypeSummarytitlestringyesnomaxLength:1000, maxGraphemes:100No description in lexicon yet.
def:ticketTypeSummaryquantityTotalintegernonominimum:1, maximum:250000The type's own configured cap. Omitted when the type is uncapped.
def:ticketTypeSummarycurrencystringyesnominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.
def:ticketTypeSummaryunitAmountintegeryesnominimum:0No description in lexicon yet.
def:ticketTypeSummarystatusstring<active | paused | archived>yesnomaxLength:32No description in lexicon yet.
def:ticketTypeSummaryticketTypeRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:ticketTypeSummaryproductref:com.atproto.repo.strongRefnonononeThe canonical kind=ticket money.atmosphere.product this ticket type points at, when one is attached. Echoed so a writer can confirm the exact Product/CID ATM recorded rather than having to re-read the ticketType record.
def:ticketTypeSummarydefaultPriceref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:eventSummaryidstringyesnomaxLength:300ATM's private identifier for this ticketed-event config.
def:eventSummaryuristringyesnoformat:at-uriAT URI of the canonical public event record.
def:eventSummarycidstringnonoformat:cidCID of the exact public event record revision, when known.
def:eventSummaryeventRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:eventSummarytitlestringnonomaxLength:3000, maxGraphemes:300No description in lexicon yet.
def:eventSummarystartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:eventSummarymanageUrlstringnonoformat:uriCurrent ATM organizer-console locator for this canonical event. Refresh this value from ATM rather than constructing or indefinitely caching the route. The signed-in organizer's authority is revalidated by ATM; possession of this URL grants no access.
def:eventSummaryscannerUrlstringnonoformat:uriStable first-party ATM scanner locator for this canonical event. The signed-in staff member still needs an active scanner grant; possession of this URL grants no access.
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:organizerCollaborationrolestring<co-organizer>yesnomaxLength:32No description in lexicon yet.
def:organizerCollaborationstatusstring<pending | accepted | revoked>yesnomaxLength:16No description in lexicon yet.
def:organizerCollaborationrevenueShareBpsintegernonominimum:0, maximum:10000Recorded revenue-share INTENT in basis points, for MANUAL RECONCILIATION ONLY. NOT an automatic split: ATM never transfers ticket revenue based on this value.
def:organizerCollaborationinvitedAtstringyesnoformat:datetimeNo description in lexicon yet.
def:organizerCollaborationacceptedAtstringnonoformat:datetimeNo description in lexicon yet.
def:organizerCollaborationrevokedAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketAvailabilityticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
def:ticketAvailabilityeventIdstringnonomaxLength:300No description in lexicon yet.
def:ticketAvailabilitytitlestringyesnomaxLength:1000, maxGraphemes:100No description in lexicon yet.
def:ticketAvailabilitydescriptionstringnonomaxLength:10000, maxGraphemes:1000No description in lexicon yet.
def:ticketAvailabilitycurrencystringnonominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.
def:ticketAvailabilityunitAmountintegernonominimum:0No description in lexicon yet.
def:ticketAvailabilitystatusstring<available | sold-out | not-on-sale | hidden | unavailable>yesnomaxLength:32No description in lexicon yet.
def:ticketAvailabilityvisibilitystring<hidden>nonomaxLength:16Present only for hidden ticket types revealed by the caller's access code, so an app can tell which entries the code unlocked. Public types omit the field.
def:ticketAvailabilityavailableQuantityintegernonominimum:0Effective availability (min across the type's capacity pools). Omitted when the type is unlimited.
def:ticketAvailabilityquantityTotalintegernonominimum:1, maximum:250000The type's OWN configured cap, for 'X of Y left' display. Omitted when the type itself is uncapped (an event capacity may still bound availableQuantity).
def:ticketAvailabilityheldQuantityintegernonominimum:0Quantity currently reserved by active holds. Returned only to authorized apps.
def:ticketAvailabilitysoldQuantityintegernonominimum:0Quantity already issued/sold. Returned only to authorized apps.
def:ticketAvailabilitymaxPerOrderintegeryesnominimum:1, maximum:50No description in lexicon yet.
def:ticketAvailabilitysaleStartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketAvailabilitysaleEndsAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketPresentationiconUrlstringnonoformat:uriPass icon URL. Currently always returned (ATM falls back to a default icon); optional so a future presentation without an icon stays valid.
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:ticketPresentationticketTyperef:#ticketPresentationTicketTypeyesnononeNo description in lexicon yet.
def:branddidstringyesnoformat:didNo description in lexicon yet.
def:brandhandlestringnonoformat:handleNo description in lexicon yet.
def:brandnamestringyesnomaxLength:300No description in lexicon yet.
def:brandavatarUrlstringnonoformat:uriNo description in lexicon yet.
def:issuedTicketidstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketeventIdstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketpaymentIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketclaimIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketenvironmentstring<test | live>yesnomaxLength:16No description in lexicon yet.
def:issuedTicketownerDidstringnonoformat:didNo description in lexicon yet.
def:issuedTicketstatusstring<active | voided | refunded>yesnomaxLength:32No description in lexicon yet.
def:issuedTicketticketNumberstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketeventRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:issuedTicketticketTypeRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:issuedTicketdefaultPriceref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:issuedTicketscanTokenstringnonomaxLength:4000Private scan token returned only to authorized clients.
def:issuedTicketscanUrlstringnonoformat: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:issuedTicketWithContextticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketWithContextpaymentIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketWithContextclaimIdstringnonomaxLength:300No description in lexicon yet.
def:issuedTicketWithContextenvironmentstring<test | live>yesnomaxLength:16No description in lexicon yet.
def:issuedTicketWithContextownerDidstringnonoformat:didNo description in lexicon yet.
def:issuedTicketWithContextstatusstring<active | voided | refunded>yesnomaxLength:32No description in lexicon yet.
def:issuedTicketWithContextticketNumberstringyesnomaxLength:300No description in lexicon yet.
def:issuedTicketWithContexteventRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:issuedTicketWithContextticketTypeRefref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:issuedTicketWithContextdefaultPriceref:com.atproto.repo.strongRefnonononeNo description in lexicon yet.
def:issuedTicketWithContextscanTokenstringnonomaxLength:4000No description in lexicon yet.
def:issuedTicketWithContextscanUrlstringnonoformat: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:issuedTicketWithContextticketTyperef:tickets.atmosphere.defs#ticketTypeSummarynonononeNo description in lexicon yet.
def:ticketPresentationQrenabledbooleanyesnononeNo description in lexicon yet.
def:ticketPresentationQrlabelstringyesnomaxLength:100No description in lexicon yet.
def:ticketPresentationEventuristringyesnoformat:at-uriAT URI of the canonical public event record.
def:ticketPresentationEventtitlestringyesnomaxLength:3000, maxGraphemes:300No description in lexicon yet.
def:ticketPresentationEventstartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:ticketPresentationEventimageUrlstringnonoformat:uriNo description in lexicon yet.
def:ticketPresentationTicketTypetitlestringyesnomaxLength:1000, maxGraphemes:100No description in lexicon yet.
tickets.atmosphere.getTicketAvailability7 fields
LocationFieldTypeRequiredNullableLimitsDescription
paramsenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
paramseventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
paramseventUristringnonoformat:at-uriNo description in lexicon yet.
paramseventCodestringnonominLength:3, maxLength:64Preferred buyer-entered event code. ATM resolves discount, hidden-ticket unlock, or combined effects in the exact event namespace; reading availability never consumes a code.
paramsaccessCodestringnonominLength:3, maxLength:64Legacy visibility-only input. New storefronts should use eventCode; hidden ticket types are omitted unless the supplied code unlocks them.
outputeventref:tickets.atmosphere.defs#eventSummarynonononeNo description in lexicon yet.
outputticketTypesarray<ref:tickets.atmosphere.defs#ticketAvailability>yesnomaxLength:250No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; EventNotFound — Ticketed event not found.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.; InvalidEventCode — The event code is invalid, unavailable, expired, or exhausted.; EventCodeConflict — The event code conflicts with a different legacy code field.

tickets.atmosphere.inviteOrganizerCollaboration8 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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. Proves the inviting organizer authorized the app to manage collaborations for this event.
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. This is NOT an automatic split: ATM never transfers or auto-pays any portion of ticket gross revenue based on this value. Ticket revenue settles entirely to the single primary organizer's connected account.
outputcollaborationref:tickets.atmosphere.defs#organizerCollaborationyesnononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; EventNotFound — Ticketed event not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; InvalidCollaboration — Invalid collaboration request (e.g. inviting the primary organizer as their own co-organizer, or an invalid revenueShareBps).; CollaborationAlreadyAccepted — An accepted collaboration already exists for this co-organizer.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.joinWaitlist15 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputeventUristringnonoformat:at-uriNo description in lexicon yet.
inputticketTypeIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputbuyerDidstringnonoformat:didNo description in lexicon yet.
inputbuyerAssertionJwtstringnonomaxLength:8192Required whenever buyerDid is supplied: a short-lived user service-auth JWT from buyerDid to ATM, scoped to tickets.atmosphere.joinWaitlist. Omit both buyer fields for a guest email waitlist entry.
inputcustomerEmailstringnonomaxLength:320Private delivery hint for the offer email. ATM stores only a MASKED hint; the raw email is never written to protocol records.
inputquantityintegernonominimum:1, maximum:50No description in lexicon yet.
outputwaitlistIdstringyesnomaxLength:300No description in lexicon yet.
outputstatusstring<waiting | offered | claimed | expired | released>yesnomaxLength:16No description in lexicon yet.
outputpositionintegeryesnominimum:0No description in lexicon yet.
outputquantityintegeryesnominimum:1No description in lexicon yet.
outputeventIdstringyesnomaxLength:300No description in lexicon yet.
outputticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
outputreusedbooleannonononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.; UserAssertionRequired — A verified buyer assertion is required whenever buyerDid is supplied.; AuthVerificationFailed — The buyer assertion could not be verified.; InvalidRequest — buyerDid and buyerAssertionJwt must be supplied together, or both omitted for a guest.; InvalidWaitlistIdentity — A buyerDid or customerEmail is required to join the waitlist.; TicketTypeNotFound — Ticket type not found.; QuantityTooHigh — Requested quantity exceeds the per-order maximum.; UserDidMismatch — buyerAssertionJwt issuer does not match buyerDid.

tickets.atmosphere.listBuyerTickets7 fields
LocationFieldTypeRequiredNullableLimitsDescription
paramsenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
paramsbuyerstringnonoformat:at-identifierDID or handle of the ticket owner.
paramspaymentIdstringnonominLength:1, maxLength:300No description in lexicon yet.
paramslimitintegernonominimum:1, maximum:100No description in lexicon yet.
paramscursorstringnonomaxLength:1024No description in lexicon yet.
outputticketsarray<ref:tickets.atmosphere.defs#issuedTicketWithContext>yesnomaxLength:100No description in lexicon yet.
outputcursorstringnonomaxLength:1024No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; InvalidCursor — Ticket cursor is invalid.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.

tickets.atmosphere.listCollaborations10 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringnonoformat:didWhen listing an event's collaborations, the requesting organizer (verified via event control).
inputorganizerAssertionJwtstringnonomaxLength:8192No description in lexicon yet.
inputcoOrganizerDidstringnonoformat:didWhen listing a co-organizer's OWN collaborations, their DID (verified via coOrganizerAssertionJwt).
inputcoOrganizerAssertionJwtstringnonomaxLength:8192No description in lexicon yet.
inputlimitintegernonominimum:1, maximum:250No description in lexicon yet.
inputcursorstringnonomaxLength:1024No description in lexicon yet.
outputcollaborationsarray<ref:tickets.atmosphere.defs#organizerCollaboration>yesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:1024No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; EventNotFound — Ticketed event not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; InvalidCollaborationQuery — Provide eventId + organizerDid (event listing) or coOrganizerDid (own-rows listing).; InvalidCursor — Collaboration cursor is invalid.; UserDidMismatch — An assertion issuer does not match the expected DID.

tickets.atmosphere.listEventWaitlist30 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringyesnoformat:didNo description in lexicon yet.
inputorganizerAssertionJwtstringnonomaxLength:8192No description in lexicon yet.
inputticketTypeIdstringnonominLength:1, maxLength:300Filter the queue to one ticket type.
inputincludeTerminalbooleannonononeInclude terminal (claimed/expired/released) rows in the queue page. Absent/false returns only active (waiting/offered) entries. The cursor paginates the entries queue only; summaries are always returned in full.
inputlimitintegernonominimum:1, maximum:250No description in lexicon yet.
inputcursorstringnonomaxLength:1024No description in lexicon yet.
outputsummariesarray<ref:#waitlistSummary>yesnomaxLength:1000No description in lexicon yet.
outputentriesarray<ref:#waitlistEntry>yesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:1024No description in lexicon yet.
def:waitlistSummaryeventIdstringyesnomaxLength:300No description in lexicon yet.
def:waitlistSummaryticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
def:waitlistSummaryticketTypeTitlestringyesnomaxLength:200No description in lexicon yet.
def:waitlistSummaryactiveCountintegeryesnominimum:0No description in lexicon yet.
def:waitlistSummarywaitingCountintegeryesnominimum:0No description in lexicon yet.
def:waitlistSummaryofferedCountintegeryesnominimum:0No description in lexicon yet.
def:waitlistSummaryactiveQuantityintegeryesnominimum:0No description in lexicon yet.
def:waitlistEntrywaitlistIdstringyesnomaxLength:300No description in lexicon yet.
def:waitlistEntryeventIdstringyesnomaxLength:300No description in lexicon yet.
def:waitlistEntryticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
def:waitlistEntrypositionintegeryesnominimum:0No description in lexicon yet.
def:waitlistEntryquantityintegeryesnominimum:1No description in lexicon yet.
def:waitlistEntrystatusstring<waiting | offered | claimed | expired | released>yesnomaxLength:16No description in lexicon yet.
def:waitlistEntrybuyerDidstringnonoformat:didNo description in lexicon yet.
def:waitlistEntrycustomerEmailHintstringnonomaxLength:200No description in lexicon yet.
def:waitlistEntryofferHoldIdstringnonomaxLength:300No description in lexicon yet.
def:waitlistEntryofferedAtstringnonoformat:datetimeNo description in lexicon yet.
def:waitlistEntryofferExpiresAtstringnonoformat:datetimeNo description in lexicon yet.
def:waitlistEntrycreatedAtstringyesnoformat:datetimeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; EventNotFound — Ticketed event not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; InvalidCursor — Waitlist cursor is invalid.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.listOrganizerTickets7 fields
LocationFieldTypeRequiredNullableLimitsDescription
paramsenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
paramsorganizerstringnonoformat:at-identifierDID or handle of the ticket organizer.
paramseventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
paramslimitintegernonominimum:1, maximum:250No description in lexicon yet.
paramscursorstringnonomaxLength:1024No description in lexicon yet.
outputticketsarray<ref:tickets.atmosphere.defs#issuedTicketWithContext>yesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:1024No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; InvalidCursor — Ticket cursor is invalid.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.

tickets.atmosphere.listPublicConfig30 fields
LocationFieldTypeRequiredNullableLimitsDescription
paramsorganizerstringyesnoformat:at-identifierDID or handle of the organizer. Handles are resolved to a DID before the indexed read.
paramseventUristringnonoformat:at-uriNo description in lexicon yet.
paramscollectionsarray<string<tickets.atmosphere.ticketType | tickets.atmosphere.ticketedEvent>>nonomaxLength:3No description in lexicon yet.
paramsincludeArchivedbooleannonononeNo description in lexicon yet.
paramslimitintegernonominimum:1, maximum:100No description in lexicon yet.
paramscursorstringnonomaxLength:1024No description in lexicon yet.
outputrecordsarray<ref:#publicConfigRecord>yesnononeNo description in lexicon yet.
outputcursorstringnonomaxLength:1024No description in lexicon yet.
def:publicConfigRecorduristringyesnoformat:at-uriAT URI of the indexed ticket config record.
def:publicConfigRecordcidstringyesnoformat:cidCID of the exact indexed ticket config record revision.
def:publicConfigRecordorganizerstringyesnoformat:didDID of the organizer repository containing the record.
def:publicConfigRecordcollectionstring<tickets.atmosphere.ticketType | tickets.atmosphere.ticketedEvent>yesnoformat:nsidNSID of the indexed ticket config record collection.
def:publicConfigRecordrkeystringyesnoformat:record-keyRepository record key of the indexed ticket config record.
def:publicConfigRecordeventref:com.atproto.repo.strongRefyesnononeCID-pinned strongRef to the public event this ticket config describes.
def:publicConfigRecordtitlestringnonomaxLength:1000, maxGraphemes:100No description in lexicon yet.
def:publicConfigRecorddescriptionstringnonomaxLength:10000, maxGraphemes:1000No description in lexicon yet.
def:publicConfigRecordcurrencystringnonominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.
def:publicConfigRecordunitAmountintegernonominimum:0No description in lexicon yet.
def:publicConfigRecordquantityTotalintegernonominimum:1, maximum:250000Display hint from the ticketType record. Omitted when uncapped or undisclosed.
def:publicConfigRecordmaxPerOrderintegernonominimum:1, maximum:50No description in lexicon yet.
def:publicConfigRecorddefaultPriceref:com.atproto.repo.strongRefnonononeCID-pinned strongRef to the ticket type's current money.atmosphere.price, when published.
def:publicConfigRecordsaleStartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:publicConfigRecordsaleEndsAtstringnonoformat:datetimeNo description in lexicon yet.
def:publicConfigRecordticketTypesarray<ref:com.atproto.repo.strongRef>nonomaxLength:250Display-ordered CID-pinned strongRefs advertised by a ticketed-event record.
def:publicConfigRecordstartsAtstringnonoformat:datetimeNo description in lexicon yet.
def:publicConfigRecordendsAtstringnonoformat:datetimeNo description in lexicon yet.
def:publicConfigRecordarchivedbooleanyesnononeNo description in lexicon yet.
def:publicConfigRecordcreatedAtstringnonoformat:datetimeNo description in lexicon yet.
def:publicConfigRecordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
def:publicConfigRecordindexedAtstringyesnoformat:datetimeWhen the AppView indexed this public ticket config record.

Declared errors: InvalidRequest — The query must include organizer, eventUri (if provided) must belong to that organizer, and only supported ticket config collections may be requested.

tickets.atmosphere.listTicketFormResponses16 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringyesnoformat:didNo description in lexicon yet.
inputorganizerAssertionJwtstringnonomaxLength:8192No description in lexicon yet.
inputticketTypeIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputticketIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputlimitintegernonominimum:1, maximum:250No description in lexicon yet.
inputcursorstringnonomaxLength:1024No description in lexicon yet.
outputresponsesarray<ref:#formResponse>yesnomaxLength:250No description in lexicon yet.
outputcursorstringnonomaxLength:1024No description in lexicon yet.
def:formResponseticketIdstringyesnomaxLength:300No description in lexicon yet.
def:formResponseticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
def:formResponsefieldKeystringyesnomaxLength:64No description in lexicon yet.
def:formResponsevaluestringyesnomaxLength:2000No description in lexicon yet.
def:formResponseshowAtCheckInbooleanyesnononeNo description in lexicon yet.
def:formResponsecreatedAtstringyesnoformat:datetimeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; EventNotFound — Ticketed event not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; InvalidCursor — Ticket form cursor is invalid.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.releaseFreeTicket10 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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.releaseFreeTicket.
inputidempotencyKeystringyesnominLength:1, maxLength:200Caller-stable identity for this release gesture. Reuse the same key after an ambiguous or lost response; ATM replays the original completed result and never releases tickets claimed later. A key cannot be reused for another buyer, event, or ticketIds selector in the same app environment.
inputticketIdsarray<string>nonomaxLength:50Optional narrowing to specific tickets — OMIT the field to release EVERY active free-claim ticket the buyer holds for this event, or pass an EMPTY array (or one with no valid ids) to release NOTHING and get releasedCount 0. The two are deliberately different so an empty client selection cannot un-RSVP a buyer from everything.
outputenvironmentstring<test | live>yesnomaxLength:16No description in lexicon yet.
outputreleasedCountintegeryesnominimum:0Authoritative number of tickets released — may exceed releasedTicketIds.length, which is capped at 1000, so treat a shorter list as partial and re-query rather than as the complete set.
outputreleasedTicketIdsarray<string>yesnomaxLength:1000Ids of the released tickets, truncated to the first 1000 — compare against releasedCount to detect truncation.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; UserAssertionRequired — A verified buyer assertion (buyerAssertionJwt) is required to release free-claim tickets.; AuthVerificationFailed — The service-auth token could not be verified.; UserDidMismatch — buyerAssertionJwt issuer does not match buyerDid.; InvalidRequest — Provide eventId or eventUri.; EventNotFound — The event does not exist for this app and environment.; IdempotencyConflict — The idempotencyKey was already used for a different buyer, event, or ticketIds selector.; TicketsBusy — The inventory row is contended; retry shortly.

tickets.atmosphere.releaseTicketHold6 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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:holdstatusstring<released | expired | failed | completed>yesnomaxLength:32No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; TicketHoldNotFound — Ticket hold not found.

tickets.atmosphere.revokeCollaboration5 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; CollaborationNotFound — Collaboration invitation not found.; EventNotFound — Ticketed event not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.setEventCapacity11 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringnonominLength:1, maxLength:300No description in lexicon yet.
inputeventUristringnonoformat:at-uriNo description in lexicon yet.
inputorganizerDidstringnonoformat:didThe current primary organizer authorizing this mutation. Omit only when the calling app is itself that primary organizer.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional only for an app updating its own event. Otherwise, a short-lived user service-auth JWT from organizerDid to ATM scoped to tickets.atmosphere.setEventCapacity.
inputcapacityintegernonominimum:1, maximum:250000Total tickets across ALL ticket types of the event.
inputunlimitedbooleannonononetrue clears the event capacity (unlimited — the default posture for new events).
outputeventIdstringyesnomaxLength:300No description in lexicon yet.
outputcapacityintegernonominimum:1, maximum:250000The event capacity now in effect. Omitted when unlimited.
outputsoldQuantityintegeryesnominimum:0No description in lexicon yet.
outputheldQuantityintegeryesnominimum:0No description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; EventNotFound — Ticketed event not found.; EventControlRequired — A verified current primary-organizer authorization is required for this event.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.; InvalidCapacity — Capacity is invalid, or lower than tickets already sold or held for the event.; InvalidCapacityConfig — Provide exactly one of capacity or unlimited:true.

tickets.atmosphere.setTicketTypeForm16 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputticketTypeIdstringyesnominLength: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.setTicketTypeForm. Proves the app is configuring ticketing with organizer consent.
inputformref:#formnoyesnoneNo description in lexicon yet.
outputticketTypeIdstringyesnomaxLength:300No description in lexicon yet.
outputfieldCountintegeryesnominimum:0No description in lexicon yet.
def:formversionintegeryesnominimum:1Form schema version. Currently 1.
def:formfieldsarray<ref:#formField>yesnomaxLength:30No description in lexicon yet.
def:formFieldkeystringyesnominLength:1, maxLength:64No description in lexicon yet.
def:formFieldlabelstringyesnominLength:1, maxLength:200No description in lexicon yet.
def:formFielddescriptionstringnonomaxLength:1000Optional buyer-facing help text shown below the question.
def:formFieldtypestring<text | textarea | email | select | checkbox | boolean | number>yesnomaxLength:16No description in lexicon yet.
def:formFieldrequiredbooleannonononeNo description in lexicon yet.
def:formFieldshowAtCheckInbooleannonononeShow this answer at check-in. Allowed ONLY on select/checkbox/boolean/number fields; rejected on text/textarea/email so no free-text/email answer can reach the door scanner.
def:formFieldoptionsarray<string>nonomaxLength:50Choice values for select fields; each string is both the stored value and the display label. Deliberately atomic: richer per-option shapes (value/label pairs) would ship as a NEW optional field rather than mutating these items.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; TicketTypeNotFound — Ticket type not found.; EventNotFound — Ticketed event not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; InvalidTicketForm — The form schema is invalid (e.g. showAtCheckIn set on a free-text or email field).; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.ticketedEvent7 fields
LocationFieldTypeRequiredNullableLimitsDescription
recordeventref:com.atproto.repo.strongRefyesnononeCID-pinned strongRef to the canonical public community.lexicon.calendar.event record.
recordticketTypesarray<ref:com.atproto.repo.strongRef>nonomaxLength:250Display-ordered CID-pinned strongRefs to the ticket types this record publicly advertises.
recordtitlestringnonomaxLength:1000, maxGraphemes:100No description in lexicon yet.
recorddescriptionstringnonomaxLength:10000, maxGraphemes:1000No description in lexicon yet.
recordarchivedbooleannonononeTrue when this ticketed-event anchor is archived. Omitted or false means it is active.
recordcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
recordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.ticketType15 fields
LocationFieldTypeRequiredNullableLimitsDescription
recordeventref:com.atproto.repo.strongRefyesnononeCID-pinned strongRef to the canonical public community.lexicon.calendar.event record.
recordtitlestringyesnominLength:1, maxLength:1000, maxGraphemes:100No description in lexicon yet.
recorddescriptionstringnonomaxLength:10000, maxGraphemes:1000No description in lexicon yet.
recordcurrencystringnonominLength:3, maxLength:3Deprecated display copy retained for readers of early records; canonical pricing belongs on the money.atmosphere.price referenced by defaultPrice. Lowercase currency code.
recordunitAmountintegernonominimum:0Deprecated display copy retained for readers of early records; canonical pricing belongs on the money.atmosphere.price referenced by defaultPrice. 0 continues to mark a free ticket type (claimed via tickets.atmosphere.claimFreeTicket, not checkout).
recordquantityTotalintegernonominimum:1, maximum:250000Display hint: the type's configured cap. Omitted when uncapped or undisclosed. Authoritative availability always comes from the availability query; capacity is enforced only in private ATM service state.
recordmaxPerOrderintegernonominimum:1, maximum:50Organizer-configured per-order limit for this ticket type. Apps must still check live ATM availability before checkout.
recordproductref:com.atproto.repo.strongRefnonononeOptional CID-pinned strongRef to the canonical money.atmosphere.product with kind=ticket for this ticket type in the organizer repo. Optional in the record so free/RSVP ticket types stay a single record, but tickets.atmosphere.createTicketType requires it for a PAID type. When present the Product owns catalog presentation and points at the current immutable money.atmosphere.price; checkout still lists on this ticketType record URI, never on the Product or the price.
recorddefaultPriceref:com.atproto.repo.strongRefnonononeOptional CID-pinned strongRef to the current money.atmosphere.price for this ticket type in the organizer repo. Legacy direct pricing retained for readers of records written before ticket types could carry a Product: when product is present, economics resolve through that Product's current defaultPrice and this field is not additionally authoritative. Absent means the type is published without catalog pricing; ATM private configuration remains settlement truth. Checkout always lists on this ticketType record URI, never on the price.
recordsaleStartsAtstringnonoformat:datetimeNo description in lexicon yet.
recordsaleEndsAtstringnonoformat:datetimeNo description in lexicon yet.
recordarchivedbooleannonononeTrue when this ticket type is archived. Omitted or false means it is not archived.
recordarchivedAtstringnonoformat:datetimeNo description in lexicon yet.
recordcreatedAtstringyesnoformat:datetimeNo description in lexicon yet.
recordupdatedAtstringnonoformat:datetimeNo description in lexicon yet.
tickets.atmosphere.updateTicketEvent11 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputeventIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringnonoformat:didThe primary organizer or accepted co-organizer authorizing this mutation. Omit only when the calling app is itself the event's primary organizer.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional only for an app updating its own event. Otherwise, a short-lived user service-auth JWT from organizerDid to ATM scoped to tickets.atmosphere.updateTicketEvent.
inputtitlestringnonominLength:1, maxLength:3000, maxGraphemes:300No description in lexicon yet.
inputstartsAtstringnoyesformat:datetimeNo description in lexicon yet.
inputeventCidstringnoyesformat:cidNo description in lexicon yet.
inputimageUrlstringnoyesformat:uriNo description in lexicon yet.
inputstatusstring<active | paused | archived>nonomaxLength:32ATM ticket-sales lifecycle state. It does not control visibility of the public event record.
inputmetadataunknownnonononeNo description in lexicon yet.
outputeventref:tickets.atmosphere.defs#eventSummaryyesnononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; TicketEventNotFound — Ticketed event config not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; PrimaryOrganizerRequired — Only the current primary organizer can archive the event.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.

tickets.atmosphere.updateTicketType20 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength:16No description in lexicon yet.
inputticketTypeIdstringyesnominLength:1, maxLength:300No description in lexicon yet.
inputorganizerDidstringnonoformat:didThe primary organizer or accepted co-organizer authorizing this mutation. Omit only when the calling app is itself the event's primary organizer.
inputorganizerAssertionJwtstringnonomaxLength:8192Optional only for an app updating its own event. Otherwise, a short-lived user service-auth JWT from organizerDid to ATM scoped to tickets.atmosphere.updateTicketType.
inputtitlestringnonominLength:1, maxLength:1000, maxGraphemes:100No description in lexicon yet.
inputdescriptionstringnoyesmaxLength:10000, maxGraphemes:1000No description in lexicon yet.
inputcurrencystringnonominLength:3, maxLength:3Lowercase ISO 4217 alphabetic code matching money.atmosphere.price. Chargeability is enforced separately by the configured processor allowlist. Asset-denominated value uses the money.atmosphere.payment.defs value union, never this field.
inputunitAmountintegernonominimum:0, maximum:2000000Amount in the smallest unit of currency. 0 creates a free ticket type (claimed via tickets.atmosphere.claimFreeTicket). A resulting paid ticket type must have an exact organizer-owned kind=ticket Product; paid amounts must also meet the processor minimum charge.
inputmaxPerOrderintegernonominimum:1, maximum:50No description in lexicon yet.
inputsaleStartsAtstringnoyesformat:datetimeNo description in lexicon yet.
inputsaleEndsAtstringnoyesformat:datetimeNo description in lexicon yet.
inputticketTypeRefref:com.atproto.repo.strongRefnoyesnoneNo description in lexicon yet.
inputproductref:com.atproto.repo.strongRefnonononeExact current organizer-owned money.atmosphere.product with kind=ticket. createTicketType requires it whenever unitAmount is greater than 0; a free type may omit it. updateTicketType requires the resulting paid type to retain or receive one, may attach or repoint it, and cannot clear it. The Product must be active and its exact default Price must be one-time, per-unit, and match the ticket amount and currency.
inputdefaultPriceref:com.atproto.repo.strongRefnoyesnoneLegacy direct-Price compatibility only. New callers using product MUST omit defaultPrice; ATM derives and verifies Product.defaultPrice and rejects both fields together. Readers still accept this field on Product-less historical ticket types.
inputmetadataunknownnonononeNo description in lexicon yet.
inputvisibilitystring<public | hidden>nonomaxLength:16Private buyer-facing visibility (default public). Hidden types are excluded from availability and buyer surfaces until unlocked by a ticket access code; organizer surfaces always see them.
inputquantityTotalintegernonominimum:1, maximum:250000Set the per-type cap.
inputunlimitedbooleannonononetrue clears the per-type cap (unlimited).
inputstatusstring<active | paused | archived>nonomaxLength:32No description in lexicon yet.
outputticketTyperef:tickets.atmosphere.defs#ticketTypeSummaryyesnononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; RecipientNotPayable — The organizer has not completed payment setup for this environment.; RecipientCurrencyUnavailable — ATM could not verify the organizer's primary settlement currency.; RecipientCurrencyUnsupported — The organizer's primary settlement currency is not supported by ATM's current payment processor.; RecipientCurrencyNotEnabled — The organizer's primary settlement currency is not enabled in this ATM environment.; RecipientCurrencyMismatch — The paid ticket currency does not match the organizer's primary settlement currency.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.; TicketTypeNotFound — Ticket type not found.; EventControlRequired — A verified primary-organizer or accepted co-organizer authorization is required for this event.; PrimaryOrganizerRequired — Only the current primary organizer can change ticket pricing, capacity, or raw metadata, or archive the ticket type.; UserDidMismatch — organizerAssertionJwt issuer does not match organizerDid.; InvalidAmount — Ticket price is invalid: negative, above the maximum, or a paid amount below the processor minimum charge (use 0 for free ticket types).; TicketCurrencyUnsupportedForFee — This paid ticket currency is incompatible with the app's fixed ticket-fee denomination.; InvalidCapacity — Capacity is invalid, or lower than tickets already sold or held for this type.; InvalidCapacityConfig — Provide at most one of quantityTotal or unlimited:true.

tickets.atmosphere.verifyTicket8 fields
LocationFieldTypeRequiredNullableLimitsDescription
inputenvironmentstring<test | live>nonomaxLength: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.
outputticketTyperef:tickets.atmosphere.defs#ticketTypeSummarynonononeNo description in lexicon yet.

Declared errors: AppNotRegistered — Caller DID is not registered as an ATM app.; TicketsModuleDisabled — This app has not enabled ATM Tickets.; TicketNotFound — Ticket not found or verification failed.; UnsupportedHistoricalCurrency — Stored ticket data uses a historical currency that the current ISO 4217 wire contract cannot represent.

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 examples

Use current request examples for paid holds, fresh free claims and app-authorized check-in. Exact fields and errors are generated above from ATM. Query ticket lists use buyer/organizer; private assertion-bearing list procedures use POST bodies.

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.cancelTicketEvent
POST tickets.atmosphere.createTicketType
POST tickets.atmosphere.updateTicketType
POST tickets.atmosphere.archiveTicketType
POST tickets.atmosphere.setEventCapacity
POST tickets.atmosphere.setTicketTypeForm
GET  tickets.atmosphere.getTicketAvailability
POST tickets.atmosphere.createTicketHold
POST tickets.atmosphere.releaseTicketHold
POST tickets.atmosphere.claimFreeTicket
POST tickets.atmosphere.releaseFreeTicket
POST tickets.atmosphere.joinWaitlist
POST tickets.atmosphere.claimWaitlistOffer
POST tickets.atmosphere.listEventWaitlist
POST tickets.atmosphere.listTicketFormResponses
POST tickets.atmosphere.inviteOrganizerCollaboration
POST tickets.atmosphere.acceptCollaboration
POST tickets.atmosphere.listCollaborations
POST tickets.atmosphere.revokeCollaboration
GET  tickets.atmosphere.listBuyerTickets
GET  tickets.atmosphere.listOrganizerTickets
POST tickets.atmosphere.verifyTicket
POST tickets.atmosphere.checkInTicket
GET  tickets.atmosphere.listPublicConfig (public AppView)

Error codes

The per-method generated field panels include declared errors from the copied schemas. Handle actual structured errors and check-in statuses instead of inventing exception names from UI messages.

InsufficientTicketCapacity / TicketsUnavailableRefresh availability and selection; do not start checkout without a successful hold.
FreeTicketRequiresClaim / PaidTicketRequiresCheckoutChoose the zero-price claim path or paid checkout path as required by the configured type.
InvalidBuyerIdentity / UserAssertionRequired / AuthVerificationFailedSupply the correct paired buyer fields and a fresh method-scoped assertion.
CustomerEmailRequired / InvalidCustomerEmailCollect valid private delivery email before a fresh free claim.
EventControlRequired / PrimaryOrganizerRequiredRevalidate current organizer authority; app provenance is insufficient.
IdempotencyKeyInFlight / IdempotencyKeyConflict / IdempotencyConflictWait/retry the original exact operation when in flight; resolve conflicting bodies before another request.
CheckoutPayerChangedReconcile the final buyer and original private status capability; do not blindly create another sale.
TicketNotFound / CheckInListMismatchReject invalid or out-of-scope admission. Repeat scans are a normal already-checked-in result.
TicketsBusyRetry with bounded backoff using the same operation key.

Error recovery

  1. Capacity conflict: refresh authoritative availability and quantity.
  2. Invalid assertion: mint a fresh assertion for the required method. Do not silently drop an asserted buyer into a new guest purchase.
  3. Uncertain hold/payment: retain the original operation key and status capability until reconciled.
  4. Failed callback: repair verification/processing, then redrive the durable delivery.
  5. Repeat scan: show the original already-checked-in timestamp.

Security model

PublicCommunity event/RSVP records, ticketType/ticketedEvent/checkInList catalog, and policy-gated payment proofs.
PrivateCapacity enforcement, holds, issued tickets, attendee/contact data, codes/counters, staff grants, pass secrets, check-ins and lifecycle audit.
App scopeCalling app, environment, module policy and current organizer selling/control authority determine access.
User assertionsProve private action identity/intent; grant no public repo write.
Presentation and admissionCurrent moderation can suppress displayed content while the issued entitlement and authorized admission remain valid.

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 types 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 type 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/type display, check-in result.Buyer email, payment id, processor id, raw QR secrets.
Public protocolSafe event, type, ticketed-event and payment proof refs.Attendee answers, exact counters, check-in logs, customer PII, fraud/risk state.

Data ownership

EventsCommunity event records and app UX; current event presentation can change without rewriting purchase history.
CatalogPublic ticketType/ticketedEvent/checkInList records plus exact attached Product/default Price refs.
InventoryPrivate transactional type/event pools and hold/issued counters.
Buyer dataPrivate ticket answers, delivery email, assertions and attendee identity.
PaymentsATM ledger plus policy-gated public proofs. Free claims have no payment row; paid-with-Free-coupon orders have $0 rows and no public proof.
AdmissionPrivate revocable pass tokens, ticket status, scanner grants and check-in audit.

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 types and capacityTicketsScarce inventory must be transactional and enforced by ATM for authorized seller channels.
Promo codes and private codesTickets + ATMPrivate code configuration 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 UXAppsSupported catalog refs can connect back to Tickets/ATM for redemption truth.

Lexicon review

Review current record portability and service boundaries: optional catalog refs for free types, exact Product/default Price economics for paid types, private type/event capacity, organizer control independent of app provenance, and assertions kept in POST bodies. Compare the exact copied ATM revision before proposing schema edits.

Use the raw JSON and generated error/field tables. A docs bundle is not proof that namespace publication, runtime deployment or release approval has occurred.

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 event/type catalog, event capacity, holds, claims, free release, availability 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 ATM canonical source, copy generated 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 typeA sellable or claimable ticket type for an event.
Capacity poolA private inventory bucket that one or more ticket types 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.