API reference

Put your chapter's data on your own website.

Every chapter on the ALL Applied AI Network has a live, public API: events, members, leaderboard, badges, merch, research projects, and learning-tree content. Officers edit it in their dashboard; your site reflects the change on the next page load, with no redeploy.

You almost certainly don't need an API key

Every per-chapter module below is readable through one public, CORS-open endpoint. If your site is static — a plain HTML site, a Vite or React SPA, anything served from GitHub Pages, S3, Netlify or Vercel without a server — that endpoint is the only correct option.

Bundlers inline environment variables (VITE_*, NEXT_PUBLIC_*, REACT_APP_*) into the JavaScript they ship to visitors. There is no such thing as a “server-side fetch” in a static build — the browser is doing the fetching whatever the code looks like, so a key placed there is a published key. The authenticated /api/v1/* endpoints exist for sites that genuinely run code on a server.

Quickstart

One request returns everything. Replace msoe-ai-club with your chapter's slug.

curl "https://dashboard.all-ai-network.org/api/public/chapter/msoe-ai-club/bundle"
// No API key. Safe to call from the browser.
const res = await fetch(
  "https://dashboard.all-ai-network.org/api/public/chapter/msoe-ai-club/bundle?events=all"
);
const { chapter, events, projects, leaderboard } = await res.json();

console.log(chapter.name, "—", chapter.member_count, "members");
for (const p of projects) {
  console.log(p.year, p.title, "by", p.members.map((m) => m.name).join(", "));
}

Responses are edge-cached about 30 seconds, so calling this on every page load is fine — don't build a client-side cache on top.

Endpoints

6 public endpoints. The chapter bundle covers most integrations on its own; the event endpoint adds an event's teams and their GitHub repositories.

Chapter bundle

No key

Everything a chapter website needs in one round-trip: identity and counts, presentation config, events, leaderboard, badges, merch, projects, and social feeds. This is the endpoint most integrations should use.

GET/api/public/chapter/msoe-ai-club/bundle
Path parameters
slugstringThe chapter's slug, e.g. msoe-ai-club.
Query parameters
eventsupcoming | past | allWhich slice of the calendar to return. Defaults to upcoming — a chapter whose events are all in the past gets an empty array unless you ask for past or all.
events_limitintegerCap on events returned. Defaults to 12 for upcoming, 100 otherwise; max 200.
  • CORS-open and edge-cached ~30 seconds, so calling it on every page load is fine.
  • Read events_scope to tell 'nothing upcoming' apart from 'no events at all'.
  • Each event carries its public page url and links (RSVP, team sign-up, project submission, registration on another site), worked out by the same rules as the event page. Show a button only when its open flag is true; a signup.url can stay non-null after sign-ups close, because the same link opens an existing participant's workspace. Listed (save-the-date) events carry the page url and nothing else.
  • slug can be null on an event that has never been linked; url always works, and the event endpoint accepts the id in its place.
  • For an event's teams and their GitHub repositories, call the event endpoint below.
  • config carries the chapter's dashboard theme and section toggles. A site with its own design should ignore both — they exist for template sites that opted into remote control.
Example response
{
  "chapter": {
    "slug": "msoe-ai-club",
    "name": "MSOE AI Club",
    "university": "Milwaukee School of Engineering",
    "member_count": 515,
    "event_count": 56
  },
  "config": { "theme": { "primary": "#4f8fea", "accent": "#a855f7" }, "logo_url": "…", "sections": { … } },
  "events": [
    {
      "id": "5f0c1a52-…",
      "slug": "innovation-lab",
      "url": "https://dashboard.all-ai-network.org/e/innovation-lab",
      "title": "Innovation Lab",
      "date": "2026-11-07T15:00:00Z",
      "publish_status": "published",
      "project_based": true,
      "links": {
        "page": "https://dashboard.all-ai-network.org/e/innovation-lab",
        "rsvp": { "url": null, "state": "disabled", "opens_at": null, "closes_at": null },
        "signup": { "url": "https://dashboard.all-ai-network.org/j/K7QX2M", "enabled": true, "open": true, "closes_at": "2026-11-05T05:00:00Z" },
        "submission": { "url": "https://dashboard.all-ai-network.org/s/P4TR9W", "open": true, "closes_at": "2026-11-08T21:00:00Z" },
        "external_registration": null
      }
    }
  ],
  "events_scope": "upcoming",
  "leaderboard": [ { "rank": 1, "name": "…", "points": 88, "badges": [ … ] } ],
  "badges": [ … ],
  "merch": [ … ],
  "projects": [
    {
      "title": "NourishNet",
      "year": "2023-2024",
      "members": [ { "name": "Sydney Balboni", "role": "author" } ],
      "files":   [ { "kind": "paper", "url": "https://arxiv.org/pdf/2407.00698" } ]
    }
  ],
  "social_feeds": { }
}

Event detail

No key

One event with its sign-up and submission links, schedule, materials, teams with their GitHub repositories, showcase projects, and counts. It is exactly what the public event page shows, so there is no key.

GET/api/public/event/innovation-lab?chapter=msoe-ai-club
Path parameters
slugstringThe event's slug (events[].slug in the bundle) or its id.
Query parameters
chapterstringA chapter slug. When given, the event must be hosted or accepted as co-hosted by that chapter, or the answer is a 404. Use it so a site only ever shows its own events.
  • CORS-open. Published and listed events only: a draft is a 404, the same as an event that does not exist.
  • A listed event is a save-the-date: no description, materials, teams, projects or counts, and links carries only the page url.
  • teams[].repo_url is null for a private repository or one not linked yet. Never guess a URL from the team's name.
  • Only members who share their profile are named. Everyone else is counted in unnamed_count (render it as '+N more'). profile_url is set only for a published profile.
  • A team's project is a short summary of what the team wrote, or the idea or problem it chose. It is null until it has one.
  • signup_open and submission links follow the event page: show the button only while open is true.
  • stages is the event's schedule when it has several phases (the bundle calls the same list phases). Each stage has its own rsvp, and a multi-stage event has no event-wide RSVP or registration.
Example response
{
  "event": {
    "id": "5f0c1a52-…",
    "slug": "innovation-lab",
    "title": "Innovation Lab",
    "description": "Two days to build something that works.",
    "type": "innovation-lab",
    "publish_status": "published",
    "date": "2026-11-07T15:00:00Z",
    "end_date": "2026-11-08T21:00:00Z",
    "timezone": "America/Chicago",
    "format": "in_person",
    "location": "Room 101",
    "virtual_url": null,
    "image_url": "https://…",
    "multi_stage": false,
    "project_based": true,
    "teams_enabled": true
  },
  "chapter": { "slug": "msoe-ai-club", "name": "MSOE AI Club", "university": "Milwaukee School of Engineering" },
  "stages": [],
  "materials": [ { "title": "Brief", "url": "https://…/brief.pdf", "kind": "document" } ],
  "project_work": {
    "signup_open": true,
    "signup_closes_at": "2026-11-05T05:00:00Z",
    "max_team_size": 5,
    "signup_url": "https://dashboard.all-ai-network.org/j/K7QX2M",
    "submission_url": "https://dashboard.all-ai-network.org/s/P4TR9W",
    "github_enabled": true,
    "teams_enabled": true,
    "team_formation": "self_selected",
    "team_joining": "open"
  },
  "teams": [
    {
      "name": "River Watch",
      "project": "Forecasting river levels from bridge sensors.",
      "repo_url": "https://github.com/river-watch/forecast",
      "members": [ { "name": "Ada Lovelace", "profile_url": "https://ada.all-ai-network.org" } ],
      "unnamed_count": 2
    },
    { "name": "Team Two", "project": null, "repo_url": null, "members": [], "unnamed_count": 3 }
  ],
  "projects": [
    {
      "title": "NourishNet",
      "writeup": "…",
      "image_url": null,
      "links": [ { "kind": "paper", "label": "Paper", "title": "The paper", "url": "https://arxiv.org/pdf/2407.00698" } ],
      "members": [ { "name": "Sydney Balboni", "profile_url": null } ],
      "unnamed_count": 0
    }
  ],
  "counts": { "signed_up": 24, "rsvps": 31, "checked_in": 18, "teams": 6 },
  "links": {
    "page": "https://dashboard.all-ai-network.org/e/innovation-lab",
    "rsvp": { "url": null, "state": "disabled", "opens_at": null, "closes_at": null },
    "signup": { "url": "https://dashboard.all-ai-network.org/j/K7QX2M", "enabled": true, "open": true, "closes_at": "2026-11-05T05:00:00Z" },
    "submission": { "url": "https://dashboard.all-ai-network.org/s/P4TR9W", "open": true, "closes_at": "2026-11-08T21:00:00Z" },
    "external_registration": null
  }
}

Learning tree

No key

The network's shared curriculum graph merged with the chapter's own nodes, as nodes and edges.

GET/api/public/learning-tree/msoe-ai-club
Path parameters
slugstringThe chapter's slug.
  • source distinguishes shared network nodes from chapter-authored ones.
  • Honour pos_x/pos_y where present — an officer arranged those by hand. Only auto-layout nodes that have none.
  • prereqs can list more than one parent. This is a graph, not a strict tree; a renderer assuming a single parent silently drops edges.
Example response
{
  "chapter": { "slug": "msoe-ai-club", "name": "MSOE AI Club" },
  "nodes": [
    {
      "id": "foundations/what-is-ai",
      "title": "What Is AI? The Real Story",
      "summary": "…",
      "body": null,
      "prereqs": [],
      "tags": ["foundations"],
      "thumbnail": "https://…",
      "difficulty": "beginner",
      "pos_x": -1240, "pos_y": 0,
      "source": "base"
    }
  ],
  "edges": [ { "from": "…", "to": "…" } ]
}

Chapter site config

No key

Just the presentation config — theme, logo, section toggles, officers — without the rest of the bundle.

GET/api/public/config/msoe-ai-club
Path parameters
slugstringThe chapter's slug.
  • Use the bundle instead if you also need data; it includes this.

Chapter directory

No key

Every chapter that has opted into network discovery, with its university and hub site.

GET/api/public/network/chapters

Network statistics

No key

Aggregate, no-PII snapshot of the network: chapter count, member totals, and partner activity.

GET/api/public/network-stats

Worked examples

Event sign-up and submission links, and the teams' repositories, from a static site first and then from a server with a key.

Show an event's teams and their GitHub repos

The event endpoint returns the teams, who is on them, and each team's repository when it is public.

// No API key. slug comes from events[].slug in the bundle (or use the id).
const res = await fetch("https://dashboard.all-ai-network.org/api/public/event/innovation-lab");
if (!res.ok) throw new Error("Event not found"); // drafts are a 404
const { event, teams, links } = await res.json();

console.log(event.title, links.page);
for (const team of teams) {
  const names = team.members.map((m) => m.name).join(", ");
  const more = team.unnamed_count ? " +" + team.unnamed_count + " more" : "";
  console.log(team.name + ": " + (team.project ?? "no project yet"));
  console.log("  " + names + more);
  if (team.repo_url) console.log("  repo:", team.repo_url); // null = private
}

Running code on a server? Send your chapter key instead:

// On a server only.
const res = await fetch("https://dashboard.all-ai-network.org/api/v1/events/innovation-lab", {
  headers: { Authorization: "Bearer " + process.env.AAIN_API_KEY },
});
if (!res.ok) throw new Error("Event not found"); // draft, or not this chapter's
const { event, teams } = await res.json(); // same shape as the keyless call

What's in the bundle

Each module below is a field on the bundle response. The same catalog drives the integration prompt in the chapter dashboard, so this list is always what the API actually returns.

Hub-site configuration

config

Fetch your chapter's theme colors, logo URL, and section toggles from the dashboard. Drives the site's CSS variables, header logo, and which components render.

No key /api/public/chapter/msoe-ai-club/bundle
API key /api/v1/config
Response shape
{
  "config": {
    "theme": { "primary": "#4f8fea", "accent": "#a855f7" },
    "logo_url": "https://gdxifnnfirnzljtxnhch.supabase.co/storage/v1/object/public/chapter-logos/<chapter>/logo.png",
    "sections": {
      "hero": true,
      "about": true,
      "events": true,
      "leaderboard": true,
      "badges": true,
      "merch": true,
      "officers": true,
      "learning_tree": true,
      "playbooks": true,
      "workshops": true
    },
    "updated_at": "2026-04-19T19:14:02.000Z"
  }
}

Upcoming events

events

Render your chapter's next events on your homepage. Auto-updates as you add events in the dashboard.

No key /api/public/chapter/msoe-ai-club/bundle
API key /api/v1/events
Response shape
{
  "events": [
    {
      "id": "evt_abc123",
      "title": "Intro to Applied AI",
      "description": "Kick-off session for the semester.",
      "type": "workshop",
      "date": "2026-09-12T23:30:00.000Z",
      "points_attend": 10,
      "points_win": 0,
      "checkin_count": 42
    }
  ]
}

Leaderboard

leaderboard

Show the top members by XP. Great for a homepage widget or a dedicated members page.

No key /api/public/chapter/msoe-ai-club/bundle
API key /api/v1/leaderboard
Response shape
{
  "leaderboard": [
    { "name": "Jane Doe",   "points": 1250, "events_attended": 18, "rank": 1 },
    { "name": "John Smith", "points": 1100, "events_attended": 16, "rank": 2 },
    { "name": "Aisha Khan", "points":  980, "events_attended": 14, "rank": 3 }
  ]
}

Chapter stats

chapter

Pull your chapter's name, university, member count, and event count — perfect for a hero banner or footer.

No key /api/public/chapter/msoe-ai-club/bundle
API key /api/v1/chapter
Response shape
{
  "chapter": {
    "name": "MSOE AI Club",
    "university": "Milwaukee School of Engineering",
    "slug": "msoe",
    "member_count": 500,
    "event_count": 142
  }
}

Officers & team

Your eboard, straight from the dashboard's Officers & Roles roster — name, role, photo and links for every member marked visible. Update the roster once; every embed follows.

No key /api/public/chapter/msoe-ai-club/bundle
Response shape
{
  "config": {
    "officers": [
      { "name": "Brett Storoe", "role": "President", "image": "https://…" },
      { "name": "Adam Haile", "role": "Vice President", "image": "https://…" }
    ]
  }
}

Chapter badges

badges

Render the full catalog of recognition badges your chapter awards — with their name, description, icon, and how many members have earned each one.

No key /api/public/chapter/msoe-ai-club/bundle
API key /api/v1/badges
Response shape
{
  "badges": [
    {
      "id": "bdg_nvidia_dli",
      "name": "NVIDIA DLI",
      "description": "Completed an NVIDIA Deep Learning Institute certification.",
      "icon": "https://gdxifnnfirnzljtxnhch.supabase.co/storage/v1/object/public/badge-icons/<chapter>/nvidia-dli.png",
      "award_count": 23
    },
    {
      "id": "bdg_rosie_finalist",
      "name": "ROSIE Competition Finalist",
      "description": "Top 8 finish in the annual MAIC ROSIE hackathon.",
      "icon": "award",
      "award_count": 16
    }
  ]
}

Merch catalog

merch

Display the rewards your chapter offers in exchange for earned points — T-shirts, stickers, workshop vouchers — so members know what they're working toward.

No key /api/public/chapter/msoe-ai-club/bundle
API key /api/v1/merch
Response shape
{
  "merch": [
    {
      "id": "mrch_tshirt",
      "name": "MAIC T-Shirt",
      "description": "Classic black tee with the MAIC logo.",
      "cost_points": 75,
      "image_url": "https://gdxifnnfirnzljtxnhch.supabase.co/storage/v1/object/public/merch-images/<chapter>/tshirt.jpg",
      "stock": 12,
      "is_active": true,
      "created_at": "2026-04-19T14:02:31.000Z"
    },
    {
      "id": "mrch_stickers",
      "name": "Sticker pack",
      "description": "Three vinyl stickers — MAIC logo, ROSIE, NVIDIA-Olympus.",
      "cost_points": 15,
      "image_url": null,
      "stock": null,
      "is_active": true,
      "created_at": "2026-04-19T14:03:11.000Z"
    }
  ]
}

Club social feed

social_feeds

Latest public posts from the club's linked LinkedIn and Instagram accounts, synced on demand from the dashboard. Renders as a card grid; hides itself until the eboard has synced a feed.

No key /api/public/chapter/msoe-ai-club/bundle
Response shape
{
  "social_feeds": {
    "linkedin": {
      "source_url": "https://www.linkedin.com/company/msoe-ai-club",
      "synced_at": "2026-07-16T14:03:22.000Z",
      "posts": [
        {
          "id": "7351234567890",
          "url": "https://www.linkedin.com/posts/...",
          "posted_at": "2026-07-12T18:30:00.000Z",
          "content": "Our Spring Innovation Lab teams just demoed...",
          "image_url": "https://media.licdn.com/dms/image/...",
          "likes": 42,
          "comments": 7
        }
      ]
    },
    "instagram": {
      "source_url": "https://www.instagram.com/msoe.aiclub/",
      "synced_at": "2026-07-16T14:05:10.000Z",
      "posts": [
        {
          "id": "3391234567890",
          "url": "https://www.instagram.com/p/ABC123/",
          "posted_at": "2026-07-10T21:00:00.000Z",
          "content": "Workshop night recap!",
          "image_url": "https://scontent.cdninstagram.com/...",
          "likes": 88,
          "comments": 12
        }
      ]
    }
  }
}

Projects & research

projects

The chapter's project and research history — each with its team, papers, slides, and recordings.

No key /api/public/chapter/msoe-ai-club/bundle
Response shape
{
  "projects": [
    {
      "id": "\u2026",
      "title": "NourishNet",
      "description": "Forecasting food commodity price spikes\u2026",
      "image_url": "https://\u2026/team-logo.png",
      "link_url": null,
      "year": "2023-2024",
      "members": [
        {
          "name": "Sydney Balboni",
          "role": "author"
        },
        {
          "name": "John Cisler",
          "role": "author"
        }
      ],
      "files": [
        {
          "id": "\u2026",
          "kind": "paper",
          "title": "NourishNet \u2014 paper",
          "url": "https://arxiv.org/pdf/2407.00698"
        }
      ]
    }
  ]
}

Learning tree

The network's shared AI curriculum graph merged with this chapter's own nodes.

No key /api/public/learning-tree/msoe-ai-club
Response shape
{
  "chapter": {
    "slug": "\u2026",
    "name": "\u2026"
  },
  "nodes": [
    {
      "id": "foundations/what-is-ai",
      "title": "What Is AI? The Real Story",
      "summary": "\u2026",
      "body": null,
      "parent_ref": null,
      "prereqs": [],
      "tags": [
        "foundations"
      ],
      "thumbnail": "https://\u2026",
      "difficulty": "beginner",
      "pos_x": -1240,
      "pos_y": 0,
      "source": "base"
    }
  ],
  "edges": [
    {
      "from": "\u2026",
      "to": "\u2026"
    }
  ]
}

Wiring this up with a coding agent

Most chapters point an AI coding agent at their existing website repo rather than writing the integration by hand. Two machine- readable entry points exist for that:

  • /llms.txt — a short summary written for agents, including the mistakes that cost people the most time.
  • /openapi.json — OpenAPI 3.1, for tooling that speaks it.

Chapter officers can also copy a ready-made integration prompt from the dashboard's Settings & API page. It carries your slug, surveys your site before changing anything, and rewires the sections you already have instead of bolting on new ones.

Authenticated API

For sites that run code on a server, per-module /api/v1/* endpoints accept a chapter API key as a bearer token:

curl "https://dashboard.all-ai-network.org/api/v1/events?upcoming=true" \
  -H "Authorization: Bearer $AAIN_API_KEY"

Officers get a key from the dashboard's Settings & API page, where they can copy or rotate it later. Keys are scoped to one chapter. Keep them in server-only environment variables — never in a variable your bundler will inline.

List events (API key)

API key

The chapter's own listed and published events, newest first. Every event carries its slug, its public page url and its links (RSVP, team sign-up, project submission, registration on another site).

GET/api/v1/events
Query parameters
limitintegerCap on events returned. Defaults to 10; max 100.
upcomingbooleantrue returns only events that have not started, soonest first.
  • Only events this chapter hosts are listed; the chapter bundle also includes events it co-hosts.
  • Drafts are never returned. A listed (save-the-date) event has no description or points, project_based and teams_enabled are false, and links carries only the page url.
  • slug can be null on an event that has never been linked; url still works.
Example response
{
  "events": [
    {
      "id": "5f0c1a52-…",
      "slug": "innovation-lab",
      "url": "https://dashboard.all-ai-network.org/e/innovation-lab",
      "title": "Innovation Lab",
      "type": "innovation-lab",
      "publish_status": "published",
      "date": "2026-11-07T15:00:00Z",
      "end_date": "2026-11-08T21:00:00Z",
      "timezone": "America/Chicago",
      "location": "Room 101",
      "image_url": "https://…",
      "format": "in_person",
      "description": "Two days to build something that works.",
      "points_attend": 10,
      "points_win": 25,
      "checkin_count": 18,
      "phases": [],
      "project_based": true,
      "teams_enabled": true,
      "links": {
        "page": "https://dashboard.all-ai-network.org/e/innovation-lab",
        "rsvp": { "url": null, "state": "disabled", "opens_at": null, "closes_at": null },
        "signup": { "url": "https://dashboard.all-ai-network.org/j/K7QX2M", "enabled": true, "open": true, "closes_at": "2026-11-05T05:00:00Z" },
        "submission": { "url": "https://dashboard.all-ai-network.org/s/P4TR9W", "open": true, "closes_at": "2026-11-08T21:00:00Z" },
        "external_registration": null
      }
    }
  ]
}

Event detail (API key)

API key

One event with its teams and their GitHub repositories, schedule, materials, showcase projects and links. The same body as the keyless event detail endpoint.

GET/api/v1/events/innovation-lab
Path parameters
idstringThe event's id or slug.
  • The event must be hosted by the key's chapter, or accepted as co-hosted by it, and be listed or published. Anything else, including a draft, is a 404.
  • Private repositories come back as null and members who do not share are only counted; see the event detail endpoint above for the rules.
Example response
{
  "event": {
    "id": "5f0c1a52-…",
    "slug": "innovation-lab",
    "title": "Innovation Lab",
    "description": "Two days to build something that works.",
    "type": "innovation-lab",
    "publish_status": "published",
    "date": "2026-11-07T15:00:00Z",
    "end_date": "2026-11-08T21:00:00Z",
    "timezone": "America/Chicago",
    "format": "in_person",
    "location": "Room 101",
    "virtual_url": null,
    "image_url": "https://…",
    "multi_stage": false,
    "project_based": true,
    "teams_enabled": true
  },
  "chapter": { "slug": "msoe-ai-club", "name": "MSOE AI Club", "university": "Milwaukee School of Engineering" },
  "stages": [],
  "materials": [ { "title": "Brief", "url": "https://…/brief.pdf", "kind": "document" } ],
  "project_work": {
    "signup_open": true,
    "signup_closes_at": "2026-11-05T05:00:00Z",
    "max_team_size": 5,
    "signup_url": "https://dashboard.all-ai-network.org/j/K7QX2M",
    "submission_url": "https://dashboard.all-ai-network.org/s/P4TR9W",
    "github_enabled": true,
    "teams_enabled": true,
    "team_formation": "self_selected",
    "team_joining": "open"
  },
  "teams": [
    {
      "name": "River Watch",
      "project": "Forecasting river levels from bridge sensors.",
      "repo_url": "https://github.com/river-watch/forecast",
      "members": [ { "name": "Ada Lovelace", "profile_url": "https://ada.all-ai-network.org" } ],
      "unnamed_count": 2
    },
    { "name": "Team Two", "project": null, "repo_url": null, "members": [], "unnamed_count": 3 }
  ],
  "projects": [
    {
      "title": "NourishNet",
      "writeup": "…",
      "image_url": null,
      "links": [ { "kind": "paper", "label": "Paper", "title": "The paper", "url": "https://arxiv.org/pdf/2407.00698" } ],
      "members": [ { "name": "Sydney Balboni", "profile_url": null } ],
      "unnamed_count": 0
    }
  ],
  "counts": { "signed_up": 24, "rsvps": 31, "checked_in": 18, "teams": 6 },
  "links": {
    "page": "https://dashboard.all-ai-network.org/e/innovation-lab",
    "rsvp": { "url": null, "state": "disabled", "opens_at": null, "closes_at": null },
    "signup": { "url": "https://dashboard.all-ai-network.org/j/K7QX2M", "enabled": true, "open": true, "closes_at": "2026-11-05T05:00:00Z" },
    "submission": { "url": "https://dashboard.all-ai-network.org/s/P4TR9W", "open": true, "closes_at": "2026-11-08T21:00:00Z" },
    "external_registration": null
  }
}