ASDev / developer portal

Build on the Syndicate.

A music catalogue you can query right now, an identity your users already have, a package registry and an inference endpoint. Developer access is free and starts the minute you ask for it.

badge issued on submit · no invite code · no card
open endpoints need no key at all

curl · no key required200 OK
$
{
"tracks": [{
"title": "Нежные порезы",
"artistSlug": "lar4ick",
"durationMs": 102896,
"genres": ["hip-hop", "rap", "boom bap"],
"bpm": 92, "playCount": 152
}]
}
§ 01

Start without asking.

Most of the platform answers anonymously. Nothing below needs an account, a key or a conversation with us — copy a line, run it, see what comes back.

MethodEndpointHostAuthReturns
GET/api/v1/catalog/tracksresonance-api.aperturesyndicate.comnoneTracks with artists, genres, bpm and play counts
GET/api/v1/catalog/artists/:slugresonance-api.aperturesyndicate.comnoneArtist page with its releases
GET/api/v1/catalog/albumsresonance-api.aperturesyndicate.comnoneAlbums, sorted and paginated
GET/api/packagessynx.aperturesyndicate.comnoneSYNX registry — search, versions, download
GET/.well-known/jwks.jsonauth.aperturesyndicate.comnoneRS256 public keys — verify our tokens yourself
GET/api/statusstatus.aperturesyndicate.comnoneLive platform status and incident history
GET/api/v1/sso/authorizeauth.aperturesyndicate.comclient_idOAuth 2.1 authorization code, PKCE required
POST/api/v1/chat/completionsasai.aperturesyndicate.comasai_ keyOpenAI-compatible chat, streaming and tools — paid plan

Current limits are per IP: 300 req/min on the catalogue, 60 req/min per ASAI key. Third-party browser origins are blocked by CORS — call these from your server, not from a page. The terms are stricter than the code: catalogue data is for personal, non-commercial use with attribution back to Resonance. Read the Developer & API terms before you ship.

§ 02

Access is one form, not a queue.

The badge is what unlocks developer-only surfaces. Getting it takes about five minutes and no one has to approve you first.

01

Sign in

Your ordinary Syndicate account. The portal reads the same session as every other service — nothing separate to create.

account required
02

Apply

Three steps: who you are, what you are building, and which surfaces you need. The description is the part we read.

≈5 minutes
03

Badge

The Developer badge lands on your account the moment you submit. Nothing sits in a queue — we read applications afterwards and can revoke.

instant
04

Build

The badge opens the studio: register applications, rotate secrets, see the surface you may call. Publishing lands there as it ships.

ongoing
Candles on a cake, the room waiting to sing

The form asks who you are, what you are building and which surfaces you need. The description is the part a person actually reads — write it the way you would tell a friend, not the way you would fill in a compliance sheet.

Open the application
§ 03

What you can build here.

Ordered by how ready each surface is. Where something is not finished, it says so.

  • 01

    Sign-in with Syndicate

    Put a Syndicate login in your own app. Register the client in the studio, point it at your callback: authorization code with PKCE, four scopes, tokens you verify locally.

    Live
  • 02

    Anything on the catalogue

    Charts, players, discovery bots, embeds, stats pages. The Resonance catalogue answers without a key.

    Live
  • 03

    Tools on ASAI

    An OpenAI-compatible endpoint with three models. The key is created in ASAI settings; calling the API needs a paid ASAI plan.

    Paid plan
  • 04

    SYNX packages

    Our config format has a public registry with search, versions and downloads. Publishing runs through the CLI.

    Live
  • 05

    Desktop apps

    ASInstaller installs a .asins package straight from disk. Publishing third-party apps into the store is not open yet — write to us.

    Planned

One identity, verified on your side.

People already have a Syndicate account for music, AI and the rest of the platform. Let them use it in your app: authorization code with PKCE, tokens signed RS256, public keys you can cache.

  • Grantsauthorization_code, refresh_token. PKCE with S256 is mandatory — plain is refused.
  • Scopesopenid · profile · email · subscription. The last one exposes plan and status, so you can gate features on it.
  • TokensAccess 15 minutes, refresh 30 days and rotated on every use.
  • VerifyFetch JWKS once, verify locally. No round trip to us on every request.
  • CaveatOAuth 2.1, not full OIDC: no discovery document, no id_token. Configure the endpoints by hand.
Two people on a bench, long after midnight

Keys, and what they open today.

Straight answer, because it saves you an afternoon: the key that works right now is the ASAI one. It is created in ASAI settings, sent as a bearer token, and accepted by an OpenAI-compatible endpoint. A single platform-wide key is the next thing being wired.

  • Formatasai_ + 43 characters, shown once, stored as a hash.
  • PlanCalls need a paid ASAI plan. The free tier can create a key but the endpoint will refuse it.
  • RevokeInstant, from the same settings screen. Revocation is checked on every call.
