Hubble Contacts · Authentication Profile

Hubble Contacts Authentication

Authentication

Hubble Contacts secures its APIs with oauth2, openIdConnect, http, and none across 2 declared security schemes, as derived from its OpenAPI definitions. OAuth 2.0 is offered via the authorizationCode flow(s).

CompanyE-CommerceRetailHealthVision CareContact LensesSubscriptionsAgentic CommerceModel Context ProtocolShopifyGraphQL
Methods: oauth2, openIdConnect, http, none Schemes: 2 OAuth flows: authorizationCode API key in:

Security Schemes

shopify-customer-accounts-oidc openIdConnect
shopify-oauth-authorization-server oauth2
· flows: authorizationCode

Source

Authentication Profile

hubble-contacts-authentication.yml Raw ↑
generated: '2026-08-04'
method: searched
source: https://account.hubblecontacts.com/.well-known/openid-configuration
docs: https://account.hubblecontacts.com/agents.md
notes: >-
  Hubble Contacts publishes no OpenAPI, so this profile is not derived from
  securitySchemes — it is read directly from the OAuth 2.0 / OpenID Connect discovery
  documents the storefront host serves, plus the observed auth behaviour of the two
  public surfaces. The authorization server is the Shopify customer accounts issuer
  bound to Hubble's shop id 15165228; the protected resource is Hubble's own host.
summary:
  types: [oauth2, openIdConnect, http, none]
  oauth2_flows: [authorizationCode]
  pkce: [S256]
  bearer_methods: [header]
  api_key_in: []
schemes:
- name: shopify-customer-accounts-oidc
  type: openIdConnect
  openIdConnectUrl: https://account.hubblecontacts.com/.well-known/openid-configuration
  issuer: https://shopify.com/authentication/15165228
  authorization_endpoint: https://shopify.com/authentication/15165228/oauth/authorize
  token_endpoint: https://shopify.com/authentication/15165228/oauth/token
  end_session_endpoint: https://shopify.com/authentication/15165228/logout
  jwks_uri: https://shopify.com/authentication/15165228/.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'
  applies_to: Customer account access (order history, subscription management)
  source: well-known/hubble-contacts-openid-configuration.json
- name: shopify-oauth-authorization-server
  type: oauth2
  metadata: https://account.hubblecontacts.com/.well-known/oauth-authorization-server
  standard: RFC 8414
  issuer: https://shopify.com/authentication/15165228
  flows:
  - flow: authorizationCode
    authorizationUrl: https://shopify.com/authentication/15165228/oauth/authorize
    tokenUrl: https://shopify.com/authentication/15165228/oauth/token
    pkce: S256
  source: well-known/hubble-contacts-oauth-authorization-server.json
protected_resources:
- resource: https://account.hubblecontacts.com
  standard: RFC 9728
  metadata: https://account.hubblecontacts.com/.well-known/oauth-protected-resource
  authorization_servers: ['https://shopify.com/authentication/15165228']
  bearer_methods_supported: [header]
  source: well-known/hubble-contacts-oauth-protected-resource.json
- name: shopify-storefront-customer-access-token
  type: http
  scheme: bearer-like custom token
  surface: Storefront GraphQL
  issued_by: 'mutation customerAccessTokenCreate(input: {email, password})'
  renewed_by: customerAccessTokenRenew
  revoked_by: customerAccessTokenDelete
  passed_as: 'customerAccessToken argument on customer-scoped fields and cart mutations'
  applies_to: 'Customer-scoped reads/writes on the Storefront GraphQL surface (customer profile, addresses, orders)'
  source: graphql/hubble-contacts-storefront.graphql
  note: >-
    Found in round 2. Distinct from the OIDC customer-accounts issuer above: this is
    the legacy Storefront-API token exchange, which Shopify is steering to the
    Customer Account API. Anonymous callers reach everything else on the surface.
surfaces:
- surface: Storefront GraphQL
  base: 'https://account.hubblecontacts.com/api/{version}/graphql.json'
  auth: none
  observed: >-
    Round 2. POST with no X-Shopify-Storefront-Access-Token and no bearer token
    returned HTTP 200 for a full introspection query (416 types) and for real data
    queries (shop { name } returned "Hubble Contacts"). The server labelled the call
    graphql;desc="storefront/query/anonymous". Only customer-scoped fields require a
    customerAccessToken. This is the most open surface on the property and it is
    documented nowhere by Hubble.
- surface: Storefront Product JSON
  base: https://account.hubblecontacts.com
  auth: none
  observed: >-
    GET /products.json, /products/{handle}.json, /collections/{handle}/products.json
    and /search all return HTTP 200 with no credentials.
- surface: UCP Commerce MCP
  base: https://account.hubblecontacts.com/api/ucp/mcp
  auth: ucp-agent-profile
  observed: >-
    Anonymous JSON-RPC returns HTTP 422 / -32001 invalid_profile_url. The gate is a
    registered UCP agent profile URI rather than an OAuth bearer challenge; no
    WWW-Authenticate header was returned. Buyer-side payment is separately gated on
    explicit human approval per Hubble's /agents.md.
- surface: Marketing site
  base: https://www.hubblecontacts.com
  auth: none
  observed: No auth-bearing API surface; no /.well-known/ documents served.
x-evidence:
  fetched: '2026-08-04'
  probes:
  - {url: 'https://account.hubblecontacts.com/.well-known/openid-configuration', http_status: 200}
  - {url: 'https://account.hubblecontacts.com/.well-known/oauth-authorization-server', http_status: 200}
  - {url: 'https://account.hubblecontacts.com/.well-known/oauth-protected-resource', http_status: 200}
  - {url: 'https://account.hubblecontacts.com/api/ucp/mcp', method: POST, http_status: 422}