API Governance | Oct 19, 2023 | 17 min read
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.
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.
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.
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.
So - now we understand why we should document - how do we even start documenting our APIs? Well here are three options:
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.
When documenting multiple versions of an API - there are several approaches you can take.
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.
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 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.
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.
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.
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 acts as a bridge between developers who create an API or software and users who consume it.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Inconsistent API endpoints slow development, confuse teams, and frustrate users. This guide breaks down the principles and best practices for designing clean, predictable, and scalable API paths that improve developer experience and reduce errors.
We’ve updated the Treblle Go SDK to support Treblle V3, with a full rewrite focused on performance, ease of use, and better integration with Go tools and frameworks. This guide walks you through the changes, setup, and new features.
In this blog, we explore how Go’s concurrency model helps us do more with less. Through a fun kitchen party analogy, you’ll learn about goroutines, channels, waitgroups, semaphores, and how to use them together to build efficient, concurrent programs.