KurrentDB HTTP API

KurrentDB exposes a native AtomPub-over-HTTP interface alongside its primary gRPC protocol, covering stream append and read, persistent (competing consumer) subscriptions, projections, user administration, node administration, statistics and cluster gossip. Authentication is HTTP Basic with per-stream access control lists. The base URL is your own KurrentDB node or Kurrent Cloud cluster, which serves the HTTP API on port 2113 by default.

OpenAPI Specification

kurrent-kurrentdb-http-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: KurrentDB HTTP API
  version: v26.1
  summary: AtomPub-over-HTTP interface to KurrentDB streams, subscriptions, projections, users and node administration.
  description: >-
    KurrentDB (formerly EventStoreDB) exposes a native AtomPub-over-HTTP interface alongside its
    primary gRPC protocol. This OpenAPI description is an API Evangelist transcription of the
    provider's published HTTP API Reference at
    https://docs.kurrent.io/server/v26.1/http-api/api.html — Kurrent does not publish an OpenAPI
    document of its own. Paths, methods, custom headers, media types and status codes are taken
    from that reference; nothing has been invented. The base URL is the address of your own
    KurrentDB node or Kurrent Cloud cluster (the same URL you use for the admin UI), which listens
    on port 2113 by default.
  contact:
    name: Kurrent
    url: https://www.kurrent.io/
  license:
    name: Kurrent License
    url: https://www.kurrent.io/terms-of-use
  x-apievangelist-provenance:
    generated: '2026-07-19'
    method: generated
    source: https://docs.kurrent.io/server/v26.1/http-api/api.html
    note: >-
      Faithful transcription of the provider's published HTTP API reference table. Operation
      summaries mirror the reference; request/response schemas are intentionally left open where
      the provider does not publish them.
externalDocs:
  description: KurrentDB HTTP API documentation
  url: https://docs.kurrent.io/server/v26.1/http-api/introduction.html
servers:
  - url: https://{host}:{port}
    description: Your KurrentDB node or Kurrent Cloud cluster
    variables:
      host:
        default: localhost
        description: Hostname of the KurrentDB node (the same host you use for the admin UI)
      port:
        default: '2113'
        description: KurrentDB HTTP port
security:
  - basicAuth: []
tags:
  - name: Streams
    description: Append to, read from and manage event streams
  - name: Subscriptions
    description: Persistent (competing consumer) subscription management and consumption
  - name: Projections
    description: Create, manage and query projections
  - name: Admin
    description: Node administration operations
  - name: Info
    description: Node information and configuration
  - name: Users
    description: User account management
  - name: Statistics
    description: Node statistics
  - name: Gossip
    description: Cluster gossip