inference · openai-compatible60 req/min
curl https://asai.aperturesyndicate.com/api/v1/chat/completions \
  -H "Authorization: Bearer asai_…" \
  -H "Content-Type: application/json" \
  -d '{"model": "asai-code",
       "messages": [{"role": "user",
                     "content": "explain this stack trace"}],
       "stream": true}'

# models: asai-code · asai-mini · asai-arc

SYNX — the format we configure everything with.

Every service on the platform is configured in SYNX rather than YAML or JSON: typed values, validation, environment binding and secrets that never reach a log. The parser is a published npm package and the registry is open to read.

  • RegistrySearch, versions and downloads are public; publishing runs through the SYNX CLI.
  • SecretsA value marked :secret is redacted from every dump and log line by the parser itself.
  • Playgroundsynx.aperturesyndicate.com runs the format live in the browser — paste a config, watch it parse.
app.synxactive mode
# !active turns a data file into a config
!active

port[type:int]:env:default:7008        PORT
db_url[required]:env                   DATABASE_URL
secret[required]:secret:env            JWT_PUBLIC_KEY
workers[type:int, min:1, max:32] 4

# npm i @aperturesyndicate/synx-format

Desktop distribution, stated plainly.

ASInstaller is our Windows launcher: it installs and updates our own titles and gathers the games and apps you already own into one library. A package is a plain ZIP with a SYNX manifest, and it can install one straight from disk.

  • Format.asins — manifest.synx at the root, payload under files/. Documented in the installer, not yet in the docs site.
  • TodayHand someone a .asins file and it installs, with shortcuts and an uninstall entry.
  • Not yetNo upload endpoint, no store submission, no third-party listings. When that lands it will be announced here first.
A blurred hug that nobody posed for
§ 04

What you are building against.

Not a marketing stack list — the actual runtime your calls land on, so you can judge the latency and the failure modes for yourself.

Runtime
Bun 1.x

Every service runs on Bun, not Node — cold starts measured in milliseconds.

HTTP
Hono

Thin, typed handlers. gRPC between services, REST at the edge.

Data
Postgres 17

One schema per service, Drizzle ORM, soft delete everywhere.

Events
NATS JetStream

Durable, versioned subjects: v1.{domain}.{verb}.

Config
SYNX

Our own format instead of YAML — typed, validated, secret-aware.

Region
EU · Helsinki

Servers and object storage in Finland, billed by an Estonian OÜ.

The stairwell everyone ends up sitting on

Your applications live here.

The studio is where your applications live: register a client, rotate its secret, disable it, and read the surface you may call. Usage metering is the next piece — it does not exist yet, so the studio does not pretend to show it.

Open the studio
Everyone laughing at once, sunset behind

There is a person
on the other end.

APERTURESyndicate is a collective, not a support desk. The people who write these services are the same ones who read your application and register your OAuth client by hand — a handful of us, in the evenings, in a courtyard like this one. That is why the page tells you what is missing instead of pretending it is finished.

§ 05

Questions we would ask.

It marks your account as a developer across the platform and is the gate that developer-only surfaces check — today that means registering an OAuth client 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 on this page work without it.

The badge is granted the moment you submit the form. We read applications afterwards, and the studio can revoke access if something looks wrong. So: no waiting, but not a free-for-all either.

Developer access is free, and so are the open endpoints. There is no developer tier to buy and no metered API billing — neither exists.

The one paid surface is ASAI inference: calling it needs a paid ASAI plan, because that is compute we pay for by the hour.

No. Catalogue and registry reads are anonymous, capped at 300 requests per minute per IP. Browser calls from a third-party origin are blocked by CORS, so call it from your server.

In the studio: Applications → New application. You give it a name, one or more redirect URIs and the scopes you need; the client_id appears immediately and the secret is shown once. You can rotate that secret or disable the client at any time.

Worth knowing up front: this is OAuth 2.1, not full OIDC. There is no discovery document and no id_token, so point your client at the three endpoints by hand.

Not yet. ASInstaller today installs our own titles and any .asins package you hand it directly — the format is a plain ZIP with a SYNX manifest. There is no upload endpoint, no store submission and no review flow, and we would rather say so than take your build and sit on it.

The rules are written and published: Developer & API terms on docs.aperturesyndicate.com cover keys, limits, OAuth clients and when access gets revoked. The endpoint reference is not — that section is still empty, and this page is the most accurate map of the public surface we have.

Treat the table above as the contract until the reference catches up.

Developer Portal | APERTURESyndicate