| 
               
                This past week at LeadsPedia we decided that our API had reached the point in it's growth where we should
                stop updating a Word doc with new endpoints and actually put the
                documentation
                online. What's hitherto kept us from doing so is that it just hasn't been worth the development time with
                all the new features we're rolling out every week. We still didn't have a lot of time to spend on it though,
                so we set out to find a quick solution.
               
              
                There are a number of different proprietary and non-proprietary solutions out there. All seemed to have
                their pluses and minuses, so it was somewhat hard to choose. Eventually I decided to have a go with
                Swagger because that's what
                Habit RPG's API is written with and I've
                done some development work with them. I figured worse case scenario was wasting a few hours going in
                a direction we wouldn't end up using.
                I was not disappointed. Swagger was fairly easy to use and took less time than I had imagined.
               
              
              
                There are basic two parts to a
                Swagger API documentation: 1) a JSON holding the data about your API, and 2) the UI interface that parses
                the JSON and and makes test API calls via AJAX. There is a bit of a learning curve to understanding
                the format of the JSON, but the
                Swagger Editor
                provides examples and a test interface to get you up to speed fairly quickly.
               
              
                Let's take a high level look at the JSON:
               
              
              
                The paths and definitions are where the real meat of your API documentation is
                stored, so I will cover those in a bit. First thing to note is that this JSON is readable by anyone who
                has access to your documentation, so it contains no API credentials. The UI provides your users
                fields to enter their own api credentials and then uses them in the example AJAX calls to your API.
                This is a great feature because they're immediately interacting with their own data and you don't
                have to worry about setting up any test data to work with.
               
              
                The first property of the JSON is swagger, which merely specifies the version
                you are using. Next up is the info property, wherein you specify the information
                to appear at the top of your documentation: a short description, the version, what the terms of service
                are, contact information and the like. Next you set up the host and
                basePath. These are important because they will form the start of the url of
                your endpoint. The tags property is useful if you have a jillion endpoints
                and you want your users to be able to limit what they are seeing to a specific tag or tags. We didn't
                implement this feature because we don't have a jillion LeadsPedia endpoints. Yet.
               
              
                As you can see, so far everything has been fairly high level. Now let's dive into a path:
               
              
              
                As you can see, there is a lot happening here even though we are not using all the options available in
                Swagger by far. In your documentation, the name of the property, in this case
                /advertisers/create, will be appended to the host and
                basePath to form the URL in the example created when somebody clicks
                "Try it out!". The properties of the path are HTML request methods: GET, POST, PUT or DELETE. For
                ease of use, we have designed the LeadsPedia API to work whether you're using a GET or POST method to
                send in your data. Thus our decision to specify post here was
                somewhat arbitrary, but I thought it would be less confusing than having each endpoint in there twice.
               
              
                The first property of the post method, tags, is included so that later
                when we have a jillion endpoints our users can limit them to advertiser endpoints by clicking on
                a tag. Again, we left this feature out of our current UI version, but it's easy to add back in. Next up
                is the summary property. This is a short string which appears on the
                line with your endpoint:
               
              
                 
              
              
                When the user clicks on the endpoint to expand the details, the first thing they see is the
                description. This is a longer form explanation of what this endpoint does
                and how to use it. (I abbreviated this one for the example.) operationID
                is the subpath of your endpoint and the produces property is an
                array of different output types this endpoint produces. In our case, we always output a JSON.
               
              
                The parameters property is where Swagger really shines. If
                a parameter is required by your API
                and you specify that here, then the UI won't let the user try it without
                specifying a value of the correct type of input for that parameter!
                All of these example parameters are strings, but integer and other types are also available.
                Also notice that the last parameter named "portalAccess" is an
                enum. This leads Swagger to create a dropdown in the UI.
               
              
                The last property is responses. Here you can specify what various
                HTTP responses, e.g. 200, 404, 301, etc, mean. Again, for ease of use we designed LeadsPedia's
                API to always respond with a 200 and provide verbose error messaging instead of requiring
                our users to interpret the response type.
               
              
                Finally, let's take a look at a definition:
               
              
              
                This is what the data structure of our API responses look like. Definitions like this can be
                used to specify what a response looks like, however, Swagger does not allow for different
                substructures (our results and  errors
                differ for each endpoint) to be embedded under this superstructure. Ergo in the end I
                decided to leave out these specs and let the example responses from the AJAX calls under
                "Try it out!" speak for themselves. This is probably my only complaint about Swagger right
                now, but hopefully they will improve on that in future versions.
               
              Conclusion
              
                All told I was able to finish the documentation of the LeadsPedia API complete with functioning
                examples and a bit of whitelabeling in a single afternoon. I probably spent nearly as much time
                writing about it in this blog. While there are a few minor shortcomings (i.e., in the data
                definitions), there are plenty of features to document any web based API quickly. I was so
                impressed with the ease and speed of implemention that I felt the need to share! Next time you
                have an API to document, you should definitely consider using
                Swagger.
               
             |