API

Everything on this site is also JSON: the projects and their writeups, the domains they're grouped by, languages and tags, awards, pull requests, blog posts, and the numbers.

base
https://londopy.github.io/api/v1
version
1.0.0
auth
none
cors
*
files
72
built

Quick start

These are static files on GitHub Pages, rebuilt with the site on every push and every night, so star counts and pull-request states are never more than a day old. There's no key and nothing to sign up for; the only limits are GitHub Pages' own.

every project and its stars — curl + jq
curl -s https://londopy.github.io/api/v1/projects.json | jq -r '.data[] | "\(.stars)★  \(.name)"'
JavaScript, from any origin
const { data } = await fetch("https://londopy.github.io/api/v1/stats.json").then((r) => r.json());
console.log(`${data.projects} projects, ${data.pull_requests.merged} PRs merged upstream`);
Python, standard library only
import json, urllib.request

url = "https://londopy.github.io/api/v1/awards.json"
for a in json.load(urllib.request.urlopen(url))["data"]:
    print(a["place"], "·", a["event"], "·", a["project"])

Endpoints

Every endpoint is a GET. Press try to fetch one live from this page.

Discovery Where everything is.

  • GET /api/v1/index.json

    Every endpoint, with its URL — Machine-readable table of contents; templated paths list every valid value.

  • GET /api/openapi.json

    This API, described in OpenAPI 3.1 — Drop it into Swagger UI, Postman or an SDK generator.

  • GET /api/v1/search.json

    Everything searchable, in one small file — Pages, projects, domains and posts with keywords: what the site's command palette (press /) loads.

Profile Who I am and how to reach me.

  • GET /api/v1/profile.json

    Name, links, contact methods and PGP key

  • GET /api/v1/now.json

    What I'm focused on this month — The /now page as data, with the latest post and pushes.

  • GET /pgp.asc

    My PGP public key, ASCII-armored — Encrypt to it with curl -s https://londopy.github.io/pgp.asc | gpg --import.

Projects The index, one file per project.

  • GET /api/v1/projects.json

    Every project — Live star counts and last-push times, as of the last build.

  • GET /api/v1/projects/{name}.json

    One project, with its full writeup — Adds the writeup (HTML and plain text), an install command for PyPI packages, and related projects.

  • GET /api/v1/featured.json

    The featured projects

  • GET /api/v1/awards.json

    Hackathon placings and other awards

  • Names reserved, code brewing

Taxonomy Domains, languages and tags.

Activity Pull requests, blog posts and the numbers.

Badges For READMEs.

  • GET /api/v1/badges/{metric}.json

    A shields.io endpoint badge — Use with https://img.shields.io/endpoint?url=… — the badge follows the site.

Terminal Plain text, for curl.

Response shape

Each JSON file wraps its payload in an envelope: meta says what you got and when it was built, data is the payload, and list endpoints add meta.count. Badges are the exception, since they're in the shape shields.io expects.

{
  "meta": {
    "api": "londopy",
    "version": "1.0.0",
    "generated": "2026-09-25T06:35:47.999Z",
    "self": "https://londopy.github.io/api/v1/featured.json",
    "docs": "https://londopy.github.io/api/",
    "count": 12
  },
  "data": [ …12 projects… ]
}

Badges

Each number is also a shields.io endpoint, so a README badge can follow the site instead of being edited by hand.

From a terminal

curl -s https://londopy.github.io/api/v1/card.ansi
╭──────────────────────────────────────────────────────────────────────────╮
│                                                                          │
│   London C.  ·  Londopy                                                  │
│   I build tools for climbing, medicine, Windows internals, and myself.   │
│                                                                          │
│   site     https://londopy.github.io/                                    │
│   blog     https://londopy.github.io/blog/                               │
│   github   https://github.com/Londopy                                    │
│   api      https://londopy.github.io/api/                                │
│   contact  https://londopy.github.io/contact/                            │
│   irc      /msg Londopy on irc.libera.chat                               │
│   discord  _londo.                                                       │
│   pgp      F010 53B8 6FE7 D60A 0A1F B790 B11E 02F1 12FA F497             │
│                                                                          │
│   36 projects · 11 domains · 17 PRs merged upstream                      │
│   open to internships — security & systems                               │
│                                                                          │
╰──────────────────────────────────────────────────────────────────────────╯

No colour? card.txt is the same card in plain text.

Versioning

This is v1. Fields may be added to it, but none will be renamed or removed; a breaking change would ship as /api/v2/, with v1 left where it is.