dartpub.dev DartNative · beta
Guides/Registry API

Registry API

Everything the plugin pages show, as data your tool can read: the catalog, one plugin's record, its README, example and changelog. The endpoints are public.

Fair use

  • 120 requests a minute per address. Over that you get 429 with a retry-after header.
  • Cache what you fetch. Answers carry cache-control (five minutes) and an ETag; send If-None-Match and an unchanged answer costs a 304.
  • Name your tool in the User-Agent header, so we can reach you if something goes wrong on either side.
  • Read the API, not the pages. Scraping the HTML is slower for you and heavier for us, and it breaks when the pages change.
  • Need more than this? Write to [email protected] and say what you are building.

The catalog

GET https://dartpub.dev/api/plugins

Every published plugin, fifty a page, by name. Parameters, all optional:

  • q: search, ranked like the site's search box. When present, sort is ignored.
  • owner: one GitHub login, for example DartNative.
  • sort: name (default), installs, active_apps, upvotes, created.
  • status: published (default), archived, all. Archived plugins are delisted but their versions still install.
  • limit: 1 to 100. page: from 1.

The answer is { count, page, limit, plugins: [ … ] }, each plugin in the shape below without the versions list.

One plugin

GET https://dartpub.dev/api/plugins/<name>

Answers 404 for a name that is not published. Example, shortened:

{
  "name": "dartnative_camera",
  "owner": { "login": "DartNative", "type": "organization", "url": "https://github.com/DartNative" },
  "publisher": { "handle": "…", "name": "…", "url": "https://dartpub.dev/@…", "verified": true },
  "tagline": "…",
  "description": "…",
  "license": { "label": "dartpub Free" },
  "source": "sdk",
  "repo": { "name": "DartNative/dartnative/plugins/dartnative_camera", "url": "…", "docs_url": "…", "example_url": "…" },
  "runtime_min": "DartNative ≥ 3.0",
  "avatar": { "url": null, "initials": "dc", "colors": ["oklch(…)", "oklch(…)"] },
  "status": "published",
  "created_at": "2026-…", "updated_at": "2026-…",
  "stats": { "weekly_installs": 0, "active_apps": 0, "upvotes": 0, "rating": { "stars": 4.1, "count": 3 } },
  "latest": { "version": "1.2.0", "published_at": "2026-…" },
  "versions": [ { "version": "1.2.0", "published_at": "…", "yanked": false, "license": "dartpub Free", "has_changelog": true } ],
  "links": { "page": "…", "api": "…", "readme": "…", "example": "…", "changelog": "…", "pub": null }
}
  • source is where the code comes from: pub means the source archive is served by the pub endpoint linked as links.pub; sdk means the plugin ships inside the DartNative SDK and links.pub is null.
  • latest is the newest version that is not yanked.
  • stats.rating.stars is the weighted score the site shows; rating is null until someone rates.
  • updated_at is the newest version's date.

README, example, changelog

GET https://dartpub.dev/api/plugins/<name>/readme
GET https://dartpub.dev/api/plugins/<name>/example
GET https://dartpub.dev/api/plugins/<name>/changelog

Markdown, as the author pushed it (text/markdown). Add ?format=html for the sanitized HTML fragment the plugin page shows, with relative links and images already pointing at the plugin's folder on GitHub. A plugin without an example answers 404; the changelog is every version's notes, newest first, one ## heading per version.

What stays the same

A field named on this page is never removed or renamed without a line in the changelog below. New fields may appear at any time; read what you need and ignore the rest. The pub protocol endpoint (/api/packages/<name>) is a separate contract for the dn tool and is not part of this API.

Changelog

  • 2026-09-24. First release, with the catalog, one plugin, README, example and changelog.