# AsyncAPI Specification ## Attribution Part of this content has been taken from the great work done by the folks at the [OpenAPI Initiative](https://openapis.org). ### Version 3.1.0 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt). The AsyncAPI Specification is licensed under [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.html). ## Introduction The AsyncAPI Specification is a project used to describe message-driven APIs in a machine-readable format. It’s protocol-agnostic, so you can use it for APIs that work over any protocol (e.g., AMQP, MQTT, WebSockets, Kafka, STOMP, HTTP, Mercure, etc). The AsyncAPI Specification defines a set of fields that can be used in an AsyncAPI document to describe an [application](#definitionsApplication)'s API. The document may reference other files for additional details or shared fields, but it is typically a single, primary document that encapsulates the API description. The AsyncAPI document SHOULD describe the operations an [application](#definitionsApplication) performs. For instance, consider the following AsyncAPI definition snippet: ```yaml channels: userSignedUp: # ...(redacted for brevity) operations: onUserSignedUp: action: receive channel: $ref: '#/channels/userSignedUp' ``` It means that the [application](#definitionsApplication) will receive messages from the `userSignedUp` [channel](#definitionsChannel). **The AsyncAPI specification does not assume any kind of software topology, architecture or pattern.** Therefore, a server MAY be a message broker, a web server or any other kind of computer program capable of sending and/or receiving data. However, AsyncAPI offers a mechanism called "bindings" that aims to help with more specific information about the protocol. It's NOT RECOMMENDED to derive a [receiver](#definitionsReceiver) AsyncAPI document from a [sender](#definitionsSender) one or vice versa. There are no guarantees that the channel used by an application to receive messages will be the same channel where another application is sending them. Also, certain fields in the document like `summary`, `description`, and the id of the operation might stop making sense. For instance, given the following receiver snippet: ```yaml operations: onUserSignedUp: summary: On user signed up. description: Event received when a user signed up on the product. action: receive channel: $ref: '#/channels/userSignedUp' ``` We can't automatically assume that an _opposite_ application exists by simply replacing `receive` with `send`: ```yaml operations: onUserSignedUp: # <-- This doesn't make sense now. Should be something like sendUserSignedUp. summary: On user signed up. # <-- This doesn't make sense now. Should say something like "Sends a user signed up event". description: Event received when a user signed up on the product. # <-- This doesn't make sense now. Should speak about sending an event, not receiving it. action: send channel: $ref: '#/channels/userSignedUp' ``` Aside from the issues mentioned above, there may also be infrastructure configuration that is not represented here. For instance, a system may use a read-only channel for receiving messages, a different one for sending them, and an intermediary process that will forward messages from one channel to the other. ## Table of Contents - [Definitions](#definitions) - [Server](#definitionsServer) - [Application](#definitionsApplication) - [Sender](#definitionsSender) - [Receiver](#definitionsReceiver) - [Message](#definitionsMessage) - [Channel](#definitionsChannel) - [Protocol](#definitionsProtocol) - [Specification](#specification) - [Format](#format) - [File Structure](#file-structure) - [Absolute URLs](#absolute-urls) - [Schema](#schema) - [AsyncAPI Object](#A2SObject) - [AsyncAPI Version String](#A2SVersionString) - [Identifier](#A2SIdString) - [Info Object](#infoObject) - [Contact Object](#contactObject) - [License Object](#licenseObject) - [Servers Object](#serversObject) - [Server Object](#serverObject) - [Server Variable Object](#serverVariableObject) - [Default Content Type](#defaultContentTypeString) - [Channels Object](#channelsObject) - [Channel Object](#channelObject) - [Operations Object](#operationsObject) - [Operation Object](#operationObject) - [Operation Trait Object](#operationTraitObject) - [Operation Reply Object](#operationReplyObject) - [Operation Reply Address Object](#operationReplyAddressObject) - [Message Object](#messageObject) - [Message Trait Object](#messageTraitObject) - [Message Example Object](#messageExampleObject) - [Tags Object](#tagsObject) - [Tag Object](#tag-object) - [External Documentation Object](#externalDocumentationObject) - [Components Object](#componentsObject) - [Reference Object](#referenceObject) - [Multi Format Schema Object](#multiFormatSchemaObject) - [Schema Object](#schemaObject) - [Security Scheme Object](#securitySchemeObject) - [OAuth Flows Object](#oauth-flows-object) - [OAuth Flow Object](#oauth-flow-object) - [Server Bindings Object](#serverBindingsObject) - [Parameters Object](#parametersObject) - [Parameter Object](#parameterObject) - [Channel Bindings Object](#channelBindingsObject) - [Operation Bindings Object](#operationBindingsObject) - [Message Bindings Object](#messageBindingsObject) - [Correlation ID Object](#correlationIdObject) - [Specification Extensions](#specificationExtensions) ## Definitions ### Server A server MAY be a message broker that is capable of sending and/or receiving between a [sender](#definitionsSender) and [receiver](#definitionsReceiver). A server MAY be a service with WebSocket API that enables message-driven communication between browser-to-server or server-to-server. ### Application An application is any kind of computer program or a group of them. It MUST be a [sender](#definitionsSender), a [receiver](#definitionsReceiver), or both. An application MAY be a microservice, IoT device (sensor), mainframe process, message broker, etc. An application MAY be written in any number of different programming languages as long as they support the selected [protocol](#definitionsProtocol). An application MUST also use a protocol supported by the [server](#definitionsServer) in order to connect and exchange [messages](#definitionsMessage), or expose the protocol described in the AsyncAPI document. ### Sender A sender is a type of application, that is sending [messages](#definitionsMessage) to [channels](#definitionsChannel). A sender MAY send to multiple channels depending on the [server](#definitionsServer), protocol, and use-case pattern. ### Receiver A receiver is a type of application that is receiving [messages](#definitionsMessage) from [channels](#definitionsChannel). A receiver MAY receive from multiple channels depending on the [server](#definitionsServer), protocol, and the use-case pattern. A receiver MAY forward a received message further without changing it. A receiver MAY act as a consumer and react to the message. A receiver MAY act as a processor that, for example, aggregates multiple messages in one and forwards them. ### Message A message is the mechanism by which information is exchanged via a channel between [servers](#definitionsServer) and applications. A message MAY contain a payload and MAY also contain headers. The headers MAY be subdivided into [protocol](#definitionsProtocol)-defined headers and header properties defined by the application which can act as supporting metadata. The payload contains the data, defined by the application, which MUST be serialized into a format (JSON, XML, Avro, binary, etc.). Since a message is a generic mechanism, it can support multiple interaction patterns such as event, command, request, or response. ### Channel A channel is an addressable component, made available by the [server](#definitionsServer), for the organization of [messages](#definitionsMessage). [Sender](#definitionsSender) applications send messages to channels and [receiver](#definitionsReceiver) applications receive messages from channels. [Servers](#definitionsServer) MAY support many channel instances, allowing messages with different content to be addressed to different channels. Depending on the [server](#definitionsServer) implementation, the channel MAY be included in the message via protocol-defined headers. ### Protocol A protocol is the mechanism (wireline protocol or API) by which [messages](#definitionsMessage) are exchanged between the application and the [channel](#definitionsChannel). Example protocols include, but are not limited to, AMQP, HTTP, JMS, Kafka, Anypoint MQ, MQTT, Solace, STOMP, Mercure, WebSocket, Google Pub/Sub, Pulsar, ROS 2. ### Bindings A "binding" (or "protocol binding") is a mechanism to define protocol-specific information. Therefore, a protocol binding MUST define protocol-specific information only. ## Specification ### Format The files describing the message-driven API in accordance with the AsyncAPI Specification are represented as JSON objects and conform to the JSON standards. YAML, being a superset of JSON, can be used as well to represent a A2S (AsyncAPI Specification) file. For example, if a field is said to have an array value, the JSON array representation will be used: ```yaml { "field" : [...] } ``` While the API is described using JSON it does not impose a JSON input/output to the API itself. All field names in the specification are **case sensitive**. The schema exposes two types of fields. Fixed fields, which have a declared name, and Patterned fields, which declare a regex pattern for the field name. Patterned fields can have multiple occurrences as long as each has a unique name. In order to preserve the ability to round-trip between YAML and JSON formats, YAML version [1.2](https://www.yaml.org/spec/1.2/spec.html) is recommended along with some additional constraints: - Tags MUST be limited to those allowed by the [JSON Schema ruleset](https://www.yaml.org/spec/1.2/spec.html#id2803231) - Keys used in YAML maps MUST be limited to a scalar string, as defined by the YAML Failsafe schema ruleset ### File Structure An AsyncAPI document MAY be made up of a single document or be divided into multiple, connected parts at the discretion of the author. In the latter case, [Reference Objects](#referenceObject) are used. It is important to note that everything that is defined in an AsyncAPI document MUST be used by the implemented [Application](#definitionsApplication), with the exception of the [Components Object](#componentsObject). Everything that is defined inside the Components Object represents a resource that MAY or MAY NOT be used by the implemented [Application](#definitionsApplication). By convention, the AsyncAPI Specification (A2S) file is named `asyncapi.json` or `asyncapi.yaml`. ### Absolute URLs Unless specified otherwise, all properties that are absolute URLs are defined by [RFC3986, section 4.3](https://datatracker.ietf.org/doc/html/rfc3986#section-4.3). ### Schema #### AsyncAPI Object This is the root document object for the API specification. It combines resource listing and API declaration together into one document. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- asyncapi | [AsyncAPI Version String](#A2SVersionString) | **REQUIRED.** Specifies the AsyncAPI Specification version being used. It can be used by tooling Specifications and clients to interpret the version. The structure shall be `major`.`minor`.`patch`, where `patch` versions _must_ be compatible with the existing `major`.`minor` tooling. Typically patch versions will be introduced to address errors in the documentation, and tooling should typically be compatible with the corresponding `major`.`minor` (1.0.*). Patch versions will correspond to patches of this document. id | [Identifier](#A2SIdString) | Identifier of the [application](#definitionsApplication) the AsyncAPI document is defining. info | [Info Object](#infoObject) | **REQUIRED.** Provides metadata about the API. The metadata can be used by the clients if needed. servers | [Servers Object](#serversObject) | Provides connection details of servers. defaultContentType | [Default Content Type](#defaultContentTypeString) | Default content type to use when encoding/decoding a message's payload. channels | [Channels Object](#channelsObject) | The channels used by this [application](#definitionsApplication). operations | [Operations Object](#operationsObject) | The operations this [application](#definitionsApplication) MUST implement. components | [Components Object](#componentsObject) | An element to hold various reusable objects for the specification. Everything that is defined inside this object represents a resource that MAY or MAY NOT be used in the rest of the document and MAY or MAY NOT be used by the implemented [Application](#definitionsApplication). This object MAY be extended with [Specification Extensions](#specificationExtensions). #### AsyncAPI Version String The version string signifies the version of the AsyncAPI Specification that the document complies to. The format for this string _must_ be `major`.`minor`.`patch`. The `patch` _may_ be suffixed by a hyphen and extra alphanumeric characters. A `major`.`minor` shall be used to designate the AsyncAPI Specification version, and will be considered compatible with the AsyncAPI Specification specified by that `major`.`minor` version. The patch version will not be considered by tooling, making no distinction between `1.0.0` and `1.0.1`. In subsequent versions of the AsyncAPI Specification, care will be given such that increments of the `minor` version should not interfere with operations of tooling developed to a lower minor version. Thus a hypothetical `1.1.0` specification should be usable with tooling designed for `1.0.0`. #### Identifier This field represents a unique universal identifier of the [application](#definitionsApplication) the AsyncAPI document is defining. It must conform to the URI format, according to [RFC3986](https://tools.ietf.org/html/rfc3986). It is RECOMMENDED to use a [URN](https://tools.ietf.org/html/rfc8141) to globally and uniquely identify the application during long periods of time, even after it becomes unavailable or ceases to exist. ##### Examples ```json { "id": "urn:example:com:smartylighting:streetlights:server" } ``` ```yaml id: 'urn:example:com:smartylighting:streetlights:server' ``` ```json { "id": "https://github.com/smartylighting/streetlights-server" } ``` ```yaml id: 'https://github.com/smartylighting/streetlights-server' ``` #### Info Object The object provides metadata about the API. The metadata can be used by the clients if needed. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- title | `string` | **REQUIRED.** The title of the application. version | `string` | **REQUIRED** Provides the version of the application API (not to be confused with the specification version). description | `string` | A short description of the application. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. termsOfService | `string` | A URL to the Terms of Service for the API. This MUST be in the form of an absolute URL. contact | [Contact Object](#contactObject) | The contact information for the exposed API. license | [License Object](#licenseObject) | The license information for the exposed API. tags | [Tags Object](#tagsObject) | A list of tags for application API documentation control. Tags can be used for logical grouping of applications. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation of the exposed API. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Info Object Example ```json { "title": "AsyncAPI Sample App", "version": "1.0.1", "description": "This is a sample app.", "termsOfService": "https://asyncapi.org/terms/", "contact": { "name": "API Support", "url": "https://www.asyncapi.org/support", "email": "support@asyncapi.org" }, "license": { "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }, "externalDocs": { "description": "Find more info here", "url": "https://www.asyncapi.org" }, "tags": [ { "name": "e-commerce" } ] } ``` ```yaml title: AsyncAPI Sample App version: 1.0.1 description: This is a sample app. termsOfService: https://asyncapi.org/terms/ contact: name: API Support url: https://www.asyncapi.org/support email: support@asyncapi.org license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html externalDocs: description: Find more info here url: https://www.asyncapi.org tags: - name: e-commerce ``` #### Contact Object Contact information for the exposed API. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- name | `string` | The identifying name of the contact person/organization. url | `string` | The URL pointing to the contact information. This MUST be in the form of an absolute URL. email | `string` | The email address of the contact person/organization. MUST be in the format of an email address. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Contact Object Example ```json { "name": "API Support", "url": "https://www.example.com/support", "email": "support@example.com" } ``` ```yaml name: API Support url: https://www.example.com/support email: support@example.com ``` #### License Object License information for the exposed API. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- name | `string` | **REQUIRED.** The license name used for the API. url | `string` | A URL to the license used for the API. This MUST be in the form of an absolute URL. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### License Object Example ```json { "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" } ``` ```yaml name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html ``` #### Servers Object The Servers Object is a map of [Server Objects](#serverObject). ##### Patterned Fields Field Pattern | Type | Description ---|:---:|--- `^[A-Za-z0-9_\-]+$` | [Server Object](#serverObject) \| [Reference Object](#referenceObject) | The definition of a server this application MAY connect to. ##### Servers Object Example ```json { "development": { "host": "localhost:5672", "description": "Development AMQP broker.", "protocol": "amqp", "protocolVersion": "0-9-1", "tags": [ { "name": "env:development", "description": "This environment is meant for developers to run their own tests." } ] }, "staging": { "host": "rabbitmq-staging.in.mycompany.com:5672", "description": "RabbitMQ broker for the staging environment.", "protocol": "amqp", "protocolVersion": "0-9-1", "tags": [ { "name": "env:staging", "description": "This environment is a replica of the production environment." } ] }, "production": { "host": "rabbitmq.in.mycompany.com:5672", "description": "RabbitMQ broker for the production environment.", "protocol": "amqp", "protocolVersion": "0-9-1", "tags": [ { "name": "env:production", "description": "This environment is the live environment available for final users." } ] } } ``` ```yaml development: host: localhost:5672 description: Development AMQP broker. protocol: amqp protocolVersion: 0-9-1 tags: - name: 'env:development' description: 'This environment is meant for developers to run their own tests.' staging: host: rabbitmq-staging.in.mycompany.com:5672 description: RabbitMQ broker for the staging environment. protocol: amqp protocolVersion: 0-9-1 tags: - name: 'env:staging' description: 'This environment is a replica of the production environment.' production: host: rabbitmq.in.mycompany.com:5672 description: RabbitMQ broker for the production environment. protocol: amqp protocolVersion: 0-9-1 tags: - name: 'env:production' description: 'This environment is the live environment available for final users.' ``` #### Server Object An object representing a message broker, a server or any other kind of computer program capable of sending and/or receiving data. This object is used to capture details such as URIs, protocols and security configuration. Variable substitution can be used so that some details, for example usernames and passwords, can be injected by code generation tools. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- host | `string` | **REQUIRED**. The server host name. It MAY include the port. This field supports [Server Variables](#serverObjectVariables). Variable substitutions will be made when a variable is named in `{`braces`}`. protocol | `string` | **REQUIRED**. The protocol this server supports for connection. protocolVersion | `string` | The version of the protocol used for connection. For instance: AMQP `0.9.1`, HTTP `2.0`, Kafka `1.0.0`, etc. pathname | `string` | The path to a resource in the host. This field supports [Server Variables](#serverObjectVariables). Variable substitutions will be made when a variable is named in `{`braces`}`. description | `string` | An optional string describing the server. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation. title | `string` | A human-friendly title for the server. summary | `string` | A short summary of the server. variables | Map[`string`, [Server Variable Object](#serverVariableObject) \| [Reference Object](#referenceObject)]] | A map between a variable name and its value. The value is used for substitution in the server's `host` and `pathname` template. security | [[Security Scheme Object](#securitySchemeObject) \| [Reference Object](#referenceObject)] | A declaration of which security schemes can be used with this server. The list of values includes alternative [security scheme objects](#securitySchemeObject) that can be used. Only one of the security scheme objects need to be satisfied to authorize a connection or operation. tags | [Tags Object](#tagsObject) | A list of tags for logical grouping and categorization of servers. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation for this server. bindings | [Server Bindings Object](#serverBindingsObject) \| [Reference Object](#referenceObject) | A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the server. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Server Object Example A single server would be described as: ```json { "host": "kafka.in.mycompany.com:9092", "description": "Production Kafka broker.", "protocol": "kafka", "protocolVersion": "3.2" } ``` ```yaml host: kafka.in.mycompany.com:9092 description: Production Kafka broker. protocol: kafka protocolVersion: '3.2' ``` An example of a server that has a `pathname`: ```json { "host": "rabbitmq.in.mycompany.com:5672", "pathname": "/production", "protocol": "amqp", "description": "Production RabbitMQ broker (uses the `production` vhost)." } ``` ```yaml host: rabbitmq.in.mycompany.com:5672 pathname: /production protocol: amqp description: Production RabbitMQ broker (uses the `production` vhost). ``` #### Server Variable Object An object representing a Server Variable for server URL template substitution. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- enum | [`string`] | An enumeration of string values to be used if the substitution options are from a limited set. default | `string` | The default value to use for substitution, and to send, if an alternate value is _not_ supplied. description | `string` | An optional description for the server variable. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation. examples | [`string`] | An array of examples of the server variable. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Server Variable Object Example ```json { "host": "rabbitmq.in.mycompany.com:5672", "pathname": "/{env}", "protocol": "amqp", "description": "RabbitMQ broker. Use the `env` variable to point to either `production` or `staging`.", "variables": { "env": { "description": "Environment to connect to. It can be either `production` or `staging`.", "enum": [ "production", "staging" ] } } } ``` ```yaml host: 'rabbitmq.in.mycompany.com:5672' pathname: '/{env}' protocol: amqp description: RabbitMQ broker. Use the `env` variable to point to either `production` or `staging`. variables: env: description: Environment to connect to. It can be either `production` or `staging`. enum: - production - staging ``` #### Default Content Type A string representing the default content type to use when encoding/decoding a message's payload. The value MUST be a specific media type (e.g. `application/json`). This value MUST be used by schema parsers when the [contentType](#messageObjectContentType) property is omitted. In case a message can't be encoded/decoded using this value, schema parsers MUST use their default content type. ##### Default Content Type Example ```json { "defaultContentType": "application/json" } ``` ```yaml defaultContentType: application/json ``` #### Channels Object An object containing all the [Channel Object](#channelObject) definitions the [Application](#definitionsApplication) MUST use during runtime. ##### Patterned Fields Field Pattern | Type | Description ---|:---:|--- {channelId} | [Channel Object](#channelObject) \| [Reference Object](#referenceObject) | An identifier for the described channel. The `channelId` value is **case-sensitive**. Tools and libraries MAY use the `channelId` to uniquely identify a channel, therefore, it is RECOMMENDED to follow common programming naming conventions. ##### Channels Object Example ```json { "userSignedUp": { "address": "user.signedup", "messages": { "userSignedUp": { "$ref": "#/components/messages/userSignedUp" } } } } ``` ```yaml userSignedUp: address: 'user.signedup' messages: userSignedUp: $ref: '#/components/messages/userSignedUp' ``` #### Channel Object Describes a shared communication channel. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- address | `string` \| `null` | An optional string representation of this channel's address. The address is typically the "topic name", "routing key", "event type", or "path". When `null` or absent, it MUST be interpreted as unknown. This is useful when the address is generated dynamically at runtime or can't be known upfront. It MAY contain [Channel Address Expressions](#channelAddressExpressions). Query parameters and fragments SHALL NOT be used, instead use [bindings](#channelBindingsObject) to define them. messages | [Messages Object](#messagesObject) | A map of the messages that will be sent to this channel by any application at any time. **Every message sent to this channel MUST be valid against one, and only one, of the [message objects](#messageObject) defined in this map.** title | `string` | A human-friendly title for the channel. summary | `string` | A short summary of the channel. description | `string` | An optional description of this channel. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. servers | [[Reference Object](#referenceObject)] | An array of `$ref` pointers to the definition of the servers in which this channel is available. If the channel is located in the [root Channels Object](#channelsObject), it MUST point to a subset of server definitions located in the [root Servers Object](#serversObject), and MUST NOT point to a subset of server definitions located in the [Components Object](#componentsObject) or anywhere else. If the channel is located in the [Components Object](#componentsObject), it MAY point to a [Server Objects](#serverObject) in any location. If `servers` is absent or empty, this channel MUST be available on all the servers defined in the [Servers Object](#serversObject). Please note the `servers` property value MUST be an array of [Reference Objects](#referenceObject) and, therefore, MUST NOT contain an array of [Server Objects](#serverObject). However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience. parameters | [Parameters Object](#parametersObject) | A map of the parameters included in the channel address. It MUST be present only when the address contains [Channel Address Expressions](#channelAddressExpressions). tags | [Tags Object](#tagsObject) | A list of tags for logical grouping of channels. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation for this channel. bindings | [Channel Bindings Object](#channelBindingsObject) \| [Reference Object](#referenceObject) | A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the channel. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Channel Object Example ```json { "address": "users.{userId}", "title": "Users channel", "description": "This channel is used to exchange messages about user events.", "messages": { "userSignedUp": { "$ref": "#/components/messages/userSignedUp" }, "userCompletedOrder": { "$ref": "#/components/messages/userCompletedOrder" } }, "parameters": { "userId": { "$ref": "#/components/parameters/userId" } }, "servers": [ { "$ref": "#/servers/rabbitmqInProd" }, { "$ref": "#/servers/rabbitmqInStaging" } ], "bindings": { "amqp": { "is": "queue", "queue": { "exclusive": true } } }, "tags": [{ "name": "user", "description": "User-related messages" }], "externalDocs": { "description": "Find more info here", "url": "https://example.com" } } ``` ```yaml address: 'users.{userId}' title: Users channel description: This channel is used to exchange messages about user events. messages: userSignedUp: $ref: '#/components/messages/userSignedUp' userCompletedOrder: $ref: '#/components/messages/userCompletedOrder' parameters: userId: $ref: '#/components/parameters/userId' servers: - $ref: '#/servers/rabbitmqInProd' - $ref: '#/servers/rabbitmqInStaging' bindings: amqp: is: queue queue: exclusive: true tags: - name: user description: User-related messages externalDocs: description: 'Find more info here' url: 'https://example.com' ``` #### Channel Address Expressions Channel addresses MAY contain expressions that can be used to define dynamic values. Expressions MUST be composed by a name enclosed in curly braces (`{` and `}`). E.g., `{userId}`. #### Messages Object Describes a map of messages included in a channel. ##### Patterned Fields Field Pattern | Type | Description ---|:---:|--- `{messageId}` | [Message Object](#messageObject) \| [Reference Object](#referenceObject) | The key represents the message identifier. The `messageId` value is **case-sensitive**. Tools and libraries MAY use the `messageId` value to uniquely identify a message, therefore, it is RECOMMENDED to follow common programming naming conventions. ##### Messages Object Example ```json { "userSignedUp": { "$ref": "#/components/messages/userSignedUp" }, "userCompletedOrder": { "$ref": "#/components/messages/userCompletedOrder" } } ``` ```yaml userSignedUp: $ref: '#/components/messages/userSignedUp' userCompletedOrder: $ref: '#/components/messages/userCompletedOrder' ``` #### Operations Object Holds a dictionary with all the [operations](#operationObject) this application MUST implement. > If you're looking for a place to define operations that MAY or MAY NOT be implemented by the application, consider defining them in [`components/operations`](#componentsOperations). ##### Patterned Fields Field Pattern | Type | Description ---|:---:|--- {operationId} | [Operation Object](#operationObject) \| [Reference Object](#referenceObject) | The operation this application MUST implement. The field name (`operationId`) MUST be a string used to identify the operation in the document where it is defined, and its value is **case-sensitive**. Tools and libraries MAY use the `operationId` to uniquely identify an operation, therefore, it is RECOMMENDED to follow common programming naming conventions. ##### Operations Object Example ```json { "onUserSignUp": { "title": "User sign up", "summary": "Action to sign a user up.", "description": "A longer description", "channel": { "$ref": "#/channels/userSignup" }, "action": "send", "tags": [ { "name": "user" }, { "name": "signup" }, { "name": "register" } ], "bindings": { "amqp": { "ack": false } }, "traits": [ { "$ref": "#/components/operationTraits/kafka" } ] } } ``` ```yaml onUserSignUp: title: User sign up summary: Action to sign a user up. description: A longer description channel: $ref: '#/channels/userSignup' action: send tags: - name: user - name: signup - name: register bindings: amqp: ack: false traits: - $ref: '#/components/operationTraits/kafka' ``` #### Operation Object Describes a specific operation. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- action | `"send"` | `"receive"` | **Required**. Use `send` when it's expected that the application will send a message to the given [`channel`](#operationObjectChannel), and `receive` when the application should expect receiving messages from the given [`channel`](#operationObjectChannel). channel | [Reference Object](#referenceObject) | **Required**. A `$ref` pointer to the definition of the channel in which this operation is performed. If the operation is located in the [root Operations Object](#operationsObject), it MUST point to a channel definition located in the [root Channels Object](#channelsObject), and MUST NOT point to a channel definition located in the [Components Object](#componentsObject) or anywhere else. If the operation is located in the [Components Object](#componentsObject), it MAY point to a [Channel Object](#channelObject) in any location. Please note the `channel` property value MUST be a [Reference Object](#referenceObject) and, therefore, MUST NOT contain a [Channel Object](#channelObject). However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience. title | `string` | A human-friendly title for the operation. summary | `string` | A short summary of what the operation is about. description | `string` | A verbose explanation of the operation. [CommonMark syntax](http://spec.commonmark.org/) can be used for rich text representation. security | [[Security Scheme Object](#securitySchemeObject) \| [Reference Object](#referenceObject)]| A declaration of which security schemes are associated with this operation. Only one of the [security scheme objects](#securitySchemeObject) MUST be satisfied to authorize an operation. In cases where [Server Security](#serverObjectSecurity) also applies, it MUST also be satisfied. tags | [Tags Object](#tagsObject) | A list of tags for logical grouping and categorization of operations. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation for this operation. bindings | [Operation Bindings Object](#operationBindingsObject) \| [Reference Object](#referenceObject) | A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the operation. traits | [[Operation Trait Object](#operationTraitObject) | [Reference Object](#referenceObject) ] | A list of traits to apply to the operation object. Traits MUST be merged using [traits merge mechanism](#traits-merge-mechanism). The resulting object MUST be a valid [Operation Object](#operationObject). messages | [[Reference Object](#referenceObject)] | A list of `$ref` pointers pointing to the supported [Message Objects](#messageObject) that can be processed by this operation. It MUST contain a subset of the messages defined in the [channel referenced in this operation](#operationObjectChannel), and MUST NOT point to a subset of message definitions located in the [Messages Object](#componentsMessages) in the [Components Object](#componentsObject) or anywhere else. **Every message processed by this operation MUST be valid against one, and only one, of the [message objects](#messageObject) referenced in this list.** Please note the `messages` property value MUST be a list of [Reference Objects](#referenceObject) and, therefore, MUST NOT contain [Message Objects](#messageObject). However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience.
**Note**: excluding this property from the Operation implies that all messages from the channel will be included. Explicitly set the `messages` property to `[]` if this operation should contain no messages.
reply | [Operation Reply Object](#operationReplyObject) | [Reference Object](#referenceObject) | The definition of the reply in a request-reply operation. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Operation Object Example ```json { "title": "User sign up", "summary": "Action to sign a user up.", "description": "A longer description", "channel": { "$ref": "#/channels/userSignup" }, "action": "send", "security": [ { "type": "oauth2", "description": "The oauth security descriptions", "flows": { "clientCredentials": { "tokenUrl": "https://example.com/api/oauth/dialog", "availableScopes": { "subscribe:auth_revocations": "Scope required for authorization revocation topic" } } }, "scopes": [ "subscribe:auth_revocations" ], "petstore_auth": [ "write:pets", "read:pets" ] } ], "tags": [ { "name": "user" }, { "name": "signup" }, { "name": "register" } ], "bindings": { "amqp": { "ack": false } }, "traits": [ { "$ref": "#/components/operationTraits/kafka" } ], "messages": [ { "$ref": "#/channels/userSignup/messages/userSignedUp" } ], "reply": { "address": { "location": "$message.header#/replyTo" }, "channel": { "$ref": "#/channels/userSignupReply" }, "messages": [ { "$ref": "#/channels/userSignupReply/messages/userSignedUpReply" } ] } } ``` ```yaml title: User sign up summary: Action to sign a user up. description: A longer description channel: $ref: '#/channels/userSignup' action: send security: - type: oauth2 description: The oauth security descriptions flows: clientCredentials: tokenUrl: 'https://example.com/api/oauth/dialog' availableScopes: 'subscribe:auth_revocations': Scope required for authorization revocation topic scopes: - 'subscribe:auth_revocations' petstore_auth: - 'write:pets' - 'read:pets' tags: - name: user - name: signup - name: register bindings: amqp: ack: false traits: - $ref: '#/components/operationTraits/kafka' messages: - $ref: '#/channels/userSignup/messages/userSignedUp' reply: address: location: '$message.header#/replyTo' channel: $ref: '#/channels/userSignupReply' messages: - $ref: '#/channels/userSignupReply/messages/userSignedUpReply' ``` #### Operation Trait Object Describes a trait that MAY be applied to an [Operation Object](#operationObject). This object MAY contain any property from the [Operation Object](#operationObject), except the `action`, `channel`, `messages` and `traits` ones. If you're looking to apply traits to a message, see the [Message Trait Object](#messageTraitObject). ##### Fixed Fields Field Name | Type | Description ---|:---:|--- title | `string` | A human-friendly title for the operation. summary | `string` | A short summary of what the operation is about. description | `string` | A verbose explanation of the operation. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. security | [[Security Scheme Object](#securitySchemeObject) \| [Reference Object](#referenceObject)]| A declaration of which security schemes are associated with this operation. Only one of the [security scheme objects](#securitySchemeObject) MUST be satisfied to authorize an operation. In cases where [Server Security](#serverObjectSecurity) also applies, it MUST also be satisfied. tags | [Tags Object](#tagsObject) | A list of tags for logical grouping and categorization of operations. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation for this operation. bindings | [Operation Bindings Object](#operationBindingsObject) \| [Reference Object](#referenceObject) | A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the operation. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Operation Trait Object Example ```json { "bindings": { "amqp": { "ack": false } } } ``` ```yaml bindings: amqp: ack: false ``` #### Operation Reply Object Describes the reply part that MAY be applied to an Operation Object. If an operation implements the request/reply pattern, the reply object represents the response message. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- address | [Operation Reply Address Object](#operationReplyAddressObject) | [Reference Object](#referenceObject) | Definition of the address that implementations MUST use for the reply. channel | [Reference Object](#referenceObject) | A `$ref` pointer to the definition of the channel in which this operation is performed. When [address](#operationReplyAddressObject) is specified, the [`address` property](#channelObjectAddress) of the channel referenced by this property MUST be either `null` or not defined. If the operation reply is located inside a [root Operation Object](#operationObject), it MUST point to a channel definition located in the [root Channels Object](#channelsObject), and MUST NOT point to a channel definition located in the [Components Object](#componentsObject) or anywhere else. If the operation reply is located inside an [Operation Object] in the [Components Object](#componentsObject) or in the [Replies Object](#componentsReplies) in the [Components Object](#componentsObject), it MAY point to a [Channel Object](#channelObject) in any location. Please note the `channel` property value MUST be a [Reference Object](#referenceObject) and, therefore, MUST NOT contain a [Channel Object](#channelObject). However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience. messages | [[Reference Object](#referenceObject)] | A list of `$ref` pointers pointing to the supported [Message Objects](#messageObject) that can be processed by this operation as reply. It MUST contain a subset of the messages defined in the [channel referenced in this operation reply](#operationObjectChannel), and MUST NOT point to a subset of message definitions located in the [Components Object](#componentsObject) or anywhere else. **Every message processed by this operation MUST be valid against one, and only one, of the [message objects](#messageObject) referenced in this list.** Please note the `messages` property value MUST be a list of [Reference Objects](#referenceObject) and, therefore, MUST NOT contain [Message Objects](#messageObject). However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience. This object MAY be extended with [Specification Extensions](#specificationExtensions). #### Operation Reply Address Object An object that specifies where an operation has to send the reply. For specifying and computing the location of a reply address, a [runtime expression](#runtimeExpression) is used. ##### Fixed Fields Field Name | Type | Description ---|:---|--- description | `string` | An optional description of the address. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. location | `string` | **REQUIRED.** A [runtime expression](#runtimeExpression) that specifies the location of the reply address. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Examples ```json { "description": "Consumer inbox", "location": "$message.header#/replyTo" } ``` ```yaml description: Consumer Inbox location: $message.header#/replyTo ``` #### Parameters Object Describes a map of parameters included in a channel address. This map MUST contain all the parameters used in the parent channel address. ##### Patterned Fields Field Pattern | Type | Description ---|:---:|--- `^[A-Za-z0-9_\-]+$` | [Parameter Object](#parameterObject) | [Reference Object](#referenceObject) | The key represents the name of the parameter. It MUST match the parameter name used in the parent channel address. ##### Parameters Object Example ```json { "address": "user/{userId}/signedup", "parameters": { "userId": { "description": "Id of the user." } } } ``` ```yaml address: user/{userId}/signedup parameters: userId: description: Id of the user. ``` #### Parameter Object Describes a parameter included in a channel address. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- enum | [`string`] | An enumeration of string values to be used if the substitution options are from a limited set. default | `string` | The default value to use for substitution, and to send, if an alternate value is _not_ supplied. description | `string` | An optional description for the parameter. [CommonMark syntax](https://spec.commonmark.org/) MAY be used for rich text representation. examples | [`string`] | An array of examples of the parameter value. location | `string` | A [runtime expression](#runtimeExpression) that specifies the location of the parameter value. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Parameter Object Example ```json { "address": "user/{userId}/signedup", "parameters": { "userId": { "description": "Id of the user.", "location": "$message.payload#/user/id" } } } ``` ```yaml address: user/{userId}/signedup parameters: userId: description: Id of the user. location: $message.payload#/user/id ``` #### Server Bindings Object Map describing protocol-specific definitions for a server. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- `http` | [HTTP Server Binding](https://github.com/asyncapi/bindings/blob/master/http#server) | Protocol-specific information for an HTTP server. `ws` | [WebSockets Server Binding](https://github.com/asyncapi/bindings/blob/master/websockets#server) | Protocol-specific information for a WebSockets server. `kafka` | [Kafka Server Binding](https://github.com/asyncapi/bindings/blob/master/kafka#server) | Protocol-specific information for a Kafka server. `anypointmq` | [Anypoint MQ Server Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq#server) | Protocol-specific information for an Anypoint MQ server. `amqp` | [AMQP Server Binding](https://github.com/asyncapi/bindings/blob/master/amqp#server) | Protocol-specific information for an AMQP 0-9-1 server. `amqp1` | [AMQP 1.0 Server Binding](https://github.com/asyncapi/bindings/blob/master/amqp1#server) | Protocol-specific information for an AMQP 1.0 server. `mqtt` | [MQTT Server Binding](https://github.com/asyncapi/bindings/blob/master/mqtt#server) | Protocol-specific information for an MQTT server. `mqtt5` | [MQTT 5 Server Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#server) | Protocol-specific information for an MQTT 5 server. `nats` | [NATS Server Binding](https://github.com/asyncapi/bindings/blob/master/nats#server) | Protocol-specific information for a NATS server. `jms` | [JMS Server Binding](https://github.com/asyncapi/bindings/blob/master/jms#server) | Protocol-specific information for a JMS server. `sns` | [SNS Server Binding](https://github.com/asyncapi/bindings/blob/master/sns#server) | Protocol-specific information for an SNS server. `solace` | [Solace Server Binding](https://github.com/asyncapi/bindings/blob/master/solace#server) | Protocol-specific information for a Solace server. `sqs` | [SQS Server Binding](https://github.com/asyncapi/bindings/blob/master/sqs#server) | Protocol-specific information for an SQS server. `stomp` | [STOMP Server Binding](https://github.com/asyncapi/bindings/blob/master/stomp#server) | Protocol-specific information for a STOMP server. `redis` | [Redis Server Binding](https://github.com/asyncapi/bindings/blob/master/redis#server) | Protocol-specific information for a Redis server. `mercure` | [Mercure Server Binding](https://github.com/asyncapi/bindings/blob/master/mercure#server) | Protocol-specific information for a Mercure server. `ibmmq` | [IBM MQ Server Binding](https://github.com/asyncapi/bindings/blob/master/ibmmq#server-binding-object) | Protocol-specific information for an IBM MQ server. `googlepubsub` | [Google Cloud Pub/Sub Server Binding](https://github.com/asyncapi/bindings/blob/master/googlepubsub#server) | Protocol-specific information for a Google Cloud Pub/Sub server. `pulsar` | [Pulsar Server Binding](https://github.com/asyncapi/bindings/tree/master/pulsar#server-binding-object) | Protocol-specific information for a Pulsar server. `ros2` | [ROS 2 Server Binding](https://github.com/asyncapi/bindings/tree/master/ros2#server-binding-object) | Protocol-specific information for a ROS 2 server. This object MAY be extended with [Specification Extensions](#specificationExtensions). #### Channel Bindings Object Map describing protocol-specific definitions for a channel. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- `http` | [HTTP Channel Binding](https://github.com/asyncapi/bindings/blob/master/http/README.md#channel) | Protocol-specific information for an HTTP channel. `ws` | [WebSockets Channel Binding](https://github.com/asyncapi/bindings/blob/master/websockets/README.md#channel) | Protocol-specific information for a WebSockets channel. `kafka` | [Kafka Channel Binding](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#channel) | Protocol-specific information for a Kafka channel. `anypointmq` | [Anypoint MQ Channel Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq/README.md#channel) | Protocol-specific information for an Anypoint MQ channel. `amqp` | [AMQP Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#channel) | Protocol-specific information for an AMQP 0-9-1 channel. `amqp1` | [AMQP 1.0 Channel Binding](https://github.com/asyncapi/bindings/blob/master/amqp1/README.md#channel) | Protocol-specific information for an AMQP 1.0 channel. `mqtt` | [MQTT Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt/README.md#channel) | Protocol-specific information for an MQTT channel. `mqtt5` | [MQTT 5 Channel Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5#channel) | Protocol-specific information for an MQTT 5 channel. `nats` | [NATS Channel Binding](https://github.com/asyncapi/bindings/blob/master/nats/README.md#channel) | Protocol-specific information for a NATS channel. `jms` | [JMS Channel Binding](https://github.com/asyncapi/bindings/blob/master/jms/README.md#channel) | Protocol-specific information for a JMS channel. `sns` | [SNS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sns/README.md#channel) | Protocol-specific information for an SNS channel. `solace` | [Solace Channel Binding](https://github.com/asyncapi/bindings/blob/master/solace#channel) | Protocol-specific information for a Solace channel. `sqs` | [SQS Channel Binding](https://github.com/asyncapi/bindings/blob/master/sqs/README.md#channel) | Protocol-specific information for an SQS channel. `stomp` | [STOMP Channel Binding](https://github.com/asyncapi/bindings/blob/master/stomp/README.md#channel) | Protocol-specific information for a STOMP channel. `redis` | [Redis Channel Binding](https://github.com/asyncapi/bindings/blob/master/redis#channel) | Protocol-specific information for a Redis channel. `mercure` | [Mercure Channel Binding](https://github.com/asyncapi/bindings/blob/master/mercure#channel) | Protocol-specific information for a Mercure channel. `ibmmq` | [IBM MQ Channel Binding](https://github.com/asyncapi/bindings/tree/master/ibmmq#channel-binding-object) | Protocol-specific information for an IBM MQ channel. `googlepubsub` | [Google Cloud Pub/Sub Channel Binding](https://github.com/asyncapi/bindings/tree/master/googlepubsub#channel) | Protocol-specific information for a Google Cloud Pub/Sub channel. `pulsar` | [Pulsar Channel Binding](https://github.com/asyncapi/bindings/tree/master/pulsar#channel-binding-object) | Protocol-specific information for a Pulsar channel. `ros2` | [ROS 2 Channel Binding](https://github.com/asyncapi/bindings/tree/master/ros2#channel-binding-object) | Protocol-specific information for a ROS 2 channel. This object MAY be extended with [Specification Extensions](#specificationExtensions). #### Operation Bindings Object Map describing protocol-specific definitions for an operation. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- `http` | [HTTP Operation Binding](https://github.com/asyncapi/bindings/blob/master/http/README.md#operation) | Protocol-specific information for an HTTP operation. `ws` | [WebSockets Operation Binding](https://github.com/asyncapi/bindings/blob/master/websockets/README.md#operation) | Protocol-specific information for a WebSockets operation. `kafka` | [Kafka Operation Binding](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#operation) | Protocol-specific information for a Kafka operation. `anypointmq` | [Anypoint MQ Operation Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq/README.md#operation) | Protocol-specific information for an Anypoint MQ operation. `amqp` | [AMQP Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#operation) | Protocol-specific information for an AMQP 0-9-1 operation. `amqp1` | [AMQP 1.0 Operation Binding](https://github.com/asyncapi/bindings/blob/master/amqp1/README.md#operation) | Protocol-specific information for an AMQP 1.0 operation. `mqtt` | [MQTT Operation Binding](https://github.com/asyncapi/bindings/blob/master/mqtt/README.md#operation) | Protocol-specific information for an MQTT operation. `mqtt5` | [MQTT 5 Operation Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5/README.md#operation) | Protocol-specific information for an MQTT 5 operation. `nats` | [NATS Operation Binding](https://github.com/asyncapi/bindings/blob/master/nats/README.md#operation) | Protocol-specific information for a NATS operation. `jms` | [JMS Operation Binding](https://github.com/asyncapi/bindings/blob/master/jms/README.md#operation) | Protocol-specific information for a JMS operation. `sns` | [SNS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sns/README.md#operation) | Protocol-specific information for an SNS operation. `solace` | [Solace Operation Binding](https://github.com/asyncapi/bindings/blob/master/solace#operation) | Protocol-specific information for a Solace operation. `sqs` | [SQS Operation Binding](https://github.com/asyncapi/bindings/blob/master/sqs/README.md#operation) | Protocol-specific information for an SQS operation. `stomp` | [STOMP Operation Binding](https://github.com/asyncapi/bindings/blob/master/stomp/README.md#operation) | Protocol-specific information for a STOMP operation. `redis` | [Redis Operation Binding](https://github.com/asyncapi/bindings/blob/master/redis#operation) | Protocol-specific information for a Redis operation. `mercure` | [Mercure Operation Binding](https://github.com/asyncapi/bindings/blob/master/mercure#operation) | Protocol-specific information for a Mercure operation. `googlepubsub` | [Google Cloud Pub/Sub Operation Binding](https://github.com/asyncapi/bindings/blob/master/googlepubsub#operation) | Protocol-specific information for a Google Cloud Pub/Sub operation. `ibmmq` | [IBM MQ Operation Binding](https://github.com/asyncapi/bindings/blob/master/ibmmq#operation-binding-object) | Protocol-specific information for an IBM MQ operation. `pulsar` | [Pulsar Operation Binding](https://github.com/asyncapi/bindings/tree/master/pulsar#operation-binding-fields) | Protocol-specific information for a Pulsar operation. `ros2` | [ROS 2 Operation Binding](https://github.com/asyncapi/bindings/tree/master/ros2#operation-binding-fields) | Protocol-specific information for a ROS 2 operation. This object MAY be extended with [Specification Extensions](#specificationExtensions). #### Message Bindings Object Map describing protocol-specific definitions for a message. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- `http` | [HTTP Message Binding](https://github.com/asyncapi/bindings/blob/master/http/README.md#message) | Protocol-specific information for an HTTP message, i.e., a request or a response. `ws` | [WebSockets Message Binding](https://github.com/asyncapi/bindings/blob/master/websockets/README.md#message) | Protocol-specific information for a WebSockets message. `kafka` | [Kafka Message Binding](https://github.com/asyncapi/bindings/blob/master/kafka/README.md#message) | Protocol-specific information for a Kafka message. `anypointmq` | [Anypoint MQ Message Binding](https://github.com/asyncapi/bindings/blob/master/anypointmq/README.md#message) | Protocol-specific information for an Anypoint MQ message. `amqp` | [AMQP Message Binding](https://github.com/asyncapi/bindings/blob/master/amqp/README.md#message) | Protocol-specific information for an AMQP 0-9-1 message. `amqp1` | [AMQP 1.0 Message Binding](https://github.com/asyncapi/bindings/blob/master/amqp1/README.md#message) | Protocol-specific information for an AMQP 1.0 message. `mqtt` | [MQTT Message Binding](https://github.com/asyncapi/bindings/blob/master/mqtt/README.md#message) | Protocol-specific information for an MQTT message. `mqtt5` | [MQTT 5 Message Binding](https://github.com/asyncapi/bindings/blob/master/mqtt5/README.md#message) | Protocol-specific information for an MQTT 5 message. `nats` | [NATS Message Binding](https://github.com/asyncapi/bindings/blob/master/nats/README.md#message) | Protocol-specific information for a NATS message. `jms` | [JMS Message Binding](https://github.com/asyncapi/bindings/blob/master/jms/README.md#message) | Protocol-specific information for a JMS message. `sns` | [SNS Message Binding](https://github.com/asyncapi/bindings/blob/master/sns/README.md#message) | Protocol-specific information for an SNS message. `solace` | [Solace Server Binding](https://github.com/asyncapi/bindings/blob/master/solace#message) | Protocol-specific information for a Solace message. `sqs` | [SQS Message Binding](https://github.com/asyncapi/bindings/blob/master/sqs/README.md#message) | Protocol-specific information for an SQS message. `stomp` | [STOMP Message Binding](https://github.com/asyncapi/bindings/blob/master/stomp/README.md#message) | Protocol-specific information for a STOMP message. `redis` | [Redis Message Binding](https://github.com/asyncapi/bindings/blob/master/redis#message) | Protocol-specific information for a Redis message. `mercure` | [Mercure Message Binding](https://github.com/asyncapi/bindings/blob/master/mercure#message) | Protocol-specific information for a Mercure message. `ibmmq` | [IBM MQ Message Binding](https://github.com/asyncapi/bindings/tree/master/ibmmq#message-binding-object) | Protocol-specific information for an IBM MQ message. `googlepubsub` | [Google Cloud Pub/Sub Message Binding](https://github.com/asyncapi/bindings/tree/master/googlepubsub#message) | Protocol-specific information for a Google Cloud Pub/Sub message. `pulsar` | [Pulsar Message Binding](https://github.com/asyncapi/bindings/tree/master/pulsar#message-binding-fields) | Protocol-specific information for a Pulsar message. `ros2` | [ROS 2 Message Binding](https://github.com/asyncapi/bindings/tree/master/ros2#message-binding-fields) | Protocol-specific information for a ROS 2 message. This object MAY be extended with [Specification Extensions](#specificationExtensions). #### Message Object Describes a message received on a given channel and operation. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- headers | [Multi Format Schema Object](#multiFormatSchemaObject) | [Schema Object](#schemaObject) | [Reference Object](#referenceObject) | Schema definition of the application headers. Schema MUST be a map of key-value pairs. It **MUST NOT** define the protocol headers. If this is a [Schema Object](#schemaObject), then the `schemaFormat` will be assumed to be "application/vnd.aai.asyncapi+json;version=`asyncapi`" where the version is equal to the [AsyncAPI Version String](#A2SVersionString). payload | [Multi Format Schema Object](#multiFormatSchemaObject) | [Schema Object](#schemaObject) | [Reference Object](#referenceObject) | Definition of the message payload. If this is a [Schema Object](#schemaObject), then the `schemaFormat` will be assumed to be "application/vnd.aai.asyncapi+json;version=`asyncapi`" where the version is equal to the [AsyncAPI Version String](#A2SVersionString). correlationId | [Correlation ID Object](#correlationIdObject) | [Reference Object](#referenceObject) | Definition of the correlation ID used for message tracing or matching. contentType | `string` | The content type to use when encoding/decoding a message's payload. The value MUST be a specific media type (e.g. `application/json`). When omitted, the value MUST be the one specified on the [defaultContentType](#defaultContentTypeString) field. name | `string` | A machine-friendly name for the message. title | `string` | A human-friendly title for the message. summary | `string` | A short summary of what the message is about. description | `string` | A verbose explanation of the message. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. tags | [Tags Object](#tagsObject) | A list of tags for logical grouping and categorization of messages. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation for this message. bindings | [Message Bindings Object](#messageBindingsObject) \| [Reference Object](#referenceObject) | A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the message. examples | [[Message Example Object](#messageExampleObject)] | List of examples. traits | [[Message Trait Object](#messageTraitObject) | [Reference Object](#referenceObject)] | A list of traits to apply to the message object. Traits MUST be merged using [traits merge mechanism](#traits-merge-mechanism). The resulting object MUST be a valid [Message Object](#messageObject). This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Message Object Example ```json { "name": "UserSignup", "title": "User signup", "summary": "Action to sign a user up.", "description": "A longer description", "contentType": "application/json", "tags": [ { "name": "user" }, { "name": "signup" }, { "name": "register" } ], "headers": { "type": "object", "properties": { "correlationId": { "description": "Correlation ID set by application", "type": "string" }, "applicationInstanceId": { "description": "Unique identifier for a given instance of the publishing application", "type": "string" } } }, "payload": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/userCreate" }, "signup": { "$ref": "#/components/schemas/signup" } } }, "correlationId": { "description": "Default Correlation ID", "location": "$message.header#/correlationId" }, "traits": [ { "$ref": "#/components/messageTraits/commonHeaders" } ], "examples": [ { "name": "SimpleSignup", "summary": "A simple UserSignup example message", "headers": { "correlationId": "my-correlation-id", "applicationInstanceId": "myInstanceId" }, "payload": { "user": { "someUserKey": "someUserValue" }, "signup": { "someSignupKey": "someSignupValue" } } } ] } ``` ```yaml name: UserSignup title: User signup summary: Action to sign a user up. description: A longer description contentType: application/json tags: - name: user - name: signup - name: register headers: type: object properties: correlationId: description: Correlation ID set by application type: string applicationInstanceId: description: Unique identifier for a given instance of the publishing application type: string payload: type: object properties: user: $ref: '#/components/schemas/userCreate' signup: $ref: '#/components/schemas/signup' correlationId: description: Default Correlation ID location: $message.header#/correlationId traits: - $ref: '#/components/messageTraits/commonHeaders' examples: - name: SimpleSignup summary: A simple UserSignup example message headers: correlationId: my-correlation-id applicationInstanceId: myInstanceId payload: user: someUserKey: someUserValue signup: someSignupKey: someSignupValue ``` Example using Avro to define the payload: ```json { "name": "UserSignup", "title": "User signup", "summary": "Action to sign a user up.", "description": "A longer description", "tags": [ { "name": "user" }, { "name": "signup" }, { "name": "register" } ], "payload": { "schemaFormat": "application/vnd.apache.avro+json;version=1.9.0", "schema": { "$ref": "./user-create.avsc" } } } ``` ```yaml name: UserSignup title: User signup summary: Action to sign a user up. description: A longer description tags: - name: user - name: signup - name: register payload: schemaFormat: 'application/vnd.apache.avro+yaml;version=1.9.0' schema: $ref: './user-create.avsc' ``` #### Message Trait Object Describes a trait that MAY be applied to a [Message Object](#messageObject). This object MAY contain any property from the [Message Object](#messageObject), except `payload` and `traits`. If you're looking to apply traits to an operation, see the [Operation Trait Object](#operationTraitObject). ##### Fixed Fields Field Name | Type | Description ---|:---:|--- headers | [Multi Format Schema Object](#multiFormatSchemaObject) | [Schema Object](#schemaObject) | [Reference Object](#referenceObject) | Schema definition of the application headers. Schema MUST be a map of key-value pairs. It **MUST NOT** define the protocol headers. If this is a [Schema Object](#schemaObject), then the `schemaFormat` will be assumed to be "application/vnd.aai.asyncapi+json;version=`asyncapi`" where the version is equal to the [AsyncAPI Version String](#A2SVersionString). correlationId | [Correlation ID Object](#correlationIdObject) | [Reference Object](#referenceObject) | Definition of the correlation ID used for message tracing or matching. contentType | `string` | The content type to use when encoding/decoding a message's payload. The value MUST be a specific media type (e.g. `application/json`). When omitted, the value MUST be the one specified on the [defaultContentType](#defaultContentTypeString) field. name | `string` | A machine-friendly name for the message. title | `string` | A human-friendly title for the message. summary | `string` | A short summary of what the message is about. description | `string` | A verbose explanation of the message. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. tags | [Tags Object](#tagsObject) | A list of tags for logical grouping and categorization of messages. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation for this message. bindings | [Message Bindings Object](#messageBindingsObject) \| [Reference Object](#referenceObject) | A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the message. examples | [[Message Example Object](#messageExampleObject)] | List of examples. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Message Trait Object Example ```json { "contentType": "application/json" } ``` ```yaml contentType: application/json ``` #### Message Example Object Message Example Object represents an example of a [Message Object](#messageObject) and MUST contain either **headers** and/or **payload** fields. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- headers | `Map[string, any]` | The value of this field MUST validate against the [Message Object's headers](#messageObjectHeaders) field. payload | `any` | The value of this field MUST validate against the [Message Object's payload](#messageObjectPayload) field. name | `string` | A machine-friendly name. summary | `string` | A short summary of what the example is about. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Message Example Object Example ```json { "name": "SimpleSignup", "summary": "A simple UserSignup example message", "headers": { "correlationId": "my-correlation-id", "applicationInstanceId": "myInstanceId" }, "payload": { "user": { "someUserKey": "someUserValue" }, "signup": { "someSignupKey": "someSignupValue" } } } ``` ```yaml name: SimpleSignup summary: A simple UserSignup example message headers: correlationId: my-correlation-id applicationInstanceId: myInstanceId payload: user: someUserKey: someUserValue signup: someSignupKey: someSignupValue ``` #### Tags Object A Tags object is a list of [Tag Objects](#tagObject). An [Tag Object](#tagObject) in a list can be referenced by [Reference Object](#referenceObject). #### Tag Object Allows adding meta data to a single tag. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- name | `string` | **REQUIRED.** The name of the tag. description | `string` | A short description for the tag. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. externalDocs | [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject) | Additional external documentation for this tag. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### Tag Object Example ```json { "name": "user", "description": "User-related messages" } ``` ```yaml name: user description: User-related messages ``` #### External Documentation Object Allows referencing an external resource for extended documentation. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- description | `string` | A short description of the target documentation. [CommonMark syntax](https://spec.commonmark.org/) can be used for rich text representation. url | `string` | **REQUIRED.** The URL for the target documentation. This MUST be in the form of an absolute URL. This object MAY be extended with [Specification Extensions](#specificationExtensions). ##### External Documentation Object Example ```json { "description": "Find more info here", "url": "https://example.com" } ``` ```yaml description: Find more info here url: https://example.com ``` #### Reference Object A simple object to allow referencing other components in the specification, internally and externally. The Reference Object is defined by [JSON Reference](https://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03) and follows the same structure, behavior and rules. A JSON Reference SHALL only be used to refer to a schema that is formatted in either JSON or YAML. In the case of a YAML-formatted Schema, the JSON Reference SHALL be applied to the JSON representation of that schema. The JSON representation SHALL be made by applying the conversion described [here](#format). For this specification, reference resolution is done as defined by the JSON Reference specification and not by the JSON Schema specification. ##### Fixed Fields Field Name | Type | Description ---|:---:|--- $ref | `string` | **REQUIRED.** The reference string. This object cannot be extended with additional properties and any properties added SHALL be ignored. ##### Reference Object Example ```json { "$ref": "#/components/schemas/Pet" } ``` ```yaml $ref: '#/components/schemas/Pet' ``` #### Components Object Holds a set of reusable objects for different aspects of the AsyncAPI specification. All objects defined within the components object will have no effect on the API unless they are explicitly referenced from properties outside the components object. ##### Fixed Fields Field Name | Type | Description ---|:---|--- schemas | Map[`string`, [Multi Format Schema Object](#multiFormatSchemaObject) \| [Schema Object](#schemaObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Schema Object](#schemaObject). If this is a [Schema Object](#schemaObject), then the `schemaFormat` will be assumed to be "application/vnd.aai.asyncapi+json;version=`asyncapi`" where the version is equal to the [AsyncAPI Version String](#A2SVersionString). servers | Map[`string`, [Server Object](#serverObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Server Objects](#serverObject). channels | Map[`string`, [Channel Object](#channelObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Channel Objects](#channelObject). operations | Map[`string`, [Operation Object](#operationObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Operation Objects](#operationObject). messages | Map[`string`, [Message Object](#messageObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Message Objects](#messageObject). securitySchemes| Map[`string`, [Security Scheme Object](#securitySchemeObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Security Scheme Objects](#securitySchemeObject). serverVariables | Map[`string`, [Server Variable Object](#serverVariableObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Server Variable Objects](#serverVariableObject). parameters | Map[`string`, [Parameter Object](#parameterObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Parameter Objects](#parameterObject). correlationIds | Map[`string`, [Correlation ID Object](#correlationIdObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Correlation ID Objects](#correlationIdObject). replies | Map[`string`, [Operation Reply Object](#operationReplyObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Operation Reply Objects](#operationReplyObject). replyAddresses | Map[`string`, [Operation Reply Address Object](#operationReplyAddressObject) | [Reference Object](#referenceObject)] | An object to hold reusable [Operation Reply Address Objects](#operationReplyAddressObject). externalDocs | Map[`string`, [External Documentation Object](#externalDocumentationObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [External Documentation Objects](#externalDocumentationObject). tags | Map[`string`, [Tag Object](#tagObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Tag Objects](#tagObject). operationTraits | Map[`string`, [Operation Trait Object](#operationTraitObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Operation Trait Objects](#operationTraitObject). messageTraits | Map[`string`, [Message Trait Object](#messageTraitObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Message Trait Objects](#messageTraitObject). serverBindings | Map[`string`, [Server Bindings Object](#serverBindingsObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Server Bindings Objects](#serverBindingsObject). channelBindings | Map[`string`, [Channel Bindings Object](#channelBindingsObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Channel Bindings Objects](#channelBindingsObject). operationBindings | Map[`string`, [Operation Bindings Object](#operationBindingsObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Operation Bindings Objects](#operationBindingsObject). messageBindings | Map[`string`, [Message Bindings Object](#messageBindingsObject) \| [Reference Object](#referenceObject)] | An object to hold reusable [Message Bindings Objects](#messageBindingsObject). This object MAY be extended with [Specification Extensions](#specificationExtensions). All the fixed fields declared above are objects that MUST use keys that match the regular expression: `^[a-zA-Z0-9\.\-_]+$`. Field Name Examples: ```text User User_1 User_Name user-name my.org.User ``` ##### Components Object Example ```json { "components": { "schemas": { "Category": { "type": "object", "properties": { "id": { "type": "integer", "format": "int64" }, "name": { "type": "string" } } }, "Tag": { "type": "object", "properties": { "id": { "type": "integer", "format": "int64" }, "name": { "type": "string" } } }, "AvroExample": { "schemaFormat": "application/vnd.apache.avro+json;version=1.9.0", "schema": { "$ref": "./user-create.avsc" } } }, "servers": { "development": { "host": "{stage}.in.mycompany.com:{port}", "description": "RabbitMQ broker", "protocol": "amqp", "protocolVersion": "0-9-1", "variables": { "stage": { "$ref": "#/components/serverVariables/stage" }, "port": { "$ref": "#/components/serverVariables/port" } } } }, "serverVariables": { "stage": { "default": "demo", "description": "This value is assigned by the service provider, in this example `mycompany.com`" }, "port": { "enum": ["5671", "5672"], "default": "5672" } }, "channels": { "user/signedup": { "subscribe": { "message": { "$ref": "#/components/messages/userSignUp" } } } }, "messages": { "userSignUp": { "summary": "Action to sign a user up.", "description": "Multiline description of what this action does.\nHere you have another line.\n", "tags": [ { "name": "user" }, { "name": "signup" } ], "headers": { "type": "object", "properties": { "applicationInstanceId": { "description": "Unique identifier for a given instance of the publishing application", "type": "string" } } }, "payload": { "type": "object", "properties": { "user": { "$ref": "#/components/schemas/userCreate" }, "signup": { "$ref": "#/components/schemas/signup" } } } } }, "parameters": { "userId": { "description": "Id of the user." } }, "correlationIds": { "default": { "description": "Default Correlation ID", "location": "$message.header#/correlationId" } }, "messageTraits": { "commonHeaders": { "headers": { "type": "object", "properties": { "my-app-header": { "type": "integer", "minimum": 0, "maximum": 100 } } } } } } } ``` ```yaml components: schemas: Category: type: object properties: id: type: integer format: int64 name: type: string Tag: type: object properties: id: type: integer format: int64 name: type: string AvroExample: schemaFormat: 'application/vnd.apache.avro+json;version=1.9.0' schema: $ref: './user-create.avsc' servers: development: host: '{stage}.in.mycompany.com:{port}' description: RabbitMQ broker protocol: amqp protocolVersion: 0-9-1 variables: stage: $ref: '#/components/serverVariables/stage' port: $ref: '#/components/serverVariables/port' serverVariables: stage: default: demo description: | This value is assigned by the service provider, in this example `mycompany.com` port: enum: - '5671' - '5672' default: '5672' channels: user/signedup: subscribe: message: $ref: '#/components/messages/userSignUp' messages: userSignUp: summary: Action to sign a user up. description: | Multiline description of what this action does. Here you have another line. tags: - name: user - name: signup headers: type: object properties: applicationInstanceId: description: | Unique identifier for a given instance of the publishing application type: string payload: type: object properties: user: $ref: '#/components/schemas/userCreate' signup: $ref: '#/components/schemas/signup' parameters: userId: description: Id of the user. correlationIds: default: description: Default Correlation ID location: '$message.header#/correlationId' messageTraits: commonHeaders: headers: type: object properties: my-app-header: type: integer minimum: 0 maximum: 100 ``` #### Multi Format Schema Object The Multi Format Schema Object represents a schema definition. It differs from the [Schema Object](#schemaObject) in that it supports multiple schema formats or languages (e.g., JSON Schema, Avro, etc.). ##### Fixed Fields Field Name | Type | Description ---|:---:|--- schemaFormat | `string` | **Required**. A string containing the name of the schema format that is used to define the information. If `schemaFormat` is missing, it MUST default to `application/vnd.aai.asyncapi+json;version={{asyncapi}}` where `{{asyncapi}}` matches the [AsyncAPI Version String](#A2SVersionString). In such a case, this would make the Multi Format Schema Object equivalent to the [Schema Object](#schemaObject). When using [Reference Object](#referenceObject) within the schema, the `schemaFormat` of the resource being referenced MUST match the `schemaFormat` of the schema that contains the initial reference. For example, if you reference Avro `schema`, then `schemaFormat` of referencing resource and the resource being reference MUST match.