BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://www.drupal.org/api-d7/node.json?type=project_module&limit=1'
JavaScript (fetch)
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);
Python (requests)
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())
Response — HTTP 200 (truncated)
{
  "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 seri

Parameters

ParameterTypeRequiredDescription
typestringOptionalNode type filter. `project_module`, `project_theme`, `project_distribution`, `project_core` or `project_issue`. project_module
limitintegerOptionalResults per page. Keep it small; the default page is large and every node carries a full HTML body. 1
pageintegerOptionalZero-indexed page number. The `last` link tells you how many pages exist. 0
field_project_machine_namestringOptionalExact machine name of a project, for resolving a name to a node. views
sort / directionstringOptionalColumn 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

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.