---
title: "UniverLab announcements API — endpoints and examples"
source: "https://univerlab.org/api/"
---

API

# Announcements API

The public API behind the Mission Log and the roadmap on this site. Every route listed here is an unauthenticated, read-only GET: there is no account, no key and nothing to arrange before calling it. Read what you like, as often as you like.

**Base URL** `https://announcements.univerlab.org` — Anonymous, read-only GET. Every response carries the CORS origin this site runs on.

## Endpoints

### GET `/`

List Mission Log entries

The most recent announcements, newest first, read from the mirror the API keeps at the edge. \`offset\` and \`limit\` page through the newest 100 entries that mirror holds.

Parameters

*   `offset` — query · integer · optional. How many entries to skip before reading.
*   `limit` — query · integer · optional. How many entries to return.

Example

    curl -s 'https://announcements.univerlab.org/?limit=20'

Response: `application/json`

### GET `/feed.atom`

Atom feed of the Mission Log

The same entries as an Atom feed, for a feed reader. The response carries an \`ETag\`; a conditional request that returns it saves the whole body.

Parameters

*   `If-None-Match` — header · string · optional. The \`ETag\` from an earlier fetch of this feed. When it still matches, the answer is \`304 Not Modified\` with no body.

Example

    curl -s https://announcements.univerlab.org/feed.atom

Response: `application/atom+xml`

### GET `/events`

Server-sent events stream

A long-lived \`text/event-stream\`. It opens with a \`:ok\` comment, sends a \`:ping\` comment every 30 seconds, and pushes an \`entry\`, \`update\` or \`roadmap\` event whose data is the changed object as JSON. It exists for one live view at a time: hold the connection instead of reconnecting, and close it when the view closes. It answers \`503\` once 200 listeners are already attached.

Parameters

This route takes no parameters.

Example

    curl -s -N https://announcements.univerlab.org/events

Response: `text/event-stream`

### GET `/roadmap`

List roadmap items

The public roadmap. \`state=active\` (the default) returns the items the laboratory is working on or has shipped; a single lane (\`idea\`, \`now\`, \`next\`, \`later\`, \`done\`) narrows to it. Items carry public fields only — the private ones are never in this answer. The two query shapes that would expose them (\`state=all\` and \`private=1\`) are reader-authenticated and answer \`401\` without a token, so they are not described here.

Parameters

*   `state` — query · string · one of: active, idea, now, next, later, done · optional. Which items to return.
*   `offset` — query · integer · optional. How many items to skip before reading.
*   `limit` — query · integer · optional. How many items to return.

Example

    curl -s 'https://announcements.univerlab.org/roadmap?state=active&limit=20'

Response: `application/json`

### GET `/roadmap/{id}`

One roadmap item and its announcements

A single public roadmap item, plus the announcements that report on it — newest first, id breaking ties. \`{id}\` is the \`id\` of an item returned by \`GET /roadmap\`. An archived item is a \`404\` on this public route.

Parameters

*   `id` — path · string · required. The item's \`id\`, exactly as \`GET /roadmap\` returned it.

Example

    curl -s --globoff 'https://announcements.univerlab.org/roadmap/{id}'

Response: `application/json`

## MCP server

The same four read-only tools this site exposes to a browser agent are also served from a real remote MCP server — stateless Streamable HTTP. Point any MCP client at the endpoint:

**Endpoint** `https://univerlab.org/mcp`

Add it with the Claude Code CLI

    claude mcp add --transport http univerlab https://univerlab.org/mcp

Or in any MCP client’s JSON config

    {
      "mcpServers": {
        "univerlab": { "type": "http", "url": "https://univerlab.org/mcp" }
      }
    }

Server Card: [/.well-known/mcp/server-card.json](/.well-known/mcp/server-card.json) — The MCP Server Card (SEP-2127) that advertises this server to agents.

*   **OpenAPI document** — This page is generated at build time from the OpenAPI 3.1 description of the same API, so the page and the description cannot drift. Fetch it for the machine-readable version of everything above. [/openapi/announcements.json](/openapi/announcements.json)
*   **API catalog** — The RFC 9727 catalog that advertises this API to agents. [/.well-known/api-catalog](/.well-known/api-catalog)
*   **auth.md** — The file that states plainly that there is nothing to register for here, and what is asked of a client that reads this API. [/auth.md](/auth.md)