APERTURESyndicate
for developers

Every card here is made from one public request. Turn one over and build the same thing.

Нежные порезы — cover
Нежные порезыLar4ick

188 plays · 92 bpm · hip-hop

# 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.

sign-in.ts
import { createRemoteJWKSet, jwtVerify } from 'jose'const AUTH = 'https://auth.aperturesyndicate.com'const CALLBACK = 'https://your.app/callback'const keys = createRemoteJWKSet(new URL(`${AUTH}/.well-known/jwks.json`))export function signInUrl(challenge: string) {  const query = new URLSearchParams({    response_type: 'code',    client_id: process.env.SYNDICATE_CLIENT_ID!,    redirect_uri: CALLBACK,    scope: 'openid profile subscription',    code_challenge: challenge,    code_challenge_method: 'S256',  })  return `${AUTH}/api/v1/sso/authorize?${query}`}export async function finishSignIn(code: string, verifier: string) {  const tokens = await fetch(`${AUTH}/api/v1/sso/token`, {    method: 'POST',    headers: { 'content-type': 'application/json' },    body: JSON.stringify({      grant_type: 'authorization_code',      client_id: process.env.SYNDICATE_CLIENT_ID,      code, code_verifier: verifier, redirect_uri: CALLBACK,    }),  }).then((r) => r.json())  const { payload } = await jwtVerify(tokens.access_token, keys)  const me = await fetch(`${AUTH}/api/v1/sso/userinfo`, {    headers: { authorization: `Bearer ${tokens.access_token}` },  }).then((r) => r.json())  return {    id: payload.sub,    name: me.nickname,    plan: me.subscription?.plan ?? null,  }}
  1. Send them to us. PKCE is required — a plain challenge gets refused.

  2. They come back with ?code=. Swap it: access token for 15 minutes, refresh token for 30 days.

  3. Check the signature yourself with our public keys. No call back to us on every request.

  4. Need their plan? The subscription scope puts it here — gate features on it.

  5. 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 application

Your applications

Register a client, rotate its secret, switch it off. Everything you may call is listed there too.

Open the studio

It 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.

Everyone laughing at once, sunset behind

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
Developer Portal | APERTURESyndicate