In the world of software-as-a-service (SaaS) and service-based architectures, it’s not uncommon for companies to maintain dozens or even hundreds of APIs, often spanning multiple teams, programming languages, and environments. This variability makes it extremely difficult to see what’s happening at a high level to prevent changes from having negative impacts.
It’s estimated that 40% of large enterprises struggle with challenges to secure, scale, or ensure performance for APIs. Because of this, more and more companies are choosing to adopt a “spec-first development” approach by defining and documenting APIs in an external format like OpenAPI. Storing these documents together in a central location makes it much easier to design, discuss, and approve changes before implementation.
In this tutorial, you’ll use the recently released Insomnia Designer to document an API, explore it, and propose a change using a spec-first approach. Designer is a cross-platform, open source REST client that builds on top of Insomnia Core—a popular app for interacting with HTTP and GraphQL APIs—aiming to make spec-first development more accessible by providing collaborative tools to organize, maintain, and validate API specs. In essence, Core is best for exploring and debugging APIs while Designer is best for designing and documenting them.
In this how-to, you’ll use the Open Library API as a base to have working examples to play with. You’ll create a minimal OpenAPI spec to document the APIs, use Insomnia Designer to test and verify that what you’ve done is correct, and then make some design changes to the API using a spec-first approach.
The spec-first workflow
Before you begin, you should understand the steps necessary to adopt a spec-first workflow. In spec-first development, a specification can be in one of two states:
- Published spec: A specification that describes a currently published API exactly
- Proposal spec: A draft specification that contains changes that need to be implemented
From this information, you can define a workflow for making changes to an API:
- Start with the published specification for the API
- Make changes to the specification to add or modify behavior
- Review the proposal spec to ensure the design is sufficient
- Implement changes in code to match the proposal
- Publish the proposal spec along with the API
Now that you understand the workflow for what you are trying to accomplish, open Insomnia Designer and start trying it out.
Define the initial specification
Since you don’t yet have a published specification for the Open Library API, you need to define one.
Start by creating a new blank document from the Create menu, give it a name, then click to the document to enter Design View. From here, you can start editing your spec.
The OpenAPI spec is most commonly written in YAML format and requires four top-level blocks to get started:
paths. The following example defines each of these blocks with helpful comments to describe the purpose of each. Also, the
paths block defines a route for
# Specify that your document is the OpenAPI 3 format
# Define high-level metadata for the API
title: Open Library API
description: Open Library has a RESTful API
# Specify the base URL the API can be accessed from
- url: http://openlibrary.org
# Define operations for the API. This will be where most
# of the work is done. The first route you'll be defining
# is `GET /recentchanges.json`
summary: Recent Changes
OpenAPI provides much more than what’s visible here, such as the ability to define authentication, response formats, reusable components, and more.
After copying the specification above into Insomnia Designer, you’ll see three columns:
- Navigation sidebar (left): Nested menu to make navigating larger documents easier
- Spec editor (middle): Text editor for editing the YAML document
- Documentation preview: Generated documentation to preview the specification
Feel free to modify different parts of the specification to see what happens. As a safeguard, Insomnia Designer alerts you when you’ve done something wrong. For example, if you accidentally delete the colon on line 18, an error panel will display below the editor.
Now that you have defined a specification, you can verify that your definition is correct by switching to Debug mode and sending a real request to the API. In Debug mode, you can see a single route was generated for the
GET /recentchanges.json endpoint. Click the Send button beside the URL to execute the request and render the response in the right panel.
There you have it! You’ve successfully verified that the API specification you created matches the production API. Now you can move to the next step in the spec-first development workflow and propose a change.
Create a proposal specification
According to the workflow outlined above, changes made to your API should first be defined in the specification. This has a number of benefits:
- Specifications can be checked into a central source-code repository
- Changes are easy to review and approve
- APIs are defined in a single, consistent format
- Unnecessary code changes are avoided
Go ahead and propose a change to your API. While in Debug mode, I noticed the API returned hundreds of results. To improve performance and usability, it would be useful to limit the number of results returned to a specific amount. A common way of doing this is to accept a
limit parameter in the query section of the URL, so go ahead and modify your specification to add a
In OpenAPI, you can define this by adding a
parameters block to the route:
summary: Recent Changes
# Add parameter to limit the number of results
- name: limit
description: Limit number of results
You can verify you defined it correctly by expanding the route within the preview and inspecting the parameters.
Review and implement the proposal
Now that you have created a proposal spec, you can have your team review and approve the changes. Insomnia Designer provides the ability to sync API specifications to source control, [Note: I added this link – is it the best one?] allowing teams to review and approve changes to API specs the same way they do with source code.
For example, you might commit and push your proposed spec to a new branch in GitHub and create a pull request to await approval.
Because this is a tutorial on spec-first development, you won’t implement the proposal yourself. The parameter you added is already supported by the API, however, so for the purpose of this article, use your imagination and pretend that your team has implemented the change.
Verify the updated specification
Once the proposal has been implemented and deployed, you can switch to Debug mode, which will regenerate the requests based on your changes, and again verify that the spec matches the production API. To ensure the new query param is being sent, click the Query tab within Debug mode and observe that the
limit parameter is set to your example value of
Once you send the request, you can verify that it returns only a single result. Change the
limit to a different value or disable the query parameter (using the checkbox) to further verify things work as expected.
The power of spec-first development
This tutorial walked through a simplified example of spec-first development. In it, you created an OpenAPI specification, verified the specification matched the implementation, and simulated what it’s like to propose a behavior change.
For a single API as simple as this demo, it may be difficult to see the full benefit of spec-first development. However, imagine being a product owner in a large organization managing hundreds of production APIs. Having well-documented specifications, accessible from a central location like Insomnia Designer, allows anyone within the organization to quickly get up to speed on any API.