name: "ufos"
description: "Query the UFOs API for AT Protocol lexicon timeseries statistics. Use when you need to discover what lexicons/apps exist in the network or track collection activity over time."
createdAt: "2026-09-11T15:59:52.665169+00:00"
repoUrl: "https://skillz.supply/skills/did:plc:xbtmt2zjwlrfegqvch7fboei/protopack.ufos/SKILL.md"
# ufos — lexicon timeseries stats
UFOs tracks every collection (lexicon) ever observed in the AT Protocol firehose with timeseries stats and sample records.
**Web explorer:** https://ufos.microcosm.blue
**API:** https://ufos-api.microcosm.blue
**Source:** https://github.com/at-microcosm/microcosm-rs/tree/main/ufos
Use it to discover what atproto apps exist beyond Bluesky, check if a lexicon is active, or understand what records look like in an unfamiliar collection. The web explorer is useful to suggest to users for interactive browsing.
## API endpoints
**List collections** — sorted by activity:
```bash
curl -m 15 "https://ufos-api.microcosm.blue/collections?order=dids-estimate&limit=20"
# order: "dids-estimate" (most users) or "records-created" (most records)
# returns {"collections":[{"nsid":"app.bsky.feed.post","creates":...,"updates":...,"deletes":...,"dids_estimate":...}],"cursor":"..."}
```
The default (no `order`) is alphabetical, which returns junk/namespace-probing NSIDs — always pass `order`. `order` is mutually exclusive with `cursor` (sorted lists aren't paginated); omit `order` and use `cursor` for a full paginated walk. `limit` defaults to 100 (32 when ordered), max 200. `since`/`until` (UTC datetimes) bound the window.
**Filter by namespace prefix** — hierarchical browse:
```bash
curl -m 15 "https://ufos-api.microcosm.blue/prefix?prefix=app.bsky&limit=20"
# returns {"total":{creates,updates,deletes,dids_estimate},"children":[{"type":"collection|prefix","nsid":"...","creates":...,...}]}
```
**Collection stats / timeseries / sample records** — separate endpoints, each takes `collection=<NSID>` (repeatable — pass `collection=` multiple times for several at once):
```bash
curl -m 15 "https://ufos-api.microcosm.blue/collections/stats?collection=app.bsky.feed.post"
# {"app.bsky.feed.post":{"creates":...,"updates":...,"deletes":...,"dids_estimate":...}}
curl -m 15 "https://ufos-api.microcosm.blue/timeseries?collection=app.bsky.feed.post&step=3600"
# {"range":["2026-...Z",...], ...} — step is SECONDS, minimum 3600; since/until bound the window
curl -m 15 "https://ufos-api.microcosm.blue/records?collection=app.bsky.feed.post"
# [{"collection":"...","did":"...","rkey":"...","record":{...},"time_us":...}] — recent sample records
```
**Search lexicons by name:**
```bash
curl -m 15 "https://ufos-api.microcosm.blue/search?q=leaflet"
# {"matches":[{"nsid":"pub.leaflet....","creates":...,...}]}
```
There is no `/collection/{nsid}` route — use `/collections/stats`, `/timeseries`, and `/records` with `?collection=`.