Documentation in API Versioning

The blog underscores the importance of API documentation, illustrated through a fictional story about a developer's disruptive unannounced changes. It then highlights key API documentation tools, emphasizing Treblle's automated OpenAPI system.

6 months ago   •   12 min read

By Christopher Miller
Table of contents

We have looked in depth at API versioning in various different ways across our blog, but there's one area that we've not really discussed - and that's documentation! Thats exactly what this blog is about.

A Tale of Captain Chaos: The Perils of Undocumented APIs

Documentation is absolutely critical in API versioning. let's take a fictitious story to demontrate why this is essential:

In a bustling software company called DevCo, there was a legendary developer known as "Captain Chaos," who had a reputation for making unannounced changes to the company's APIs. Captain Chaos believed that surprises were the spice of life and that developers should constantly adapt to new challenges.

One day, he decided to put his philosophy to the test. Without any warning or documentation, he changed the structure of a critical API endpoint. The result? Pandemonium. Developers across the company were in a frenzy, trying to figure out what had happened and how to adapt their code. Not only were the developers at DevCo in chaos - but also their customers! some customers had integrations built on the back of this API, and it broke down hundreds of customers integrations!

API Docs in Versioning - Captain Chaos

As chaos reigned supreme, a junior developer named Jenny found herself in the middle of the storm. She was tasked with fixing a critical bug in the company's flagship application, and her code relied heavily on the now-mysteriously-transformed API endpoint. With sweat on her brow and caffeine in her veins, Jenny embarked on a mission to decipher the changes.

Hours turned into days, and Jenny's desk became a war room littered with printouts of logs and hastily scribbled notes. She even considered putting on a detective's hat, so mysterious were the API changes. It was a comedy of errors as she tried various code combinations, only to encounter new bugs and issues. In the mean time, customers were getting more and more frustrated with the issues, and some even threatened to leave.

Finally, in a fit of frustration, Jenny posted a message on the company's developer chat channel, pleading for help. That's when the more experienced developers swooped in to her rescue. They scoured the code repository, trying to piece together the changes Captain Chaos had made.

After days of detective work and late-night pizza-fueled coding sessions, they managed to uncover the undocumented changes. With great relief, they updated the code and resolved the bug. But the ordeal had taken its toll, and Jenny vowed never to venture into undocumented API territory again. They quickly gave out the new explanation to the customers, who were able to implement the change quickly and easily.

The Transformation from Chaos to Clarity

From that day on, Captain Chaos became known as "Captain Clarity" after the incident. The company implemented a strict policy of documenting all API changes, ensuring that no developer would have to endure a similar comedy of errors.

API Versioning - From Chaos to Clarity

The moral of the story is clear: In the real world of software development, undocumented API changes can lead to a huge number of errors that even the most experienced developers might struggle to resolve. Documentation isn't just a nicety; it's a lifeline that keeps chaos at bay and empowers developers to work efficiently and collaboratively.

Essential Tools for API Documentation

So - now we understand why we should document - how do we even start documenting our APIs? Well here are three options:

OpenAPI Specification (formerly Swagger)

  • Documentation Link: OpenAPI Specification
  • Description: The OpenAPI Specification is a widely adopted standard for documenting RESTful APIs. It provides a machine-readable format for describing the structure of your API, including endpoints, request/response formats, authentication methods, and more. Tools like Swagger UI and Swagger Editor make it easy to create and visualize OpenAPI documentation.

API Blueprint

  • Documentation Link: API Blueprint
  • Description: API Blueprint is a simple yet powerful markdown-based language for documenting APIs. It focuses on human-friendly documentation that can be easily converted into interactive API documentation using tools like Dredd and Apiary. API Blueprint is known for its simplicity and readability.

RAML (RESTful API Modeling Language)

  • Documentation Link: RAML Specification
  • Description: RAML is a comprehensive specification for modeling and documenting RESTful APIs. It allows you to define your API's structure, including endpoints, methods, data types, and security schemes. RAML-based documentation can be generated into various formats, making it versatile for both developers and API consumers.

The Advantage of Treblle: Automated OpenAPI Documentation

