Lemon Perfect · Authentication Profile

Lemon Perfect Authentication

Authentication

Lemon Perfect secures its APIs with oauth2, openIdConnect, apiKey, and agentIdentity across 4 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode, refreshToken, and jwtBearer flow(s).

CompanyBeveragesConsumer Packaged GoodsEcommerceRetailDirect to ConsumerAgentic CommerceModel Context ProtocolGraphQLUniversal Commerce ProtocolShopify
Methods: oauth2, openIdConnect, apiKey, agentIdentity Schemes: 4 OAuth flows: authorizationCode, refreshToken, jwtBearer API key in: header

Security Schemes

StorefrontPublicToken apiKey
· in: header ()
CustomerAccountsOIDC openIdConnect
CustomerAccessToken http
scheme: bearer
UCPAgentProfile agentIdentity
· in: header ()

Source

Authentication Profile

lemon-perfect-authentication.yml Raw ↑
generated: '2026-08-04'
method: probed
source: https://lemonperfect.com/.well-known/openid-configuration
docs: https://lemonperfect.com/agents.md
note: >-
  Derived from documents fetched anonymously from lemonperfect.com, not from an
  OpenAPI securitySchemes block (Lemon Perfect publishes no OpenAPI). Three
  distinct auth models coexist on the same host: an anonymous/public-token
  GraphQL storefront, an OIDC-protected customer account authorization server,
  and an agent-identity gate on the UCP/MCP commerce endpoint.
summary:
  types: [oauth2, openIdConnect, apiKey, agentIdentity]
  api_key_in: [header]
  oauth2_flows: [authorizationCode, refreshToken, jwtBearer]
  pkce: [S256]
schemes:
- name: StorefrontPublicToken
  type: apiKey
  in: header
  parameter_name: X-Shopify-Storefront-Access-Token
  applies_to: https://lemonperfect.com/api/{version}/graphql.json
  description: >-
    Shopify Storefront API public access token. Intended to be embedded in
    client code — it scopes an app to public storefront data only.
  observed: >-
    Anonymous introspection and anonymous `{shop{name}}` queries both returned
    HTTP 200 without a token on 2026-08-04, so read access to this surface is
    effectively open.
  sources: [graphql/lemon-perfect-storefront-2026-07.graphql]
- name: CustomerAccountsOIDC
  type: openIdConnect
  openIdConnectUrl: https://lemonperfect.com/.well-known/openid-configuration
  issuer: https://shopify.com/authentication/3205202020
  authorization_endpoint: https://shopify.com/authentication/3205202020/oauth/authorize
  token_endpoint: https://shopify.com/authentication/3205202020/oauth/token
  end_session_endpoint: https://shopify.com/authentication/3205202020/logout
  jwks_uri: https://shopify.com/authentication/3205202020/.well-known/jwks.json
  response_types_supported: [code]
  grant_types_supported: [authorization_code, refresh_token, 'urn:ietf:params:oauth:grant-type:jwt-bearer']
  token_endpoint_auth_methods_supported: [client_secret_basic]
  code_challenge_methods_supported: [S256]
  id_token_signing_alg_values_supported: [RS256]
  subject_types_supported: [public]
  claims_supported: [iss, sub, aud, exp, iat, nonce, sid, email, email_verified]
  scopes_supported: [openid, email, 'customer-account-api:full', 'customer-account-mcp-api:full']
  description: >-
    Shopify Customer Accounts authorization server bound to this store
    (shop id 3205202020). Guards the Customer Account API and the customer
    account MCP API.
  sources: [well-known/lemon-perfect-openid-configuration.json]
- name: CustomerAccessToken
  type: http
  scheme: bearer
  applies_to: 'Storefront GraphQL customer* fields and mutations'
  description: >-
    Legacy Storefront customer access token minted by the
    `customerAccessTokenCreate` mutation and passed as `customerAccessToken` on
    customer queries/mutations. Verified present in the 2026-07 SDL.
  sources: [graphql/lemon-perfect-storefront-2026-07.graphql]
- name: UCPAgentProfile
  type: agentIdentity
  in: header
  parameter_name: UCP-Agent
  applies_to: https://lemonperfect.com/api/ucp/mcp
  description: >-
    The UCP/MCP endpoint refuses anonymous JSON-RPC calls. The caller must
    supply a `ucp-agent.profile` URI (mapped to the HTTP UCP-Agent header)
    resolving to a fetchable platform UCP profile document.
  observed_failure:
    http_status: 422
    jsonrpc_error_code: -32001
    code: invalid_profile_url
    message: 'Unable to fetch agent profile: Missing profile uri'
  sources: [mcp/lemon-perfect-mcp.yml]
buyer_consent:
  required_for: [complete_checkout, payment]
  policy_url: https://lemonperfect.com/robots.txt
  description: >-
    Payment authorization is explicitly reserved to a human. Agents may not
    finalize a checkout without contemporaneous buyer approval.
x-evidence:
  fetched: '2026-08-04'
  urls:
  - {url: 'https://lemonperfect.com/.well-known/openid-configuration', http_status: 200}
  - {url: 'https://lemonperfect.com/.well-known/oauth-authorization-server', http_status: 200}
  - {url: 'https://lemonperfect.com/api/2026-07/graphql.json', http_status: 200}
  - {url: 'https://lemonperfect.com/api/ucp/mcp', http_status: 422}