API

Directory JSON
Endpoints

public and no auth required. free to use.

GET /catalog/user
GET the app catalog. actor and refresh params are optional. without params returns all apps. if actor param is included the respone returns the apps in two lists: apps that match the user's collections from describeRepo and 'discover' which are the rest of apps the user is seemingly not on. the refresh param will force the cache to reload and call describeRepo.

Parameters

NameTypeRequiredDescription
actor string no Handle or DID. Returns personalized view when provided.
refresh boolean no Force rebuild of cached catalog.

Example

curl "https://api.courier.social/catalog/user?actor=<YOUR_HANDLE_HERE>"

Response

{
  "yourApps": [
    {
      "category": "Social",
      "apps": [
        {
          "collectionPrefix": "app.bsky",
          "appName": "Blacksky",
          "appUrl": "https://blacksky.community",
          "category": "Social",
          "description": "...",
          "faviconUrl": "..."
        }
      ]
    }
  ],
  "discoverApps": [...]
}
GET /catalog/alternatives
GET alternative apps for a shared lexicon (e.g., all atproto social clients).

Parameters

NameTypeRequiredDescription
prefix string yes Collection prefix. e.g., app.bsky

Example

curl "https://api.courier.social/catalog/alternatives?prefix=app.bsky"

Response

[
  { "collectionPrefix": "app.bsky", "appName": "Bluesky", "appUrl": "https://bsky.app", ... },
  { "collectionPrefix": "app.graysky", "appName": "Bluesky", "alternativeFor": "app.bsky", ... },
  ...
]
GET /app_catalog.json
Raw static JSON of the full app catalog. No server required — served from CDN.

Example

curl "https://courier.social/app_catalog.json"

Response

[
  {
    "collectionPrefix": "app.bsky",
    "appName": "Bluesky",
    "appUrl": "https://bsky.app",
    "category": "Social",
    "description": "...",
    "faviconUrl": "...",
    "alternativeFor": ""
  },
  ...
] // 385 apps