But of course, documentation is actually made simple using Treblle - we auto document for you using the OpenAPI Specification. So if you don't already have a documentation standard in your company - we can massively help you there! and let's be honest - OpenAPI is by far the lead horse in the documentation race, with a massive number of API documenting using that standard.

How To Document Multiple API Versions

When documenting multiple versions of an API - there are several approaches you can take.

Different Files For Different Versions

This is probably the most simple approach to write - but would require people picking the correct version of the API documentation for the version of the api you're using. It might look something like this:

openapi: 3.0.0
info:
  title: My API - Version 1
  version: 1.0.0
paths:
  /resource:
    get:
      summary: Get resource
      responses:
        '200':
          description: Successful response

v1.yaml

openapi: 3.0.0
info:
  title: My API - Version 2
  version: 2.0.0
paths:
  /resource:
    get:
      summary: Get resource (v2)
      responses:
        '200':
          description: Successful response (v2)

v2.yaml

Here, I've not provided examples of the difference between models for brevity - but the idea is that each file is a separate version for the API. note: this is not a full specification to OpenAPI standards, and should be written in line with the full specification.

Different Models For Different Versions in the same document

So this is a more complex setup - and should be described much more carefully, as this can become confusing as to which response type belongs to which version.

openapi: 3.0.0
info:
  title: My API
  version: 1.0.0
paths:
  /resource:
    get:
      summary: Get resource
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ResourceV1'
                  - $ref: '#/components/schemas/ResourceV2'

components:
  schemas:
    ResourceV1:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
      required:
        - id
        - name
      discriminator:
        propertyName: version
        mapping:
          v1: '#/components/schemas/ResourceV1'
    
    ResourceV2:
      type: object
      properties:
        id:
          type: string
        description:
          type: string
      required:
        - id
        - description
      discriminator:
        propertyName: version
        mapping:
          v2: '#/components/schemas/ResourceV2'

differentmodels.yaml

This provides one full description for the entire supported version history, but can become very long and difficult to understand quickly. Tools like redocly or swagger can help here, but remember that you still need to show how to differentiate between them. You can expand this slightly, to make it more useful

openapi: 3.0.0
info:
  title: My API
  version: 1.0.0
paths:
  /resource:
    get:
      summary: Get resource
      parameters:
        - name: Api-Version
          in: header
          required: true
          schema:
            type: string
            enum:
              - v1
              - v2
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/ResourceV1'
                  - $ref: '#/components/schemas/ResourceV2'

components:
  schemas:
    ResourceV1:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
      required:
        - id
        - name
      discriminator:
        propertyName: version
        mapping:
          v1: '#/components/schemas/ResourceV1'
    
    ResourceV2:
      type: object
      properties:
        id:
          type: string
        description:
          type: string
      required:
        - id
        - description
      discriminator:
        propertyName: version
        mapping:
          v2: '#/components/schemas/ResourceV2'

differentiation.yaml

For me, the ideal scenario is to use the different version docs for different versions of the API - yes, it means that your customer needs to pick the right documentation version, but that is primarily down to communication flows with your customers to ensure that they have the up-to-date information.

Documenting Deprecated Features

Documenting deprecations is actually relatively simple - it's a case of including the deprecated tag:

openapi: 3.0.0
info:
  title: My API
  version: 1.0.0
paths:
  /deprecated-route:
    get:
      summary: Deprecated Route
      description: This route is no longer recommended for use.
      deprecated: true
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: This route is deprecated.

deprecated.yaml

This is a fairly simple example, but actually shows just how easy it is - remember to define that the headers come back that we talked about in other blogs, but in principal, this is probably the easiest part of documenting an API.

Versioning Documentation Best Practices


Clear Versioning Strategy

When documenting API versioning, it's essential to have a clear and consistent versioning strategy. Use semantic versioning (e.g., MAJOR.MINOR.PATCH) to convey the significance of changes. Clearly define how version numbers will change in response to updates, whether it's a major change indicating breaking changes, a minor change for new features, or a patch for bug fixes. Include this information in your documentation's introduction, so users immediately understand your versioning approach.

The Value of a Detailed Changelog

A well-documented changelog is invaluable for users of your API. Include a dedicated section in your documentation where you list all changes made in each version. For each change, provide a brief description, the version number it was introduced or fixed in, and, if applicable, examples of how it affects API usage. You can host this changelog on platforms like GitHub, using markdown files, making it easy for both developers and non-developers to track API changes.

