> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://api.docs.modulards.com/modular-ds-public-api/updater/components/list-components/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://api.docs.modulards.com/_mcp/server. # List components GET https://api.modulards.com/api/public/v1/components Returns each plugin, theme and WordPress version installed on your websites once, with how many websites have it, how many can be updated, its known vulnerabilities and the actions running on it. Use it to decide what to update first. Sorted by the number of websites with an update available, most first, unless you sort otherwise. The website filters narrow which websites are counted. When `fields[components]` is not sent, every counter is returned. Reference: https://api.docs.modulards.com/modular-ds-public-api/updater/components/list-components ## Authentication - `Authorization` header (bearer token, required) — Personal access token created in the Modular DS dashboard; read-only tokens can only call GET endpoints. ## Request ### Query parameters - `filter[type][]` (string, optional) — Component types: `core`, `plugin` or `theme`. Several values match any of them. - `filter[site][]` (string, optional) — Website ids: only installs on these websites are counted. Several values match any of them. - `filter[team][]` (string, optional) — Team ids: only installs on websites of these teams are counted. - `filter[tags][]` (string, optional) — Tag ids: only installs on websites carrying any of these tags are counted. - `filter[core_version][]` (string, optional) — Exact WordPress versions: only installs on websites running one of them are counted, for example `6.8.1`. - `filter[engine_version][]` (string, optional) — Exact PHP versions: only installs on websites running one of them are counted, for example `8.2.27`. - `filter[update_available]` (string, optional) — `1` for components with at least one counted website waiting for an update, `0` for the rest. - `filter[has_vulnerabilities]` (string, optional) — `1` for components with a known vulnerability in an installed version, `0` for the rest. - `filter[is_abandoned]` (string, optional) — `1` for components whose author has not released anything in 2 years, `0` for the rest. - `filter[closed]` (string, optional) — `1` for components closed on wordpress.org, `0` for the rest. - `filter[s]` (string, optional) — Free-text search on the component's name. - `sort` (string, optional) — Sort order: `sites_updatable` (default, descending), `name`, `vulnerabilities`, `released_at` or `sites_total`. Prefix with `-` for descending. - `page[number]` (string, optional) — Page to return, starting at 1. Default 1. - `page[size]` (string, optional) — Number of components per page, 1 to 50. Default 15. - `fields[components]` (string, optional) — Attributes to return, comma-separated; only those are returned. Default: all of `slug`, `name`, `type`, `url`, `is_abandoned`, `closed`, `latest_version`, `released_at`, `days_since_release`, `copilot_score`, `vulnerabilities`, `sites_total`, `sites_updatable`, `sites_active` and `in_progress_actions`. `sites_updatable` counts the websites with a newer version pending, an update notice that is not hidden, and that also accept installs. ## Response ### 200 200 - Components - `data` (list of ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaDataItems, optional) - `jsonapi` (ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaJsonapi, optional) - `links` (ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaLinks, optional) - `meta` (ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaMeta, optional) ## Types ### ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaDataItems - `attributes` (ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaDataItemsAttributes, optional) - `id` (string, optional) - `type` (string, optional) ### ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaJsonapi - `version` (string, optional) ### ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaLinks - `first` (string, optional) - `last` (string, optional) - `next` (any, optional, nullable) - `prev` (any, optional, nullable) ### ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaMeta - `current_page` (double, optional) - `from` (double, optional) - `last_page` (double, optional) - `links` (list of ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaMetaLinksItems, optional) - `path` (string, optional) - `per_page` (double, optional) - `to` (double, optional) - `total` (double, optional) ### ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaDataItemsAttributes - `closed` (boolean, optional) - `copilot_score` (double, optional) - `days_since_release` (double, optional) - `in_progress_actions` (double, optional) - `is_abandoned` (boolean, optional) - `latest_version` (string, optional) - `name` (string, optional) - `released_at` (string, optional) - `sites_active` (double, optional) - `sites_total` (double, optional) - `sites_updatable` (double, optional) - `slug` (string, optional) - `type` (string, optional) - `url` (string, optional) - `vulnerabilities` (double, optional) ### ApiPublicV1ComponentsGetResponsesContentApplicationJsonSchemaMetaLinksItems - `active` (boolean, optional) - `label` (string, optional) - `url` (string, optional, nullable) ## Examples **Response** ```json { "data": [ { "attributes": { "closed": false, "copilot_score": 92, "days_since_release": 11, "in_progress_actions": 0, "is_abandoned": false, "latest_version": "8.10.1", "name": "WooCommerce", "released_at": "2026-09-10T00:00:00.000000Z", "sites_active": 8, "sites_total": 9, "sites_updatable": 4, "slug": "woocommerce", "type": "plugin", "url": "https://woocommerce.com/", "vulnerabilities": 1 }, "id": "42", "type": "components" }, { "attributes": { "closed": false, "copilot_score": 100, "days_since_release": 68, "in_progress_actions": 0, "is_abandoned": false, "latest_version": "6.8.1", "name": "WordPress", "released_at": "2026-07-15T00:00:00.000000Z", "sites_active": 12, "sites_total": 12, "sites_updatable": 1, "slug": "wordpress", "type": "core", "url": "https://wordpress.org/", "vulnerabilities": 0 }, "id": "7", "type": "components" } ], "jsonapi": { "version": "1.1" }, "links": { "first": "{{base_url}}/api/public/v1/components?page%5Bnumber%5D=1", "last": "{{base_url}}/api/public/v1/components?page%5Bnumber%5D=1", "next": null, "prev": null }, "meta": { "current_page": 1, "from": 1, "last_page": 1, "links": [ { "active": false, "label": "« Previous", "url": null }, { "active": true, "label": "1", "url": "{{base_url}}/api/public/v1/components?page%5Bnumber%5D=1" }, { "active": false, "label": "Next »", "url": null } ], "path": "{{base_url}}/api/public/v1/components", "per_page": 15, "to": 2, "total": 2 } } ``` **SDK Code** ```python 200 - Components import requests url = "https://api.modulards.com/api/public/v1/components" headers = {"Authorization": "Bearer "} response = requests.get(url, headers=headers) print(response.json()) ``` ```javascript 200 - Components const url = 'https://api.modulards.com/api/public/v1/components'; const options = {method: 'GET', headers: {Authorization: 'Bearer '}}; try { const response = await fetch(url, options); const data = await response.json(); console.log(data); } catch (error) { console.error(error); } ``` ```go 200 - Components package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.modulards.com/api/public/v1/components" req, _ := http.NewRequest("GET", url, nil) req.Header.Add("Authorization", "Bearer ") res, _ := http.DefaultClient.Do(req) defer res.Body.Close() body, _ := io.ReadAll(res.Body) fmt.Println(res) fmt.Println(string(body)) } ``` ```ruby 200 - Components require 'uri' require 'net/http' url = URI("https://api.modulards.com/api/public/v1/components") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = 'Bearer ' response = http.request(request) puts response.read_body ``` ```java 200 - Components import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.modulards.com/api/public/v1/components") .header("Authorization", "Bearer ") .asString(); ``` ```php 200 - Components request('GET', 'https://api.modulards.com/api/public/v1/components', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp 200 - Components using RestSharp; var client = new RestClient("https://api.modulards.com/api/public/v1/components"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift 200 - Components import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.modulards.com/api/public/v1/components")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0) request.httpMethod = "GET" request.allHTTPHeaderFields = headers let session = URLSession.shared let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) } }) dataTask.resume() ```