Aden

Add Aden to your website

Show your releases, shows and news on any site. Public data needs no key.

Your site reads from Aden, so a new release, a sold-out show or a news post shows up there without anyone editing the site.

You want to showUse
Your profile, links, upcoming shows, releases, newsThe site feed: no key, works in the browser
Anything private, or more than the feed holdsAn API key, from your server
A whole new site, built for youTeam → API → Build your website with AI in Aden

The site feed

One public address returns what your Aden profile already shows, as JSON:

https://aden.space/api/v1/public/sites/<handle>

Your handle is the part after @ in your profile address (aden.space/@stripes → stripes). On Team → API, the arrow beside Open in ChatGPT has Copy feed URL.

What's in it

{
    "data": {
        "artist": {
            "name": "Stripes",
            "slug": "stripes",
            "bio": "…",
            "genres": ["Electronic"],
            "city": "Antwerp",
            "country": "BE",
            "url": "https://aden.space/@stripes",
            "imageUrl": "https://…",
            "bannerUrl": "https://…"
        },
        "links": [{ "platform": "spotify", "url": "https://…" }],
        "shows": [
            {
                "id": 81,
                "name": "Stripes live",
                "date": "2026-11-21",
                "startTime": "21:00:00",
                "venue": "Trix",
                "city": "Antwerp",
                "country": "BE",
                "tour": null,
                "ticketUrl": "https://…",
                "url": "https://aden.space/@stripes/events/…",
                "imageUrl": "https://…",
                "soldOut": false,
                "cancelled": false
            }
        ],
        "releases": [
            {
                "id": 412,
                "kind": "track",
                "title": "Night Bus",
                "releaseDate": "2026-10-03",
                "coverUrl": "https://…",
                "url": "https://aden.space/@stripes/track/night-bus"
            }
        ],
        "posts": [
            {
                "id": 9,
                "title": "New single out",
                "excerpt": "…",
                "date": "2026-10-03",
                "imageUrl": "https://…",
                "url": "https://aden.space/@stripes/posts/…"
            }
        ]
    }
}
  • shows: the next 20, today included. releases: the newest 12 tracks and 12 albums, newest first. posts: the latest 6.
  • Each release url opens its Aden page, with every streaming link.
  • Only public things appear: a show marked busy, an unreleased track or a draft post never does. Hide your picture on public pages and imageUrl is null.
  • Image links never expire, so you can cache the feed as long as you like.

Use it

Paste this where the releases should appear. It works on any page, including Webflow, Framer and Squarespace code blocks.

<ul id="aden-releases"></ul>
<script>
    fetch('https://aden.space/api/v1/public/sites/stripes')
        .then((res) => res.json())
        .then(({ data }) => {
            const list = document.getElementById('aden-releases')
            for (const release of data.releases) {
                const item = document.createElement('li')
                const link = document.createElement('a')
                link.href = release.url
                link.textContent = release.title
                item.append(link)
                list.append(item)
            }
        })
</script>

Changes reach the feed within about five minutes. Fetching more often than that returns the same answer, and one address that asks for more than 60 uncached feeds a minute gets a 429.

Private data with an API key

An API key reads your team's own data: the whole catalogue, unreleased tracks, milestones, tasks, contacts. It belongs on a server, never in a web page.

A key in a web page is readable by every visitor. Aden refuses any key sent from a browser with 403 server_only, so the mistake shows up while you build, not after you ship. For the browser, use the site feed.

Create a key

In Aden, open your team, go to API and press New key. Pick Read only unless your code changes things in Aden. Copy the key: it starts with aden_ and is shown once. API keys need the Lite plan or higher.

Store it as a secret

Put it in your server's environment, never in your code or git:

.env
ADEN_API_KEY=aden_…
ADEN_TEAM_ID=216

Your team id is the number in the API page's address (aden.space/app/teams/216/api → 216).

Call Aden from your server

Send the key as a bearer token, and name your team with teamId:

app/catalogue.tsx
const aden = async (path: string) => {
    const res = await fetch(`https://aden.space/api/v1${path}`, {
        headers: { authorization: `Bearer ${process.env.ADEN_API_KEY}` },
        next: { revalidate: 300 },
    })
    if (!res.ok) throw new Error(`Aden answered ${res.status}`)
    return res.json()
}

export const Catalogue = async () => {
    const { data: tracks, total } = await aden(
        `/tracks?teamId=${process.env.ADEN_TEAM_ID}&limit=50`
    )
    return (
        <section>
            <h2>{total} tracks</h2>
            <ul>
                {tracks.map((track) => (
                    <li key={track.id}>{track.title}</li>
                ))}
            </ul>
        </section>
    )
}

This runs on the server, so the key never reaches the visitor.

What a key can reach

A key belongs to one team and only ever reaches that team's data. It can call:

ResourceList
TracksGET /tracks?teamId=… (versions under /tracks/:id/versions)
AlbumsGET /albums?teamId=…
PlaylistsGET /playlists?teamId=…
ShowsGET /events?teamId=…
ToursGET /tours?teamId=…
PostsGET /posts?teamId=…
MilestonesGET /milestones?teamId=…
TasksGET /todos?teamId=…
ContactsGET /contacts?teamId=…
WebhooksGET /webhooks?teamId=…
App dataGET /app-data?entityType=…&entityId=…

Most also have GET /<resource>/:id for one item. A Read & write key can also create and change milestones, tasks, contacts, webhooks and app data. Uploading audio, creating tracks and adding collaborators happen in Aden, by a signed-in member.

Every other endpoint answers a key with 403 endpoint_not_allowed. The API reference lists each endpoint's fields.

Limits

PlanPer minutePer hourPer month
Lite3001,00050,000
Pro3005,000250,000
Max30020,0001,000,000

All of a team's keys share these. Every keyed response carries X-RateLimit-Remaining and X-RateLimit-Reset; a 429 adds Retry-After. Cache what you read: a site that fetches on every page view runs out fast. See Rate limits.

Errors

StatuserrorWhat to do
401UnauthorizedThe key is wrong, revoked or expired. Create a new one on Team → API.
403server_onlyThe key was sent from a browser. Call Aden from your server.
403endpoint_not_allowedKeys can't call this endpoint. message lists the ones they can.
403insufficient_scopeA Read only key tried to change something. Use a Read & write key.
403plan_requiredThe team's plan has no API access. Upgrade to Lite or higher.
429rate_limitedWait for Retry-After seconds, then cache more.

Error bodies hold the code in error, and most add a message that says what happened.

Keep keys safe

  • One key per site or script, named after it, so you can revoke one without breaking the rest.
  • Read only unless the code writes.
  • Revoke a key on Team → API the moment you suspect it leaked. It stops working within a minute.
Was this helpful?

On this page