Interactive API Reference: A Hands-on Approach for Users


To enhance the user experience, create an interactive API reference in your documentation. Tools like Swagger/OpenAPI or tools tailored to your programming language can generate detailed API documentation automatically. These tools not only provide comprehensive information on endpoints, request parameters, and response structures but also allow users to make API calls directly within the documentation.
This hands-on approach can be especially helpful for beginners looking to understand API functionality quickly. don't forget here at Treblle we also have our own documentation tool!

By following these best practices and using tools like Swagger/OpenAPI or Postman, you'll create documentation that caters to both your expertise and a wide audience, making it easier for developers to understand and utilize your API effectively.

Documentation as a Communication Channel

Documentation acts as a bridge between developers who create an API or software and users who consume it.

Bridging the Gap: Developers and Users

Clear and well-structured documentation helps users understand the purpose, functionality, and usage of your code or API. This communication ensures that users can utilize your work effectively, reducing the need for back-and-forth queries or confusion.

Documentation also establishes a standard language for describing software components, functions, and interfaces. This consistency aids in effective communication, as developers and users can refer to the same documentation to discuss features, troubleshoot issues, or propose improvements. This shared understanding is especially crucial when multiple developers or teams are involved.

Detailed documentation should include error codes, troubleshooting guides, and examples. This facilitates communication by helping users identify and report issues accurately. Developers, in turn, can refer users to specific sections of the documentation for solutions, reducing support overhead.

To encourage user engagement, consider adding interactive elements to your documentation. This can include comment sections, forums, or even direct links to GitHub issues or pull requests. These features allow users to provide feedback, ask questions, and suggest improvements right within the documentation.

Documentation as a Community Tool

If your project is open source, documentation can play a significant role in attracting contributors. Clearly outline how individuals can contribute to your project, whether it's through code contributions, bug reports, or documentation enhancements. By making it easy for users to become contributors, you can foster a vibrant community around your project.

Treat your documentation as a living entity that evolves with your project. Encourage users to submit corrections, updates, or clarifications. Acknowledge and credit contributors for their contributions to the documentation. This collaborative approach not only enhances the quality of your documentation but also strengthens the bond between developers and users.

Feedback Loops: Encouraging Continuous Engagement

Establish feedback loops where user suggestions and concerns are regularly reviewed and acted upon. This demonstrates your commitment to listening to the user community and encourages more engagement. Additionally, consider conducting surveys or polls to gather input on potential features or improvements.

By recognizing documentation as a communication channel, you can facilitate smoother interactions between developers and users. Clear and engaging documentation not only aids users in understanding and using your software but also creates a sense of community and collaboration, ultimately benefiting both parties.

Automating Versioning Documentation

At Treblle, we strongly believe in automating your documentation - but how does this work?

Well, if you integrate our SDK with your system, you gain that living document that we spoke about earlier. You can use the documentation generated by Treblle to ensure that your customers are kept up to date with changes in your API, because we change the documentation in real time in line with the actual requests and responses in your API.

You might not want to publicly make them available to customers directly, but what we do give you is something you can build on to ensure that you have the most up to date documentation ready to modify for release.

We're also working on our documentation system here, so there will be changes coming that will make it even easier to use for versioning.

Documentation for API Consumers

So what if you're not writing the documentation, and instead using it? Start by thoroughly understanding the versioning conventions used in the API documentation. This includes grasping the significance of major, minor, and patch version changes. This knowledge will help you anticipate the impact of updates on your integration.

Follow Upgrade Paths: API documentation often provides guidance on how to transition from one version to another smoothly. Be sure to follow these recommended upgrade paths to avoid potential disruptions when adopting new versions.

Use Changelogs: Utilize the changelog section of the documentation to stay informed about what's changed in each API version. This is crucial for identifying any new features, deprecated functionalities, or bug fixes.

Error Handling: Familiarize yourself with error codes and error messages documented in the API reference. Understanding these codes will enable you to handle errors gracefully in your application and provide better user experiences.

How Clear Documentation Improves the Developer Experience

Reduced Learning Curve: Clear and well-organized documentation significantly reduces the time it takes for developers to understand how to use an API. This streamlined learning process makes it easier for developers to get started quickly, which is especially important for time-sensitive projects.

