Beta developer packet
A concise handoff for invited app developers integrating ATM checkout, callbacks, and Tickets in test mode.
Compatible with the closed-beta ATM app APIs and versioned ATM event headers. Check atm-api-version on every webhook or XRPC receiver event.
Install
Use the published beta packages from a trusted backend. Do not build checkout envelopes, service-auth tokens, webhook verification, or ticket fulfillment code in the browser.
npm install @atmosphere-money/app-node@beta
npm install -D @atmosphere-money/testing@betaRequired environment
| ATM_BASE_URL | https://checkout.atmosphere.money for production beta, or the local ATM URL during local development. |
|---|---|
| ATM_APP_DID | The DID of the app account registered in ATM. |
| ATM_ENVIRONMENT | test until ATM explicitly grants live access. |
| ATM_WEBHOOK_SECRET | The environment-specific signing secret from the ATM app dashboard. |
| ATM_APP_SERVICE_AUDIENCE | did:plc:a54sdlhmv7xklga67xamqfyq#AttestedNetwork |
| ATM_APP_SERVICE_KEY | Your app-side credential or key material for minting AT Protocol service-auth JWTs. Keep this private. |
Test-mode checklist
- Register the app in ATM test mode and enable only the modules being tested.
- Configure a test webhook URL or optional XRPC receiver.
- Send a dashboard test event and verify signature, delivery id, environment, and idempotency handling.
- Create a checkout from your backend and fulfill only after payment.completed.
- Test cancel/return browser paths without using them as fulfillment truth.
- Test refunds, failed payments, duplicate deliveries, and disabled recipient states.
- For Tickets, test availability, paid holds, hold release, free limited claims, verify, and check-in.
Callbacks
HTTP webhooks are the default ATM-to-app callback path. XRPC receivers are optional for apps that already host an XRPC surface and want protocol-shaped callbacks signed with ATM service-auth.
API shape
| getPayoutStatus | Check whether a recipient can receive payments before showing paid actions. |
|---|---|
| initiatePayment | Create hosted ATM checkout from an app server. |
| getPaymentStatus | Reconcile checkout state when the browser returns. |
| getTicketAvailability | Read ticket availability before showing quantities. |
| createTicketHold | Reserve paid ticket capacity before checkout. |
| claimFreeTicket | Claim free scarce tickets without a checkout redirect. |
| verifyTicket / checkInTicket | Power QR scanners and check-in tools. |
Auth model
| App to ATM | App service-auth JWT minted server-side by the app. |
|---|---|
| Buyer assertion | Optional short-lived user service-auth JWT when the app already has the buyer present. |
| ATM to app webhook | HMAC signature with the environment webhook secret. |
| ATM to app XRPC receiver | ATM service-auth JWT scoped to money.atmosphere.event.receive. |
Sample events
Use the testing package to generate signed fixtures for app tests. The same event envelope shape is used by HTTP webhooks and optional XRPC receiver callbacks.
import {
ATM_TEST_WEBHOOK_SECRET,
createAtmWebhookRequest,
createPaymentCompletedFixture,
} from "@atmosphere-money/testing";
import { constructTypedAtmWebhookEvent } from "@atmosphere-money/app-node";
const fixture = createPaymentCompletedFixture({
payment: { id: "pay_test_123", metadata: { appOrderId: "ord_123" } },
});
const request = createAtmWebhookRequest(fixture);
const event = constructTypedAtmWebhookEvent({
rawBody: fixture.rawBody,
secret: ATM_TEST_WEBHOOK_SECRET,
expectedType: "payment.completed",
now: fixture.event.created,
headers: {
signature: request.headers.get("atm-signature"),
deliveryId: request.headers.get("atm-delivery-id"),
event: request.headers.get("atm-event"),
apiVersion: request.headers.get("atm-api-version"),
environment: request.headers.get("atm-environment"),
},
});Ticket flow
- 01
Buyer selects tier
The event app owns the event page and ticket selection UX.
- 02
Check availability
The app asks ATM Tickets for current private inventory state.
- 03
Create hold
ATM reserves scarce capacity and returns a hold id plus checkout URL.
- 04
Buyer pays
ATM checkout handles cards, wallets, Link, receipts, and payment state.
- 05
Tickets issued
ATM issues tickets once and sends tickets.issued to the app receiver.
- 06
Fulfill
The app shows the buyer tickets after verified event delivery or confirmed ATM state.
Free limited tickets use claimFreeTicket instead of checkout. ATM still owns capacity and issuance.
Current beta caveats
- Install with @beta; latest is not the docs-supported install path yet.
- Test and live app environments are separate.
- HTTP webhooks are the default callback path.
- XRPC receivers are optional and require ATM service-auth verification plus jti replay protection.
- Browser iframe checkout embeds are future roadmap, not the current beta.
- Tickets is a pilot module; event discovery and consumer UX stay in the event app.
Support
For beta access, app registration, webhook troubleshooting, or live readiness review, contact ATM support with your app DID, test environment, webhook delivery id, and the ATM payment or ticket id involved.