Pyyan / API

The Pyyan API

Everything on this site, as JSON. Free, public, read only, and there is no key to ask for: the endpoints below work from a terminal, a browser tab or an agent's tool loader right now.

Start here

One request tells you what exists. The root lists every resource with its live row count, so nothing below has to be memorised.

curl https://pyyan.com/api/v1

There is an OpenAPI 3.1 document at /api/v1/openapi.json. Paste that URL into Swagger, Postman, Bruno or an agent framework and it will generate a client for you.

The shape of every response

One record comes back as { data }. A list adds meta and links, so paging never means building URLs by hand.

{
  "data": [ { "slug": "nvidia-buys-hugging-face", "date": "2026-09-03", ... } ],
  "meta":  { "total": 35, "count": 20, "page": 1, "limit": 20, "pages": 2 },
  "links": { "self": "...", "next": "...?page=2&limit=20", "prev": null }
}

total counts everything matching your filter, not what is on this page. count is what came back. An X-Total-Count header carries the same number for anyone who would rather read a header.

Parameters every list understands

page, limit
Paging. limit defaults to 20 and stops at 100.
sort
A field name, or -field for descending. Only whitelisted fields are accepted. An unknown one is a 400 that lists the fields you can use, rather than being quietly ignored: silently returning data in an order nobody asked for is worse than an error, because there is no way to notice it.
fields
Comma separated keys to return, when you want a slug and a date rather than a whole story.
q
Free text search, case insensitive, on the fields listed for each resource.

Errors

Every failure is JSON with a stable machine code and a sentence for a person.

curl "https://pyyan.com/api/v1/news?sort=nonsense"

{
  "error": {
    "status": 400,
    "code": "bad_sort",
    "message": "Cannot sort by \"nonsense\".",
    "sortable": ["date", "addedAt", "headline", "category", "weight"]
  }
}

Codes in use: bad_sort, bad_limit, bad_page, no_search, not_found, unknown_source, internal_error.

Resources

News68 records

Dated AI news written up from primary sources. Most carry a storified long form under `story`, with the five movements and a dated lineage.

GET /api/v1/news

GET /api/v1/news/{slug}

sort date, addedAt, headline, category, weight

q supported

  • category Models, Law, Money, Policy, Safety, Silicon, Benchmarks
  • org an organisation named in the story
  • sourcing primary or corroborated
  • storified true for only the long form pieces
  • from / to ISO dates, inclusive

Videos89 records

Talks, interviews and lectures, each with a line on why it is listed. No shorts and no clips.

GET /api/v1/videos

GET /api/v1/videos/{videoId}

sort published, order, title, channel, topic

q supported

  • topic Research, People, Foundations, Safety, Silicon, Models
  • channel exact channel name
  • person a slug from /people, for what they appear in

Entities235 records

Everything the index tracks: language models, open weights, chips, clouds, agent tools and the rest. Every spec carries its own `source`, `asOf` date and `confidence`.

GET /api/v1/entities

GET /api/v1/entities/{slug}

sort rank, name, maker, verifiedAt, categorySlug

q supported

  • category a slug from /categories
  • maker exact maker name
  • status current, deprecated
  • new true for the most recent intake

Categories20 records

The categories entities are filed under, each with what it ranks on and which spec fields it carries.

GET /api/v1/categories

GET /api/v1/categories/{slug}

sort order, name, slug, group

q supported

  • group the menu group

People172 records

The people who build and argue about AI, by tier.

GET /api/v1/people

GET /api/v1/people/{slug}

sort order, name, tier, country

q supported

  • tier Founders, Research, Safety, Pioneers, Thinkers, Educators, Journalists, Fiction
  • country country name

Makers118 records

Organisations that make the things in the index.

GET /api/v1/makers

sort name, slug

q supported

Changes12 records

The index's own changelog: what moved, when, and why.

GET /api/v1/changes

sort date, entity, maker, tag

q supported

  • tag the kind of change

Trending

Four sources: huggingface, github, reddit, hacker-news. Each ranks on its own metric and the numbers are not comparable between them, so the response carries an X-Ranking-Basis header saying which.

GET /api/v1/trending/{source}

sort rank, and the source's own metric

Boxes

Long form articles. These are files in the repository rather than rows, so this one does not page.

GET /api/v1/boxes

GET /api/v1/boxes/{name}

Worked examples

# the five most recent stories, slugs and headlines only
curl "https://pyyan.com/api/v1/news?limit=5&fields=slug,date,headline"

# every language model, cheapest input first is not sortable, so sort by rank
curl "https://pyyan.com/api/v1/entities?category=language-models&limit=100"

# what Fei-Fei Li appears in
curl "https://pyyan.com/api/v1/videos?person=fei-fei-li"

# safety stories from September
curl "https://pyyan.com/api/v1/news?category=Safety&from=2026-09-01"

# what is trending on Hugging Face right now
curl "https://pyyan.com/api/v1/trending/huggingface?limit=10"

What is not here

Subscribers and short links have no route. There is no generic collection passthrough in this API: every resource is a file that names its own collection, its own sortable fields and its own filters, so a private collection cannot be reached by guessing a URL. Mongo's _id never leaves either, because it would become part of the contract the moment somebody stored one.

It is read only. There is no POST, PUT or DELETE on any of this, and no key to lose.

If you are an AI agent

There is an MCP server at /api/mcp covering the same data, with nine tools, two resources and two prompts. Point a client at it and it will discover the rest itself, which is less work than reading this page.

Terms, briefly

Free to use, including commercially. Attribution to pyyan.com is appreciated and not required. Caching is welcome and responses carry sensible cache headers, so please do cache rather than polling. If you are going to make a lot of requests, say hello first rather than finding out where the limit is.

Every figure in the index carries its own source and the date it was checked. If something is wrong, the source is right there in the response and corrections are welcome.