Qeen.AI · Authentication Profile

Qeenai Authentication

Authentication

Qeen.AI secures its APIs with apiKey and cookie across 3 declared security schemes, as derived from its OpenAPI definitions.

CompanyAiMarketingEcommerceAdvertisingMENAAnalyticsPersonalizationMobile SDKContent OptimizationSearchAttribution
Methods: apiKey, cookie Schemes: 3 OAuth flows: API key in: sdk-configuration

Security Schemes

MobileSDKApiKey apiKey
· in: sdk-configuration (apiKey)
WebSDKProjectBinding apiKey
· in: script-url (path segment: /qeen-script/{hash(pageUrl)}{hash(userDeviceId)})
CustomerPlatformSession cookie
· in: cookie ()

Source

Authentication Profile

qeenai-authentication.yml Raw ↑
generated: '2026-08-12'
method: searched
source: >-
  https://github.com/fodoole/qeen-mobile-sdk-ios (README + published .swiftinterface),
  https://github.com/fodoole/qeen-maven (README), https://cdn.qeen.ai/sdk/qeen.js,
  and live unauthenticated probes of https://users.qeen.ai/api/v1/* on 2026-08-12
docs: https://github.com/fodoole/qeen-mobile-sdk-ios#usage
note: >-
  Qeen publishes no OpenAPI, so nothing here is derived from a spec. Every scheme below is read
  from a first-party artifact the company distributes publicly (its SDK source, its SDK READMEs)
  or observed on a live unauthenticated request. Credentials themselves are NOT self-serve:
  both mobile READMEs state the host and API key "are shared privately by email — contact
  tech@qeen.ai", so there is no public key-issuance flow to document.

summary:
  types: [apiKey, cookie]
  api_key_in: [sdk-configuration]
  oauth2_flows: []
  oauth2: false
  openid_connect: false
  mutual_tls: false
  self_serve_credentials: false
  credential_request_channel: tech@qeen.ai

schemes:
  - name: MobileSDKApiKey
    type: apiKey
    in: sdk-configuration
    parameter: apiKey
    surface: Qeen Mobile Analytics SDK (iOS + Android)
    signature: 'QeenSDK.configure(apiKey: String, host: String, debug: Bool = false, options: [String: Any] = [:])'
    sources: [packages/qeenai-ios-sdk-interface.swiftinterface]
    note: >-
      The key is paired with a customer-provisioned `host` — the SDK has no default ingestion
      endpoint. The compiled framework binary names only PostHog's own asset hosts
      (us.i.posthog.com, eu.i.posthog.com and their asset siblings), consistent with the README's
      statement that PostHog is "baked INTO the framework and hidden"; the customer's `host` is
      the PostHog-compatible ingestion endpoint Qeen provisions for that account.
    key_prefix: null
    key_prefix_note: not published
    rotation: not documented

  - name: WebSDKProjectBinding
    type: apiKey
    in: script-url
    parameter: 'path segment: /qeen-script/{hash(pageUrl)}{hash(userDeviceId)}'
    surface: Qeen Web SDK loader (https://cdn.qeen.ai/loader/main.js)
    sources: [https://cdn.qeen.ai/loader/main.js, https://cdn.qeen.ai/sdk/qeen.js]
    note: >-
      The browser loader carries no secret. It derives a 7-character non-cryptographic hash (a
      djb2-style rolling hash, base-32, zero-padded) of the page URL and of a device id persisted
      in localStorage under "fodoole_uid", and requests the content-replacement script at
      fodoole-web-analytics-qfan6cresq-ew.a.run.app/qeen-script/{hash}. Project and website
      identity (projectId, websiteId, contentServingId) then arrive from the server in the client
      config rather than being embedded in the page. This is site-binding, not authentication —
      there is no bearer credential on the browser data plane.

  - name: CustomerPlatformSession
    type: cookie
    in: cookie
    surface: https://users.qeen.ai/api/v1/
    framework: Django REST Framework
    sources: [live probe]
    note: >-
      The customer web application (app.qeen.ai, a Nuxt SPA) calls its backend at users.qeen.ai
      with credentials:"include". Token lifecycle endpoints are POST /api/v1/auth/verify-token/
      and POST /api/v1/auth/refresh-token/. Unauthenticated requests to business endpoints return
      DRF's standard 401 body {"detail":"Authentication credentials were not provided."}. This is
      the product's own session surface, not a developer API — no key issuance, no scopes, no
      public documentation.
    evidence:
      - {url: 'https://users.qeen.ai/api/v1/core/websites', status: 401, body: '{"detail":"Authentication credentials were not provided."}'}
      - {url: 'https://users.qeen.ai/api/v1/subscriptions/products', status: 401, body: '{"detail":"Authentication credentials were not provided."}'}
      - {url: 'https://users.qeen.ai/api/v1/auth/verify-token/', status: 400, body: '{"valid":false,"message":"... Token is required. ..."}'}
      - {url: 'https://users.qeen.ai/api/v1/auth/verify-token/', method: GET, status: 405, body: '{"detail":"Method \"GET\" not allowed."}'}

unauthenticated_surfaces:
  - url: https://fodoole-web-analytics-qfan6cresq-ew.a.run.app/search-results
    status: 400
    body: '{"error":"Empty search query provided"}'
    note: >-
      Answers anonymously and validates input rather than rejecting on auth — the embedded search
      widget's backing endpoint takes no credential from the browser.
  - url: https://fodoole-web-analytics-qfan6cresq-ew.a.run.app/sdk/client-config
    status: 400
    body: 'Unsupported URL'
    note: Anonymous; requires site/page parameters the loader supplies.

not_found:
  - oauth2 authorization server
  - openid-connect discovery
  - scoped access tokens
  - public API key self-service / developer portal
  - mTLS