ATTENTION: Work in progress
This version is not yet ready to be used. We're currently working on it. If you want to join the effort and participate in the development of the next major version of AsyncAPI, head over to GitHub Issue that we use for tracking 3.0 development progress.
AsyncAPI Specification
Disclaimer
Part of this content has been taken from the great work done by the folks at the OpenAPI Initiative. Mainly because it's a great work and we want to keep as much compatibility as possible with the OpenAPI Specification.
Version 3.0.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.
The AsyncAPI Specification is licensed under The Apache License, Version 2.0.
Introduction
The AsyncAPI Specification is a project used to describe and document 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 files required to describe such an API. These files can then be used to create utilities, such as documentation, integration and/or testing tools.
The file(s) MUST describe the operations an application accepts. For instance, consider the following AsyncAPI definition snippet:
1 2 3 4
user/signedup: subscribe: message: $ref: "#/components/messages/userSignUp"
It means that the application allows consumers to subscribe to the user/signedup
channel to receive userSignUp messages produced by the application.
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.
Definitions
Server
A server MAY be a message broker that is capable of sending and/or receiving between a producer and consumer. 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 producer, a consumer or both. An application MAY be a microservice, IoT device (sensor), mainframe process, etc. An application MAY be written in any number of different programming languages as long as they support the selected protocol. An application MUST also use a protocol supported by the server in order to connect and exchange messages.
Producer
A producer is a type of application, connected to a server, that is creating messages and addressing them to channels. A producer MAY be publishing to multiple channels depending on the server, protocol, and use-case pattern.
Consumer
A consumer is a type of application, connected to a server via a supported protocol, that is consuming messages from channels. A consumer MAY be consuming from multiple channels depending on the server, protocol, and the use-case pattern.
Message
A message is the mechanism by which information is exchanged via a channel between servers and applications. A message MUST contain a payload and MAY also contain headers. The headers MAY be subdivided into protocol-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, for the organization of messages. Producer applications send messages to channels and consumer applications consume messages from channels. Servers MAY support many channel instances, allowing messages with different content to be addressed to different channels. Depending on the server 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 are exchanged between the application and the channel. Example protocols include, but are not limited to, AMQP, HTTP, JMS, Kafka, Anypoint MQ, MQTT, Solace, STOMP, Mercure, WebSocket.
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:
1 2 3
{ "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 is recommended along with some additional constraints:
- Tags MUST be limited to those allowed by the JSON Schema ruleset
- 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 are used.
It is important to note that everything that is defined in an AsyncAPI document MUST be used by the implemented Application, with the exception of the Components Object. Everything that is defined inside the Components Object represents a resource that MAY or MAY NOT be used by the implemented Application.
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.
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 | 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 | Identifier of the application the AsyncAPI document is defining. |
info | Info Object | REQUIRED. Provides metadata about the API. The metadata can be used by the clients if needed. |
servers | Servers Object | Provides connection details of servers. |
defaultContentType | Default Content Type | Default content type to use when encoding/decoding a message's payload. |
channels | Channels Object | The channels used by this application. |
operations | Operations Object | The operations this application MUST implement. |
components | Components Object | 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. |
This object MAY be extended with Specification Extensions.
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 the AsyncAPI document is defining. It must conform to the URI format, according to RFC3986.
It is RECOMMENDED to use a URN to globally and uniquely identify the application during long periods of time, even after it becomes unavailable or ceases to exist.
Examples
1 2 3
{ "id": "urn:example:com:smartylighting:streetlights:server" }
id: 'urn:example:com:smartylighting:streetlights:server'
1 2 3
{ "id": "https://github.com/smartylighting/streetlights-server" }
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 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 | The contact information for the exposed API. |
license | License Object | The license information for the exposed API. |
tags | Tags Object | A list of tags for application API documentation control. Tags can be used for logical grouping of applications. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation of the exposed API. |
This object MAY be extended with Specification Extensions.
Info Object Example:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
{ "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" } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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
This object MAY be extended with Specification Extensions.
Contact Object Example:
1 2 3 4 5
{ "name": "API Support", "url": "https://www.example.com/support", "email": "support@example.com" }
1 2 3
name: API Support url: https://www.example.com/support email: support@example.com
License Object
License information for the exposed API.
Fixed Fields
This object MAY be extended with Specification Extensions.
License Object Example:
1 2 3 4
{ "name": "Apache 2.0", "url": "https://www.apache.org/licenses/LICENSE-2.0.html" }
1 2
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.
Patterned Fields
Field Pattern | Type | Description |
---|---|---|
^[A-Za-z0-9_\-]+$ | Server Object | Reference Object | The definition of a server this application MAY connect to. |
Servers Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
{ "development": { "url": "development.gigantic-server.com", "protocol": "kafka", "protocolVersion": "1.0.0", "title": "Development server", "summary": "A development server", "description": "A longer description", "tags": [ { "name": "env:development" } ], "externalDocs": { "description": "Find more info here", "url": "https://kafka.apache.org/" } } }
1 2 3 4 5 6 7 8 9 10 11 12
development: url: development.gigantic-server.com protocol: kafka protocolVersion: 1.0.0 title: Development server summary: A development server description: A longer description tags: - name: "env:development" externalDocs: description: Find more info here url: https://kafka.apache.org/
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 |
---|---|---|
url | string | REQUIRED. A URL to the target host. This URL supports Server Variables and MAY be relative, to indicate that the host location is relative to the location where the AsyncAPI document is being served. Variable substitutions will be made when a variable is named in { braces} . |
protocol | string | REQUIRED. The protocol this URL supports for connection. Supported protocol include, but are not limited to: amqp , amqps , http , https , ibmmq , jms , kafka , kafka-secure , anypointmq , mqtt , secure-mqtt , solace , stomp , stomps , ws , wss , mercure , googlepubsub . |
protocolVersion | string | The version of the protocol used for connection. For instance: AMQP 0.9.1 , HTTP 2.0 , Kafka 1.0.0 , etc. |
title | string | A human-friendly title for the server. |
summary | string | A short summary of the server. |
description | string | An optional string describing the host designated by the URL. CommonMark syntax MAY be used for rich text representation. |
variables | Map[string , Server Variable Object | Reference Object]] | A map between a variable name and its value. The value is used for substitution in the server's URL template. |
security | [Security Scheme Object | Reference Object] | A declaration of which security schemes can be used with this server. The list of values includes alternative security scheme objects that can be used. Only one of the security scheme objects need to be satisfied to authorize a connection or operation. |
tags | Tags Object | A list of tags for logical grouping and categorization of servers. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this server. |
bindings | Server Bindings Object | Reference Object | A map where the keys describe the name of the protocol and the values describe protocol-specific definitions for the server. |
Server Object Example
A single server would be described as:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{ "url": "development.gigantic-server.com", "protocol": "kafka", "protocolVersion": "1.0.0", "title": "Development server", "summary": "A development server", "description": "A longer description", "tags": [ { "name": "env:development" } ], "externalDocs": { "description": "Find more info here", "url": "https://kafka.apache.org/" } }
1 2 3 4 5 6 7 8 9 10 11
url: development.gigantic-server.com protocol: kafka protocolVersion: 1.0.0 title: Development server summary: A development server description: A longer description tags: - name: "env:development" externalDocs: description: Find more info here url: https://kafka.apache.org/
Using server variables for dynamic URLs:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
{ "url": "{username}.gigantic-server.com:{port}/{basePath}", "description": "The production API server", "protocol": "secure-mqtt", "variables": { "username": { "default": "demo", "description": "This value is assigned by the service provider, in this example `gigantic-server.com`" }, "port": { "enum": [ "8883", "8884" ], "default": "8883" }, "basePath": { "default": "v2" } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
url: '{username}.gigantic-server.com:{port}/{basePath}' description: The production API server protocol: secure-mqtt variables: username: # Note: no enum here means it is an open value. default: demo description: This value is assigned by the service provider, in this example `gigantic-server.com` port: enum: - '8883' - '8884' default: '8883' basePath: # Note: open meaning. There is the opportunity to use special base paths as assigned by the provider, default is `v2`. default: v2
Using security mechanisms:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
{ "url": "broker.company.com", "description": "Production MQTT broker", "protocol": "secure-mqtt", "protocolVersion": "5", "security": [ { "type": "userPassword", "description": "Connect to the MQTT broker using basic authentication." }, { "type": "X509", "description": "Connect to the MQTT broker using a X509 certificate." } ] }
1 2 3 4 5 6 7 8 9
url: broker.company.com description: Production MQTT broker protocol: secure-mqtt protocolVersion: '5' security: - type: userPassword description: Connect to the MQTT broker using basic authentication. - type: X509 description: Connect to the MQTT broker using a X509 certificate.
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 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.
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 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
1 2 3
{ "defaultContentType": "application/json" }
defaultContentType: application/json
Channels Object
An object containing all the Channel Object definitions the Application MUST use during runtime.
Patterned Fields
Field Pattern | Type | Description |
---|---|---|
{channelId} | Channel Object | Reference Object | 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
1 2 3 4 5 6 7 8 9 10
{ "userSignedUp": { "address": "user.signedup", "messages": { "userSignedUp": { "$ref": "#/components/messages/userSignedUp" } } } }
1 2 3 4 5
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. |
messages | Messages Object | 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 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 can be used for rich text representation. |
servers | [Reference Object] | An array of $ref pointers to the definition of the servers in which this channel is available. If servers is absent or empty, this channel MUST be available on all the servers defined in the Servers Object. Please note the servers property value MUST be an array of Reference Objects and, therefore, MUST NOT contain an array of Server Objects. However, it is RECOMMENDED that parsers (or other software) dereference this property for a better development experience. |
parameters | Parameters Object | A map of the parameters included in the channel address. It MUST be present only when the address contains Channel Address Expressions. |
tags | Tags Object | A list of tags for logical grouping of channels. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this channel. |
bindings | Channel Bindings Object | Reference Object | 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.
Channel Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
{ "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" } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
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 | Reference Object | 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
1 2 3 4 5 6 7 8
{ "userSignedUp": { "$ref": "#/components/messages/userSignedUp" }, "userCompletedOrder": { "$ref": "#/components/messages/userCompletedOrder" } }
1 2 3 4
userSignedUp: $ref: '#/components/messages/userSignedUp' userCompletedOrder: $ref: '#/components/messages/userCompletedOrder'
Operations Object
Holds a dictionary with all the operations 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
.
Patterned Fields
Field Pattern | Type | Description |
---|---|---|
{operationId} | Operation Object | Reference Object | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
{ "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" } ] } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
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 | string | Required. Allowed values are send and receive . Use send when it's expected that the application will send a message to the given channel , and receive when the application should expect receiving messages from the given channel . |
channel | Reference Object | Required. A $ref pointer to the definition of the channel in which this operation is performed. Please note the channel property value MUST be a Reference Object and, therefore, MUST NOT contain a Channel Object. 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 can be used for rich text representation. |
security | [Security Scheme Object | Reference Object] | A declaration of which security schemes are associated with this operation. Only one of the security scheme objects MUST be satisfied to authorize an operation. In cases where Server Security also applies, it MUST also be satisfied. |
tags | Tags Object | A list of tags for logical grouping and categorization of operations. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this operation. |
bindings | Operation Bindings Object | Reference Object | 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 | Reference Object ] | A list of traits to apply to the operation object. Traits MUST be merged into the operation object using the JSON Merge Patch algorithm in the same order they are defined here. |
This object MAY be extended with Specification Extensions.
Operation Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
{ "title": "User sign up", "summary": "Action to sign a user up.", "description": "A longer description", "channel": { "$ref": "#/channels/userSignup" }, "action": "send", "security": [ { "petstore_auth": [ "write:pets", "read:pets" ] } ], "tags": [ { "name": "user" }, { "name": "signup" }, { "name": "register" } ], "bindings": { "amqp": { "ack": false } }, "traits": [ { "$ref": "#/components/operationTraits/kafka" } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
title: User sign up summary: Action to sign a user up. description: A longer description channel: $ref: '#/channels/userSignup' action: send security: - petstore_auth: - write:pets - read:pets tags: - name: user - name: signup - name: register bindings: amqp: ack: false traits: - $ref: "#/components/operationTraits/kafka"
Operation Trait Object
Describes a trait that MAY be applied to an Operation Object. This object MAY contain any property from the Operation Object, except the action
, channel
and traits
ones.
If you're looking to apply traits to a message, see the Message Trait Object.
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 can be used for rich text representation. |
security | [Security Scheme Object | Reference Object] | A declaration of which security schemes are associated with this operation. Only one of the security scheme objects MUST be satisfied to authorize an operation. In cases where Server Security also applies, it MUST also be satisfied. |
tags | Tags Object | A list of tags for logical grouping and categorization of operations. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this operation. |
bindings | Operation Bindings Object | Reference Object | 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.
Operation Trait Object Example
1 2 3 4 5 6 7
{ "bindings": { "amqp": { "ack": false } } }
1 2 3
bindings: amqp: ack: false
Parameters Object
Describes a map of parameters included in a channel name.
This map MUST contain all the parameters used in the parent channel name.
Patterned Fields
Field Pattern | Type | Description |
---|---|---|
^[A-Za-z0-9_\-]+$ | Parameter Object | Reference Object | The key represents the name of the parameter. It MUST match the parameter name used in the parent channel name. |
Parameters Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
{ "user/{userId}/signup": { "parameters": { "userId": { "description": "Id of the user.", "schema": { "type": "string" } } }, "subscribe": { "message": { "$ref": "#/components/messages/userSignedUp" } } } }
1 2 3 4 5 6 7 8 9
user/{userId}/signup: parameters: userId: description: Id of the user. schema: type: string subscribe: message: $ref: "#/components/messages/userSignedUp"
Parameter Object
Describes a parameter included in a channel name.
Fixed Fields
Field Name | Type | Description |
---|---|---|
description | string | A verbose explanation of the parameter. CommonMark syntax can be used for rich text representation. |
schema | Schema Object | Reference Object | Definition of the parameter. |
location | string | A runtime expression that specifies the location of the parameter value. Even when a definition for the target field exists, it MUST NOT be used to validate this parameter but, instead, the schema property MUST be used. |
This object MAY be extended with Specification Extensions.
Parameter Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
{ "user/{userId}/signup": { "parameters": { "userId": { "description": "Id of the user.", "schema": { "type": "string" }, "location": "$message.payload#/user/id" } }, "subscribe": { "message": { "$ref": "#/components/messages/userSignedUp" } } } }
1 2 3 4 5 6 7 8 9 10
user/{userId}/signup: parameters: userId: description: Id of the user. schema: type: string location: $message.payload#/user/id subscribe: message: $ref: "#/components/messages/userSignedUp"
Server Bindings Object
Map describing protocol-specific definitions for a server.
Fixed Fields
Field Name | Type | Description |
---|---|---|
http | HTTP Server Binding | Protocol-specific information for an HTTP server. |
ws | WebSockets Server Binding | Protocol-specific information for a WebSockets server. |
kafka | Kafka Server Binding | Protocol-specific information for a Kafka server. |
anypointmq | Anypoint MQ Server Binding | Protocol-specific information for an Anypoint MQ server. |
amqp | AMQP Server Binding | Protocol-specific information for an AMQP 0-9-1 server. |
amqp1 | AMQP 1.0 Server Binding | Protocol-specific information for an AMQP 1.0 server. |
mqtt | MQTT Server Binding | Protocol-specific information for an MQTT server. |
mqtt5 | MQTT 5 Server Binding | Protocol-specific information for an MQTT 5 server. |
nats | NATS Server Binding | Protocol-specific information for a NATS server. |
jms | JMS Server Binding | Protocol-specific information for a JMS server. |
sns | SNS Server Binding | Protocol-specific information for an SNS server. |
solace | Solace Server Binding | Protocol-specific information for a Solace server. |
sqs | SQS Server Binding | Protocol-specific information for an SQS server. |
stomp | STOMP Server Binding | Protocol-specific information for a STOMP server. |
redis | Redis Server Binding | Protocol-specific information for a Redis server. |
mercure | Mercure Server Binding | Protocol-specific information for a Mercure server. |
ibmmq | IBM MQ Server Binding | Protocol-specific information for an IBM MQ server. |
googlepubsub | Google Cloud Pub/Sub Server Binding | Protocol-specific information for a Google Cloud Pub/Sub server. |
This object MAY be extended with Specification Extensions.
Channel Bindings Object
Map describing protocol-specific definitions for a channel.
Fixed Fields
Field Name | Type | Description |
---|---|---|
http | HTTP Channel Binding | Protocol-specific information for an HTTP channel. |
ws | WebSockets Channel Binding | Protocol-specific information for a WebSockets channel. |
kafka | Kafka Channel Binding | Protocol-specific information for a Kafka channel. |
anypointmq | Anypoint MQ Channel Binding | Protocol-specific information for an Anypoint MQ channel. |
amqp | AMQP Channel Binding | Protocol-specific information for an AMQP 0-9-1 channel. |
amqp1 | AMQP 1.0 Channel Binding | Protocol-specific information for an AMQP 1.0 channel. |
mqtt | MQTT Channel Binding | Protocol-specific information for an MQTT channel. |
mqtt5 | MQTT 5 Channel Binding | Protocol-specific information for an MQTT 5 channel. |
nats | NATS Channel Binding | Protocol-specific information for a NATS channel. |
jms | JMS Channel Binding | Protocol-specific information for a JMS channel. |
sns | SNS Channel Binding | Protocol-specific information for an SNS channel. |
solace | Solace Channel Binding | Protocol-specific information for a Solace channel. |
sqs | SQS Channel Binding | Protocol-specific information for an SQS channel. |
stomp | STOMP Channel Binding | Protocol-specific information for a STOMP channel. |
redis | Redis Channel Binding | Protocol-specific information for a Redis channel. |
mercure | Mercure Channel Binding | Protocol-specific information for a Mercure channel. |
ibmmq | IBM MQ Channel Binding | Protocol-specific information for an IBM MQ channel. |
googlepubsub | Google Cloud Pub/Sub Channel Binding | Protocol-specific information for a Google Cloud Pub/Sub channel. |
This object MAY be extended with Specification Extensions.
Operation Bindings Object
Map describing protocol-specific definitions for an operation.
Fixed Fields
Field Name | Type | Description |
---|---|---|
http | HTTP Operation Binding | Protocol-specific information for an HTTP operation. |
ws | WebSockets Operation Binding | Protocol-specific information for a WebSockets operation. |
kafka | Kafka Operation Binding | Protocol-specific information for a Kafka operation. |
anypointmq | Anypoint MQ Operation Binding | Protocol-specific information for an Anypoint MQ operation. |
amqp | AMQP Operation Binding | Protocol-specific information for an AMQP 0-9-1 operation. |
amqp1 | AMQP 1.0 Operation Binding | Protocol-specific information for an AMQP 1.0 operation. |
mqtt | MQTT Operation Binding | Protocol-specific information for an MQTT operation. |
mqtt5 | MQTT 5 Operation Binding | Protocol-specific information for an MQTT 5 operation. |
nats | NATS Operation Binding | Protocol-specific information for a NATS operation. |
jms | JMS Operation Binding | Protocol-specific information for a JMS operation. |
sns | SNS Operation Binding | Protocol-specific information for an SNS operation. |
solace | Solace Operation Binding | Protocol-specific information for a Solace operation. |
sqs | SQS Operation Binding | Protocol-specific information for an SQS operation. |
stomp | STOMP Operation Binding | Protocol-specific information for a STOMP operation. |
redis | Redis Operation Binding | Protocol-specific information for a Redis operation. |
mercure | Mercure Operation Binding | Protocol-specific information for a Mercure operation. |
googlepubsub | Google Cloud Pub/Sub Operation Binding | Protocol-specific information for a Google Cloud Pub/Sub operation. |
ibmmq | IBM MQ Operation Binding | Protocol-specific information for an IBM MQ operation. |
This object MAY be extended with Specification Extensions.
Message Bindings Object
Map describing protocol-specific definitions for a message.
Fixed Fields
Field Name | Type | Description |
---|---|---|
http | HTTP Message Binding | Protocol-specific information for an HTTP message, i.e., a request or a response. |
ws | WebSockets Message Binding | Protocol-specific information for a WebSockets message. |
kafka | Kafka Message Binding | Protocol-specific information for a Kafka message. |
anypointmq | Anypoint MQ Message Binding | Protocol-specific information for an Anypoint MQ message. |
amqp | AMQP Message Binding | Protocol-specific information for an AMQP 0-9-1 message. |
amqp1 | AMQP 1.0 Message Binding | Protocol-specific information for an AMQP 1.0 message. |
mqtt | MQTT Message Binding | Protocol-specific information for an MQTT message. |
mqtt5 | MQTT 5 Message Binding | Protocol-specific information for an MQTT 5 message. |
nats | NATS Message Binding | Protocol-specific information for a NATS message. |
jms | JMS Message Binding | Protocol-specific information for a JMS message. |
sns | SNS Message Binding | Protocol-specific information for an SNS message. |
solace | Solace Server Binding | Protocol-specific information for a Solace message. |
sqs | SQS Message Binding | Protocol-specific information for an SQS message. |
stomp | STOMP Message Binding | Protocol-specific information for a STOMP message. |
redis | Redis Message Binding | Protocol-specific information for a Redis message. |
mercure | Mercure Message Binding | Protocol-specific information for a Mercure message. |
ibmmq | IBM MQ Message Binding | Protocol-specific information for an IBM MQ message. |
googlepubsub | Google Cloud Pub/Sub Message Binding | Protocol-specific information for a Google Cloud Pub/Sub message. |
This object MAY be extended with Specification Extensions.
Message Object
Describes a message received on a given channel and operation.
Fixed Fields
Field Name | Type | Description |
---|---|---|
messageId | string | Unique string used to identify the message. The id MUST be unique among all messages described in the API. The messageId value is case-sensitive. Tools and libraries MAY use the messageId to uniquely identify a message, therefore, it is RECOMMENDED to follow common programming naming conventions. |
headers | Schema Object | Reference Object | Schema definition of the application headers. Schema MUST be of type "object". It MUST NOT define the protocol headers. |
payload | any | Definition of the message payload. It can be of any type but defaults to Schema object. It must match the schema format, including encoding type - e.g Avro should be inlined as either a YAML or JSON object NOT a string to be parsed as YAML or JSON. |
correlationId | Correlation ID Object | Reference Object | Definition of the correlation ID used for message tracing or matching. |
schemaFormat | string | A string containing the name of the schema format used to define the message payload. If omitted, implementations should parse the payload as a Schema object. When the payload is defined using a $ref to a remote file, it is RECOMMENDED the schema format includes the file encoding type to allow implementations to parse the file correctly. E.g., adding +yaml if content type is application/vnd.apache.avro results in application/vnd.apache.avro+yaml .Check out the supported schema formats table for more information. Custom values are allowed but their implementation is OPTIONAL. A custom value MUST NOT refer to one of the schema formats listed in the table. |
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 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 can be used for rich text representation. |
tags | Tags Object | A list of tags for logical grouping and categorization of messages. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this message. |
bindings | Message Bindings Object | Reference Object | 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] | List of examples. |
traits | [Message Trait Object | Reference Object] | A list of traits to apply to the message object. Traits MUST be merged into the message object using the JSON Merge Patch algorithm in the same order they are defined here. The resulting object MUST be a valid Message Object. |
This object MAY be extended with Specification Extensions.
Schema formats table
The following table contains a set of values that every implementation MUST support.
Name | Allowed values | Notes |
---|---|---|
AsyncAPI 3.0.0 Schema Object | application/vnd.aai.asyncapi;version=3.0.0 , application/vnd.aai.asyncapi+json;version=3.0.0 , application/vnd.aai.asyncapi+yaml;version=3.0.0 | This is the default when a schemaFormat is not provided. |
JSON Schema Draft 07 | application/schema+json;version=draft-07 , application/schema+yaml;version=draft-07 |
The following table contains a set of values that every implementation is RECOMMENDED to support.
Name | Allowed values | Notes |
---|---|---|
Avro 1.9.0 schema | application/vnd.apache.avro;version=1.9.0 , application/vnd.apache.avro+json;version=1.9.0 , application/vnd.apache.avro+yaml;version=1.9.0 | |
OpenAPI 3.0.0 Schema Object | application/vnd.oai.openapi;version=3.0.0 , application/vnd.oai.openapi+json;version=3.0.0 , application/vnd.oai.openapi+yaml;version=3.0.0 | |
RAML 1.0 data type | application/raml+yaml;version=1.0 |
Message Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
{ "messageId": "userSignup", "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" } } } ] }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
messageId: userSignup 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
{ "messageId": "userSignup", "name": "UserSignup", "title": "User signup", "summary": "Action to sign a user up.", "description": "A longer description", "tags": [ { "name": "user" }, { "name": "signup" }, { "name": "register" } ], "schemaFormat": "application/vnd.apache.avro+json;version=1.9.0", "payload": { "$ref": "path/to/user-create.avsc#/UserCreate" } }
1 2 3 4 5 6 7 8 9 10 11 12
messageId: userSignup name: UserSignup title: User signup summary: Action to sign a user up. description: A longer description tags: - name: user - name: signup - name: register schemaFormat: 'application/vnd.apache.avro+yaml;version=1.9.0' payload: $ref: 'path/to/user-create.avsc/#UserCreate'
Message Trait Object
Describes a trait that MAY be applied to a Message Object. This object MAY contain any property from the Message Object, except payload
and traits
.
If you're looking to apply traits to an operation, see the Operation Trait Object.
Fixed Fields
Field Name | Type | Description |
---|---|---|
messageId | string | Unique string used to identify the message. The id MUST be unique among all messages described in the API. The messageId value is case-sensitive. Tools and libraries MAY use the messageId to uniquely identify a message, therefore, it is RECOMMENDED to follow common programming naming conventions. |
headers | Schema Object | Reference Object | Schema definition of the application headers. Schema MUST be of type "object". It MUST NOT define the protocol headers. |
correlationId | Correlation ID Object | Reference Object | Definition of the correlation ID used for message tracing or matching. |
schemaFormat | string | A string containing the name of the schema format/language used to define the message payload. If omitted, implementations should parse the payload as a Schema object. |
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 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 can be used for rich text representation. |
tags | Tags Object | A list of tags for logical grouping and categorization of messages. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this message. |
bindings | Message Bindings Object | Reference Object | 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] | List of examples. |
This object MAY be extended with Specification Extensions.
Message Trait Object Example
1 2 3 4
{ "schemaFormat": "application/vnd.apache.avro+json;version=1.9.0", "contentType": "application/json" }
1 2
schemaFormat: 'application/vnd.apache.avro+yaml;version=1.9.0' contentType: application/json
Message Example Object
Message Example Object represents an example of a Message Object 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 field. |
payload | any | The value of this field MUST validate against the Message Object's payload 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.
Message Example Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
{ "name": "SimpleSignup", "summary": "A simple UserSignup example message", "headers": { "correlationId": "my-correlation-id", "applicationInstanceId": "myInstanceId" }, "payload": { "user": { "someUserKey": "someUserValue" }, "signup": { "someSignupKey": "someSignupValue" } } }
1 2 3 4 5 6 7 8 9 10
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. An Tag Object in a list can be referenced by Reference Object.
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 can be used for rich text representation. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this tag. |
This object MAY be extended with Specification Extensions.
Tag Object Example
1 2 3 4
{ "name": "user", "description": "User-related messages" }
1 2
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 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.
External Documentation Object Example
1 2 3 4
{ "description": "Find more info here", "url": "https://example.com" }
1 2
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 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.
For this specification, reference resolution is done as defined by the JSON Reference specification and not by the JSON Schema specification.
Fixed Fields
This object cannot be extended with additional properties and any properties added SHALL be ignored.
Reference Object Example
1 2 3
{ "$ref": "#/components/schemas/Pet" }
$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 , Schema Object | Reference Object] | An object to hold reusable Schema Objects. |
servers | Map[string , Server Object | Reference Object] | An object to hold reusable Server Objects. |
channels | Map[string , Channel Object | Reference Object] | An object to hold reusable Channel Objects. |
operations | Map[string , Operation Item Object | Reference Object] | An object to hold reusable Operation Item Objects. |
messages | Map[string , Message Object | Reference Object] | An object to hold reusable Message Objects. |
securitySchemes | Map[string , Security Scheme Object | Reference Object] | An object to hold reusable Security Scheme Objects. |
serverVariables | Map[string , Server Variable Object | Reference Object] | An object to hold reusable Server Variable Objects. |
parameters | Map[string , Parameter Object | Reference Object] | An object to hold reusable Parameter Objects. |
correlationIds | Map[string , Correlation ID Object | Reference Object] | An object to hold reusable Correlation ID Objects. |
externalDocs | Map[string , External Documentation Object | Reference Object] | An object to hold reusable External Documentation Objects. |
tags | Map[string , Tag Object | Reference Object] | An object to hold reusable Tag Objects. |
operationTraits | Map[string , Operation Trait Object | Reference Object] | An object to hold reusable Operation Trait Objects. |
messageTraits | Map[string , Message Trait Object | Reference Object] | An object to hold reusable Message Trait Objects. |
serverBindings | Map[string , Server Bindings Object | Reference Object] | An object to hold reusable Server Bindings Objects. |
channelBindings | Map[string , Channel Bindings Object | Reference Object] | An object to hold reusable Channel Bindings Objects. |
operationBindings | Map[string , Operation Bindings Object | Reference Object] | An object to hold reusable Operation Bindings Objects. |
messageBindings | Map[string , Message Bindings Object | Reference Object] | An object to hold reusable Message Bindings Objects. |
This object MAY be extended with Specification Extensions.
All the fixed fields declared above are objects that MUST use keys that match the regular expression: ^[a-zA-Z0-9\.\-_]+$
.
Field Name Examples:
1 2 3 4 5
User User_1 User_Name user-name my.org.User
Components Object Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
{ "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" } } } }, "servers": { "development": { "url": "{stage}.gigantic-server.com:{port}", "description": "Development server", "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 `gigantic-server.com`" }, "port": { "enum": ["8883", "8884"], "default": "8883" } }, "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.", "schema": { "type": "string" } } }, "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 } } } } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
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 servers: development: url: "{stage}.gigantic-server.com:{port}" description: Development server 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 `gigantic-server.com` port: enum: [8883, 8884] default: 8883 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. schema: type: string 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
Schema Object
The Schema Object allows the definition of input and output data types.
These types can be objects, but also primitives and arrays. This object is a superset of the JSON Schema Specification Draft 07. The empty schema (which allows any instance to validate) MAY be represented by the boolean
value true
and a schema which allows no instance to validate MAY be represented by the boolean
value false
.
Further information about the properties can be found in JSON Schema Core and JSON Schema Validation. Unless stated otherwise, the property definitions follow the JSON Schema specification as referenced here.
Properties
The AsyncAPI Schema Object is a JSON Schema vocabulary which extends JSON Schema Core and Validation vocabularies. As such, any keyword available for those vocabularies is by definition available in AsyncAPI, and will work the exact same way, including but not limited to:
- title
- type
- required
- multipleOf
- maximum
- exclusiveMaximum
- minimum
- exclusiveMinimum
- maxLength
- minLength
- pattern (This string SHOULD be a valid regular expression, according to the ECMA 262 regular expression dialect)
- maxItems
- minItems
- uniqueItems
- maxProperties
- minProperties
- enum
- const
- examples
- if / then / else
- readOnly
- writeOnly
- properties
- patternProperties
- additionalProperties
- additionalItems
- items
- propertyNames
- contains
- allOf
- oneOf
- anyOf
- not
The following properties are taken from the JSON Schema definition but their definitions were adjusted to the AsyncAPI Specification.
- description - CommonMark syntax can be used for rich text representation.
- format - See Data Type Formats for further details. While relying on JSON Schema's defined formats, the AsyncAPI Specification offers a few additional predefined formats.
- default - The default value represents what would be assumed by the consumer of the input as the value of the schema if one is not provided. Unlike JSON Schema, the value MUST conform to the defined type for the Schema Object defined at the same level. For example, of
type
isstring
, thendefault
can be"foo"
but cannot be1
.
Alternatively, any time a Schema Object can be used, a Reference Object can be used in its place. This allows referencing definitions in place of defining them inline. It is appropriate to clarify that the $ref
keyword MUST follow the behavior described by Reference Object instead of the one in JSON Schema definition.
In addition to the JSON Schema fields, the following AsyncAPI vocabulary fields MAY be used for further schema documentation:
Fixed Fields
Field Name | Type | Description |
---|---|---|
discriminator | string | Adds support for polymorphism. The discriminator is the schema property name that is used to differentiate between other schema that inherit this schema. The property name used MUST be defined at this schema and it MUST be in the required property list. When used, the value MUST be the name of this schema or any schema that inherits it. See Composition and Inheritance for more details. |
externalDocs | External Documentation Object | Reference Object | Additional external documentation for this schema. |
deprecated | boolean | Specifies that a schema is deprecated and SHOULD be transitioned out of usage. Default value is false . |
This object MAY be extended with Specification Extensions.
Composition and Inheritance (Polymorphism)
The AsyncAPI Specification allows combining and extending model definitions using the allOf
property of JSON Schema, in effect offering model composition.
allOf
takes in an array of object definitions that are validated independently but together compose a single object.
While composition offers model extensibility, it does not imply a hierarchy between the models.
To support polymorphism, AsyncAPI Specification adds the support of the discriminator
field.
When used, the discriminator
will be the name of the property used to decide which schema definition is used to validate the structure of the model.
As such, the discriminator
field MUST be a required field.
There are are two ways to define the value of a discriminator for an inheriting instance.
- Use the schema's name.
- Override the schema's name by overriding the property with a new value. If exists, this takes precedence over the schema's name.
As such, inline schema definitions, which do not have a given id, cannot be used in polymorphism.
Schema Object Examples
Primitive Sample
1 2 3 4
{ "type": "string", "format": "email" }
1 2
type: string format: email
Simple Model
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
{ "type": "object", "required": [ "name" ], "properties": { "name": { "type": "string" }, "address": { "$ref": "#/components/schemas/Address" }, "age": { "type": "integer", "format": "int32", "minimum": 0 } } }
1 2 3 4 5 6 7 8 9 10 11 12
type: object required: - name properties: name: type: string address: $ref: '#/components/schemas/Address' age: type: integer format: int32 minimum: 0
Model with Map/Dictionary Properties
For a simple string to string mapping:
1 2 3 4 5 6
{ "type": "object", "additionalProperties": { "type": "string" } }
1 2 3
type: object additionalProperties: type: string
For a string to model mapping:
1 2 3 4 5 6
{ "type": "object", "additionalProperties": { "$ref": "#/components/schemas/ComplexModel" } }
1 2 3
type: object additionalProperties: $ref: '#/components/schemas/ComplexModel'
Model with Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
{ "type": "object", "properties": { "id": { "type": "integer", "format": "int64" }, "name": { "type": "string" } }, "required": [ "name" ], "examples": [ { "name": "Puma", "id": 1 } ] }
1 2 3 4 5 6 7 8 9 10 11 12
type: object properties: id: type: integer format: int64 name: type: string required: - name examples: - name: Puma id: 1
Model with Boolean Schemas
1 2 3 4 5 6 7 8 9 10
{ "type": "object", "required": [ "anySchema" ], "properties": { "anySchema": true, "cannotBeDefined": false } }
1 2 3 4 5 6
type: object required: - anySchema properties: anySchema: true cannotBeDefined: false
Models with Composition
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
{ "schemas": { "ErrorModel": { "type": "object", "required": [ "message", "code" ], "properties": { "message": { "type": "string" }, "code": { "type": "integer", "minimum": 100, "maximum": 600 } } }, "ExtendedErrorModel": { "allOf": [ { "$ref": "#/components/schemas/ErrorModel" }, { "type": "object", "required": [ "rootCause" ], "properties": { "rootCause": { "type": "string" } } } ] } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
schemas: ErrorModel: type: object required: - message - code properties: message: type: string code: type: integer minimum: 100 maximum: 600 ExtendedErrorModel: allOf: - $ref: '#/components/schemas/ErrorModel' - type: object required: - rootCause properties: rootCause: type: string
Models with Polymorphism Support
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
{ "schemas": { "Pet": { "type": "object", "discriminator": "petType", "properties": { "name": { "type": "string" }, "petType": { "type": "string" } }, "required": [ "name", "petType" ] }, "Cat": { "description": "A representation of a cat. Note that `Cat` will be used as the discriminator value.", "allOf": [ { "$ref": "#/components/schemas/Pet" }, { "type": "object", "properties": { "huntingSkill": { "type": "string", "description": "The measured skill for hunting", "enum": [ "clueless", "lazy", "adventurous", "aggressive" ] } }, "required": [ "huntingSkill" ] } ] }, "Dog": { "description": "A representation of a dog. Note that `Dog` will be used as the discriminator value.", "allOf": [ { "$ref": "#/components/schemas/Pet" }, { "type": "object", "properties": { "packSize": { "type": "integer", "format": "int32", "description": "the size of the pack the dog is from", "minimum": 0 } }, "required": [ "packSize" ] } ] }, "StickInsect": { "description": "A representation of an Australian walking stick. Note that `StickBug` will be used as the discriminator value.", "allOf": [ { "$ref": "#/components/schemas/Pet" }, { "type": "object", "properties": { "petType": { "const": "StickBug" }, "color": { "type": "string" } }, "required": [ "color" ] } ] } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
schemas: Pet: type: object discriminator: petType properties: name: type: string petType: type: string required: - name - petType ## applies to instances with `petType: "Cat"` ## because that is the schema name Cat: description: A representation of a cat allOf: - $ref: '#/components/schemas/Pet' - type: object properties: huntingSkill: type: string description: The measured skill for hunting enum: - clueless - lazy - adventurous - aggressive required: - huntingSkill ## applies to instances with `petType: "Dog"` ## because that is the schema name Dog: description: A representation of a dog allOf: - $ref: '#/components/schemas/Pet' - type: object properties: packSize: type: integer format: int32 description: the size of the pack the dog is from minimum: 0 required: - packSize ## applies to instances with `petType: "StickBug"` ## because that is the required value of the discriminator field, ## overriding the schema name StickInsect: description: A representation of an Australian walking stick allOf: - $ref: '#/components/schemas/Pet' - type: object properties: petType: const: StickBug color: type: string required: - color
Security Scheme Object
Defines a security scheme that can be used by the operations. Supported schemes are:
- User/Password.
- API key (either as user or as password).
- X.509 certificate.
- End-to-end encryption (either symmetric or asymmetric).
- HTTP authentication.
- HTTP API key.
- OAuth2's common flows (Implicit, Resource Owner Protected Credentials, Client Credentials and Authorization Code) as defined in RFC6749.
- OpenID Connect Discovery.
- SASL (Simple Authentication and Security Layer) as defined in RFC4422.
Fixed Fields
Field Name | Type | Applies To | Description |
---|---|---|---|
type | string | Any | REQUIRED. The type of the security scheme. Valid values are "userPassword" , "apiKey" , "X509" , "symmetricEncryption" , "asymmetricEncryption" , "httpApiKey" , "http" , "oauth2" , "openIdConnect" , "plain" , "scramSha256" , "scramSha512" , and "gssapi" . |
description | string | Any | A short description for security scheme. CommonMark syntax MAY be used for rich text representation. |
name | string | httpApiKey | REQUIRED. The name of the header, query or cookie parameter to be used. |
in | string | apiKey | httpApiKey | REQUIRED. The location of the API key. Valid values are "user" and "password" for apiKey and "query" , "header" or "cookie" for httpApiKey . |
scheme | string | http | REQUIRED. The name of the HTTP Authorization scheme to be used in the Authorization header as defined in RFC7235. |
bearerFormat | string | http ("bearer" ) | A hint to the client to identify how the bearer token is formatted. Bearer tokens are usually generated by an authorization server, so this information is primarily for documentation purposes. |
flows | OAuth Flows Object | oauth2 | REQUIRED. An object containing configuration information for the flow types supported. |
openIdConnectUrl | string | openIdConnect | REQUIRED. OpenId Connect URL to discover OAuth2 configuration values. This MUST be in the form of an absolute URL. |
scopes | [string ] | oauth2 | openIdConnect | List of the needed scope names. An empty array means no scopes are needed. |
This object MAY be extended with Specification Extensions.
Security Scheme Object Example
User/Password Authentication Sample
1 2 3
{ "type": "userPassword" }
type: userPassword
API Key Authentication Sample
1 2 3 4
{ "type": "apiKey", "in": "user" }
1 2
type: apiKey in: user
X.509 Authentication Sample
1 2 3
{ "type": "X509" }
type: X509
End-to-end Encryption Authentication Sample
1 2 3
{ "type": "symmetricEncryption" }
type: symmetricEncryption
Basic Authentication Sample
1 2 3 4
{ "type": "http", "scheme": "basic" }
1 2
type: http scheme: basic
API Key Sample
1 2 3 4 5
{ "type": "httpApiKey", "name": "api_key", "in": "header" }
1 2 3
type: httpApiKey name: api_key in: header
JWT Bearer Sample
1 2 3 4 5
{ "type": "http", "scheme": "bearer", "bearerFormat": "JWT" }
1 2 3
type: http scheme: bearer bearerFormat: JWT
Implicit OAuth2 Sample
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
{ "type": "oauth2", "flows": { "implicit": { "authorizationUrl": "https://example.com/api/oauth/dialog", "availableScopes": { "write:pets": "modify pets in your account", "read:pets": "read your pets" } } }, "scopes": [ "write:pets" ] }
1 2 3 4 5 6 7 8 9
type: oauth2 flows: implicit: authorizationUrl: https://example.com/api/oauth/dialog availableScopes: write:pets: modify pets in your account read:pets: read your pets scopes: - 'write:pets'
SASL Sample
1 2 3
{ "type": "scramSha512" }
type: scramSha512
OAuth Flows Object
Allows configuration of the supported OAuth Flows.
Fixed Fields
Field Name | Type | Description |
---|---|---|
implicit | OAuth Flow Object | Configuration for the OAuth Implicit flow. |
password | OAuth Flow Object | Configuration for the OAuth Resource Owner Protected Credentials flow. |
clientCredentials | OAuth Flow Object | Configuration for the OAuth Client Credentials flow. |
authorizationCode | OAuth Flow Object | Configuration for the OAuth Authorization Code flow. |
This object MAY be extended with Specification Extensions.
OAuth Flow Object
Configuration details for a supported OAuth Flow
Fixed Fields
This object MAY be extended with Specification Extensions.
OAuth Flow Object Examples
1 2 3 4 5 6 7 8
{ "authorizationUrl": "https://example.com/api/oauth/dialog", "tokenUrl": "https://example.com/api/oauth/token", "availableScopes": { "write:pets": "modify pets in your account", "read:pets": "read your pets" } }
1 2 3 4 5
authorizationUrl: https://example.com/api/oauth/dialog tokenUrl: https://example.com/api/oauth/token availableScopes: write:pets: modify pets in your account read:pets: read your pets
Correlation ID Object
An object that specifies an identifier at design time that can used for message tracing and correlation.
For specifying and computing the location of a Correlation ID, a runtime expression is used.
Fixed Fields
Field Name | Type | Description |
---|---|---|
description | string | An optional description of the identifier. CommonMark syntax can be used for rich text representation. |
location | string | REQUIRED. A runtime expression that specifies the location of the correlation ID. |
This object MAY be extended with Specification Extensions.
Examples
1 2 3 4
{ "description": "Default Correlation ID", "location": "$message.header#/correlationId" }
1 2
description: Default Correlation ID location: $message.header#/correlationId
Runtime Expression
A runtime expression allows values to be defined based on information that will be available within the message. This mechanism is used by Correlation ID Object.
The runtime expression is defined by the following ABNF syntax:
1 2 3 4 5
expression = ( "$message" "." source ) source = ( header-reference | payload-reference ) header-reference = "header" ["#" fragment] payload-reference = "payload" ["#" fragment] fragment = a JSON Pointer [RFC 6901](https://tools.ietf.org/html/rfc6901)
The table below provides examples of runtime expressions and examples of their use in a value:
Examples
Source Location | Example expression | Notes |
---|---|---|
Message Header Property | $message.header#/MQMD/CorrelId | Correlation ID is set using the CorrelId value from the MQMD header. |
Message Payload Property | $message.payload#/messageId | Correlation ID is set using the messageId value from the message payload. |
Runtime expressions preserve the type of the referenced value.
Specification Extensions
While the AsyncAPI Specification tries to accommodate most use cases, additional data can be added to extend the specification at certain points.
The extensions properties are implemented as patterned fields that are always prefixed by "x-"
.
The extensions may or may not be supported by the available tooling, but those may be extended as well to add requested support (if tools are internal or open-sourced).
Data Type Formats
Primitives have an optional modifier property: format
.
The AsyncAPI specification uses several known formats to more finely define the data type being used.
However, the format
property is an open string
-valued property, and can have any value to support documentation needs.
Formats such as "email"
, "uuid"
, etc., can be used even though they are not defined by this specification.
Types that are not accompanied by a format
property follow their definition from the JSON Schema.
Tools that do not recognize a specific format
MAY default back to the type
alone, as if the format
was not specified.
The formats defined by the AsyncAPI Specification are:
Common Name | type | format | Comments |
---|---|---|---|
integer | integer | int32 | signed 32 bits |
long | integer | int64 | signed 64 bits |
float | number | float | |
double | number | double | |
string | string | ||
byte | string | byte | base64 encoded characters |
binary | string | binary | any sequence of octets |
boolean | boolean | ||
date | string | date | As defined by full-date - RFC3339 |
dateTime | string | date-time | As defined by date-time - RFC3339 |
password | string | password | Used to hint UIs the input needs to be obscured. |