Documentation

Harpd open data

Public, deterministic, machine-readable datasets of the Harpd AI product rankings, published under CC BY 4.0. No API key, no signup, no rate-limit gate on the public files. Every payload carries its own provenance — publisher, licence, methodology URL and canonical URL — so you can attribute without guessing.

940products in the current board
28categories with published products
28category boards operated
2immutable monthly snapshots

1. Dataset overview

Each dataset has one canonical page, one JSON endpoint and — where the shape is tabular — a CSV form. The registry below is the same one the endpoints read, so it cannot advertise a URL that does not resolve.

DatasetCanonical pageJSONCSVUpdatesSnapshots
Harpd AI Product Ranking
harpd-product-ranking
/data/rank/jsoncsvcontinuousyes
Harpd AI Products
harpd-ai-products
/data/products/jsoncsvcontinuousyes
Harpd AI Categories
harpd-ai-categories
/data/categories/json—continuousno
Harpd Historical Ranking Snapshots
harpd-ranking-history
/rank/history/json—per-snapshotyes
Harpd Research Reports
harpd-research
/data/research/json—monthlyyes
Harpd Evidence Register
harpd-evidence-register
/evidence/json—continuousno
Harpd Citation Registry
harpd-citations
/data/citations/jsoncsvcontinuousno
Harpd Rank Methodology
harpd-rank-methodology
/rank/methodology/json—monthlyno
Harpd Open Data Schema
harpd-open-data-schema
/docs/data/json—monthlyno
Harpd Benchmarks
harpd-benchmarks
/data/benchmarks/jsoncsvmonthlyno
Harpd Immutable Rank Snapshots
harpd-rank-snapshots
/data/rank/snapshots.jsonjson—per-snapshotyes
Harpd Dataset Changelog
harpd-dataset-changelog
/data/changelog/json—per-snapshotyes

2. API

The public data surface is plain HTTP GET returning JSON or CSV. It is not an authenticated API: the same files are served to browsers, scripts and crawlers.

  • GET /data/rank.json — the current board.
  • GET /data/rank.csv — the same rows, CSV.
  • GET /data/products.json — product-level records.
  • GET /data/categories.json — category boards and counts.
  • GET /data/rank/latest.json — newest immutable snapshot.
  • GET /data/rank/{YYYY-MM}.json — one frozen month.
  • GET /data/rank/snapshots.json — the snapshot index.
  • GET /data/changelog.json — what changed between snapshots.
  • GET /data/schema.json — the field dictionary.
  • GET /data/citations.json — the citation registry.
  • GET /data/export/{dataset}.{csv|json|jsonl} — bulk export.
  • GET /data/open-data/{file} — the GitHub-ready package.

Response envelope

Registry-backed endpoints return { meta, data }; the legacy dataset endpoints return { ...meta, products }. Both carry the same metadata fields:

{
  "meta": {
    "dataset": "harpd-product-ranking",
    "version": "1.0",
    "generated_at": "…",
    "publisher": "Harpd",
    "canonical_url": "https://harpd.com/data/rank/",
    "license": "CC BY 4.0",
    "license_url": "…",
    "methodology_url": "https://harpd.com/rank/methodology/",
    "source_url": "https://harpd.com/data/rank.json",
    "schema_url": "https://harpd.com/data/schema.json",
    "update_frequency": "continuous",
    "historical_snapshots": true,
    "citation": "Harpd. Harpd AI Product Ranking Dataset. https://harpd.com/data/rank/ (CC BY 4.0)."
  },
  "data": []
}

3. JSON schema

The field dictionary is served at /data/schema.json. The rank record shape is:

FieldTypeMeaning
idstringStable entity id. Never a display name.
namestringDisplay name as shown on the board.
slugstringURL slug. Identity survives a slug change via id.
urlstringCanonical Harpd profile URL.
categorystringCategory board slug.
categoryNamestringHuman label for the category.
ranknumberBoard position. 0 when unplaced.
rankPointsnumberCredits spent on promotional placement. NOT a quality or review score.
verifiedbooleanMaker-claimed and verified listing.
updatedAtstring|nullISO timestamp of the last listing change.