paths:
  /streams/{stream}:
    parameters:
      - $ref: '#/components/parameters/Stream'
    get:
      tags: [Streams]
      operationId: readStream
      summary: Read events from a stream
      parameters:
        - $ref: '#/components/parameters/RequireLeader'
      responses:
        '200': { $ref: '#/components/responses/StreamFeed' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
    post:
      tags: [Streams]
      operationId: appendToStream
      summary: Append one or more events to a stream
      parameters:
        - $ref: '#/components/parameters/ExpectedVersion'
        - $ref: '#/components/parameters/EventType'
        - $ref: '#/components/parameters/EventId'
        - $ref: '#/components/parameters/RequireLeader'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/EventBatch' }
          application/vnd.kurrent.events+json:
            schema: { $ref: '#/components/schemas/EventBatch' }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '307': { description: Temporary Redirect — the request must be forwarded to the leader node }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    delete:
      tags: [Streams]
      operationId: deleteStream
      summary: Delete a stream
      parameters:
        - $ref: '#/components/parameters/ExpectedVersion'
        - $ref: '#/components/parameters/RequireLeader'
      responses:
        '204': { description: No Content — the stream was deleted }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /streams/{stream}/incoming/{guid}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - name: guid
        in: path
        required: true
        description: Client-generated event id, used as the idempotency key for this append
        schema: { type: string, format: uuid }
    post:
      tags: [Streams]
      operationId: appendEventToStreamIdempotent
      summary: Append a single event using a client-supplied event id (idempotent append URL)
      parameters:
        - $ref: '#/components/parameters/ExpectedVersion'
        - $ref: '#/components/parameters/EventType'
      requestBody:
        required: true
        content:
          application/json:
            schema: { type: object, description: The event body }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /streams/{stream}/metadata:
    parameters:
      - $ref: '#/components/parameters/Stream'
    get:
      tags: [Streams]
      operationId: readStreamMetadata
      summary: Read the metadata of a stream
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
    post:
      tags: [Streams]
      operationId: updateStreamMetadata
      summary: Update the metadata of a stream
      parameters:
        - $ref: '#/components/parameters/ExpectedVersion'
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/StreamMetadata' }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /streams/{stream}/{event}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/EventNumber'
    get:
      tags: [Streams]
      operationId: readEvent
      summary: Read a single event from a stream
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /streams/{stream}/{event}/{count}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/EventNumber'
      - $ref: '#/components/parameters/Count'
    get:
      tags: [Streams]
      operationId: readEvents
      summary: Read a page of events from a stream starting at an event number
      responses:
        '200': { $ref: '#/components/responses/StreamFeed' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /streams/{stream}/{event}/backward/{count}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/EventNumber'
      - $ref: '#/components/parameters/Count'
    get:
      tags: [Streams]
      operationId: readEventsBackward
      summary: Page backward through a stream from an event number
      responses:
        '200': { $ref: '#/components/responses/StreamFeed' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /streams/{stream}/{event}/forward/{count}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/EventNumber'
      - $ref: '#/components/parameters/Count'
    get:
      tags: [Streams]
      operationId: readEventsForward
      summary: Page forward through a stream from an event number
      responses:
        '200': { $ref: '#/components/responses/StreamFeed' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /streams/$all:
    get:
      tags: [Streams]
      operationId: readAllStream
      summary: Read events from the $all stream
      parameters:
        - $ref: '#/components/parameters/RequireLeader'
      responses:
        '200': { $ref: '#/components/responses/StreamFeed' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions:
    get:
      tags: [Subscriptions]
      operationId: listSubscriptions
      summary: List all persistent subscriptions
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}:
    parameters:
      - $ref: '#/components/parameters/Stream'
    get:
      tags: [Subscriptions]
      operationId: listSubscriptionsForStream
      summary: List the persistent subscriptions on a stream
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
    get:
      tags: [Subscriptions]
      operationId: readSubscription
      summary: Read events from a persistent subscription
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    put:
      tags: [Subscriptions]
      operationId: createSubscription
      summary: Create a persistent subscription
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/PersistentSubscriptionSettings' }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    post:
      tags: [Subscriptions]
      operationId: updateSubscription
      summary: Update a persistent subscription
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/PersistentSubscriptionSettings' }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    delete:
      tags: [Subscriptions]
      operationId: deleteSubscription
      summary: Delete a persistent subscription
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}/info:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
    get:
      tags: [Subscriptions]
      operationId: getSubscriptionInfo
      summary: Get details of a persistent subscription
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}/{count}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
      - $ref: '#/components/parameters/Count'
    get:
      tags: [Subscriptions]
      operationId: readSubscriptionEvents
      summary: Read a number of events from a persistent subscription
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}/ack:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
    post:
      tags: [Subscriptions]
      operationId: ackMessages
      summary: Acknowledge a set of messages
      parameters:
        - name: ids
          in: query
          required: true
          description: Comma-separated list of message ids to acknowledge
          schema: { type: string }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}/ack/{messageid}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
      - $ref: '#/components/parameters/MessageId'
    post:
      tags: [Subscriptions]
      operationId: ackMessage
      summary: Acknowledge a single message
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}/nack:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
    post:
      tags: [Subscriptions]
      operationId: nackMessages
      summary: Negatively acknowledge a set of messages
      parameters:
        - name: ids
          in: query
          required: true
          description: Comma-separated list of message ids to negatively acknowledge
          schema: { type: string }
        - $ref: '#/components/parameters/NackAction'
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}/nack/{messageid}:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
      - $ref: '#/components/parameters/MessageId'
    post:
      tags: [Subscriptions]
      operationId: nackMessage
      summary: Negatively acknowledge a single message
      parameters:
        - $ref: '#/components/parameters/NackAction'
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /subscriptions/{stream}/{subscription}/replayParked:
    parameters:
      - $ref: '#/components/parameters/Stream'
      - $ref: '#/components/parameters/Subscription'
    post:
      tags: [Subscriptions]
      operationId: replayParkedMessages
      summary: Replay the parked messages of a persistent subscription
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projections/any:
    get:
      tags: [Projections]
      operationId: listAllProjections
      summary: List all projections
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projections/all-non-transient:
    get:
      tags: [Projections]
      operationId: listNonTransientProjections
      summary: List all non-transient projections
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projections/transient:
    get:
      tags: [Projections]
      operationId: listTransientProjections
      summary: List all transient projections
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    post:
      tags: [Projections]
      operationId: createTransientProjection
      summary: Create a transient projection
      parameters:
        - $ref: '#/components/parameters/ProjectionName'
      requestBody: { $ref: '#/components/requestBodies/ProjectionQuery' }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projections/onetime:
    get:
      tags: [Projections]
      operationId: listOneTimeProjections
      summary: List all one-time projections (queries)
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    post:
      tags: [Projections]
      operationId: createOneTimeProjection
      summary: Create a one-time projection
      requestBody: { $ref: '#/components/requestBodies/ProjectionQuery' }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projections/continuous:
    get:
      tags: [Projections]
      operationId: listContinuousProjections
      summary: List all continuous projections
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    post:
      tags: [Projections]
      operationId: createContinuousProjection
      summary: Create a continuous projection
      parameters:
        - $ref: '#/components/parameters/ProjectionName'
        - name: emit
          in: query
          description: Whether the projection is allowed to emit events
          schema: { type: boolean }
      requestBody: { $ref: '#/components/requestBodies/ProjectionQuery' }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projections/read-events:
    post:
      tags: [Projections]
      operationId: readProjectionEvents
      summary: Query the events of a projection
      requestBody:
        required: true
        content:
          application/json:
            schema: { type: object }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projection/{name}:
    parameters:
      - $ref: '#/components/parameters/Name'
    get:
      tags: [Projections]
      operationId: getProjection
      summary: Get the details of a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
    delete:
      tags: [Projections]
      operationId: deleteProjection
      summary: Delete a projection
      responses:
        '204': { description: No Content — the projection was deleted }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /projection/{name}/query:
    parameters:
      - $ref: '#/components/parameters/Name'
    get:
      tags: [Projections]
      operationId: getProjectionQuery
      summary: Get the definition of a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
    put:
      tags: [Projections]
      operationId: updateProjectionQuery
      summary: Update the definition of a projection
      requestBody: { $ref: '#/components/requestBodies/ProjectionQuery' }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projection/{name}/state:
    parameters:
      - $ref: '#/components/parameters/Name'
    get:
      tags: [Projections]
      operationId: getProjectionState
      summary: Get the state of a projection
      parameters:
        - $ref: '#/components/parameters/Partition'
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /projection/{name}/result:
    parameters:
      - $ref: '#/components/parameters/Name'
    get:
      tags: [Projections]
      operationId: getProjectionResult
      summary: Get the result of a projection
      parameters:
        - $ref: '#/components/parameters/Partition'
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /projection/{name}/statistics:
    parameters:
      - $ref: '#/components/parameters/Name'
    get:
      tags: [Projections]
      operationId: getProjectionStatistics
      summary: Get the statistics of a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /projection/{name}/config:
    parameters:
      - $ref: '#/components/parameters/Name'
    get:
      tags: [Projections]
      operationId: getProjectionConfig
      summary: Get the configuration of a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
    put:
      tags: [Projections]
      operationId: updateProjectionConfig
      summary: Update the configuration of a projection
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/ProjectionConfig' }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /projection/{name}/command/enable:
    parameters:
      - $ref: '#/components/parameters/Name'
    post:
      tags: [Projections]
      operationId: enableProjection
      summary: Enable a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /projection/{name}/command/disable:
    parameters:
      - $ref: '#/components/parameters/Name'
    post:
      tags: [Projections]
      operationId: disableProjection
      summary: Disable a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /projection/{name}/command/reset:
    parameters:
      - $ref: '#/components/parameters/Name'
    post:
      tags: [Projections]
      operationId: resetProjection
      summary: Reset a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /projection/{name}/command/abort:
    parameters:
      - $ref: '#/components/parameters/Name'
    post:
      tags: [Projections]
      operationId: abortProjection
      summary: Abort a projection
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /admin/shutdown:
    post:
      tags: [Admin]
      operationId: shutdownNode
      summary: Shut down the node
      responses:
        '200': { description: OK — shutdown initiated }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /admin/node/resign:
    post:
      tags: [Admin]
      operationId: resignNode
      summary: Resign leadership of the node
      responses:
        '200': { description: OK — the node resigned leadership }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /admin/scavenge:
    post:
      tags: [Admin]
      operationId: startScavenge
      summary: Start a scavenge operation
      parameters:
        - name: startFromChunk
          in: query
          description: Chunk number to start scavenging from
          schema: { type: integer }
        - name: threads
          in: query
          description: Number of threads to use for the scavenge
          schema: { type: integer }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /admin/scavenge/{scavengeId}:
    parameters:
      - name: scavengeId
        in: path
        required: true
        description: Identifier of the running scavenge operation
        schema: { type: string }
    delete:
      tags: [Admin]
      operationId: stopScavenge
      summary: Stop a running scavenge operation
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /admin/mergeindexes:
    post:
      tags: [Admin]
      operationId: mergeIndexes
      summary: Merge the node indexes
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /info:
    get:
      tags: [Info]
      operationId: getNodeInfo
      summary: Get information about the node
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /info/options:
    get:
      tags: [Info]
      operationId: getNodeOptions
      summary: Get the configuration options of the node
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /users/:
    get:
      tags: [Users]
      operationId: listUsers
      summary: List all users
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    post:
      tags: [Users]
      operationId: createUser
      summary: Create a user
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/NewUser' }
      responses:
        '201': { $ref: '#/components/responses/Created' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /users/{login}:
    parameters:
      - $ref: '#/components/parameters/Login'
    get:
      tags: [Users]
      operationId: getUser
      summary: Get the details of a user
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
    put:
      tags: [Users]
      operationId: updateUser
      summary: Update a user
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: '#/components/schemas/UserUpdate' }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
    delete:
      tags: [Users]
      operationId: deleteUser
      summary: Delete a user
      responses:
        '204': { description: No Content — the user was deleted }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /users/{login}/command/enable:
    parameters:
      - $ref: '#/components/parameters/Login'
    put:
      tags: [Users]
      operationId: enableUser
      summary: Enable a user account
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /users/{login}/command/disable:
    parameters:
      - $ref: '#/components/parameters/Login'
    put:
      tags: [Users]
      operationId: disableUser
      summary: Disable a user account
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /users/{login}/command/reset-password:
    parameters:
      - $ref: '#/components/parameters/Login'
    post:
      tags: [Users]
      operationId: resetUserPassword
      summary: Reset the password of a user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                newPassword: { type: string }
              required: [newPassword]
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /users/{login}/command/change-password:
    parameters:
      - $ref: '#/components/parameters/Login'
    post:
      tags: [Users]
      operationId: changeUserPassword
      summary: Change the password of a user
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                currentPassword: { type: string }
                newPassword: { type: string }
              required: [currentPassword, newPassword]
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '400': { $ref: '#/components/responses/BadRequest' }
        '401': { $ref: '#/components/responses/Unauthorized' }
  /stats:
    get:
      tags: [Statistics]
      operationId: getStats
      summary: Get all node statistics
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /stats/{statPath}:
    parameters:
      - name: statPath
        in: path
        required: true
        description: Path of the statistic to return
        schema: { type: string }
    get:
      tags: [Statistics]
      operationId: getStatByPath
      summary: Get a specific statistic
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '401': { $ref: '#/components/responses/Unauthorized' }
        '404': { $ref: '#/components/responses/NotFound' }
  /gossip:
    get:
      tags: [Gossip]
      operationId: getGossip
      summary: Get the gossip details of the cluster
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '404': { $ref: '#/components/responses/NotFound' }
    post:
      tags: [Gossip]
      operationId: updateGossip
      summary: Update the gossip details of the cluster
      requestBody:
        required: true
        content:
          application/json:
            schema: { type: object }
      responses:
        '200': { $ref: '#/components/responses/JsonOk' }
        '404': { $ref: '#/components/responses/NotFound' }
