listmonk · OpenAPI Overlay 1.0.0

API Evangelist enhancements for the listmonk OpenAPI

7 actions 7 updates security extends ../openapi/_original/listmonk-collections-openapi.yml
Generated by API Evangelist Written by API Evangelist tooling for listmonk's API. It is a proposal applied on top of the contract, not a document listmonk publishes.
View Overlay File View on GitHub Overlay Specification

What the actions change

x-application-versionx-api-evangelist-notecontactlicenseexternalDocssecuritysecuritySchemesError

Targets 7

$.info
$
$.servers
$.components
$.components.schemas
$.paths.*[?(@.responses)]
$.tags

OpenAPI Overlay

Raw ↑
# authorship: generated by API Evangelist tooling. Stamped 2026-08-18
# on the file's own generator header (roadmap#64). An unmarked file is
# NOT assumed to be ours -- absence of evidence was never stamped.
x-method: generated
overlay: 1.0.0
info:
  title: API Evangelist enhancements for the listmonk OpenAPI
  version: 1.0.0
  x-generated: '2026-08-13'
  x-method: generated
  x-source: >-
    Generated by API Evangelist against listmonk's own OpenAPI 3.0.0
    (https://listmonk.app/docs/swagger/collections.yaml, captured verbatim to
    openapi/_original/listmonk-collections-openapi.yml). Every value added here
    is documented by listmonk in prose — at /docs/apis/apis/,
    /docs/roles-and-permissions/ and /docs/installation/ — but is absent from the
    machine-readable contract. The overlay closes that gap without mutating the
    original.
  x-rationale: >-
    Three real gaps in listmonk's published spec: (1) it declares no
    securitySchemes and no security requirement at all, so a generated client
    ships with no auth; (2) it documents only 200 responses across all 72
    operations, so no generated client knows what a failure looks like; (3) its
    only concrete server is http://localhost:9000/api, which is correct for a
    default install but does not say that a real deployment substitutes its own
    host over https.
extends: ../openapi/_original/listmonk-collections-openapi.yml
actions:
  - target: $.info
    description: Point consumers at the canonical documentation and record the application version the spec tracks.
    update:
      x-application-version: '6.2.0'
      x-api-evangelist-note: >-
        info.version in the upstream document is 1.0.0 and tracks the spec file,
        not the application. The API is not versioned independently of listmonk
        itself.
      contact:
        name: listmonk
        url: https://listmonk.app/docs/apis/apis/
      license:
        name: AGPL-3.0
        url: https://github.com/knadh/listmonk/blob/master/LICENSE

  - target: $
    description: >-
      Add the templated https server that a real deployment uses, alongside the
      upstream localhost default, and declare a default security requirement.
    update:
      externalDocs:
        description: listmonk API documentation
        url: https://listmonk.app/docs/apis/apis/
      security:
        - BasicAuth: []
        - TokenAuth: []

  - target: $.servers
    description: Append a templated self-hosted server. The upstream localhost entry is left in place.
    update:
      - url: 'https://{host}/api'
        description: >-
          Self-hosted listmonk instance. Substitute the operator's own hostname.
          listmonk operates no shared API host.
        variables:
          host:
            default: localhost:9000
            description: Hostname of the listmonk deployment.

  - target: $.components
    description: >-
      Declare the two authentication schemes listmonk documents at
      /docs/apis/apis/ but does not express in the spec.
    update:
      securitySchemes:
        BasicAuth:
          type: http
          scheme: basic
          description: >-
            HTTP Basic auth with an API user name and its generated token
            (api_user:token). Example: curl -u "api_user:token"
            http://localhost:9000/api/lists
        TokenAuth:
          type: apiKey
          in: header
          name: Authorization
          description: >-
            Authorization header in the form `token api_user:token`. Example:
            curl -H "Authorization: token api_user:token"
            http://localhost:9000/api/lists

  - target: $.components.schemas
    description: >-
      Add the error envelope listmonk documents in prose. The upstream spec
      describes no failure shape anywhere.
    update:
      Error:
        type: object
        required:
          - message
        properties:
          message:
            type: string
            description: Human-readable error message. The only guaranteed field on a failure.
            example: invalid session
          data:
            type: object
            nullable: true
            description: Optional additional payload accompanying the error.

  - target: $.paths.*[?(@.responses)]
    description: >-
      Attach the common failure responses from listmonk's published error table
      to every operation. None of these appear in the upstream spec.
    update:
      responses:
        '400':
          description: Missing or bad request parameters or values.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: >-
            Session expired or invalidated; must re-authenticate. NOTE listmonk
            returns 403, not 401, for a missing or invalid API credential, and
            sends no WWW-Authenticate challenge.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Requested resource was not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '422':
          description: Unprocessable entity — the request contains invalid data.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            Too many requests (rate limiting). No RateLimit-* or Retry-After
            header accompanies this response.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Something unexpected went wrong.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'

  - target: $.tags
    description: Cross-reference the derived API Evangelist artifacts from the tag set.
    update:
      - name: Subscribers
        x-artifacts:
          data-model: ../data-model/listmonk-data-model.yml
          conventions: ../conventions/listmonk-conventions.yml
      - name: Bounces
        x-artifacts:
          asyncapi: ../asyncapi/listmonk-bounce-webhooks-asyncapi.yml