Launcher API
Put a Jace Store browser inside your Minecraft launcher. Search mods, resource packs, shaders, data packs, modpacks, plugins and worlds; resolve the right file for an instance; install it; and check for updates. Public, read-only, no key needed, CORS enabled.
https://jace-store-deb.vercel.app/api/launcher/v1
Spec: openapi.json. Please send a descriptiveUser-Agent (e.g. MyLauncher/2.1 (contact@example.com)).
Endpoints
GET
/metaTypes, loaders, categories, game versions and install folders, for building filter UIGET
/search?q=&type=mod&loader=fabric&game_version=1.21.1&category=&sort=downloads&page=1&limit=20Browse/search. type, loader and category take comma lists. edition=bedrock|all for Bedrock contentGET
/featured?type=mod&edition=java&limit=10Popular, recently updated and newest rows for a home screenGET
/project/{slug}Details: Markdown description, gallery, links, install info, featured versionGET
/project/{slug}/versions?loader=&game_version=&channel=releaseVersion list filtered for an instanceGET
/project/{slug}/resolve?loader=fabric&game_version=1.21.1The one file to install for an instance, plus where it goesPOST
/updatesSend file hashes from an instance; get back what's installed and available updatesGET
/openapi.jsonOpenAPI 3.1 spec, for generating clientsTypical flow
- Build filters from
/meta(cache it; it rarely changes). - Show a browser with
/featuredon open and/searchas the user types, passing the instance's loader and game version so only compatible content shows. - Open a project with
/project/{slug}. The description is Markdown;galleryis a list of image URLs. - Install: call
/resolvewith the instance's loader + version, downloadfile.url, verifyfile.hashes.sha1, and save it toinstall.pathinside the instance. Modpacks (install.method = "import_instance") are.mrpack/.zipfiles to feed your instance importer. - Update: hash the files in
mods/,resourcepacks/,shaderpacks/and POST them to/updates.
Example (JavaScript)
const API = "https://jace-store-deb.vercel.app/api/launcher/v1";
const instance = { loader: "fabric", game_version: "1.21.1" };
// 1. search
const res = await fetch(`${API}/search?${new URLSearchParams({ q: "minimap", type: "mod", ...instance })}`);
const { hits } = await res.json();
// 2. resolve + install
const r = await (await fetch(`${API}/project/${hits[0].slug}/resolve?${new URLSearchParams(instance)}`)).json();
const bytes = new Uint8Array(await (await fetch(r.file.url)).arrayBuffer());
const sha1 = [...new Uint8Array(await crypto.subtle.digest("SHA-1", bytes))].map(b => b.toString(16).padStart(2, "0")).join("");
if (r.file.hashes && sha1 !== r.file.hashes.sha1) throw new Error("hash mismatch");
// write bytes to <instance>/${r.install.path}Example (Python)
import hashlib, pathlib, requests
API = "https://jace-store-deb.vercel.app/api/launcher/v1"
HEADERS = {"User-Agent": "MyLauncher/1.0"}
mods = pathlib.Path("~/.minecraft/mods").expanduser()
hashes = {hashlib.sha1(p.read_bytes()).hexdigest(): p for p in mods.glob("*.jar")}
r = requests.post(f"{API}/updates", headers=HEADERS, json={
"hashes": list(hashes), "loader": "fabric", "game_version": "1.21.1",
}).json()
for h, info in r["results"].items():
if info["update_available"]:
f = info["latest_file"]
print(f"{info['project']['title']}: {info['current_version']['version_number']} -> {info['latest_version']['version_number']}")
data = requests.get(f["url"], headers=HEADERS).content
assert hashlib.sha1(data).hexdigest() == f["hashes"]["sha1"]
(mods / f["filename"]).write_bytes(data)
hashes[h].unlink()Notes
file.urlgoes through the download counter and redirects todirect_url. Follow redirects.- Files can be hosted elsewhere (
external: true). Minecraft files always have SHA-1 and SHA-512 so you can verify them. resolvedefaults tochannel=releaseand respects a version the creator pinned as primary, if it fits the instance.- Responses are cached at the edge for 30-120 seconds;
/updatesis never cached. - Bedrock Edition content (add-ons, texture packs, worlds, skin packs, world templates) has
edition: "bedrock"andinstall.method = "bedrock_import": open or import the.mcpack/.mcaddon/.mcworld/.mctemplatefile with the game instead of copying it to a folder. Without atype, search and featured return Java content only; passedition=bedrockoredition=all. Bedrock uses its own version numbers (bedrock_game_versionsin/meta). - Need Modrinth-compatible endpoints instead? See /api/v2.