Read this before ranking anything. rankPoints is the number of Credits a maker spent on promotional placement. It is not a review score, not a quality rating and not an editorial assessment. Harpd publishes no first-party traffic, revenue or review figures for third-party products. See the methodology.

4. CSV schema

CSV exports use a stable header and UTF-8 encoding. Columns mirror the JSON fields, with nested values flattened. Where a CSV form exists it is listed in the overview table above.

slug,name,category,categoryName,rank,rankPoints,verified,updatedAt

5. Snapshots

One immutable file per closed calendar month. A snapshot is never rewritten: if a figure is corrected, the correction ships as a new snapshot plus a changelog entry, and the old file keeps saying what it said.

  • /data/rank/latest.json — resolves to the newest closed snapshot.
  • /data/rank/{YYYY-MM}.json — a specific month, stable forever.
  • /data/rank/snapshots.json — the index of what exists.

Available now: 2026-09, 2026-08

6. License

CC BY 4.0 — https://creativecommons.org/licenses/by/4.0/. Attribution is required: credit “Harpd” and link the canonical dataset URL. Redistribution is permitted, including commercially, as long as attribution is preserved.

7. Methodology

The Harpd Rank methodology defines Rank Points, board position and the separation between promotional placement and editorial assessment. A dataset consumer is expected to read it before interpreting rank or rankPoints. A machine-readable copy is at /data/methodology.json.

8. Citation

Every dataset carries a ready-to-paste citation in meta.citation:

Harpd. Harpd AI Product Ranking Dataset. https://harpd.com/data/rank/ (CC BY 4.0).

The full citation registry — one object per citable claim — is at /data/citations.json, with a human guide at /citations/ and per-object citations at /api/citation/{type}/{slug}.

9. Embed

Rankings can be embedded on an external site with a single script tag or iframe. Attribution is built in and is not removable in the default embed.

<script src="https://harpd.com/embed/rank.js" data-limit="10" data-theme="auto" async></script>

Directory: /embed/ · generator: /developers/embed/ · badges: /developers/attribution/.

10. Rate limits

The public dataset files are static or edge-cached and are not rate-limited for reasonable use. Responses carry Cache-Control; honour it rather than polling. There is no key to request and no quota to raise — if you need the data continuously, fetch it on its ownupdate_frequency and cache locally.

The live api.harpd.com API is a separate, separately-limited surface; the/data/ files above are served from harpd.com precisely so that dataset consumers never depend on it.

11. Usage examples

curl

# The whole board as JSON (no key, no signup)
curl -s https://harpd.com/data/rank.json | jq '.count'

# The same rows as CSV
curl -s https://harpd.com/data/rank.csv -o harpd-rank.csv

# The newest immutable monthly snapshot
curl -s https://harpd.com/data/rank/latest.json | jq '.snapshot.id'

# One specific month, forever
curl -s https://harpd.com/data/rank/2026-08.json | jq '.products | length'

# What changed between snapshots
curl -s https://harpd.com/data/changelog.json | jq '.entries[0]'

JavaScript

// Node 20+ / browsers / any JS runtime. No API key.
const res = await fetch('https://harpd.com/data/rank.json')
const { meta, products } = await res.json()

console.log(meta.dataset, meta.version, meta.license)
for (const p of products.slice(0, 10)) {
  console.log(p.rank, p.name, p.rankPoints)
}

Python

# stdlib only — no dependencies, no key
import json, urllib.request

with urllib.request.urlopen("https://harpd.com/data/rank.json") as r:
    payload = json.load(r)

print(payload["meta"]["dataset"], payload["meta"]["license"])
for row in payload["products"][:10]:
    print(row["rank"], row["name"], row["rankPoints"])

AI agent

# An AI agent should read the discovery files first, then the dataset.
curl -s https://harpd.com/llms.txt                      # what Harpd is + canonical URLs
curl -s https://harpd.com/.well-known/harpd-agent.json  # capability + pricing manifest
curl -s https://harpd.com/data/rank/snapshots.json      # which immutable periods exist
curl -s https://harpd.com/data/rank/latest.json         # the newest frozen snapshot

# Every payload carries its own provenance, so an agent can attribute without
# guessing: meta.publisher, meta.license, meta.canonical_url, meta.methodology_url

Where to go next