AdReady (CPXi) · Authentication Profile

Adready Cpxi Authentication

Authentication

AdReady (CPXi) secures its APIs with session-jwt across 1 declared security scheme, as derived from its OpenAPI definitions.

CompanyCommerceAdvertisingAdTechMarketingProgrammaticMediaMedia PlanningCampaign ManagementAttributionConnected TVAd OperationsMeasurementAgencies
Methods: session-jwt Schemes: 1 OAuth flows: API key in:

Security Schemes

SessionJWT http
scheme: bearer

Source

Authentication Profile

Raw ↑
generated: '2026-08-12'
method: derived
source: openapi/adready-cpxi-kickstart-openapi.yml + live unauthenticated probes of https://platform.digitalremedy.com
note: >-
  The published OpenAPI declares NO components.securitySchemes and NO top-level or per-operation
  security[] requirements, so nothing here is derived from a declared scheme. The auth model below is
  reconstructed from the authentication and token operations the spec DOES describe, corroborated by
  live unauthenticated probes: every business path returns HTTP 401 with an empty body, while
  /version, /health-check, /api/version, /api/theme and /api/config answer 200 anonymously.
  This gap between the deployed enforcement and the described contract is the finding — an agent
  reading this spec alone cannot tell that the API requires authentication, or how to obtain a token.

summary:
  types:
  - session-jwt
  api_key_in: []
  oauth2_flows: []
  declared_in_spec: false
  enforced_at_runtime: true

schemes:
- name: SessionJWT
  type: http
  scheme: bearer
  bearer_format: JWT
  declared_in_openapi: false
  status: undeclared-but-enforced
  description: >-
    A session JSON Web Token issued by POST /api/auth/login and managed by the token-controller
    operations. The spec does not describe where the credential is carried (header vs cookie); the
    login response is typed only as a bare object, and the browser client sets
    axios withCredentials true, which is consistent with a cookie-borne session. Confirming the exact
    carrier requires an authenticated session and was not attempted.
  sources:
  - openapi/adready-cpxi-kickstart-openapi.yml

credential_operations:
- operationId: authenticateUser
  method: post
  path: /api/auth/login
  purpose: Exchange email + password for a session token
  request_schema: LoginRequest
  request_fields:
  - email (string, format email, required)
  - password (string, required)
  query_parameters:
  - name: app
    required: true
    type: integer
    note: Application discriminator; the spec documents no enumeration of valid values.
- operationId: authenticatePlusUser
  method: post
  path: /api/auth/plus_login
  purpose: Login path for the legacy AdReady+ (plus.adready.com) application
- operationId: loginAhUser
  method: post
  path: /api/auth/loginC360User
  purpose: Login path for Compulse 360 (C360) users, following the Compulse / Digital Remedy combination
- operationId: refreshToken
  method: get
  path: /api/token/refresh
  purpose: Refresh the session token
  response_schema: ApiResponseTokenWrapper
- operationId: parseJwtToken
  method: get
  path: /api/token/parse
  purpose: Parse and inspect the current JWT
- operationId: removeJwtToken
  method: delete
  path: /api/token/remove
  purpose: Invalidate the session token (logout)

password_lifecycle_operations:
- {operationId: createPassword, method: post, path: /api/auth/forgot_password}
- {operationId: createPassword_1, method: post, path: /api/auth/create_password}
- {operationId: ResetPassword, method: post, path: /api/auth/reset_password}
- {operationId: validateResetPasswordToken, method: post, path: /api/auth/validate_token}
- {operationId: sendVerificationEmail, method: post, path: /api/sendVerificationEmail}

delegated_analytics_tokens:
  note: >-
    The API mints short-lived tokens for embedded third-party analytics surfaces rather than exposing
    those systems directly. These are outbound delegation, not inbound API authentication.
  operations:
  - {operationId: tableauJwtToken, path: '/api/token/tableau', target: Tableau}
  - {operationId: tableauJwtTokenByAccount, path: '/api/token/tableau/account/{accountId}', target: Tableau}
  - {operationId: tableauJwtToken_1, path: '/api/token/tableau/{advertiserId}', target: Tableau}
  - {operationId: tableauSignInTokenByAdvertiser, path: '/api/token/tableau/sign/{advertiserId}', target: Tableau}
  - {operationId: generateThoughtSpotToken, path: '/api/token/thoughtSpot', target: ThoughtSpot}

anonymous_operations:
  note: Observed 200 without credentials on 2026-08-12.
  paths:
  - {path: /version, status: 200, returns: build metadata (version, git revision, build time)}
  - {path: /api/version, status: 200, returns: build metadata}
  - {path: /health-check, status: 200, returns: 'plain text: server is up'}
  - {path: /api/theme, status: 200, returns: white-label theme CSS}
  - {path: /api/config, status: 200, returns: client bootstrap configuration}
  - {path: /v3/api-docs, status: 200, returns: the OpenAPI 3.1 description itself}
  - {path: /swagger-ui.html, status: 200, returns: Swagger UI}

runtime_evidence:
- {url: 'https://platform.digitalremedy.com/api/users/1', status: 401, body_length: 0, www_authenticate: absent}
- {url: 'https://platform.digitalremedy.com/config', status: 401, body_length: 0}
- {url: 'https://platform.digitalremedy.com/version', status: 200}
- {url: 'https://platform.digitalremedy.com/v3/api-docs', status: 200}

gaps:
- No securitySchemes declared in the OpenAPI, so no operation states its auth requirement.
- The 401 response carries no body and no WWW-Authenticate challenge header.
- Only one operation in 355 documents a 401 response and only one documents a 403.
- No OAuth 2.0, no OpenID Connect, no API keys, and therefore no scope surface.
- No public sign-up: credentials are provisioned by Digital Remedy, not self-served.