{"openapi":"3.1.0","info":{"title":"DromorCraft API","version":"1.1.0","description":"Public API of the DromorCraft content platform (mods, maps, skins): search, projects, versions, files, hash lookup, downloads, public profiles and reference data. It is read-only (GET) and anonymous: no account, key or token exists or is needed, and cookies are ignored, so every client sees the same public data. CORS is open. Every response is JSON: `{ \"data\": … , \"meta\"?: … }` on success, `{ \"error\": { \"code\", \"message\", \"details\"?, \"requestId\" } }` on failure. List parameters (`ids`, `hashes`, filters) take `a,b,c` or a JSON array `[\"a\",\"b\"]`; a filter list matches any of its values. Bulk reads use GET (the API accepts no other method): `/projects?ids=`, `/versions?ids=`, `/users?ids=`, `/version-files?hashes=`. Rate limit: 120 requests/min per IP, announced in `X-Ratelimit-Limit`; 429 responses carry `Retry-After`, `X-Ratelimit-Remaining` and `X-Ratelimit-Reset`. Every 200 carries an `ETag`: send it back in `If-None-Match` to get an empty 304 when nothing changed, and honour Cache-Control. Please send a `User-Agent` that identifies your application and a contact, e.g. `my-launcher/1.2 (me@example.com)`.","contact":{"url":"https://dromorcraft.com"}},"servers":[{"url":"https://dromorcraft.com/api/v1"}],"tags":[{"name":"Projects","description":"Search and read published projects."},{"name":"Versions","description":"Published versions of a project."},{"name":"Files","description":"Files, hash lookup and downloads."},{"name":"Users","description":"Public creator profiles."},{"name":"Reference","description":"Categories, content types, Minecraft versions and platform totals."}],"components":{"responses":{"E404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E405":{"description":"Method not allowed (the API is read-only)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E422":{"description":"Validation failed","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"E429":{"description":"Rate limited","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"object","required":["code","message","requestId"],"properties":{"code":{"type":"string","examples":["not_found","validation_failed","rate_limited"]},"message":{"type":"string"},"details":{"type":"array","items":{"type":"object","properties":{"path":{"type":"string"},"message":{"type":"string"}}}},"requestId":{"type":"string"}}}}},"PageMeta":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}}},"Author":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"name":{"type":"string"},"avatarUrl":{"type":["string","null"]},"verified":{"type":"boolean"}}},"ProjectSummary":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string","enum":["mod","map","skin"]},"slug":{"type":"string"},"name":{"type":"string"},"summary":{"type":"string"},"iconUrl":{"type":["string","null"]},"url":{"type":"string","description":"Site-relative page URL."},"status":{"type":"string"},"author":{"$ref":"#/components/schemas/Author"},"categories":{"type":"array","items":{"type":"string"}},"tags":{"type":"array","items":{"type":"string"}},"gameVersions":{"type":"array","items":{"type":"string"}},"platforms":{"type":"array","items":{"type":"string"},"description":"Loaders (mods), edition (maps) or model (skins)."},"license":{"type":["string","null"]},"downloads":{"type":"integer"},"favorites":{"type":"integer"},"followers":{"type":"integer"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"publishedAt":{"type":["string","null"],"format":"date-time"}}},"ProjectDetail":{"allOf":[{"$ref":"#/components/schemas/ProjectSummary"},{"type":"object","properties":{"description":{"type":"string","description":"Markdown."},"bannerUrl":{"type":["string","null"]},"licenseUrl":{"type":["string","null"]},"links":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string"},"url":{"type":"string"},"label":{"type":["string","null"]}}}},"screenshots":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"caption":{"type":"string"}}}},"members":{"type":"array","items":{"type":"object","properties":{"role":{"type":"string"},"user":{"$ref":"#/components/schemas/Author"}}}},"currentVersion":{"oneOf":[{"$ref":"#/components/schemas/Version"},{"type":"null"}]}}}]},"File":{"type":"object","properties":{"id":{"type":"string"},"filename":{"type":"string"},"size":{"type":"integer"},"sha256":{"type":"string"},"sha1":{"type":["string","null"]},"contentType":{"type":"string"},"primary":{"type":"boolean"},"downloadUrl":{"type":"string"}}},"Dependency":{"type":"object","properties":{"type":{"type":"string","enum":["required","optional","incompatible","embedded"]},"project":{"type":["object","null"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"versionId":{"type":["string","null"]},"external":{"type":["object","null"],"properties":{"source":{"type":"string"},"id":{"type":"string"}}}}},"Version":{"type":"object","properties":{"id":{"type":"string"},"projectId":{"type":"string"},"versionNumber":{"type":"string"},"name":{"type":"string"},"channel":{"type":"string","enum":["stable","beta","alpha"]},"status":{"type":"string"},"gameVersions":{"type":"array","items":{"type":"string"}},"platforms":{"type":"array","items":{"type":"string"}},"downloads":{"type":"integer"},"changelog":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"publishedAt":{"type":["string","null"],"format":"date-time"},"files":{"type":"array","items":{"$ref":"#/components/schemas/File"}},"dependencies":{"type":"array","items":{"$ref":"#/components/schemas/Dependency"}}}},"VersionsByHash":{"type":"object","description":"Keyed by the requested hash; unknown hashes (or files with no compatible version) are left out.","additionalProperties":{"$ref":"#/components/schemas/Version"}},"Dependencies":{"type":"object","properties":{"projects":{"type":"array","items":{"$ref":"#/components/schemas/ProjectSummary"}},"versions":{"type":"array","items":{"$ref":"#/components/schemas/Version"}}}},"Statistics":{"type":"object","properties":{"projects":{"type":"integer"},"versions":{"type":"integer"},"files":{"type":"integer"},"authors":{"type":"integer"},"downloads":{"type":"integer"}}},"UserProfile":{"type":"object","properties":{"id":{"type":"string"},"username":{"type":"string"},"name":{"type":"string"},"bio":{"type":"string"},"avatarUrl":{"type":["string","null"]},"links":{"type":"object"},"role":{"type":"string"},"developer":{"type":["object","null"],"properties":{"verified":{"type":"boolean"}}},"location":{"type":["string","null"]},"joinedAt":{"type":"string","format":"date-time"},"stats":{"type":"object","properties":{"projects":{"type":"integer"},"downloads":{"type":"integer"},"followers":{"type":"integer"},"favorites":{"type":"integer"}}}}}}},"paths":{"/projects":{"get":{"tags":["Projects"],"summary":"Search published projects, or get several by id","description":"With `ids`, returns those projects (up to 50 ids or slugs, in the order asked; unknown or private ones are left out) and ignores every other parameter.","parameters":[{"name":"ids","in":"query","schema":{"type":"string"},"description":"Project ids or slugs (bulk read, max 50). Comma-separated or a JSON array."},{"name":"q","in":"query","schema":{"type":"string"},"description":"Full-text search in name, slug, summary, description, tags and author."},{"name":"type","in":"query","schema":{"type":"string","enum":["mod","map","skin"]}},{"name":"category","in":"query","schema":{"type":"string"},"description":"Category slugs. Comma-separated or a JSON array."},{"name":"gameVersion","in":"query","schema":{"type":"string"},"description":"Minecraft versions. Comma-separated or a JSON array.","example":"1.21.4"},{"name":"platform","in":"query","schema":{"type":"string"},"description":"Loaders, edition or skin model. Alias: loader. Comma-separated or a JSON array.","example":"fabric,quilt"},{"name":"tag","in":"query","schema":{"type":"string"}},{"name":"author","in":"query","schema":{"type":"string"},"description":"Username."},{"name":"sort","in":"query","schema":{"type":"string","enum":["relevance","downloads","favorites","updated","newest","name"]}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectSummary"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}},{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectSummary"}}}}]}}}},"422":{"$ref":"#/components/responses/E422"},"429":{"$ref":"#/components/responses/E429"}}}},"/search":{"get":{"tags":["Projects"],"summary":"Alias of GET /projects","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectSummary"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}}}}},"/projects/{idOrSlug}":{"parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project id or slug."}],"get":{"tags":["Projects"],"summary":"Get a project","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/ProjectDetail"}}}}}},"404":{"$ref":"#/components/responses/E404"}}}},"/projects/{idOrSlug}/versions":{"parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project id or slug."}],"get":{"tags":["Versions"],"summary":"List published versions (newest first)","parameters":[{"name":"channel","in":"query","schema":{"type":"string"},"description":"Release channels (stable, beta, alpha). Comma-separated or a JSON array.","example":"stable,beta"},{"name":"gameVersion","in":"query","schema":{"type":"string"},"description":"Minecraft versions. Comma-separated or a JSON array.","example":"1.21.4,1.21.3"},{"name":"platform","in":"query","schema":{"type":"string"},"description":"Loaders (mods), edition (maps) or model (skins). Alias: loader. Comma-separated or a JSON array.","example":"fabric,quilt"},{"name":"includeChangelog","in":"query","schema":{"type":"boolean","default":true},"description":"`false` leaves the changelog out of each version (smaller payloads)."},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data","meta"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Version"}},"meta":{"$ref":"#/components/schemas/PageMeta"}}}}}},"404":{"$ref":"#/components/responses/E404"},"422":{"$ref":"#/components/responses/E422"}}}},"/projects/{idOrSlug}/versions/{version}":{"parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project id or slug."},{"name":"version","in":"path","required":true,"schema":{"type":"string"},"description":"Version id or version number."}],"get":{"tags":["Versions"],"summary":"Get one version of a project","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Version"}}}}}},"404":{"$ref":"#/components/responses/E404"}}}},"/projects/{idOrSlug}/dependencies":{"parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project id or slug."}],"get":{"tags":["Projects"],"summary":"Public projects and versions the published versions depend on (required, optional, embedded)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Dependencies"}}}}}},"404":{"$ref":"#/components/responses/E404"}}}},"/projects/{idOrSlug}/files":{"parameters":[{"name":"idOrSlug","in":"path","required":true,"schema":{"type":"string"},"description":"Project id or slug."},{"name":"all","in":"query","schema":{"type":"boolean"},"description":"Every published version instead of the current one."}],"get":{"tags":["Files"],"summary":"Files of the current version","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/File"}}}}}}},"404":{"$ref":"#/components/responses/E404"}}}},"/versions":{"get":{"tags":["Versions"],"summary":"Get several versions by id (max 100, in the order asked)","parameters":[{"name":"ids","in":"query","schema":{"type":"string"},"description":"Version ids. Comma-separated or a JSON array.","required":true},{"name":"includeChangelog","in":"query","schema":{"type":"boolean","default":true},"description":"`false` leaves the changelog out of each version (smaller payloads)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Version"}}}}}}},"422":{"$ref":"#/components/responses/E422"}}}},"/versions/{id}":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Version id."}],"get":{"tags":["Versions"],"summary":"Get a version by id","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Version"}}}}}},"404":{"$ref":"#/components/responses/E404"}}}},"/version-files":{"get":{"tags":["Files"],"summary":"Identify many installed files at once: hash → version that contains it","parameters":[{"name":"hashes","in":"query","schema":{"type":"string"},"description":"Up to 100 SHA-1 (40 hex) or SHA-256 (64 hex) digests. Comma-separated or a JSON array.","required":true},{"name":"algorithm","in":"query","schema":{"type":"string","enum":["sha1","sha256"]},"description":"Optional; inferred from each hash length."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/VersionsByHash"}}}}}},"422":{"$ref":"#/components/responses/E422"}}}},"/version-files/update":{"get":{"tags":["Files"],"summary":"Check updates for many files: hash → newest compatible version of the same project","parameters":[{"name":"hashes","in":"query","schema":{"type":"string"},"description":"Up to 100 SHA-1 (40 hex) or SHA-256 (64 hex) digests. Comma-separated or a JSON array.","required":true},{"name":"algorithm","in":"query","schema":{"type":"string","enum":["sha1","sha256"]},"description":"Optional; inferred from each hash length."},{"name":"channel","in":"query","schema":{"type":"string"},"description":"Release channels (stable, beta, alpha). Comma-separated or a JSON array.","example":"stable,beta"},{"name":"gameVersion","in":"query","schema":{"type":"string"},"description":"Minecraft versions. Comma-separated or a JSON array.","example":"1.21.4,1.21.3"},{"name":"platform","in":"query","schema":{"type":"string"},"description":"Loaders (mods), edition (maps) or model (skins). Alias: loader. Comma-separated or a JSON array.","example":"fabric,quilt"}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/VersionsByHash"}}}}}},"422":{"$ref":"#/components/responses/E422"}}}},"/version-files/{hash}":{"parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"},"description":"SHA-1 (40 hex) or SHA-256 (64 hex) of a published file."},{"name":"algorithm","in":"query","schema":{"type":"string","enum":["sha1","sha256"]},"description":"Optional; inferred from the hash length."}],"get":{"tags":["Files"],"summary":"Find the version that contains a file (identify installed files, check updates)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Version"}}}}}},"404":{"$ref":"#/components/responses/E404"}}}},"/version-files/{hash}/update":{"parameters":[{"name":"hash","in":"path","required":true,"schema":{"type":"string"},"description":"SHA-1 or SHA-256 of an installed file."},{"name":"algorithm","in":"query","schema":{"type":"string","enum":["sha1","sha256"]},"description":"Optional; inferred from each hash length."},{"name":"channel","in":"query","schema":{"type":"string"},"description":"Release channels (stable, beta, alpha). Comma-separated or a JSON array.","example":"stable,beta"},{"name":"gameVersion","in":"query","schema":{"type":"string"},"description":"Minecraft versions. Comma-separated or a JSON array.","example":"1.21.4,1.21.3"},{"name":"platform","in":"query","schema":{"type":"string"},"description":"Loaders (mods), edition (maps) or model (skins). Alias: loader. Comma-separated or a JSON array.","example":"fabric,quilt"}],"get":{"tags":["Files"],"summary":"Newest published version of the same project that matches the filters (the installed one when it is already the newest)","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Version"}}}}}},"404":{"$ref":"#/components/responses/E404"},"422":{"$ref":"#/components/responses/E422"}}}},"/files/{id}/download":{"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"File id."}],"get":{"tags":["Files"],"summary":"Download a published file (302 to the immutable object; counted once per visitor and day)","responses":{"302":{"description":"Redirect to the file"},"404":{"$ref":"#/components/responses/E404"}}}},"/users":{"get":{"tags":["Users"],"summary":"Get several public profiles by id or username (max 50)","parameters":[{"name":"ids","in":"query","schema":{"type":"string"},"description":"User ids or usernames. Comma-separated or a JSON array.","required":true}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/UserProfile"}}}}}}},"422":{"$ref":"#/components/responses/E422"}}}},"/users/{username}":{"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"},"description":"Username."}],"get":{"tags":["Users"],"summary":"Public profile","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/UserProfile"}}}}}},"404":{"$ref":"#/components/responses/E404"}}}},"/users/{username}/projects":{"parameters":[{"name":"username","in":"path","required":true,"schema":{"type":"string"},"description":"Username."}],"get":{"tags":["Users"],"summary":"Public projects of a user","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProjectSummary"}}}}}}}}}},"/categories":{"get":{"tags":["Reference"],"summary":"Categories","parameters":[{"name":"type","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object"}}}}}}}}}},"/types":{"get":{"tags":["Reference"],"summary":"Enabled content types and their file rules","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object"}}}}}}}}}},"/minecraft/versions":{"get":{"tags":["Reference"],"summary":"Minecraft versions","parameters":[{"name":"snapshots","in":"query","schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"type":"array","items":{"type":"object"}}}}}}}}}},"/statistics":{"get":{"tags":["Reference"],"summary":"Platform totals: published projects, versions, files, authors and downloads","responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","required":["data"],"properties":{"data":{"$ref":"#/components/schemas/Statistics"}}}}}}}}},"/openapi.json":{"get":{"tags":["Reference"],"summary":"This document","responses":{"200":{"description":"OpenAPI 3.1 JSON"}}}}}}