StoryTap · Authentication Profile

Storytap Authentication

Authentication

StoryTap declares 2 security scheme(s) across its OpenAPI definitions.

CompanyVideoTestimonialsUser Generated ContentMarketingReviewsVideo TestimonialsSaaS
Methods: Schemes: 2 OAuth flows: API key in:

Security Schemes

k apiKey
· in: body ()
unknown
· in: unknown ()

Source

Authentication Profile

storytap-authentication.yml Raw ↑
generated: '2026-08-13'
method: probed
source: >-
  Request construction read from StoryTap's public embed loader
  https://cdn1aws.storytap.com/storytap-videos-2.js and confirmed against live
  responses from https://api.storytap.com/w/*. derive-authentication.py produced
  nothing because StoryTap publishes no OpenAPI to derive securitySchemes from.
docs: null
docs_note: StoryTap publishes no authentication documentation on any host.
summary: >-
  The only StoryTap API surface reachable without credentials authenticates with
  a PUBLIC per-embed key carried in the JSON request body — not a header, not a
  bearer token, and not a secret. The authenticated Enterprise platform API has
  no publicly documented authentication scheme at all.
schemes:
  - id: embed-public-key
    type: apiKey
    in: body
    name: k
    aliases: [key]
    companion_parameters:
      - {name: eid, meaning: embed id — identifies which embed/brand the request is for}
      - {name: storeId, meaning: optional store scope}
      - {name: origin, meaning: window.location.hostname, added by the loader}
      - {name: source, meaning: full page URL, added by the loader}
    applies_to:
      - POST https://api.storytap.com/w/get-embed
      - POST https://api.storytap.com/w/answer
      - POST https://api.storytap.com/w/question
      - POST https://api.storytap.com/w/v-feedback
      - POST https://api.storytap.com/w/event-queue
    secrecy: public
    note: >-
      The key is published in the host page's embed markup, so any site visitor
      can read it. It scopes a request to a brand's embed rather than
      authenticating a principal. CORS is fully open
      (access-control-allow-origin: *), so the practical control is the
      origin/source values the loader supplies, which a caller can set freely.
      Treat this as identification, not authentication.
  - id: enterprise-platform-api
    type: unknown
    in: unknown
    applies_to: 'StoryTap Enterprise REST API (campaigns, brands, invites, events)'
    evidence: >-
      Existence is established by StoryTap's own Zapier app,
      StoryTapCLIAPI@1.6.1 (https://zapier.com/apps/storytap/integrations), which
      necessarily authenticates to a StoryTap account. The listing does not
      disclose the auth type, and StoryTap publishes no auth documentation, so
      nothing further is asserted here.
negative_findings:
  - {check: OAuth 2.0 authorization server metadata, url: 'https://api.storytap.com/.well-known/oauth-authorization-server', status: 404}
  - {check: OAuth 2.0 protected resource metadata, url: 'https://api.storytap.com/.well-known/oauth-protected-resource', status: 404}
  - {check: OpenID Connect discovery, url: 'https://app.storytap.com/.well-known/openid-configuration', status: 404}
  - {check: Authorization header accepted, result: 'not used by the client and not required by the server'}
  - {check: mTLS, result: not offered}
oauth_scopes: none
x-evidence:
  fetched: '2026-08-13'
  probes:
    - {url: 'https://api.storytap.com/w/get-embed', method: POST, status: 200, body: '{"error":"Missing required data"}'}
    - {url: 'https://api.storytap.com/w/get-embed', method: OPTIONS, status: 200, note: 'access-control-allow-origin: *; allow-methods GET,POST'}