> 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/websites/manage-websites/summarize-websites/llms.txt. > For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://api.docs.modulards.com/_mcp/server. # Summarize websites GET https://api.modulards.com/api/public/v1/sites/summary Returns how many websites you have and how they are spread across the versions they run: WordPress, PHP, the Modular Connector plugin and the database. Use it to answer questions such as "how many of my websites still run an old PHP version?" without listing every website. The counts cover the websites your token can reach. Narrow them with the same filters as "List websites", for example one team or one tag. Only `filter` is accepted: there is nothing to sort, page or include here, so `sort`, `page`, `fields` and `include` answer `422`. Each list has one row per version, newest first, plus a row without a version for websites that have never synchronized, and adds up to the total. Reference: https://api.docs.modulards.com/modular-ds-public-api/websites/manage-websites/summarize-websites ## 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[id][]` (string, optional) — Website ids. Several values match any of them. - `filter[team][]` (string, optional) — Team ids. Several values match websites in any of these teams. - `filter[tags][]` (string, optional) — Tag ids. Several values match websites carrying any of these tags. - `filter[connected]` (string, optional) — `1` for websites whose connection works, `0` for websites that are not connected. - `filter[s]` (string, optional) — Free-text search on the website's name, slug or address. - `filter[core_version][]` (string, optional) — Exact WordPress versions, for example `6.8.1`. Several values match any of them. - `filter[engine_version][]` (string, optional) — Exact PHP versions, for example `8.2.27`. Several values match any of them. - `filter[alerts][]` (string, optional) — Notification configuration ids. Several values match websites associated with any of them. - `filter[patchstack]` (string, optional) — `1` for websites with Patch & Protect switched on, `0` for websites without it. ## Response ### 200 200 OK - `jsonapi` (ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaJsonapi, optional) - `meta` (ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMeta, optional) ## Types ### ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaJsonapi - `version` (string, optional) ### ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMeta - `connector_version` (list of ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaConnectorVersionItems, optional) - `core_version` (list of ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaCoreVersionItems, optional) - `db_engine_version` (list of ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaDbEngineVersionItems, optional) - `engine_version` (list of ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaEngineVersionItems, optional) - `total` (integer, optional) — Number of websites that match the filters. ### ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaConnectorVersionItems - `sites_count` (integer, optional) — Number of websites on that Modular Connector plugin version. - `value` (string, optional, nullable) — A Modular Connector plugin version in use; null groups the websites that have never synchronized. ### ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaCoreVersionItems - `sites_count` (integer, optional) — Number of websites on that WordPress version. - `value` (string, optional, nullable) — A WordPress version in use; null groups the websites that have never synchronized. ### ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaDbEngineVersionItems - `db_engine` (string, optional, nullable) — Database engine, for example mysql or mariadb; null for websites that have never synchronized. - `sites_count` (integer, optional) — Number of websites on that database engine and version. - `value` (string, optional, nullable) — Database engine version; null for websites that have never synchronized. ### ApiPublicV1SitesSummaryGetResponsesContentApplicationJsonSchemaMetaEngineVersionItems - `sites_count` (integer, optional) — Number of websites on that PHP version. - `value` (string, optional, nullable) — A PHP version in use; null groups the websites that have never synchronized. ## Examples **Response** ```json { "jsonapi": { "version": "1.1" }, "meta": { "connector_version": [ { "sites_count": 39, "value": "1.4.0" }, { "sites_count": 3, "value": null } ], "core_version": [ { "sites_count": 30, "value": "6.8.1" }, { "sites_count": 9, "value": "6.7.2" }, { "sites_count": 3, "value": null } ], "db_engine_version": [ { "db_engine": "mysql", "sites_count": 22, "value": "8.0.0" }, { "db_engine": "mariadb", "sites_count": 17, "value": "10.11.2" }, { "db_engine": null, "sites_count": 3, "value": null } ], "engine_version": [ { "sites_count": 25, "value": "8.2.27" }, { "sites_count": 14, "value": "8.1.0" }, { "sites_count": 3, "value": null } ], "total": 42 } } ``` **SDK Code** ```python 200 OK import requests url = "https://api.modulards.com/api/public/v1/sites/summary" headers = {"Authorization": "Bearer "} response = requests.get(url, headers=headers) print(response.json()) ``` ```javascript 200 OK const url = 'https://api.modulards.com/api/public/v1/sites/summary'; 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 OK package main import ( "fmt" "net/http" "io" ) func main() { url := "https://api.modulards.com/api/public/v1/sites/summary" 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 OK require 'uri' require 'net/http' url = URI("https://api.modulards.com/api/public/v1/sites/summary") 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 OK import com.mashape.unirest.http.HttpResponse; import com.mashape.unirest.http.Unirest; HttpResponse response = Unirest.get("https://api.modulards.com/api/public/v1/sites/summary") .header("Authorization", "Bearer ") .asString(); ``` ```php 200 OK request('GET', 'https://api.modulards.com/api/public/v1/sites/summary', [ 'headers' => [ 'Authorization' => 'Bearer ', ], ]); echo $response->getBody(); ``` ```csharp 200 OK using RestSharp; var client = new RestClient("https://api.modulards.com/api/public/v1/sites/summary"); var request = new RestRequest(Method.GET); request.AddHeader("Authorization", "Bearer "); IRestResponse response = client.Execute(request); ``` ```swift 200 OK import Foundation let headers = ["Authorization": "Bearer "] let request = NSMutableURLRequest(url: NSURL(string: "https://api.modulards.com/api/public/v1/sites/summary")! 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() ```