Drupal
App · Website Builders · 14 actions
Work with Drupal from a workflow, in two halves. The first needs nothing at all: search drupal.org for any of its tens of thousands of modules, themes and distributions, read a project's releases, look through issue queues, and find contributors. The action worth having on a schedule is the security check, which takes the version you run and tells you whether drupal.org has marked it insecure, whether the project has been abandoned, and what to move to. The second half talks to a Drupal site of your own over JSON:API, which ships in core: list, read, create, change and delete content, taxonomy terms, users and anything else in its content model, with a raw request action for the rest. Add the site URL and an account to switch that half on; everything about drupal.org keeps working without one.
Actions
| Action | What it does |
|---|---|
| Browse projects | Browse the modules, themes and distributions published on drupal.org, newest first by default. |
| Check for security updates | Ask whether a project needs updating, and whether it is urgent. |
| Create a record | This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. |
| Delete a record | This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. |
| Find a project | Look up a module, theme or distribution on drupal.org by its machine name and get what it is, who maintains it, whether it takes issues and whether it has releases. |
| Get a contributor | Look up a drupal.org contributor by username and get their profile: when they joined, where they are, what they say they work on and which organisations they are attached to. |
| Get a record | This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. |
| Get an issue | Read one issue from drupal.org by its node id, the number in its URL. |
| List a project's releases | List the releases published for a module, theme or Drupal core, newest first, each with its download link and how drupal.org labels it. |
| List records | This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. |
| List what the site exposes | This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. |
| Run a JSON:API request | This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. |
| Search issues | List issues from a project's queue, or across all of drupal.org, most recently changed first. |
| Update a record | This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. |
Browse projects
Browse the modules, themes and distributions published on drupal.org, newest first by default. Use it to watch what is being released, to build a digest of new contributions, or to page through a category. Note that drupal.org has tens of thousands of projects, so this pages rather than returning everything.
Inputs
- Kind of project
project_typetext - Which kind to list. Defaults to modules.One of:
project_module(Modules),project_theme(Themes),project_distribution(Distributions),project_core(Drupal core). Default:project_module. - Newest first
newest_firsttrue/false - Sort by when the project was first published, newest first. On by default. Turn it off for drupal.org's own default order.Default:
true. - How many to return
sizenumber - How many rows to return, from 1 to 100. Defaults to 25.From 1 to 100. Default:
25. - Page
pagenumber - Which page of results to return, counting from 0. Use it with 'How many to return' to walk through a long list.From 0 to 100000. Default:
0.
Outputs
countnumber- How many rows came back
pages_availablenumber- How many pages exist at this page size
project_typetext- The kind that was listed
projectslist
Example output
{
"count": 2,
"pages_available": 28198,
"project_type": "project_module",
"projects": [
{
"changed": "1789669929",
"created": "1789669929",
"has_issue_queue": true,
"has_releases": true,
"homepage": null,
"machine_name": "paragraph_display_toggle",
"maintainer": "studgate",
"node_id": "3624102",
"summary": "<p>Paragraph Display Toggle lets an editor hide a single paragraph from public pages without deleting it. The paragraph keeps its content, stays editable, and can be switched back on at any time.</p>...",
"title": "Paragraph Display Toggle",
"type": "project_module",
"url": "https://www.drupal.org/project/paragraph_display_toggle"
},
{
"changed": "1789670273",
"created": "1789669580",
"has_issue_queue": true,
"has_releases": true,
"homepage": null,
"machine_name": "ai_provider_typesafeai",
"maintainer": "markusa",
"node_id": "3624098",
"summary": "<p>TypeSafe AI Provider connects the <a href=\"https://www.drupal.org/project/ai\" rel=\"nofollow\">AI module</a> to <a href=\"https://typesafe.ai\" rel=\"nofollow\">TypeSafe AI</a> System One models, startin...",
"title": "AI Provider TypeSafe AI",
"type": "project_module",
"url": "https://www.drupal.org/project/ai_provider_typesafeai"
}
]
}Check for security updates
Ask whether a project needs updating, and whether it is urgent. Give it the version you run and it says plainly whether that release is one drupal.org has marked insecure, whether the project has been abandoned, and what to move to. Being on a release marked insecure is the thing to act on, and no version number can tell you that by itself. Run it over your module list on a schedule to get a standing security check.
Inputs
- Project
projecttextRequired - The module, theme or distribution, by its machine name: the short name in its drupal.org URL, so drupal.org/project/pathauto is 'pathauto'. The full URL is accepted too.
- Version you are running
installed_versiontext - The version string exactly as Drupal reports it, for example '8.x-1.14' or '11.4.5'. Leave blank to just be told the current release.
- Drupal version
core_versiontext - Which Drupal version's releases to read, for example '11.x' or '7.x'. Leave blank for 'current', which is what the project publishes today.Default:
current.
Outputs
installed_is_insecuretrue/false- True when the installed release is one a security release fixed
installed_is_knowntrue/false- False when drupal.org has no such release
installed_versiontext- The version that was checked, if one was given
is_unsupportedtrue/false- True when drupal.org no longer covers it with security advisories
latest_releaseobjectlatest_security_releaseobjectlatest_versiontext- Newest stable release
needs_attentiontrue/false- True when anything above warrants acting on. The single flag to branch on
projecttext- Machine name that was checked
project_statustext- 'published', 'unsupported' or 'obsolete'
releases_checkednumber- How many releases were examined
summarytext- One line saying what the answer means
titletext- Human readable project name
update_availabletrue/false- True when a newer stable release exists
urltext- The project page on drupal.org
Example output
{
"installed_is_insecure": true,
"installed_is_known": true,
"installed_version": "11.4.5",
"is_unsupported": false,
"latest_release": {
"date": "1789571969",
"download_url": "https://ftp.drupal.org/files/projects/drupal-11.4.7.tar.gz",
"is_insecure": false,
"is_security_release": true,
"name": "drupal 11.4.7",
"release_types": [
"Security update"
],
"security_note": "Covered by Drupal's security advisory policy",
"status": "published",
"url": "https://www.drupal.org/project/drupal/releases/11.4.7",
"version": "11.4.7"
},
"latest_security_release": {
"date": "1789571969",
"download_url": "https://ftp.drupal.org/files/projects/drupal-11.4.7.tar.gz",
"is_insecure": false,
"is_security_release": true,
"name": "drupal 11.4.7",
"release_types": [
"Security update"
],
"security_note": "Covered by Drupal's security advisory policy",
"status": "published",
"url": "https://www.drupal.org/project/drupal/releases/11.4.7",
"version": "11.4.7"
},
"latest_version": "11.4.7",
"needs_attention": true,
"project": "drupal",
"project_status": "published",
"releases_checked": 559,
"summary": "drupal 11.4.5 is marked insecure on drupal.org. Update to 11.4.7.",
"title": "Drupal core",
"update_available": true,
"url": "https://www.drupal.org/project/drupal"
}Create a record
This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. Create a record on the site: publish an article, add a taxonomy term, file anything the content model allows. The fields go in as a JSON object named the way the site names them, which 'Get a record' will show you for something that already exists. Creating needs an account with permission to do it.
Inputs
- Resource type
resource_typetextRequired - What to read or write, written entity--bundle. 'node--article' is the Article content type, 'taxonomy_term--tags' the Tags vocabulary. Which types a site has depends on its content model, so run 'List what the site exposes' against a site you do not already know.
- Fields
attributesobjectRequired - The fields to set, as a JSON object. Text fields with a format take an object of their own, so a body reads {"body": {"value": "Hello", "format": "basic_html"}}.
- Links to other records
relationshipsobject - Relationships to set, as a JSON object in JSON:API's own shape. Each entry names the type and the UUID of what it points at.
Outputs
attributesobject- Every field on the record, exactly as the site names them
changedtext- When it last changed
createdtext- When it was created
drupal_internal_idnumber- The node, term or user id shown in the admin screens
idtext- The record's UUID
relationshipsobject- Links to other records, each as a type and an id
resource_typetext- Its entity--bundle type
statustrue/false- Whether it is published
titletext- Title or name, where the type has one
urltext- Its own JSON:API address
Example output
{
"attributes": {
"body": {
"value": "text"
},
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal__nid": 42,
"status": true,
"title": "Created"
},
"changed": null,
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal_id": 42,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"relationships": {
"uid": {
"id": "u-1",
"type": "user--user"
}
},
"resource_type": "node--article",
"status": true,
"title": "Created",
"url": "http://127.0.0.1:8731/jsonapi/node/article/1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e"
}Delete a record
This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. Delete a record from the site permanently. Drupal does not put JSON:API deletions in a trash can, so this cannot be undone from here: unpublish it with 'Update a record' instead if you might want it back.
Inputs
- Resource type
resource_typetextRequired - What to read or write, written entity--bundle. 'node--article' is the Article content type, 'taxonomy_term--tags' the Tags vocabulary. Which types a site has depends on its content model, so run 'List what the site exposes' against a site you do not already know.
- Record id
record_idtextRequired - The record's UUID, which is what JSON:API identifies things by rather than the node id shown in the admin screens. Every list action returns one per row.
Outputs
deletedtrue/false- True when the site confirmed the deletion
idtext- UUID of the record that was deleted
resource_typetext- The type that was deleted from
site_urltext- The site it was deleted from
Example output
{
"deleted": true,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"resource_type": "node--article",
"site_url": "http://127.0.0.1:8731"
}Find a project
Look up a module, theme or distribution on drupal.org by its machine name and get what it is, who maintains it, whether it takes issues and whether it has releases. Paste the project URL and the name is taken out of it. This is the first step for anything else that names a project.
Inputs
- Project
projecttextRequired - The module, theme or distribution, by its machine name: the short name in its drupal.org URL, so drupal.org/project/pathauto is 'pathauto'. The full URL is accepted too.
Outputs
changedtext- When it last changed
createdtext- When the project was first published
has_issue_queuetrue/false- Whether it takes issues
has_releasestrue/false- Whether it has published releases
homepagetext- The project's own site, if it has one
machine_nametext- Short name used in the URL
maintainertext- Username of the project owner
node_idtext- drupal.org node id for the project
summarytext- Opening of the project description
titletext- Human readable project name
typetext- project_module, project_theme, project_distribution or project_core
urltext- The project page on drupal.org
Example output
{
"changed": "1770576519",
"created": "1108425985",
"has_issue_queue": true,
"has_releases": true,
"homepage": "http://groups.drupal.org/paths",
"machine_name": "pathauto",
"maintainer": "dave reid",
"node_id": "17345",
"summary": "<p>The Pathauto module automatically generates URL/path aliases for various kinds of content (nodes, taxonomy terms, users) without requiring the user to manually specify the path alias. This allows y...",
"title": "Pathauto",
"type": "project_module",
"url": "https://www.drupal.org/project/pathauto"
}Get a contributor
Look up a drupal.org contributor by username and get their profile: when they joined, where they are, what they say they work on and which organisations they are attached to. Use it to put a name to a maintainer or a patch author.
Inputs
- Username
usernametextRequired - The drupal.org username, which is the name in the profile URL: drupal.org/u/webchick is 'webchick'. Case sensitive.
Outputs
areas_of_expertiselist- What they say they work on
biographytext- Opening of their profile text
countrytext- Two-letter country code, where they gave one
createdtext- When they joined, as a Unix timestamp
first_nametext- First name, where they gave one
last_nametext- Last name, where they gave one
organizationslist- Organisations on their profile
urltext- Their profile page
user_idtext- Their numeric user id
usernametext- Their drupal.org username
Example output
{
"areas_of_expertise": [
{
"id": "151101",
"resource": "taxonomy_term",
"uri": "https://www.drupal.org/api-d7/taxonomy_term/151101"
},
{
"id": "151449",
"resource": "taxonomy_term",
"uri": "https://www.drupal.org/api-d7/taxonomy_term/151449"
}
],
"biography": null,
"country": "CA",
"created": "1117921746",
"first_name": "Angie",
"last_name": "Byron",
"organizations": [
{
"id": "638519",
"resource": "field_collection_item",
"uri": "https://www.drupal.org/api-d7/field_collection_item/638519"
},
{
"id": "1498159",
"resource": "field_collection_item",
"uri": "https://www.drupal.org/api-d7/field_collection_item/1498159"
}
],
"url": "https://www.drupal.org/u/webchick",
"user_id": "24967",
"username": "webchick"
}Get a record
This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. Read one record from the site by its UUID, with every field it carries. JSON:API identifies records by UUID rather than by the node id the admin screens show, and every list action returns one per row.
Inputs
- Resource type
resource_typetextRequired - What to read or write, written entity--bundle. 'node--article' is the Article content type, 'taxonomy_term--tags' the Tags vocabulary. Which types a site has depends on its content model, so run 'List what the site exposes' against a site you do not already know.
- Record id
record_idtextRequired - The record's UUID, which is what JSON:API identifies things by rather than the node id shown in the admin screens. Every list action returns one per row.
- Also fetch related records
includetext - Comma-separated relationships to pull in alongside the record, for example 'uid,field_tags'. Saves a second call when you need the author's name or a term's label rather than just its id.
Outputs
attributesobject- Every field on the record, exactly as the site names them
changedtext- When it last changed
createdtext- When it was created
drupal_internal_idnumber- The node, term or user id shown in the admin screens
idtext- The record's UUID
relationshipsobject- Links to other records, each as a type and an id
resource_typetext- Its entity--bundle type
statustrue/false- Whether it is published
titletext- Title or name, where the type has one
urltext- Its own JSON:API address
Example output
{
"attributes": {
"body": {
"value": "text"
},
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal__nid": 42,
"status": true,
"title": "Hello"
},
"changed": null,
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal_id": 42,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"relationships": {
"uid": {
"id": "u-1",
"type": "user--user"
}
},
"resource_type": "node--article",
"status": true,
"title": "Hello",
"url": "http://127.0.0.1:8731/jsonapi/node/article/1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e"
}Get an issue
Read one issue from drupal.org by its node id, the number in its URL. Returns the title, status, priority, category, who filed it, who it is assigned to and the opening of the description, so a workflow can post it to chat or open a matching ticket somewhere else.
Inputs
- Issue id
issue_idnumberRequired - The number in the issue's URL, so drupal.org/node/3588582 is 3588582. The search action returns one per row.At least 1.
Outputs
assigned_totext- Username it is assigned to, if anyone
bodytext- Opening of the issue description
categorytext- Bug report, Task, Feature request, Support request or Plan
changedtext- When it last changed
comment_countnumber- How many comments it has
componenttext- Which part of the project it concerns
createdtext- When it was filed
node_idtext- drupal.org node id for the issue
prioritytext- Critical, Major, Normal or Minor
project_node_idtext- Node id of the project it belongs to
reportertext- Username who filed it
statustext- Readable status, e.g. 'Needs review'
status_idtext- The numeric status the API filters on
titletext- Issue title
urltext- The issue on drupal.org
versiontext- Version the issue was filed against
Example output
{
"assigned_to": null,
"body": "<h3 id=\"summary-problem-motivation\">Problem/Motivation</h3>\n<p>The upgrade from 8.x-1.14 to 8.x-1.15 appears to have changed the selection_criteria in the Content Type pattern YAML from an array to a...",
"category": "Bug report",
"changed": "1788423870",
"comment_count": "12",
"component": "Code",
"created": "1778044413",
"node_id": "3588582",
"priority": "Normal",
"project_node_id": "17345",
"reporter": "kenwest",
"status": "Needs review",
"status_id": "8",
"title": "Selection criteria duplicated when editing pattern for a content type",
"url": "https://www.drupal.org/project/pathauto/issues/3588582",
"version": "8.x-1.15"
}List a project's releases
List the releases published for a module, theme or Drupal core, newest first, each with its download link and how drupal.org labels it. Use it to build a changelog, to find the download URL for a particular version, or to see how actively a project is maintained.
Inputs
- Project
projecttextRequired - The module, theme or distribution, by its machine name: the short name in its drupal.org URL, so drupal.org/project/pathauto is 'pathauto'. The full URL is accepted too.
- Drupal version
core_versiontext - Which Drupal version's releases to read, for example '11.x' or '7.x'. Leave blank for 'current', which is what the project publishes today.Default:
current. - How many to return
sizenumber - How many releases to return, from 1 to 500. Defaults to 25. Drupal core has hundreds.From 1 to 500. Default:
25.
Outputs
countnumber- How many were returned
projecttext- Machine name that was read
project_statustext- 'published', 'unsupported' or 'obsolete'
releaseslisttitletext- Human readable project name
totalnumber- How many releases the feed carried
urltext- The project page on drupal.org
Example output
{
"count": 2,
"project": "pathauto",
"project_status": "published",
"releases": [
{
"date": "1777931039",
"download_url": "https://ftp.drupal.org/files/projects/pathauto-8.x-1.15.tar.gz",
"is_insecure": false,
"is_security_release": false,
"name": "pathauto 8.x-1.15",
"release_types": [
"Bug fixes",
"New features"
],
"security_note": "Covered by Drupal's security advisory policy",
"status": "published",
"url": "https://www.drupal.org/project/pathauto/releases/8.x-1.15",
"version": "8.x-1.15"
},
{
"date": "1759838097",
"download_url": "https://ftp.drupal.org/files/projects/pathauto-8.x-1.14.tar.gz",
"is_insecure": false,
"is_security_release": false,
"name": "pathauto 8.x-1.14",
"release_types": [
"Bug fixes"
],
"security_note": "Covered by Drupal's security advisory policy",
"status": "published",
"url": "https://www.drupal.org/project/pathauto/releases/8.x-1.14",
"version": "8.x-1.14"
}
],
"title": "Pathauto",
"total": 25,
"url": "https://www.drupal.org/project/pathauto"
}List records
This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. List records of one type from the site: articles, pages, taxonomy terms, users, or anything else its content model has. Filter on a field, sort, and pull in related records in the same call. The attributes come back exactly as the site names them, because a site's fields are its own.
Inputs
- Resource type
resource_typetextRequired - What to read or write, written entity--bundle. 'node--article' is the Article content type, 'taxonomy_term--tags' the Tags vocabulary. Which types a site has depends on its content model, so run 'List what the site exposes' against a site you do not already know.
- Filters
filtersobject - Field and value pairs to match on, as a JSON object, for example {"status": 1} for published only, or {"title": "Welcome"}. Each pair is an exact match. Use 'Run a JSON:API request' for anything more involved.
- Sort by
sorttext - Field to sort on. Prefix with a minus for descending, so '-created' is newest first.
- Also fetch related records
includetext - Comma-separated relationships to pull in alongside the record, for example 'uid,field_tags'. Saves a second call when you need the author's name or a term's label rather than just its id.
- How many to return
sizenumber - How many records to return, from 1 to 50. Defaults to 25. Drupal enforces the ceiling itself.From 1 to 50. Default:
25. - Skip this many
offsetnumber - How many records to skip before returning any. Use it with 'How many to return' to walk a long list.From 0 to 10000000. Default:
0.
Outputs
countnumber- How many records came back
has_moretrue/false- Whether there is another page after this one
recordslistrecords_withheldtrue/false- Present and true when the site withheld some records the account may not read. The list is short rather than wrong
resource_typetext- The type that was listed
totalnumber- How many exist in total, when the site reports it
Example output
{
"count": 2,
"has_more": true,
"records": [
{
"attributes": {
"body": {
"value": "text"
},
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal__nid": 42,
"status": true,
"title": "Hello"
},
"changed": null,
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal_id": 42,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"relationships": {
"uid": {
"id": "u-1",
"type": "user--user"
}
},
"resource_type": "node--article",
"status": true,
"title": "Hello",
"url": "http://127.0.0.1:8731/jsonapi/node/article/1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e"
},
{
"attributes": {
"body": {
"value": "text"
},
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal__nid": 42,
"status": true,
"title": "Second"
},
"changed": null,
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal_id": 42,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"relationships": {
"uid": {
"id": "u-1",
"type": "user--user"
}
},
"resource_type": "node--article",
"status": true,
"title": "Second",
"url": "http://127.0.0.1:8731/jsonapi/node/article/1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e"
}
],
"resource_type": "node--article",
"total": 2
}List what the site exposes
This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. List every resource type the connected site publishes over JSON:API, each written entity--bundle. Which types a site has depends entirely on its content model, so run this first against a site you do not already know: every other site action needs one of these names.
Inputs
None.
Outputs
authenticatedtrue/false- Whether credentials were sent. Anonymous sees fewer types
countnumber- How many types came back
jsonapi_versiontext- JSON:API version the site speaks
resource_typeslistsite_urltext- The site that answered
Example output
{
"authenticated": true,
"count": 2,
"jsonapi_version": "1.1",
"resource_types": [
{
"resource_type": "node--article",
"url": "http://127.0.0.1:8731/jsonapi/node/article"
},
{
"resource_type": "taxonomy_term--tags",
"url": "http://127.0.0.1:8731/jsonapi/taxonomy_term/tags"
}
],
"site_url": "http://127.0.0.1:8731"
}Run a JSON:API request
This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. Call any JSON:API endpoint on the site directly. The escape hatch for the parts of a content model the other actions do not reach: a custom entity type, a filter too involved for the simple field-and-value form, a relationship endpoint, or a revision. The response is shaped the same way whether the endpoint returns one record or many.
Inputs
- Path
pathtextRequired - The JSON:API path to call, with or without the /jsonapi prefix, for example 'node/article' or '/jsonapi/node/article/<uuid>/field_tags'.
- Method
methodtext - Which HTTP method to use. Defaults to GET.One of:
GET(GET (read)),POST(POST (create)),PATCH(PATCH (change)),DELETE(DELETE (remove)). Default:GET. - Query parameters
queryobject - Query string parameters as a JSON object, passed through untouched. This is where a filter JSON:API's shorthand cannot express goes.
- Request body
bodyobject - The request body as a JSON object, in JSON:API's own shape. Ignored on a GET.
Outputs
countnumber- How many records came back
has_moretrue/false- Whether another page follows
methodtext- The method that was used
pathtext- The path that was called
rawobject- The untouched response, when it carried no records
recordobject- One record from the site, with its JSON:API envelope flattened
recordslistsite_urltext- The site that answered
totalnumber- How many exist in total, when the site reports it
Example output
{
"count": 2,
"has_more": true,
"method": "GET",
"path": "node/article",
"records": [
{
"attributes": {
"body": {
"value": "text"
},
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal__nid": 42,
"status": true,
"title": "Hello"
},
"changed": null,
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal_id": 42,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"relationships": {
"uid": {
"id": "u-1",
"type": "user--user"
}
},
"resource_type": "node--article",
"status": true,
"title": "Hello",
"url": "http://127.0.0.1:8731/jsonapi/node/article/1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e"
},
{
"attributes": {
"body": {
"value": "text"
},
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal__nid": 42,
"status": true,
"title": "Second"
},
"changed": null,
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal_id": 42,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"relationships": {
"uid": {
"id": "u-1",
"type": "user--user"
}
},
"resource_type": "node--article",
"status": true,
"title": "Second",
"url": "http://127.0.0.1:8731/jsonapi/node/article/1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e"
}
],
"site_url": "http://127.0.0.1:8731",
"total": 2
}Search issues
List issues from a project's queue, or across all of drupal.org, most recently changed first. Filter by status, priority and category to watch what needs review on a module you maintain, to find critical bugs before an upgrade, or to feed a triage report.
Inputs
- Project
projecttext - Narrow to one project's queue, by machine name or URL. Leave blank to search every queue on drupal.org at once.
- Status
statustext - Only issues at this status. Leave blank for any.One of:
1(Active),18(Closed (cannot reproduce)),3(Closed (duplicate)),7(Closed (fixed)),vs(Closed (outdated)),5(Closed (won't fix)),6(Closed (works as designed)),2(Fixed),8(Needs review),13(Needs work), and 4 more. - Priority
prioritytext - Only issues at this priority. Leave blank for any.One of:
400(Critical),300(Major),200(Normal),100(Minor). - Category
categorytext - Only issues of this kind. Leave blank for any.One of:
1(Bug report),2(Task),3(Feature request),4(Support request),5(Plan). - How many to return
sizenumber - How many rows to return, from 1 to 100. Defaults to 25.From 1 to 100. Default:
25. - Page
pagenumber - Which page of results to return, counting from 0. Use it with 'How many to return' to walk through a long list.From 0 to 100000. Default:
0.
Outputs
countnumber- How many rows came back
issueslistpages_availablenumber- How many pages exist at this page size
projecttext- Machine name the search was narrowed to, if any
Example output
{
"count": 2,
"issues": [
{
"assigned_to": null,
"body": "<h3 id=\"summary-problem-motivation\">Problem/Motivation</h3>\n<p>The upgrade from 8.x-1.14 to 8.x-1.15 appears to have changed the selection_criteria in the Content Type pattern YAML from an array to a...",
"category": "Bug report",
"changed": "1788423870",
"comment_count": "12",
"component": "Code",
"created": "1778044413",
"node_id": "3588582",
"priority": "Normal",
"project_node_id": "17345",
"reporter": "kenwest",
"status": "Needs review",
"status_id": "8",
"title": "Selection criteria duplicated when editing pattern for a content type",
"url": "https://www.drupal.org/project/pathauto/issues/3588582",
"version": "8.x-1.15"
},
{
"assigned_to": null,
"body": "<h3 id=\"summary-problem-motivation\">Problem/Motivation</h3>\n<p>Deprecated function: Using null as an array offset is deprecated, use an empty string instead in Drupal\\pathauto\\PathautoGenerator->ge...",
"category": "Task",
"changed": "1786444648",
"comment_count": "3",
"component": "Code",
"created": "1786441842",
"node_id": "3616056",
"priority": "Normal",
"project_node_id": "17345",
"reporter": "trickfun",
"status": "Needs review",
"status_id": "8",
"title": "Deprecated function: Using null as an array offset is deprecated, use an empty string instead in Drupal\\pathauto\\PathautoGenerator->getPatternByEntity()",
"url": "https://www.drupal.org/project/pathauto/issues/3616056",
"version": "8.x-1.15"
}
],
"pages_available": 16,
"project": "pathauto"
}Update a record
This acts on the Drupal site connected to this integration, so it needs the site URL, and credentials for anything the site does not let anonymous visitors do. Change fields on a record that already exists. Only the fields given are touched; everything else is left as it was. Use it to publish or unpublish something, correct a title, or retag an article.
Inputs
- Resource type
resource_typetextRequired - What to read or write, written entity--bundle. 'node--article' is the Article content type, 'taxonomy_term--tags' the Tags vocabulary. Which types a site has depends on its content model, so run 'List what the site exposes' against a site you do not already know.
- Record id
record_idtextRequired - The record's UUID, which is what JSON:API identifies things by rather than the node id shown in the admin screens. Every list action returns one per row.
- Fields to change
attributesobject - The fields to change, as a JSON object. Anything left out is untouched.
- Links to change
relationshipsobject - Relationships to change, as a JSON object in JSON:API's own shape. Anything left out is untouched.
Outputs
attributesobject- Every field on the record, exactly as the site names them
changedtext- When it last changed
createdtext- When it was created
drupal_internal_idnumber- The node, term or user id shown in the admin screens
idtext- The record's UUID
relationshipsobject- Links to other records, each as a type and an id
resource_typetext- Its entity--bundle type
statustrue/false- Whether it is published
titletext- Title or name, where the type has one
urltext- Its own JSON:API address
Example output
{
"attributes": {
"body": {
"value": "text"
},
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal__nid": 42,
"status": true,
"title": "Updated"
},
"changed": null,
"created": "2026-09-17T10:00:00+00:00",
"drupal_internal_id": 42,
"id": "1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e",
"relationships": {
"uid": {
"id": "u-1",
"type": "user--user"
}
},
"resource_type": "node--article",
"status": true,
"title": "Updated",
"url": "http://127.0.0.1:8731/jsonapi/node/article/1f8a1c4e-0f8b-4a35-9f0e-2d3c4b5a6d7e"
}