{"lexicon":1,"id":"money.atmosphere.membership.getAccess","defs":{"accessTier":{"type":"object","required":["tier"],"properties":{"tier":{"type":"ref","ref":"com.atproto.repo.strongRef","description":"Matched money.atmosphere.membership.tier record."},"rank":{"type":"integer","minimum":0,"description":"Resolved tier rank, when known."},"currentPeriodEndsAt":{"type":"string","format":"datetime","description":"When the current paid period ends, when available to the caller."}}},"main":{"type":"procedure","description":"Reserved cross-app membership access check. The current route is hard-closed: ATM_MEMBERSHIP_ACCESS_QUERY_ENABLED alone cannot enable it, because a standard member getServiceAuth token binds aud+lxm but not creatorDid, program, tier, or environment. It must remain unavailable until a member-controlled artifact cryptographically binds that exact request and the handler verifies the binding. Once implemented, authority is additionally creator-consent scoped, ATM answers from the union of attested subscriptions and registered grants, and the personalized response remains Cache-Control private, no-store.","input":{"encoding":"application/json","schema":{"type":"object","required":["memberDid","creatorDid","memberAssertionJwt"],"properties":{"memberDid":{"type":"string","format":"did","description":"Member DID to check. Must match memberAssertionJwt issuer."},"creatorDid":{"type":"string","format":"did","description":"Creator or project DID whose membership is being checked."},"memberAssertionJwt":{"type":"string","maxLength":8192,"description":"Single-use, short-TTL member presence token: a com.atproto.server.getServiceAuth JWT with iss = memberDid, aud = the broker DID's #AttestedNetwork service, lxm = money.atmosphere.membership.assertMember. Verified and discarded; jti is replay-protected so a token satisfies exactly one check."},"environment":{"type":"string","knownValues":["test","live"],"maxLength":16,"description":"ATM app environment. Defaults to live."},"program":{"type":"string","format":"at-uri","description":"Optional money.atmosphere.membership.program AT-URI to check."},"tier":{"type":"string","format":"at-uri","description":"Optional money.atmosphere.membership.tier AT-URI to check. When absent, any active tier in the program may satisfy access."},"tierOrAbove":{"type":"boolean","default":false,"description":"When true, an exact tier match or a different tier with rank strictly greater than the requested tier rank satisfies access. Equal-ranked tiers are peers and do not satisfy one another. Defaults to exact tier/program access."}}}},"output":{"encoding":"application/json","schema":{"type":"object","required":["access","memberDid","creatorDid","checkedAt"],"properties":{"access":{"type":"boolean","description":"True when ATM found an active membership satisfying the request."},"memberDid":{"type":"string","format":"did"},"creatorDid":{"type":"string","format":"did"},"program":{"type":"ref","ref":"com.atproto.repo.strongRef","description":"Matched membership program, when resolved."},"tiers":{"type":"array","maxLength":16,"items":{"type":"ref","ref":"#accessTier"},"description":"Matched active tiers the caller is authorized to know about. Empty when access is false or only program-level access is known."},"checkedAt":{"type":"string","format":"datetime","description":"When ATM evaluated access."}}}},"errors":[{"name":"FeatureUnavailable","description":"The cross-app membership access query is hard-closed until member authorization is bound to the exact request; the deployment flag alone cannot enable it."},{"name":"InvalidActor","description":"Member or creator DID is malformed."},{"name":"AppNotRegistered","description":"Caller is not a registered ATM app."},{"name":"NotAuthorized","description":"memberAssertionJwt is missing, invalid, or not issued by memberDid."}]}}}