Build with Atmosphere Money
Atmosphere Money is a payment broker for AT Protocol apps. We are launching first with Supper, then opening the integration surface to additional apps once the creator and buyer experience has settled in production. ATM writes cryptographic proof-of-payment records per the attested.network spec so transactions can be independently verified.
Full docs for when app sign-ups open.
Proof of payment
attested.networkATM payment proofs are built from three AT Protocol record roles:
- A payment record for the payer or payer-of-record (one-time or recurring) listing the recipient and amount.
- A broker proof in ATM’s repository attesting the payment cleared.
- A creator proof in the recipient’s repository attesting receipt.
The records are content-addressed and cryptographically linked, so verifiers can confirm cleared payments without trusting ATM’s database alone. See the attested.network spec for the full verification flow.
Reference
ProtocolATM uses public AT Protocol records for catalog data that should be portable across apps. A product record describes the thing being sold; one or more price records describe how that product can be paid for; optional discount records describe the coupon-like economic offer; optional discount-code records describe customer-facing redemption codes for those offers. Supper writes these records to the creator’s PDS today, and ATM resolves them during checkout so the payment, Stripe mirror, and proof records all point back to content-addressed protocol data instead of an ATM-only database row.
Product lexiconmoney.atmosphere.product — public identity for what a creator is selling.
{ "lexicon": 1, "id": "money.atmosphere.product", "defs": { "main": { "type": "record", "description": "Public ATM catalog product describing what is sold; prices live in money.atmosphere.price.", "key": "any", "record": { "type": "object", "required": [ "title", "kind", "createdAt" ], "properties": { "title": { "type": "string", "minLength": 1, "maxGraphemes": 100, "maxLength": 1000 }, "sku": { "type": "string", "maxLength": 64 }, "defaultPrice": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "kind": { "type": "string", "knownValues": [ "physical", "digital", "commission", "service", "ticket", "other" ], "maxLength": 32 }, "description": { "type": "string", "maxGraphemes": 1000, "maxLength": 10000 }, "image": { "type": "object", "required": [ "uri" ], "properties": { "uri": { "type": "string", "format": "uri" }, "alt": { "type": "string", "maxGraphemes": 300, "maxLength": 3000 } } }, "variantOf": { "type": "ref", "ref": "com.atproto.repo.strongRef" }, "archived": { "type": "boolean" }, "archivedAt": { "type": "string", "format": "datetime" }, "createdAt": { "type": "string", "format": "datetime" }, "updatedAt": { "type": "string", "format": "datetime" } } } } } }Price lexiconmoney.atmosphere.price — public amount, currency, cadence, and Stripe-style custom amount configuration.
{ "lexicon": 1, "id": "money.atmosphere.price", "defs": { "main": { "type": "record", "description": "Public ATM price record describing amount, currency, and billing cadence for a product.", "key": "any", "record": { "type": "object", "required": [ "productUri", "currency", "unitAmount", "type", "createdAt" ], "properties": { "productUri": { "type": "string", "format": "at-uri" }, "lookupKey": { "type": "string", "maxLength": 200 }, "nickname": { "type": "string", "maxGraphemes": 100, "maxLength": 1000 }, "currency": { "type": "string", "minLength": 3, "maxLength": 3, "description": "Lowercase ISO 4217 currency code, matching Stripe Price." }, "unitAmount": { "type": "integer", "minimum": 1 }, "customUnitAmount": { "type": "object", "required": [ "enabled" ], "description": "Stripe-compatible customer-chosen amount configuration. When enabled, unitAmount should be treated as the default/preset display amount rather than a fixed charge.", "properties": { "enabled": { "type": "boolean" }, "preset": { "type": "integer", "minimum": 1, "description": "Initial amount shown to the buyer, in the smallest unit of currency." }, "minimum": { "type": "integer", "minimum": 1, "description": "Minimum buyer-entered amount, in the smallest unit of currency." }, "maximum": { "type": "integer", "minimum": 1, "description": "Maximum buyer-entered amount, in the smallest unit of currency." } } }, "type": { "type": "string", "knownValues": [ "one-time", "recurring" ], "maxLength": 16 }, "recurring": { "type": "object", "required": [ "interval", "intervalCount" ], "properties": { "interval": { "type": "string", "knownValues": [ "day", "week", "month", "year" ], "maxLength": 16 }, "intervalCount": { "type": "integer", "minimum": 1, "maximum": 36 } } }, "archived": { "type": "boolean" }, "createdAt": { "type": "string", "format": "datetime" }, "updatedAt": { "type": "string", "format": "datetime" } } } } } }Discount lexiconmoney.atmosphere.discount — public offer terms that map to Stripe coupons.
{ "lexicon": 1, "id": "money.atmosphere.discount", "defs": { "main": { "type": "record", "description": "Public ATM discount terms that can be mirrored to processor coupon objects at checkout.", "key": "any", "record": { "type": "object", "required": [ "createdAt" ], "properties": { "name": { "type": "string", "maxGraphemes": 100, "maxLength": 1000 }, "percentOffBps": { "type": "integer", "minimum": 1, "maximum": 10000, "description": "Percentage discount in basis points. 2500 = 25%. Mutually exclusive with amountOff." }, "amountOff": { "type": "object", "required": [ "currency", "unitAmount" ], "properties": { "currency": { "type": "string", "minLength": 3, "maxLength": 3, "description": "Lowercase ISO 4217 currency code." }, "unitAmount": { "type": "integer", "minimum": 1, "description": "Amount off in the smallest currency unit." } } }, "duration": { "type": "string", "knownValues": [ "once", "forever", "repeating" ], "maxLength": 16, "description": "Stripe-compatible discount duration. Omitted means once." }, "durationInMonths": { "type": "integer", "minimum": 1, "maximum": 36, "description": "Required when duration is repeating." }, "appliesTo": { "type": "object", "properties": { "productUris": { "type": "array", "items": { "type": "string", "format": "at-uri" }, "description": "ATM product URIs this discount can apply to. Empty/absent means any product." }, "priceUris": { "type": "array", "items": { "type": "string", "format": "at-uri" }, "description": "ATM price URIs this discount can apply to. Empty/absent means any price." } } }, "maxRedemptions": { "type": "integer", "minimum": 1 }, "redeemBy": { "type": "string", "format": "datetime" }, "disabled": { "type": "boolean" }, "createdAt": { "type": "string", "format": "datetime" }, "updatedAt": { "type": "string", "format": "datetime" } } } } } }Discount code lexiconmoney.atmosphere.discountCode — customer-facing code and restrictions that map to Stripe promotion codes.
{ "lexicon": 1, "id": "money.atmosphere.discountCode", "defs": { "main": { "type": "record", "description": "Public customer-facing redemption code for a money.atmosphere.discount.", "key": "any", "record": { "type": "object", "required": [ "discount", "code", "createdAt" ], "properties": { "discount": { "type": "ref", "ref": "com.atproto.repo.strongRef", "description": "StrongRef to the money.atmosphere.discount this code redeems." }, "code": { "type": "string", "maxLength": 64, "description": "Customer-facing code. Case-insensitive in Stripe; ATM accepts letters, digits, and dashes." }, "name": { "type": "string", "maxGraphemes": 100, "maxLength": 1000 }, "restrictions": { "type": "object", "properties": { "firstTimeTransaction": { "type": "boolean", "description": "Stripe-compatible first-time transaction restriction." }, "minimumAmount": { "type": "object", "required": [ "currency", "unitAmount" ], "properties": { "currency": { "type": "string", "minLength": 3, "maxLength": 3, "description": "Lowercase ISO 4217 currency code." }, "unitAmount": { "type": "integer", "minimum": 1, "description": "Minimum payment amount in the smallest currency unit." } } } } }, "maxRedemptions": { "type": "integer", "minimum": 1 }, "redeemBy": { "type": "string", "format": "datetime" }, "disabled": { "type": "boolean" }, "createdAt": { "type": "string", "format": "datetime" }, "updatedAt": { "type": "string", "format": "datetime" } } } } } }
Atmosphere Tickets
TicketsATM Tickets is the ticketing module for event apps building on AT Protocol. Apps keep their own event pages and social experience, while ATM handles payment-linked ticket holds, capacity, issuance, optional QR passes, verification, and check-in contracts.
Visit atmosphere.ticketsApp sign-ups opening soon
Early accessSupper is the first production reference app for ATM. We’re using that launch to harden the creator and buyer experience before opening self-service app onboarding to more teams. In the meantime, get in touch and we’ll add you to the early-access list.
Request early access