{"openapi":"3.1.0","info":{"title":"Unbound API","version":"2.1.0","description":"The public Unbound HTTP API. Every operation here answers JSON without signing in. A failure answers a non-2xx status with `{ error: { code, message } }`."},"servers":[{"url":"https://unbound.rip"}],"security":[],"tags":[{"name":"Addons","description":"Read the addon store: listings, versions and maintainers."},{"name":"Updates","description":"Check installed addons and the native loader for updates."},{"name":"Users","description":"Read what a user shows on their profile."},{"name":"Fonts","description":"Find the files behind a font link. Unbound hosts no font files."}],"paths":{"/api/v1/catalog":{"get":{"operationId":"getCatalog","tags":["Addons"],"summary":"Get the catalog","description":"Every listed addon with its newest version. Send `revision` in `If-None-Match` to get `304` while nothing changed.","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["revision","addons"],"properties":{"revision":{"type":"string","minLength":1},"addons":{"type":"array","items":{"type":"object","required":["id","type","latestVersion"],"properties":{"id":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$"},"type":{"enum":["plugin","theme","icon-pack","font"]},"icon":{"anyOf":[{"type":"string","pattern":"^Icon[A-Z][A-Za-z\\d]*$","maxLength":64},{"type":"null"}]},"iconSvg":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string"},"description":{"type":"string"},"tags":{"type":"array","items":{"type":"object","required":["id","label","color"],"properties":{"id":{"type":"string","pattern":"^[a-z\\d]+(?:-[a-z\\d]+)*$","maxLength":64},"label":{"type":"string"},"color":{"type":"string"}}}},"installs":{"type":"integer","minimum":0},"createdAt":{"type":"string","format":"date-time"},"latestVersion":{"type":"object","required":["version","manifest","changelog","changes","source","bundleSize","sha256","publishedAt","manifestUrl","bundleUrl"],"properties":{"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"manifest":{"type":"object","required":["id","name","description","authors","main","version"],"properties":{"id":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$"},"type":{"enum":["plugin","theme","icon-pack","font"]},"name":{"type":"string","minLength":1},"description":{"type":"string"},"authors":{"type":"array","items":{"type":"object","required":["name","id"],"properties":{"name":{"type":"string","minLength":1},"id":{"type":"string","pattern":"^\\d+$"}}},"minItems":1},"icon":{"anyOf":[{"type":"string"},{"type":"object","required":["uri"],"properties":{"uri":{"type":"string"}}}]},"main":{"type":"string","pattern":"^(?:[\\w-][\\w.-]*\\/)*[\\w-][\\w.-]*$"},"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"platforms":{"type":"object","patternProperties":{"^.*$":{"type":"object","properties":{"capabilities":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"capabilities":{"type":"array","items":{"type":"string"}},"minNativeBridgeApi":{"type":"string"},"unbound":{"type":"object","properties":{"min":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"}}},"bytecode":{"type":"object","patternProperties":{"^\\d{1,10}$":{"type":"string","pattern":"^[\\da-f]{128}$"}},"additionalProperties":false},"locales":{"type":"object","patternProperties":{"^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$":{"type":"string","pattern":"^[\\da-f]{64}$"}},"additionalProperties":false},"assets":{"type":"object","patternProperties":{"^[\\w-][\\w.-]*(?:/[\\w-][\\w.-]*)*$":{"type":"object","required":["type","width","height","scales"],"properties":{"type":{"enum":["png","jpg","webp","gif"]},"width":{"type":"integer","minimum":1,"maximum":16384},"height":{"type":"integer","minimum":1,"maximum":16384},"scales":{"type":"object","properties":{"1":{"type":"string","pattern":"^[\\da-f]{64}$"},"2":{"type":"string","pattern":"^[\\da-f]{64}$"},"3":{"type":"string","pattern":"^[\\da-f]{64}$"}},"additionalProperties":false,"minProperties":1}},"additionalProperties":false}},"additionalProperties":false},"library":{"type":"boolean"},"dependencies":{"type":"object","patternProperties":{"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$":{"type":"string","minLength":1}},"additionalProperties":false}},"additionalProperties":true},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}]},"changes":{"anyOf":[{"type":"object","required":["date","sections"],"properties":{"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"sections":{"type":"array","items":{"type":"object","required":["type","items"],"properties":{"type":{},"items":{"type":"array","items":{"type":"string","minLength":1,"maxLength":500},"minItems":1,"maxItems":50}}},"maxItems":4}}},{"type":"null"}]},"source":{"anyOf":[{"type":"object","required":["repository","repositoryId","path","ref","commitSha","bundlePath","bundleBlobSha"],"properties":{"repository":{"type":"string","pattern":"^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\/[A-Za-z0-9._-]+$"},"repositoryId":{"type":"integer","exclusiveMinimum":0},"path":{"type":"string","maxLength":255,"pattern":"^(?:[\\w.-]+(?:\\/[\\w.-]+)*)?$"},"ref":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s~^:?*[\\\\]+$"},"commitSha":{"type":"string","pattern":"^[0-9a-f]{40}$"},"bundlePath":{"type":"string","minLength":1},"bundleBlobSha":{"type":"string","pattern":"^[0-9a-f]{40}$"}}},{"type":"null"}]},"bundleSize":{"type":"integer","exclusiveMinimum":0},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"publishedAt":{"type":"string","format":"date-time"},"manifestUrl":{"type":"string","format":"url"},"bundleUrl":{"type":"string","format":"url"},"pageUrl":{"anyOf":[{"type":"string","format":"url"},{"type":"null"}]}}}}}}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/addons":{"get":{"operationId":"getAddons","tags":["Addons"],"summary":"List addons","description":"A filtered, sorted page of listed addons with their newest versions.","parameters":[{"name":"type","in":"query","required":false,"description":"Only addons of this type.","schema":{"enum":["plugin","theme","icon-pack","font"]}},{"name":"q","in":"query","required":false,"description":"Search text, matched in the name or description.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"Defaults to `name`. Ties sort by id.","schema":{"enum":["name","created","updated"]}},{"name":"order","in":"query","required":false,"description":"Defaults to `asc`.","schema":{"enum":["asc","desc"]}},{"name":"tags","in":"query","required":false,"description":"Comma-separated tag ids, combined by `tagMatch`.","schema":{"type":"string","pattern":"^[a-z\\d]+(?:-[a-z\\d]+)*(?:,[a-z\\d]+(?:-[a-z\\d]+)*)*$","maxLength":512}},{"name":"tagMatch","in":"query","required":false,"description":"Defaults to `any`.","schema":{"enum":["any","all","none"]}},{"name":"authors","in":"query","required":false,"description":"Comma-separated Discord ids of credited authors.","schema":{"type":"string","pattern":"^[1-9]\\d{0,19}(?:,[1-9]\\d{0,19})*$","maxLength":512}},{"name":"authorMatch","in":"query","required":false,"description":"Defaults to `any`. `none` excludes these authors.","schema":{"enum":["any","none"]}},{"name":"updated","in":"query","required":false,"description":"Days since the newest version was approved.","schema":{"type":"string","pattern":"^[1-9]\\d{0,3}$"}},{"name":"updatedMatch","in":"query","required":false,"description":"Defaults to `any`, within `updated` days. `none` means older.","schema":{"enum":["any","none"]}},{"name":"cursor","in":"query","required":false,"description":"The previous page's `nextCursor`. Keep the same filters.","schema":{"type":"string","maxLength":512}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["addons","nextCursor"],"properties":{"addons":{"type":"array","items":{"type":"object","required":["id","type","latestVersion"],"properties":{"id":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$"},"type":{"enum":["plugin","theme","icon-pack","font"]},"icon":{"anyOf":[{"type":"string","pattern":"^Icon[A-Z][A-Za-z\\d]*$","maxLength":64},{"type":"null"}]},"iconSvg":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"type":"string"},"description":{"type":"string"},"tags":{"type":"array","items":{"type":"object","required":["id","label","color"],"properties":{"id":{"type":"string","pattern":"^[a-z\\d]+(?:-[a-z\\d]+)*$","maxLength":64},"label":{"type":"string"},"color":{"type":"string"}}}},"installs":{"type":"integer","minimum":0},"createdAt":{"type":"string","format":"date-time"},"latestVersion":{"type":"object","required":["version","manifest","changelog","changes","source","bundleSize","sha256","publishedAt","manifestUrl","bundleUrl"],"properties":{"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"manifest":{"type":"object","required":["id","name","description","authors","main","version"],"properties":{"id":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$"},"type":{"enum":["plugin","theme","icon-pack","font"]},"name":{"type":"string","minLength":1},"description":{"type":"string"},"authors":{"type":"array","items":{"type":"object","required":["name","id"],"properties":{"name":{"type":"string","minLength":1},"id":{"type":"string","pattern":"^\\d+$"}}},"minItems":1},"icon":{"anyOf":[{"type":"string"},{"type":"object","required":["uri"],"properties":{"uri":{"type":"string"}}}]},"main":{"type":"string","pattern":"^(?:[\\w-][\\w.-]*\\/)*[\\w-][\\w.-]*$"},"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"platforms":{"type":"object","patternProperties":{"^.*$":{"type":"object","properties":{"capabilities":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"capabilities":{"type":"array","items":{"type":"string"}},"minNativeBridgeApi":{"type":"string"},"unbound":{"type":"object","properties":{"min":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"}}},"bytecode":{"type":"object","patternProperties":{"^\\d{1,10}$":{"type":"string","pattern":"^[\\da-f]{128}$"}},"additionalProperties":false},"locales":{"type":"object","patternProperties":{"^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$":{"type":"string","pattern":"^[\\da-f]{64}$"}},"additionalProperties":false},"assets":{"type":"object","patternProperties":{"^[\\w-][\\w.-]*(?:/[\\w-][\\w.-]*)*$":{"type":"object","required":["type","width","height","scales"],"properties":{"type":{"enum":["png","jpg","webp","gif"]},"width":{"type":"integer","minimum":1,"maximum":16384},"height":{"type":"integer","minimum":1,"maximum":16384},"scales":{"type":"object","properties":{"1":{"type":"string","pattern":"^[\\da-f]{64}$"},"2":{"type":"string","pattern":"^[\\da-f]{64}$"},"3":{"type":"string","pattern":"^[\\da-f]{64}$"}},"additionalProperties":false,"minProperties":1}},"additionalProperties":false}},"additionalProperties":false},"library":{"type":"boolean"},"dependencies":{"type":"object","patternProperties":{"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$":{"type":"string","minLength":1}},"additionalProperties":false}},"additionalProperties":true},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}]},"changes":{"anyOf":[{"type":"object","required":["date","sections"],"properties":{"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"sections":{"type":"array","items":{"type":"object","required":["type","items"],"properties":{"type":{},"items":{"type":"array","items":{"type":"string","minLength":1,"maxLength":500},"minItems":1,"maxItems":50}}},"maxItems":4}}},{"type":"null"}]},"source":{"anyOf":[{"type":"object","required":["repository","repositoryId","path","ref","commitSha","bundlePath","bundleBlobSha"],"properties":{"repository":{"type":"string","pattern":"^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\/[A-Za-z0-9._-]+$"},"repositoryId":{"type":"integer","exclusiveMinimum":0},"path":{"type":"string","maxLength":255,"pattern":"^(?:[\\w.-]+(?:\\/[\\w.-]+)*)?$"},"ref":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s~^:?*[\\\\]+$"},"commitSha":{"type":"string","pattern":"^[0-9a-f]{40}$"},"bundlePath":{"type":"string","minLength":1},"bundleBlobSha":{"type":"string","pattern":"^[0-9a-f]{40}$"}}},{"type":"null"}]},"bundleSize":{"type":"integer","exclusiveMinimum":0},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"publishedAt":{"type":"string","format":"date-time"},"manifestUrl":{"type":"string","format":"url"},"bundleUrl":{"type":"string","format":"url"},"pageUrl":{"anyOf":[{"type":"string","format":"url"},{"type":"null"}]}}}}}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}]}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/addons/{id}/versions":{"get":{"operationId":"getAddonsByIdVersions","tags":["Addons"],"summary":"List an addon's versions","description":"A listed addon's live versions, newest first.","parameters":[{"name":"id","in":"path","required":true,"description":"The addon id, such as `unbound.example`.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["versions"],"properties":{"versions":{"type":"array","items":{"type":"object","required":["version","manifest","changelog","changes","source","bundleSize","sha256","publishedAt","manifestUrl","bundleUrl"],"properties":{"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"manifest":{"type":"object","required":["id","name","description","authors","main","version"],"properties":{"id":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$"},"type":{"enum":["plugin","theme","icon-pack","font"]},"name":{"type":"string","minLength":1},"description":{"type":"string"},"authors":{"type":"array","items":{"type":"object","required":["name","id"],"properties":{"name":{"type":"string","minLength":1},"id":{"type":"string","pattern":"^\\d+$"}}},"minItems":1},"icon":{"anyOf":[{"type":"string"},{"type":"object","required":["uri"],"properties":{"uri":{"type":"string"}}}]},"main":{"type":"string","pattern":"^(?:[\\w-][\\w.-]*\\/)*[\\w-][\\w.-]*$"},"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"platforms":{"type":"object","patternProperties":{"^.*$":{"type":"object","properties":{"capabilities":{"type":"array","items":{"type":"string"}}},"additionalProperties":false}}},"capabilities":{"type":"array","items":{"type":"string"}},"minNativeBridgeApi":{"type":"string"},"unbound":{"type":"object","properties":{"min":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"}}},"bytecode":{"type":"object","patternProperties":{"^\\d{1,10}$":{"type":"string","pattern":"^[\\da-f]{128}$"}},"additionalProperties":false},"locales":{"type":"object","patternProperties":{"^[a-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$":{"type":"string","pattern":"^[\\da-f]{64}$"}},"additionalProperties":false},"assets":{"type":"object","patternProperties":{"^[\\w-][\\w.-]*(?:/[\\w-][\\w.-]*)*$":{"type":"object","required":["type","width","height","scales"],"properties":{"type":{"enum":["png","jpg","webp","gif"]},"width":{"type":"integer","minimum":1,"maximum":16384},"height":{"type":"integer","minimum":1,"maximum":16384},"scales":{"type":"object","properties":{"1":{"type":"string","pattern":"^[\\da-f]{64}$"},"2":{"type":"string","pattern":"^[\\da-f]{64}$"},"3":{"type":"string","pattern":"^[\\da-f]{64}$"}},"additionalProperties":false,"minProperties":1}},"additionalProperties":false}},"additionalProperties":false},"library":{"type":"boolean"},"dependencies":{"type":"object","patternProperties":{"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$":{"type":"string","minLength":1}},"additionalProperties":false}},"additionalProperties":true},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}]},"changes":{"anyOf":[{"type":"object","required":["date","sections"],"properties":{"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"sections":{"type":"array","items":{"type":"object","required":["type","items"],"properties":{"type":{},"items":{"type":"array","items":{"type":"string","minLength":1,"maxLength":500},"minItems":1,"maxItems":50}}},"maxItems":4}}},{"type":"null"}]},"source":{"anyOf":[{"type":"object","required":["repository","repositoryId","path","ref","commitSha","bundlePath","bundleBlobSha"],"properties":{"repository":{"type":"string","pattern":"^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\/[A-Za-z0-9._-]+$"},"repositoryId":{"type":"integer","exclusiveMinimum":0},"path":{"type":"string","maxLength":255,"pattern":"^(?:[\\w.-]+(?:\\/[\\w.-]+)*)?$"},"ref":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[^\\s~^:?*[\\\\]+$"},"commitSha":{"type":"string","pattern":"^[0-9a-f]{40}$"},"bundlePath":{"type":"string","minLength":1},"bundleBlobSha":{"type":"string","pattern":"^[0-9a-f]{40}$"}}},{"type":"null"}]},"bundleSize":{"type":"integer","exclusiveMinimum":0},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"publishedAt":{"type":"string","format":"date-time"},"manifestUrl":{"type":"string","format":"url"},"bundleUrl":{"type":"string","format":"url"},"pageUrl":{"anyOf":[{"type":"string","format":"url"},{"type":"null"}]}}}}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/addons/{id}/maintainers":{"get":{"operationId":"getAddonsByIdMaintainers","tags":["Addons"],"summary":"List an addon's maintainers","description":"An addon's maintainers with their roles.","parameters":[{"name":"id","in":"path","required":true,"description":"The addon id, such as `unbound.example`.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["maintainers"],"properties":{"maintainers":{"type":"array","items":{"type":"object","required":["id","name","image","role","addedAt"],"properties":{"id":{"type":"string","minLength":1},"name":{"type":"string"},"image":{"anyOf":[{"type":"string"},{"type":"null"}]},"role":{"enum":["owner","maintainer"]},"addedAt":{"type":"string","format":"date-time"}}}}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/updates":{"post":{"operationId":"postUpdates","tags":["Updates"],"summary":"Check addons for updates","description":"The installed addons that have a newer, withdrawn or rebuilt version. Rate limited per IP.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["clientVersion","addons"],"properties":{"clientVersion":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"addons":{"type":"array","items":{"type":"object","required":["id","version"],"properties":{"id":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$"},"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"sha256":{"type":"string","pattern":"^[\\da-f]{64}$"}}},"maxItems":500}}}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["updates"],"properties":{"updates":{"type":"array","items":{"type":"object","required":["version","changelog","changes","sha256","manifestUrl","bundleUrl","id","reason","changelogs"],"properties":{"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}]},"changes":{"anyOf":[{"type":"object","required":["date","sections"],"properties":{"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"sections":{"type":"array","items":{"type":"object","required":["type","items"],"properties":{"type":{},"items":{"type":"array","items":{"type":"string","minLength":1,"maxLength":500},"minItems":1,"maxItems":50}}},"maxItems":4}}},{"type":"null"}]},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"manifestUrl":{"type":"string","format":"url"},"bundleUrl":{"type":"string","format":"url"},"id":{"type":"string","maxLength":100,"pattern":"^[A-Za-z0-9]+(?:[._-][A-Za-z0-9]+)*$"},"reason":{"enum":["newer","withdrawn","rebuilt"]},"changelogs":{"type":"array","items":{"type":"object","required":["version","changelog","changes","publishedAt"],"properties":{"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"changelog":{"anyOf":[{"type":"string"},{"type":"null"}]},"changes":{"anyOf":[{"type":"object","required":["date","sections"],"properties":{"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}]},"sections":{"type":"array","items":{"type":"object","required":["type","items"],"properties":{"type":{},"items":{"type":"array","items":{"type":"string","minLength":1,"maxLength":500},"minItems":1,"maxItems":50}}},"maxItems":4}}},{"type":"null"}]},"publishedAt":{"type":"string","format":"date-time"}}},"maxItems":20,"default":[]}}}}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/loader/updates":{"get":{"operationId":"getLoaderUpdates","tags":["Updates"],"summary":"Check for loader updates","description":"The newest loader release, or `null` when current, and the loader version the newest bundle on `channel` needs when the installed loader is older. Rate limited per IP.","parameters":[{"name":"platform","in":"query","required":true,"description":"The platform the loader runs on.","schema":{"enum":["ios","android"]}},{"name":"version","in":"query","required":true,"description":"The installed loader version.","schema":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"}},{"name":"channel","in":"query","required":false,"description":"The bundle channel the client runs.","schema":{"enum":["stable","beta"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["update","requiredVersion"],"properties":{"update":{"anyOf":[{"type":"object","required":["platform","version","url","changelog","publishedAt","changelogs"],"properties":{"platform":{"enum":["ios","android"]},"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"url":{"type":"string","format":"url","pattern":"^https?:\\/\\/"},"changelog":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}]},"publishedAt":{"type":"string","format":"date-time"},"changelogs":{"type":"array","items":{"type":"object","required":["version","changelog","publishedAt"],"properties":{"version":{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},"changelog":{"anyOf":[{"type":"string","maxLength":10000},{"type":"null"}]},"publishedAt":{"type":"string","format":"date-time"}}},"maxItems":20}}},{"type":"null"}]},"requiredVersion":{"anyOf":[{"type":"string","maxLength":64,"pattern":"^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$"},{"type":"null"}]}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/loader/android-builds":{"get":{"operationId":"getLoaderAndroidBuilds","tags":["Updates"],"summary":"List patched Android Discord builds","description":"A channel's patched Discord builds with each gzipped split's URL, newest Discord first. Rate limited per IP.","parameters":[{"name":"channel","in":"query","required":true,"description":"The Google Play channel the builds were made from.","schema":{"enum":["stable","beta","alpha"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["builds"],"properties":{"builds":{"type":"array","items":{"type":"object","required":["channel","discordVersion","discordVersionCode","commit","splits","publishedAt"],"properties":{"channel":{"enum":["stable","beta","alpha"]},"discordVersion":{"type":"string","pattern":"^\\d{1,4}\\.\\d{1,4}$"},"discordVersionCode":{"type":"integer","minimum":1,"maximum":1999999999},"commit":{"type":"string","pattern":"^[\\da-f]{40}$"},"splits":{"type":"array","items":{"type":"object","required":["name","sha256","size","compressedSize","url"],"properties":{"name":{"type":"string","pattern":"^(base|config\\.[a-z\\d_]{1,32})$"},"sha256":{"type":"string","pattern":"^[\\da-f]{64}$"},"size":{"type":"integer","minimum":1},"compressedSize":{"type":"integer","minimum":1},"url":{"type":"string","format":"url","pattern":"^https?:\\/\\/"}}},"minItems":1,"maxItems":64},"publishedAt":{"type":"string","format":"date-time"}}},"maxItems":50}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/users/{id}/badges":{"get":{"operationId":"getUsersByIdBadges","tags":["Users"],"summary":"List a user's badges","description":"The sponsor badges a user shows on their profile, in order.","parameters":[{"name":"id","in":"path","required":true,"description":"The user's id, as the maintainers list returns it, or the Discord id of their linked Discord account.","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["badges"],"properties":{"badges":{"type":"array","items":{"type":"object","required":["name","imageUrl","kind"],"properties":{"name":{"type":"string"},"imageUrl":{"type":"string","format":"url"},"kind":{"enum":["custom-badge"]}}}}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}},"/api/v1/fonts/resolve":{"get":{"operationId":"getFontsResolve","tags":["Fonts"],"summary":"Resolve a font","description":"A font's files at its provider: Google Fonts, Fontsource, Bunny Fonts, Fontshare, Font Squirrel, dafont, GitHub, or a direct link. Rate limited per IP.","parameters":[{"name":"input","in":"query","required":true,"description":"A Google Fonts family name, a font page link, or a direct `.ttf`, `.otf` or `.zip` link.","schema":{"type":"string","minLength":1,"maxLength":2048}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["provider","id","family","files"],"properties":{"provider":{"enum":["google","fontsource","fontshare","fontsquirrel","dafont","github","url"]},"id":{"type":"string","minLength":1},"family":{"type":"string","minLength":1},"files":{"type":"array","items":{"type":"object","required":["url","kind","weight","style"],"properties":{"url":{"type":"string","format":"url","pattern":"^https:\\/\\/"},"kind":{"enum":["font","archive"]},"weight":{"anyOf":[{"type":"integer","minimum":1,"maximum":1000},{"type":"null"}]},"style":{"anyOf":[{"enum":["normal","italic"]},{"type":"null"}]}}},"minItems":1,"maxItems":64}}}}}},"4XX":{"$ref":"#/components/responses/Error"},"5XX":{"$ref":"#/components/responses/Error"}}}}},"components":{"schemas":{"ApiError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"enum":["invalid_request","invalid_manifest","unauthorized","forbidden","not_found","rate_limited","addon_id_taken","not_maintainer","version_exists","pending_update_exists","pending_listing_cap","account_too_new","artifact_too_large","submission_not_pending","self_review","artifact_mismatch","last_owner","github_not_linked","github_no_push_access","github_unavailable","font_source_unavailable","repository_not_found","ref_not_found","source_changed","addon_not_found","artifact_missing","invalid_changelog","sync_conflict","sync_document_too_large","edit_conflict","sponsorship_required","badge_rejected","perk_revoked","internal_error"]},"message":{"type":"string"}}}}}},"responses":{"Error":{"description":"The request failed. `code` names why; `message` explains it to a person.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}