Introduction to OpenAPI 3.0
We recommend a multi-file format for OpenAPI definitions. OpenAPI allows for either a JSON or YAML format. We recommend using the YAML format, and use it in our examples.
Learn the YAML essentials before learning OpenAPI.
Then, continue on to see the OpenAPI visual reference which explores the entire specification showing snippets of the spec, samples, visual renders, and the corresponding types used in Redocly CLI.
Root document (aka entrypoint)
The entrypoint, typically named openapi.yaml
has the entire skeleton of the OpenAPI definition. It is known as the root document.
It has certain required properties:
- openapi
- info
- paths
And some optional properties:
- externalDocs
- servers
- components
- tags
- security
Here is a sample truncated openapi.yaml
file.
openapi: 3.0.3 info: version: 1.0.0 title: Example.com termsOfService: 'https://example.com/terms/' contact: email: contact@example.com url: 'http://example.com/contact' license: name: Apache 2.0 url: 'http://www.apache.org/licenses/LICENSE-2.0.html' x-logo: url: 'https://apis.guru/openapi-template/logo.png' description: > # Your description here externalDocs: description: Find out how to create a GitHub repo for your OpenAPI definition. url: 'https://github.com/Rebilly/generator-openapi-repo' tags: - name: Echo description: Example echo operations - name: User description: Operations about user servers: - url: 'http://example.com/api/v1' - url: 'https://example.com/api/v1' paths: # paths here components: securitySchemes: # security schemes here security: - SecretAPIKey: [] - JWT: []
Almost all of the complexity and effort will go into the components
and paths
descriptions.
We recommend keeping the components
within the root document at a minimum, and only defining the security schemes used.
We recommend describing the paths and schema into other files. The paths will reference the schema using $refs.
Paths
The paths
in the root document should point to separate path files.
paths: '/users/{username}': $ref: 'paths/users@{username}.yaml' /echo: $ref: paths/echo.yaml
Path templating refers to the usage of curly braces ({}) to mark a section of a URL path as replaceable using path parameters.
Keep in mind, the path parameter must use the same name used within the curly braces within the subsequent path definition.
We add using @
to represent a /
within a filename. On the otherhand, you may wish to make a sub-folder. We discuss the pros and cons of this approach within the paths' README.md
file. For our examples, we'll use this @
approach and keep all of our files in the root-level of the paths
folder.
Path file example
Our root document references this (and other) path files. The file is named like the endpoint. It contains a paths object.
At the top-level of the paths object:
- parameters (applies to all http methods if defined here)
- servers (if you wish to override the servers defined in the root document)
- summary
- description
- get
- put
- post
- delete
- options
- head
- patch
- trace
The get, put, post, delete, options, head, patch and trace refer to the http method used, and they are properties that all accept the Operation Object.
parameters: - name: pretty_print in: query description: Pretty print response schema: type: boolean get: tags: - User summary: Get user by user name description: | Some description of the operation. You can use `markdown` here. operationId: getUserByName parameters: - name: username in: path description: The name that needs to be fetched required: true schema: type: string - name: with_email in: query description: Filter users without email schema: type: boolean security: - main_auth: - 'read:users' - api_key: [] responses: '200': description: Success content: application/json: schema: $ref: ../components/schemas/User.yaml example: username: user1 email: user@example.com '403': description: Forbidden '404': description: User not found put: tags: - User summary: Updated user description: This can only be done by the logged in user. operationId: updateUser parameters: - name: username in: path description: The name that needs to be updated required: true schema: type: string security: - main_auth: - 'write:users' responses: '200': description: OK '400': description: Invalid user supplied '404': description: User not found requestBody: content: application/json: schema: $ref: ../components/schemas/User.yaml application/xml: schema: $ref: ../components/schemas/User.yaml description: Updated user object required: true
This demonstrates that the bulk of the paths file is related to the Operation Object.
Operation object
- tags
- summary
- description
- externalDocs
- operationId
- parameters
- requestBody
- responses
- callbacks
- deprecated
- security
- servers
The parameters, requestBody, and response content schema can use $refs. Using $refs will allow us to create reusable parameters and schema objects. We may also create reusable headers objects too. We find those to be the most profitable objects for re-use:
- schema
- parameters
- headers
We will be adding guides to writing schema soon.
Exercises for learning
- Read the OpenAPI Specification.
- Read examples of OpenAPI definitions. (Many companies publish their OpenAPI definitions.)
- Write schema to describe APIs by looking at only a request/response or docs (but not the OpenAPI definitions).
- Use our OpenAPI-starter template repository to create your own repository.