Appsamurai · Authentication Profile

Appsamurai Authentication

Authentication

Appsamurai secures its APIs with http-bearer and apiKey across 2 declared security schemes, as derived from its OpenAPI definitions.

CompanyMobileAdvertisingUser AcquisitionMarketingApp GrowthAttributionAnalyticsMobile MarketingSDKStorylyContent ExperienceIn-App StoriesMCPMobile Commerce
Methods: http-bearer, apiKey Schemes: 2 OAuth flows: API key in: path

Security Schemes

bearerAuth http
scheme: bearer · in: header ()
PathApiKey apiKey
· in: path (api_key)

Source

Authentication Profile

Raw ↑
generated: '2026-08-13'
method: searched
source: >-
  https://docs.storyly.io/reference +
  openapi/appsamurai-storyly-external-api-openapi.json +
  https://help.appsamurai.com/en/articles/11105087-appsamurai-campaign-spend-api
  + live 400/401 probes of api.storyly.io (2026-08-13)
docs: https://docs.storyly.io/reference
summary:
  types: [http-bearer, apiKey]
  api_key_in: [path]
  bearer_formats: [JWT]
  oauth2_flows: []
  openid_connect: false
  mtls: false
  notes: >-
    Two APIs, two unrelated credentials, neither self-service. The Storyly
    External API takes a bearer JWT; the AppSamurai Campaign Spend API takes an
    account-scoped key embedded in the URL path. There is no OAuth, no OIDC, no
    scope model and no documented token-issuance endpoint anywhere in App
    Samurai's surface - both credentials are obtained out of band.
    The MCP server is the outlier and the only unauthenticated surface:
    mcp.storyly.io answered tools/list and tools/call anonymously.

schemes:
  - name: bearerAuth
    api: Storyly External API
    type: http
    scheme: bearer
    bearer_format: JWT
    in: header
    header: Authorization
    applies_to: all 18 operations (declared per-operation, not as a root security requirement)
    issuance: >-
      Not documented publicly. No token endpoint appears in the OpenAPI, and
      docs.storyly.io publishes no token/credentials page - the JWT is obtained
      from the Storyly dashboard or an account contact.
    rotation: not documented
    expiry: not documented
    sources:
      - openapi/appsamurai-storyly-external-api-openapi.json
    docs: https://docs.storyly.io/reference
    observed_behaviour:
      method: probed
      checked: '2026-08-13'
      probes:
        - request: GET https://api.storyly.io/external/app with no Authorization header
          status: 400
          body_code: TokenNotFound
          note: A missing credential returns 400, not the conventional 401.
        - request: GET https://api.storyly.io/external/app with an invalid bearer token
          status: 401
          body_code: InvalidToken
    gaps:
      - The spec declares no 401/403 responses, so a generated client has no failure path.
      - No token lifetime, refresh or revocation is documented.

  - name: PathApiKey
    api: AppSamurai Campaign Spend API
    type: apiKey
    in: path
    parameter: api_key
    path_template: /api/customer-pull/spent/{api_key}
    issuance: manual (provided by an AppSamurai account manager)
    rotation: not documented
    sources:
      - openapi/appsamurai-campaign-spend-api-openapi.yml
    docs: https://help.appsamurai.com/en/articles/11105087-appsamurai-campaign-spend-api
    risk:
      credential_in_url: true
      documented_over_http: true
      note: >-
        A secret in a path segment is written to every proxy log, browser history
        and referrer along the route, and the published base URL is http://, not
        https://. It also cannot be rotated by the customer. See
        security/appsamurai-domain-security.yml.
    modelling_note: >-
      Represented in the OpenAPI as apiKey/in:query because OpenAPI 3.x has no
      in:path security scheme. The real placement is a path segment.

unauthenticated_surfaces:
  - name: Storyly Integration MCP server
    url: https://mcp.storyly.io/mcp
    auth: none
    verified: probed
    checked: '2026-08-13'
    note: >-
      tools/list and tools/call both answered anonymously. No OAuth challenge,
      and no /.well-known/oauth-authorization-server or
      /.well-known/oauth-protected-resource is served (both 404). It exposes
      documentation content only, not customer data.
  - name: Storyly External API OpenAPI
    url: https://docs.storyly.io/openapi/68f9ff1ab2a841f03a72b06b
    note: The specification is public; the operations it describes are not.

scopes:
  model: none
  note: >-
    Neither credential carries scopes, roles or permissions. The Storyly JWT is
    account-wide - any holder can create and delete story groups, stories and
    segments across every app on the account. No scopes/ artifact is emitted
    because there is nothing to enumerate.