crate resolves any name, link, or third-party id to a single cluster_id, then hands you the whole fleet's data on it — discography, bookings, press, momentum signals — in one call. And it's honest about what it doesn't know.
# any name, link, or id -> the canonical cluster
curl https://crate.hosaka.fm/api/v2/resolve?q=Burial \
-H "X-API-Key: $CRATE_KEY"
{
"cluster_id": "b3a9f2c1...e7", // the prime key
"slug": "burial",
"resolved_via": "discogs", // verified bind
"locators": {
"discogs": 31337,
"musicbrainz": "a4f1...",
"bandcamp": "burial.bandcamp.com"
}
}curl 'https://crate.hosaka.fm/api/v2/preview/artist?q=four+tet'
{
"object": "artist.preview",
"present": true,
"display": "Four Tet",
"cluster_id": null,
"resolved_via": "discogs",
"emergence_tier": "steady",
"arc": [
{ "year": 1996, "tier": "press", "label": "first press mention" },
{ "year": 1998, "tier": "bandcamp","label": "first release" },
{ "year": 2001, "tier": "radio", "label": "first radio airplay" }
],
"arc_truncated": true,
"booked_with": ["Ben UFO","Floating Points","Pearson Sound"],
"press_count": 50,
"note": "Education preview — a capped subset of the artist dossier."
}As of 2026-08-04: v2 spec = 2.47.0 · 22 documented resources on the self-describing index (/api/v2) — including title-first track search (/api/v2/tracks) · 15 catalogued errors with copy-pasteable fixes · v1 frozen (deprecation shim) · 2 keyless surfaces (/api/v2/preview/artist + /api/v2/openapi.json) · billed on 2xx only — errors and 429s are never charged.
You don't need to learn crate's internals. Convert whatever identifier you're holding into a cluster, then read the dossier. That's it.
A name, a Discogs/MusicBrainz id, an ISRC, an artist+track pair, or any artist link — Bandcamp, SoundCloud, Spotify, a website. We reverse-match it to one cluster.
GET /api/v2/resolve?url=…One call returns the canonical dossier: discography, live bookings, press, and emergence signals — composed across the fleet of producers.
GET /api/v2/artist/{cluster_id}Flat, source-tagged JSON with an honest-gap state on every field — so your UI never guesses. Same shape across artists, labels, releases.
200 · private, no-store · typedFive music catalogues disagree about who an artist even is. crate reconciles them once, so you integrate one API instead of five.
Every artist, label, and release rolls up to a single cluster_id — Discogs, MusicBrainz, Bandcamp, booking data and more, reconciled. The long tail with no Discogs id still resolves.
No fan-out, no joining six endpoints. Ask for an entity and get everything — identity, catalogue, bookings, press, signals — assembled server-side in one round trip.
Every field carries provenance and a state — live, fallback, blind — and the producer + refresh cadence behind it. Unresolved lookups return 200 with nulls, never a 404 guess.
Plain REST you can curl, plus a typed @hosaka-fm/crate client with generated types — your editor knows every field before you run it.
The SDK is a thin, typed wrapper over the same REST API — no magic, no lock-in. Generated straight from the OpenAPI spec, so the types never drift from production.
import { Crate } from "@hosaka-fm/crate";
const crate = new Crate({ apiKey: process.env.CRATE_API_KEY });
// name -> canonical cluster (fully typed)
const { cluster_id } = await crate.resolve({ q: "Burial" });
// -> the whole dossier, source-tagged
const artist = await crate.artist.get(cluster_id);
artist.discography[0].title; // string | autocompletesEvery plan is metered on successful responses. Start free, no card — enough to build a real prototype, not a teaser.
Grab a free key, paste it into a curl, and resolve your first artist before your coffee's cold.