Appsamurai · OpenAPI Overlay 1.0.0

API Evangelist enhancements — Storyly External API

9 actions 9 updates documentation
Derived by API Evangelist Built from the contracts Appsamurai publishes. Appsamurai did not publish this file.
View Overlay File View on GitHub Overlay Specification

What the actions change

schemarequiredcontactx-apievangelist-docsx-apievangelist-catalogdescriptionx-corsschemas

Targets 9

$.info
$.servers[0]
$.components
$.paths.*.*.responses
$.paths[*][*].parameters[?(@.name=='limit')]
$.paths[*][*].parameters[?(@.name=='offset')]
$.paths[*][*].parameters[?(@.name=='ts_start')]
$.paths[*][*].parameters[?(@.name=='ts_end')]
$.tags

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements — Storyly External API
  version: 1.0.0
x-generated: '2026-08-13'
x-method: generated
x-source: openapi/appsamurai-storyly-external-api-openapi.json
x-notes: >-
  Applies to the provider-published Storyly External API specification harvested
  verbatim from https://docs.storyly.io/openapi/68f9ff1ab2a841f03a72b06b. The
  original is never mutated.
  Every action below records something that is TRUE and OBSERVED but missing
  from the published contract: the two error responses seen live on
  api.storyly.io on 2026-08-13, the pagination constraints the provider states
  as free text in parameter descriptions rather than as schema keywords, and the
  contact/licence metadata the spec leaves empty. Nothing here invents behaviour.
x-extends: openapi/appsamurai-storyly-external-api-openapi.json

actions:
  - target: $.info
    description: Fill in the empty contact block and point at the real documentation.
    update:
      contact:
        name: Storyly Support
        url: https://docs.storyly.io/
      x-apievangelist-docs: https://docs.storyly.io/reference
      x-apievangelist-catalog: https://docs.storyly.io/.well-known/api-catalog

  - target: $.servers[0]
    description: Name the production server and record the observed CORS posture.
    update:
      description: Production
      x-cors:
        access-control-allow-origin: '*'
        access-control-allow-credentials: 'true'
        x-observed: '2026-08-13'

  - target: $.components
    description: >-
      Add the error envelope the API actually returns. The published spec
      declares no schemas at all and no non-2xx responses; this shape was
      recovered by probing api.storyly.io/external/app anonymously (400
      TokenNotFound) and with an invalid bearer (401 InvalidToken).
    update:
      schemas:
        StorylyError:
          type: object
          description: >-
            Vendor error envelope observed on api.storyly.io. Not RFC 9457
            problem+json — content-type is application/json.
          properties:
            status:
              type: string
              description: HTTP status code repeated as a string.
              example: '401'
            request:
              type: string
              description: Opaque 32-character per-request correlation id. Quote this to support.
              example: REDACTED_REQUEST_ID
            error:
              type: object
              properties:
                message:
                  type: string
                  example: Invalid Token
                code:
                  type: string
                  description: Machine-readable PascalCase error code.
                  enum:
                    - TokenNotFound
                    - InvalidToken
          x-apievangelist-method: probed
          x-apievangelist-observed: '2026-08-13'

  - target: $.paths.*.*.responses
    description: >-
      Add the two authentication failures to every operation. All 18 operations
      declare only a 200 today, so a generated client has no failure path at all.
    update:
      '400':
        description: >-
          Bad Request — returned when the Authorization header is absent
          entirely (error.code TokenNotFound). Note this API answers 400, not
          401, for a missing credential.
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StorylyError'
      '401':
        description: Unauthorized — the supplied bearer token is not a valid Storyly JWT (error.code InvalidToken).
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/StorylyError'

  - target: $.paths[*][*].parameters[?(@.name=='limit')]
    description: >-
      Promote the pagination bounds from the free-text description
      ("required=False, min_value=1, max_value=100") into real schema keywords.
    update:
      schema:
        type: integer
        minimum: 1
        maximum: 100
        example: 100

  - target: $.paths[*][*].parameters[?(@.name=='offset')]
    description: Promote the offset bound from free text into schema keywords.
    update:
      schema:
        type: integer
        minimum: 0
        example: 0

  - target: $.paths[*][*].parameters[?(@.name=='ts_start')]
    description: Type the required stats date parameters as dates rather than free strings.
    update:
      required: true
      schema:
        type: string
        format: date
        example: '2026-08-01'

  - target: $.paths[*][*].parameters[?(@.name=='ts_end')]
    description: Type the required stats date parameters as dates rather than free strings.
    update:
      required: true
      schema:
        type: string
        format: date
        example: '2026-08-13'

  - target: $.tags
    description: Record the entity graph these tags sit on, derived in data-model/.
    update:
      - name: app
        description: Apps and websites registered on the account. Root of the content tree.
        x-apievangelist-datamodel: data-model/appsamurai-data-model.yml
      - name: instance
        description: Placement containers within an app. listInstances requires app_id.
      - name: story-group
        description: Story groups within an instance. getStoryGroups requires instance_id.
      - name: story
        description: Stories within a story group. getStories requires story_group_id.
      - name: audience
        description: Targetable audiences. Can be created but never deleted via the API.
      - name: segment
        description: String labels used for targeting. Keyed and deleted by label, not by id.

Work with this as data

Every overlay here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for openapi overlays

4 MCP tools reach this
  • find_overlaysBrowse and filter every overlay in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This overlay
curl "https://apis.io/api/v1/overlays/appsamurai-storyly-external-api-overlay"
All openapi overlays
curl "https://apis.io/api/v1/overlays?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.