APERTURESyndicate
for developers
Every card here is made from one public request. Turn one over and build the same thing.
# no key, no account GET /api/v1/catalog/tracks?limit=1 Host: resonance-api.aperturesyndicate.com { "title": "Нежные порезы", "artists": [{ "name": "Lar4ick" }], "playCount": 188, "bpm": 92, "genres": ["hip-hop", "rap"], "coverUrl": "https://…" }Run it yourself
Sign-in, start to finish.
1import { createRemoteJWKSet, jwtVerify } from 'jose'23const AUTH = 'https://auth.aperturesyndicate.com'4const CALLBACK = 'https://your.app/callback'5const keys = createRemoteJWKSet(new URL(`${AUTH}/.well-known/jwks.json`))67export function signInUrl(challenge: string) {8 const query = new URLSearchParams({9 response_type: 'code',10 client_id: process.env.SYNDICATE_CLIENT_ID!,11 redirect_uri: CALLBACK,12 scope: 'openid profile subscription',13 code_challenge: challenge,14 code_challenge_method: 'S256',15 })16 return `${AUTH}/api/v1/sso/authorize?${query}`17}1819export async function finishSignIn(code: string, verifier: string) {20 const tokens = await fetch(`${AUTH}/api/v1/sso/token`, {21 method: 'POST',22 headers: { 'content-type': 'application/json' },23 body: JSON.stringify({24 grant_type: 'authorization_code',25 client_id: process.env.SYNDICATE_CLIENT_ID,26 code, code_verifier: verifier, redirect_uri: CALLBACK,27 }),28 }).then((r) => r.json())2930 const { payload } = await jwtVerify(tokens.access_token, keys)3132 const me = await fetch(`${AUTH}/api/v1/sso/userinfo`, {33 headers: { authorization: `Bearer ${tokens.access_token}` },34 }).then((r) => r.json())3536 return {37 id: payload.sub,38 name: me.nickname,39 plan: me.subscription?.plan ?? null,40 }41}
Send them to us. PKCE is required — a plain challenge gets refused.
They come back with ?code=. Swap it: access token for 15 minutes, refresh token for 30 days.
Check the signature yourself with our public keys. No call back to us on every request.
Need their plan? The subscription scope puts it here — gate features on it.
That is the whole thing. The client_id comes from the studio.
Register an app
What is open.
aperturesyndicate.com/
- sso/Sign in with SyndicateRegister an app
- catalog/Resonance tracks, artists, albums — no keyLive response
- chat/ASAI models, OpenAI-compatible — paid planGet a key
- synx/Our config format and its registryPlayground
- apeiron/Publishing games and appsnot open yet
Get the badge
One form, nobody to wait for. Describe what you are building the way you would tell a friend.
Open the applicationYour applications
Register a client, rotate its secret, switch it off. Everything you may call is listed there too.
Open the studioQuestions
Developer & API termsIt marks your account as a developer and opens the studio, where you register OAuth clients so people can sign in to your app with their Syndicate account.
It is not a paywall and not a rate-limit tier. The open endpoints work without it.
The badge lands the moment you submit. We read applications afterwards and can revoke access if something looks wrong — no waiting, but not a free-for-all either.
Developer access and the open endpoints are free. There is no developer tier to buy and no metered API billing.
The one paid surface is ASAI inference: calling it needs a paid ASAI plan, because that is compute we pay for by the hour.
Catalogue and registry reads: 300 requests per minute per IP. ASAI: 60 requests per minute per key.
Browser calls from a third-party origin are blocked by CORS, so call these from your server. Catalogue data is for personal, non-commercial use with attribution back to Resonance.
Not yet. Apeiron installs and updates titles from signed releases that we publish ourselves. There is no upload or store submission, and we would rather say so than take your build and sit on it.
In the Developer & API terms on docs.aperturesyndicate.com: keys, limits, OAuth clients and when access gets revoked. The endpoint reference is still being written — until then, this page is the map.

There is a person on the other end.
The people who write these services are the ones who read your application — a handful of us, in the evenings. That is why this page tells you what is missing.
Request developer access