Faster Issue Resolution: Detailed documentation provides troubleshooting guides and error-handling information. This not only helps developers prevent issues but also speeds up issue resolution when problems do arise. Developers can consult the documentation to diagnose and fix problems independently.

Enhanced Integration: Clear documentation enhances the integration process. When developers have a precise understanding of how to interact with an API, they can build more robust and feature-rich integrations, resulting in better overall user experiences.

Confidence in the API: When documentation is comprehensive and up-to-date, developers gain confidence in the API's stability and reliability. This confidence encourages them to use the API more extensively and explore its full capabilities.

Positive User Experience: Ultimately, clear API documentation contributes to a positive user experience for the end users of the application. When developers can effectively leverage the API, they can create smoother, more functional applications that meet user needs effectively.

Challenges in API Documentation

Managing multiple versions of an API or software can become complex. Documenting each version thoroughly while keeping the documentation concise and accessible is a common challenge.

Consistency Across Versions: Ensuring consistency in documentation across different versions is crucial. Changes in terminology, examples, or formatting can confuse users.

Outdated Documentation: As software evolves, documentation can quickly become outdated. Keeping documentation up-to-date with each version is a perpetual challenge.

Balancing Detail: Striking the right balance between providing detailed information and maintaining user-friendliness is challenging. Too much detail can overwhelm users, while too little can lead to confusion.

User Engagement: Encouraging users to engage with documentation, provide feedback, and contribute to improvements can be challenging, particularly for open-source projects.

Strategies for Overcoming Documentation Hurdles

Versioning Automation: Invest in automation tools and scripts to generate documentation from source code or API definitions. This helps ensure that documentation stays in sync with the codebase, reducing the risk of outdated information. Treblle helps with that!

Style Guides and Templates: Establish clear style guides and templates for documentation. This ensures consistency in terminology, formatting, and examples across different versions. Review documentation during code reviews to maintain consistency. Ensure your users know what to expect!

Continuous Integration: Integrate documentation updates into your development process. When you make changes to the API or software, consider updating documentation as part of the same workflow. This reduces the chances of documentation lagging behind.

User-Friendly Navigation: Design documentation with user-friendliness in mind. Use clear navigation structures, search functionality, and interactive elements to make it easy for users to find relevant information quickly.

Versioning and Deprecation Notices: Clearly mark deprecated features and provide information on alternatives. Use versioning labels to indicate which versions the documentation applies to. This helps users navigate between different versions seamlessly.

Feedback Channels: Create easily accessible channels for users to provide feedback on documentation. This can include comment sections, forums, or GitHub issues. Actively monitor and respond to user feedback to address concerns and improve the documentation continuously.

Documentation as Code: Treat documentation as a code artifact that undergoes version control. This allows you to track changes, collaborate with others, and review documentation updates just like you would with software code.

Documentation Workshops: Organize workshops or training sessions for developers and writers involved in documentation. Ensure that everyone understands the importance of clear and up-to-date documentation and has the skills to contribute effectively.

Conclusion


In conclusion, this blog has shed light on the often-overlooked but critically important aspect of API versioning: documentation. Through the story of "Captain Chaos" at DevCo, we've seen firsthand how undocumented API changes can lead to chaos and frustration among developers and customers alike. The moral of the story is clear - documentation isn't just a nicety; it's a lifeline that keeps chaos at bay and empowers developers to work efficiently and collaboratively.

We've also explored various documentation tools and platforms, including the OpenAPI Specification, API Blueprint, and RAML, which can simplify the documentation process. Furthermore, we've discussed best practices for versioning documentation, emphasizing the importance of a clear versioning strategy, detailed changelogs, and interactive API references.

Additionally, we've recognized documentation as a vital communication channel between developers and users, promoting clear understanding, troubleshooting, and collaboration. Automation, style guides, continuous integration, user-friendly navigation, versioning and deprecation notices, feedback channels, and treating documentation as code are all strategies to overcome common documentation challenges.

By following these practices and leveraging documentation tools, you can create clear, concise, and up-to-date documentation that benefits both your expertise and a broader audience, ultimately enhancing the developer experience and the usability of your API.

Spread the word

Keep reading