components:
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
      description: >-
        KurrentDB supports HTTP Basic authentication for the HTTP API, with access control lists
        (ACLs) applied per stream. See https://docs.kurrent.io/server/v26.1/http-api/security.html
  parameters:
    Stream:
      name: stream
      in: path
      required: true
      description: Name of the event stream
      schema: { type: string }
    Subscription:
      name: subscription
      in: path
      required: true
      description: Name of the persistent subscription group
      schema: { type: string }
    EventNumber:
      name: event
      in: path
      required: true
      description: Event number within the stream, or "head" for the latest event
      schema: { type: string }
    Count:
      name: count
      in: path
      required: true
      description: Number of events to return
      schema: { type: integer }
    MessageId:
      name: messageid
      in: path
      required: true
      description: Identifier of the message to acknowledge
      schema: { type: string, format: uuid }
    Name:
      name: name
      in: path
      required: true
      description: Name of the projection
      schema: { type: string }
    Login:
      name: login
      in: path
      required: true
      description: Login name of the user
      schema: { type: string }
    ProjectionName:
      name: name
      in: query
      description: Name to give the projection
      schema: { type: string }
    Partition:
      name: partitio

# --- truncated at 32 KB (39 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/kurrent/refs/heads/main/openapi/kurrent-kurrentdb-http-api-openapi.yml