{"lexicon":1,"id":"tickets.atmosphere.createTicketType","defs":{"main":{"type":"procedure","description":"Create an organizer-owned ATM ticket type and optional public ticket-type record refs for an event. A paid type requires an exact active organizer-owned kind=ticket Product whose one-time default Price matches amount and currency; callers using product must omit legacy defaultPrice because ATM derives it. A free type may omit Product. Requires app service-auth and, when the app is not itself the organizer, a verified organizer assertion.","input":{"encoding":"application/json","schema":{"type":"object","required":["organizerDid","event","title","currency","unitAmount"],"properties":{"environment":{"type":"string","knownValues":["test","live"],"maxLength":16},"organizerDid":{"type":"string","format":"did"},"organizerAssertionJwt":{"type":"string","description":"Optional short-lived user service-auth JWT from organizerDid to ATM, scoped to tickets.atmosphere.createTicketType. Proves the app is configuring ticketing with organizer consent.","maxLength":8192},"event":{"type":"ref","ref":"tickets.atmosphere.defs#eventInput"},"title":{"type":"string","minLength":1,"maxGraphemes":100,"maxLength":1000},"description":{"type":"string","maxGraphemes":1000,"maxLength":10000},"currency":{"type":"string","minLength":3,"maxLength":3,"description":"Lowercase 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."},"unitAmount":{"type":"integer","minimum":0,"maximum":2000000,"description":"Amount 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."},"maxPerOrder":{"type":"integer","minimum":1,"maximum":50},"saleStartsAt":{"type":"string","format":"datetime"},"saleEndsAt":{"type":"string","format":"datetime"},"ticketTypeRef":{"type":"ref","ref":"com.atproto.repo.strongRef"},"product":{"type":"ref","ref":"com.atproto.repo.strongRef","description":"Exact 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."},"defaultPrice":{"type":"ref","ref":"com.atproto.repo.strongRef","description":"Legacy 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."},"metadata":{"type":"unknown"},"visibility":{"type":"string","knownValues":["public","hidden"],"maxLength":16,"description":"Private 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."},"quantityTotal":{"type":"integer","minimum":1,"maximum":250000,"description":"Optional per-type cap. Omit for an unlimited type (the default). An event capacity set via tickets.atmosphere.setEventCapacity additionally bounds every type."}}}},"output":{"encoding":"application/json","schema":{"type":"object","required":["event","ticketType"],"properties":{"event":{"type":"ref","ref":"tickets.atmosphere.defs#eventSummary"},"ticketType":{"type":"ref","ref":"tickets.atmosphere.defs#ticketTypeSummary"}}}},"errors":[{"name":"AppNotRegistered","description":"Caller DID is not registered as an ATM app."},{"name":"TicketsModuleDisabled","description":"This app has not enabled ATM Tickets."},{"name":"OrganizerNotRegistered","description":"Organizer has not signed in to ATM yet."},{"name":"PaymentSetupIncomplete","description":"Organizer has not finished ATM payment setup."},{"name":"OrganizerConsentRequired","description":"A verified organizer authorization (organizerAssertionJwt) is required to configure ticketing for this organizer."},{"name":"OrganizerReassignmentNotAllowed","description":"This event already belongs to a different organizer; a fresh organizer authorization is required to reassign it."},{"name":"RecipientNotPayable","description":"The organizer has not completed payment setup for this environment."},{"name":"RecipientCurrencyUnavailable","description":"ATM could not verify the organizer's primary settlement currency."},{"name":"RecipientCurrencyUnsupported","description":"The organizer's primary settlement currency is not supported by ATM's current payment processor."},{"name":"RecipientCurrencyNotEnabled","description":"The organizer's primary settlement currency is not enabled in this ATM environment."},{"name":"RecipientCurrencyMismatch","description":"The paid ticket currency does not match the organizer's primary settlement currency."},{"name":"InvalidAmount","description":"Ticket price is invalid: negative, above the maximum, or a paid amount below the processor minimum charge (use 0 for free ticket types)."},{"name":"TicketCurrencyUnsupportedForFee","description":"This paid ticket currency is incompatible with the app's fixed ticket-fee denomination."},{"name":"InvalidCapacity","description":"Ticket quantity must be at least 1."},{"name":"UserDidMismatch","description":"organizerAssertionJwt issuer does not match organizerDid."}]}}}