diff --git a/http-service/pom.xml b/http-service/pom.xml
index d1217f0ced..7a58a078b9 100644
--- a/http-service/pom.xml
+++ b/http-service/pom.xml
@@ -180,6 +180,48 @@
spring-boot-maven-plugin
${spring.boot.version}
+
+ com.github.kongchen
+ swagger-maven-plugin
+ 3.1.8
+
+
+
+ true
+
+ net.runelite
+
+
+ https
+
+ api.runelite.net
+ /runelite-${project.version}
+
+ ${project.parent.name} HTTP API
+ ${project.version}
+ ${project.description}
+
+ https://tldrlegal.com/license/bsd-2-clause-license-(freebsd)
+ BSD 2-Clause "Simplified"
+
+
+ ${basedir}/src/main/templates/template.html.hbs
+ ${project.build.directory}/swagger-ui
+ ${project.build.directory}/site/api.html
+ true
+ json
+
+
+
+
+
+ compile
+
+ generate
+
+
+
+
diff --git a/http-service/src/main/templates/markdown.hbs b/http-service/src/main/templates/markdown.hbs
new file mode 100644
index 0000000000..1beacd052a
--- /dev/null
+++ b/http-service/src/main/templates/markdown.hbs
@@ -0,0 +1,110 @@
+{{#info}}
+# {{title}}
+{{join schemes " | "}}://{{host}}{{basePath}}
+
+{{description}}
+
+{{#contact}}
+[**Contact the developer**](mailto:{{email}})
+{{/contact}}
+
+**Version** {{version}}
+
+{{#if termsOfService}}
+[**Terms of Service**]({{termsOfService}})
+{{/if}}
+
+{{/info}}
+
+{{#if consumes}}__Consumes:__ {{join consumes ", "}}{{/if}}
+
+{{#if produces}}__Produces:__ {{join produces ", "}}{{/if}}
+
+{{#if securityDefinitions}}
+# Security Definitions
+{{> security}}
+{{/if}}
+
+
+Table Of Contents
+[toc]
+
+
+# APIs
+
+{{#each paths}}
+## {{@key}}
+{{#this}}
+{{#get}}
+### GET
+{{> operation}}
+{{/get}}
+
+{{#put}}
+### PUT
+{{> operation}}
+{{/put}}
+
+{{#post}}
+### POST
+
+{{> operation}}
+
+{{/post}}
+
+{{#delete}}
+### DELETE
+{{> operation}}
+{{/delete}}
+
+{{#option}}
+### OPTION
+{{> operation}}
+{{/option}}
+
+{{#patch}}
+### PATCH
+{{> operation}}
+{{/patch}}
+
+{{#head}}
+### HEAD
+{{> operation}}
+{{/head}}
+
+{{/this}}
+{{/each}}
+
+# Definitions
+{{#each definitions}}
+## {{@key}}
+
+
+
+ | name |
+ type |
+ required |
+ description |
+ example |
+
+ {{#each this.properties}}
+
+ | {{@key}} |
+
+ {{#ifeq type "array"}}
+ {{#items.$ref}}
+ {{type}}[{{basename items.$ref}}]
+ {{/items.$ref}}
+ {{^items.$ref}}{{type}}[{{items.type}}]{{/items.$ref}}
+ {{else}}
+ {{#$ref}}{{basename $ref}}{{/$ref}}
+ {{^$ref}}{{type}}{{#format}} ({{format}}){{/format}}{{/$ref}}
+ {{/ifeq}}
+ |
+ {{#required}}required{{/required}}{{^required}}optional{{/required}} |
+ {{#description}}{{{description}}}{{/description}}{{^description}}-{{/description}} |
+ {{example}} |
+
+ {{/each}}
+
+{{/each}}
diff --git a/http-service/src/main/templates/operation.hbs b/http-service/src/main/templates/operation.hbs
new file mode 100644
index 0000000000..f7015850b8
--- /dev/null
+++ b/http-service/src/main/templates/operation.hbs
@@ -0,0 +1,71 @@
+{{#deprecated}}-deprecated-{{/deprecated}}
+{{summary}}
+
+{{description}}
+
+{{#if externalDocs.url}}{{externalDocs.description}}. [See external documents for more details]({{externalDocs.url}})
+{{/if}}
+
+{{#if security}}
+#### Security
+{{/if}}
+
+{{#security}}
+{{#each this}}
+* {{@key}}
+{{#this}} * {{this}}
+{{/this}}
+{{/each}}
+{{/security}}
+
+#### Request
+
+{{#if consumes}}__Content-Type:__ {{join consumes ", "}}{{/if}}
+
+##### Parameters
+{{#if parameters}}
+
+
+ | Name |
+ Located in |
+ Required |
+ Description |
+ Default |
+ Schema |
+
+{{/if}}
+
+{{#parameters}}
+
+ | {{name}} |
+ {{in}} |
+ {{#if required}}yes{{else}}no{{/if}} |
+ {{description}}{{#if pattern}} (**Pattern**: `{{pattern}}`){{/if}} |
+ - |
+{{#ifeq in "body"}}
+
+ {{#ifeq schema.type "array"}}Array[{{basename schema.items.$ref}}]{{/ifeq}}
+ {{#schema.$ref}}{{basename schema.$ref}} {{/schema.$ref}}
+ |
+{{else}}
+ {{#ifeq type "array"}}
+ Array[{{items.type}}] ({{collectionFormat}}) |
+ {{else}}
+ {{type}} {{#format}}({{format}}){{/format}} |
+ {{/ifeq}}
+{{/ifeq}}
+
+{{/parameters}}
+{{#if parameters}}
+
+{{/if}}
+
+
+#### Response
+
+{{#if produces}}__Content-Type:__ {{join produces ", "}}{{/if}}
+
+| Status Code | Reason | Response Model |
+|-------------|-------------|----------------|
+{{#each responses}}| {{@key}} | {{description}} | {{#schema.$ref}}{{basename schema.$ref}}{{/schema.$ref}}{{#ifeq schema.type "array"}}Array[{{basename schema.items.$ref}}]{{/ifeq}}{{^schema}} - {{/schema}}|
+{{/each}}
diff --git a/http-service/src/main/templates/security.hbs b/http-service/src/main/templates/security.hbs
new file mode 100644
index 0000000000..04f86e8380
--- /dev/null
+++ b/http-service/src/main/templates/security.hbs
@@ -0,0 +1,88 @@
+{{#each securityDefinitions}}
+### {{@key}}
+{{#this}}
+{{#ifeq type "oauth2"}}
+
+
+ | type |
+ {{type}} |
+
+{{#if description}}
+
+ | description |
+ {{description}} |
+
+{{/if}}
+{{#if authorizationUrl}}
+
+ | authorizationUrl |
+ {{authorizationUrl}} |
+
+{{/if}}
+{{#if flow}}
+
+ | flow |
+ {{flow}} |
+
+{{/if}}
+{{#if tokenUrl}}
+
+ | tokenUrl |
+ {{tokenUrl}} |
+
+{{/if}}
+{{#if scopes}}
+
+ | scopes |
+{{#each scopes}}
+ {{@key}} |
+ {{this}} |
+
+
+{{/each}}
+
+{{/if}}
+
+{{/ifeq}}
+{{#ifeq type "apiKey"}}
+
+
+ | type |
+ {{type}} |
+
+{{#if description}}
+
+ | description |
+ {{description}} |
+
+{{/if}}
+{{#if name}}
+
+ | name |
+ {{name}} |
+
+{{/if}}
+{{#if in}}
+
+ | in |
+ {{in}} |
+
+{{/if}}
+
+{{/ifeq}}
+{{#ifeq type "basic"}}
+
+
+ | type |
+ {{type}} |
+
+{{#if description}}
+
+ | description |
+ {{description}} |
+
+{{/if}}
+
+{{/ifeq}}
+{{/this}}
+{{/each}}
\ No newline at end of file
diff --git a/http-service/src/main/templates/template.html.hbs b/http-service/src/main/templates/template.html.hbs
new file mode 100644
index 0000000000..da587c2cc4
--- /dev/null
+++ b/http-service/src/main/templates/template.html.hbs
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{info.title}} {{info.version}}
+
+
+
+
+
\ No newline at end of file