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: partition in: query description: Partition of a partitioned projection to read schema: { type: string } NackAction: name: action in: query description: What the server should do with the negatively acknowledged message schema: type: string enum: [Park, Retry, Skip, Stop] ExpectedVersion: name: Kurrent-ExpectedVersion in: header description: The version the stream is expected to be at, used for optimistic concurrency control schema: { type: integer } EventType: name: Kurrent-EventType in: header description: The event type of the posted body schema: { type: string } EventId: name: Kurrent-EventId in: header description: >- The unique identifier of the posted event. Supplying it makes the append idempotent — a repeated append with the same id is not written twice. schema: { type: string, format: uuid } RequireLeader: name: Kurrent-RequireLeader in: header description: Require that the request is served by the leader node rather than a follower schema: { type: boolean } requestBodies: ProjectionQuery: required: true description: The projection definition, as JavaScript content: application/json: schema: { type: string } responses: JsonOk: description: OK content: application/json: schema: { type: object } StreamFeed: description: OK — an AtomPub feed of events content: application/json: schema: { $ref: '#/components/schemas/AtomFeed' } application/atom+xml: schema: { type: string } application/xml: schema: { type: string } Created: description: Created headers: Location: description: URI of the created resource schema: { type: string } BadRequest: description: Bad Request — the request was malformed or violated an expected version content: text/plain: schema: { type: string } Unauthorized: description: Unauthorized — credentials were missing, invalid, or lacked ACL permission content: text/plain: schema: { type: string } NotFound: description: Not Found — the stream, event, projection, subscription or user does not exist content: text/plain: schema: { type: string } schemas: EventBatch: type: array description: One or more events to append to a stream items: { $ref: '#/components/schemas/Event' } Event: type: object description: A single event written to a KurrentDB stream properties: eventId: type: string format: uuid description: Client-generated unique identifier for the event; makes the append idempotent eventType: type: string description: The type name of the event data: description: The event payload metadata: description: Optional event metadata required: [eventId, eventType, data] StreamMetadata: type: object description: Metadata controlling the retention and access of a stream properties: $maxCount: { type: integer, description: Maximum number of events retained in the stream } $maxAge: { type: integer, description: Maximum age in seconds of events retained in the stream } $cacheControl: { type: integer, description: Cache control in seconds for the stream head } $tb: { type: integer, description: Truncate-before event number } $acl: { $ref: '#/components/schemas/StreamAcl' } StreamAcl: type: object description: Access control list applied to a stream properties: $r: { description: Users or groups allowed to read } $w: { description: Users or groups allowed to write } $d: { description: Users or groups allowed to delete } $mr: { description: Users or groups allowed to read metadata } $mw: { description: Users or groups allowed to write metadata } PersistentSubscriptionSettings: type: object description: Settings of a persistent (competing consumer) subscription properties: resolveLinktos: { type: boolean } startFrom: { type: integer } extraStatistics: { type: boolean } checkPointAfterMilliseconds: { type: integer } liveBufferSize: { type: integer } readBatchSize: { type: integer } bufferSize: { type: integer } maxCheckPointCount: { type: integer } maxRetryCount: { type: integer } maxSubscriberCount: { type: integer } messageTimeoutMilliseconds: { type: integer } minCheckPointCount: { type: integer } namedConsumerStrategy: { type: string } ProjectionConfig: type: object description: Runtime configuration of a projection properties: emitEnabled: { type: boolean } trackEmittedStreams: { type: boolean } checkpointAfterMs: { type: integer } checkpointHandledThreshold: { type: integer } checkpointUnhandledBytesThreshold: { type: integer } pendingEventsThreshold: { type: integer } maxWriteBatchLength: { type: integer } NewUser: type: object description: A user account to create properties: loginName: { type: string } fullName: { type: string } password: { type: string } groups: type: array items: { type: string } required: [loginName, fullName, password] UserUpdate: type: object description: Updated details of a user account properties: fullName: { type: string } groups: type: array items: { type: string } AtomFeed: type: object description: An AtomPub feed of events from a stream properties: title: { type: string } id: { type: string } updated: { type: string, format: date-time } streamId: { type: string } author: type: object properties: name: { type: string } headOfStream: { type: boolean } links: type: array items: { $ref: '#/components/schemas/AtomLink' } entries: type: array items: { $ref: '#/components/schemas/AtomEntry' } AtomLink: type: object description: A navigation link in an AtomPub feed (first, last, previous, next, metadata) properties: uri: { type: string } relation: { type: string } AtomEntry: type: object description: A single event entry in an AtomPub feed properties: eventId: { type: string, format: uuid } eventType: { type: string } eventNumber: { type: integer } streamId: { type: string } isJson: { type: boolean } isMetaData: { type: boolean } isLinkMetaData: { type: boolean } positionEventNumber: { type: integer } positionStreamId: { type: string } title: { type: string } id: { type: string } updated: { type: string, format: date-time } data: { description: The event payload } metaData: { description: The event metadata } links: type: array items: { $ref: '#/components/schemas/AtomLink' }