Drupal.org API
Query Drupal.org for modules, themes, issues and users as JSON. No API key, no signup. Live curl example plus the pagination gotchas that catch people out.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Drupal.org API?
Drupal.org exposes a read-only REST API at `https://www.drupal.org/api-d7/` that returns projects, issues, users, comments and taxonomy terms as JSON. It requires no API key: `GET /api-d7/node.json?type=project_module&limit=1` returns one module node plus paging links.
The Drupal.org API is a Services 3.x endpoint bolted onto a Drupal 7 site, and that heritage shows in every response. Field names are raw database column names such as `taxonomy_vocabulary_44`, related entities appear as `{uri, id, resource}` stubs rather than embedded objects, and the body of a project arrives as pre-rendered HTML. It is not a pretty API, but it is the authoritative source for the entire Drupal ecosystem and it has been stable for over a decade.
The most useful trick is filtering on `type`. `project_module`, `project_theme`, `project_distribution` and `project_core` are separate node types, so a single query parameter switches you between the module directory, the theme directory and core releases. Combine that with `field_project_machine_name` and you can resolve a machine name such as `views` to its full project record in one request.
Quick facts
- Base URL
https://www.drupal.org/api-d7- Authentication
- Read-only access needs no key or account. Write operations are not exposed publicly.
- Rate limit
- Not formally published. Drupal.org asks integrators to be reasonable and to cache; heavy scraping will attract throttling.
- Pricing
- Free.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Drupal.org API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch one module project node
GET https://www.drupal.org/api-d7/node.json?type=project_module&limit=1
curl 'https://www.drupal.org/api-d7/node.json?type=project_module&limit=1'const res = await fetch("https://www.drupal.org/api-d7/node.json?type=project_module&limit=1");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://www.drupal.org/api-d7/node.json?type=project_module&limit=1", timeout=20)
res.raise_for_status()
print(res.json()){
"self": "https://www.drupal.org/api-d7/node?type=project_module&limit=1",
"first": "https://www.drupal.org/api-d7/node?type=project_module&limit=1&page=0",
"last": "https://www.drupal.org/api-d7/node?type=project_module&limit=1&page=56186",
"next": "https://www.drupal.org/api-d7/node?type=project_module&limit=1&page=1",
"list": [
{
"taxonomy_vocabulary_44": {
"uri": "https://www.drupal.org/api-d7/taxonomy_term/13028",
"id": "13028",
"resource": "taxonomy_term"
},
"taxonomy_vocabulary_46": {
"uri": "https://www.drupal.org/api-d7/taxonomy_term/9988",
"id": "9988",
"resource": "taxonomy_term"
},
"taxonomy_vocabulary_3": [
{
"uri": "https://www.drupal.org/api-d7/taxonomy_term/104",
"id": "104",
"resource": "taxonomy_term"
},
{
"uri": "https://www.drupal.org/api-d7/taxonomy_term/67",
"id": "67",
"resource": "taxonomy_term"
}
],
"body": {
"value": "<p>This project is an implementation of the <strong><a href=\"https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html\" rel=\"nofollow\">Amazon Product Advertising API</a></strong>. </p>\n<p>It's modular in design, with a central \"<strong>Pure API</strong>\" component that interacts with Amazon, and optional modules to handle expanded data for additional product types, features like wish-lists and customer reviews, etc.</p>\n<h2>Major Update - 2/9/17</h2>\n<p>The Amazon Product Advertisement API module requires seriParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
type | string | Optional | Node type filter. `project_module`, `project_theme`, `project_distribution`, `project_core` or `project_issue`. project_module |
limit | integer | Optional | Results per page. Keep it small; the default page is large and every node carries a full HTML body. 1 |
page | integer | Optional | Zero-indexed page number. The `last` link tells you how many pages exist. 0 |
field_project_machine_name | string | Optional | Exact machine name of a project, for resolving a name to a node. views |
sort / direction | string | Optional | Column to sort on and `ASC`/`DESC`. `created` and `changed` are the useful ones. created |
Response fields
self / first / last / nextstring- Pagination links. `last` embeds the final page number, which is the only cheap way to learn the total result count.
listarray- The node objects themselves. An empty `list` with valid paging links means you have paged past the end.
list[].bodyobject- Object with `value`, `summary` and `format`. `value` is rendered HTML, not Markdown, so sanitise it before displaying.
list[].taxonomy_vocabulary_*object or array- Category and tag references as `{uri, id, resource}` stubs. You must follow `uri` to get the human-readable term name.
list[].nidstring- Node id, returned as a string rather than a number. Compare with `==` carefully or cast it first.
What you can build with the Drupal.org API
- Build a module search or comparison site backed by live Drupal.org data
- Check whether the modules a site depends on have new releases or are unsupported
- Report on issue queue activity for a maintainer dashboard
- Audit a client site's contributed modules against the security advisories linked from project nodes
- Seed a local development catalogue of Drupal projects for offline browsing
Common errors and how to fix them
404
Unknown resource path. Only `node`, `comment`, `user`, `file` and `taxonomy_term` exist under `/api-d7/`.
Fix: Check the resource name is singular and ends in `.json`, e.g. `/api-d7/node.json`.
Empty list with valid links
The filter combination matched nothing, or you requested a page beyond `last`.
Fix: Re-read the `last` link, which contains the highest valid page number for your query.
503
Drupal.org is under load or is throttling your address.
Fix: Back off, cache aggressively, and send a descriptive User-Agent so the infrastructure team can identify your traffic.
Drupal.org API — frequently asked questions
Does the Drupal.org API need an API key?
No. All read endpoints under `/api-d7/` are public and unauthenticated. There is no public write access, so you cannot create issues or comments through it.
How do I find a module by its machine name?
Query `node.json` with `type=project_module` and `field_project_machine_name=your_module`. That returns the single project node, from which you can follow release and issue links.
Why are the field names so cryptic?
The endpoint exposes Drupal 7 field storage directly, so vocabulary fields keep their numeric ids. The mapping is documented on drupal.org and is stable, but it will never be self-explanatory.
Can I get release version data?
Yes, indirectly. Releases are their own nodes of type `project_release`, linked from the project node, and carry version strings and download URLs.
Tools that pair with this API
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
JSON Viewer
View JSON as a collapsible interactive tree online. Expand and collapse nodes, search keys and values, and copy the JSONPath of any node privately.
HTML to Markdown Converter
Convert HTML to clean Markdown — headings, emphasis, links, images, nested lists, code blocks, tables and blockquotes — privately in your browser.
Strip HTML Tags
Remove all HTML tags and convert markup to clean plain text. Decode HTML entities and keep line breaks for block elements like paragraphs and headings.
Drupal.org API is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.