> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://api.docs.modulards.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://api.docs.modulards.com/_mcp/server.

# Search components

GET https://api.modulards.com/api/public/v1/components/search

Searches wordpress.org for a plugin or theme by name. It looks at the public repository, not at what is installed on your websites (use "List components" or "List site items" for that), and gives you the exact slug that "Install a component on websites" needs.

**Errors**
- **422**: `type` is missing or not `plugin` or `theme`, `s` is missing for a plugin search or is shorter than 2 or longer than 100 characters, or a `page` value is out of range.
- **502**: wordpress.org cannot be reached. Retry in a moment.

Reference: https://api.docs.modulards.com/modular-ds-public-api/updater/components/search-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

- `type` (string, optional) — What to search: `plugin` or `theme`. Required.
- `s` (string, optional) — Search text, 2 to 100 characters. Required for a plugin search; optional for a theme search, which then browses the popular themes.
- `page[number]` (string, optional) — Page to return, starting at 1. Default 1.
- `page[size]` (string, optional) — Number of results per page, 1 to 50. Default 15.

## Response

### 200

200 - Components found on wordpress.org

- `data` (list of ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaDataItems, optional)
- `jsonapi` (ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaJsonapi, optional)
- `links` (ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaLinks, optional)
- `meta` (ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaMeta, optional)

## Types

### ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaDataItems

- `attributes` (ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaDataItemsAttributes, optional)
- `id` (string, optional)
- `type` (string, optional)

### ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaJsonapi

- `version` (string, optional)

### ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaLinks

- `first` (string, optional)
- `last` (string, optional)
- `next` (any, optional, nullable)
- `prev` (any, optional, nullable)

### ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaMeta

- `current_page` (double, optional)
- `from` (double, optional)
- `last_page` (double, optional)
- `links` (list of ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaMetaLinksItems, optional)
- `path` (string, optional)
- `per_page` (double, optional)
- `to` (double, optional)
- `total` (double, optional)

### ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaDataItemsAttributes

- `active_installs` (double, optional)
- `author` (string, optional)
- `download_link` (string, optional)
- `last_updated` (string, optional)
- `name` (string, optional)
- `rating` (double, optional)
- `requires_php` (string, optional)
- `requires_wp` (string, optional)
- `slug` (string, optional)
- `tested_wp` (string, optional)
- `version` (string, optional)

### ApiPublicV1ComponentsSearchGetResponsesContentApplicationJsonSchemaMetaLinksItems

- `active` (boolean, optional)
- `label` (string, optional)
- `url` (string, optional, nullable)

## Examples

**Response**

```json
{
  "data": [
    {
      "attributes": {
        "active_installs": 5000000,
        "author": "Automattic",
        "download_link": "https://downloads.wordpress.org/plugin/woocommerce.8.10.1.zip",
        "last_updated": "2026-09-10T00:00:00.000000Z",
        "name": "WooCommerce",
        "rating": 90,
        "requires_php": "7.4",
        "requires_wp": "6.6",
        "slug": "woocommerce",
        "tested_wp": "6.8.1",
        "version": "8.10.1"
      },
      "id": "woocommerce",
      "type": "wordpress-repository-items"
    },
    {
      "attributes": {
        "active_installs": 300000,
        "author": "WooCommerce",
        "download_link": "https://downloads.wordpress.org/plugin/woocommerce-shipping.2.9.0.zip",
        "last_updated": "2026-08-22T00:00:00.000000Z",
        "name": "WooCommerce Shipping & Tax",
        "rating": 82,
        "requires_php": "7.4",
        "requires_wp": "6.4",
        "slug": "woocommerce-shipping",
        "tested_wp": "6.8.1",
        "version": "2.9.0"
      },
      "id": "woocommerce-shipping",
      "type": "wordpress-repository-items"
    }
  ],
  "jsonapi": {
    "version": "1.1"
  },
  "links": {
    "first": "{{base_url}}/api/public/v1/components/search?page%5Bnumber%5D=1",
    "last": "{{base_url}}/api/public/v1/components/search?page%5Bnumber%5D=1",
    "next": null,
    "prev": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "links": [
      {
        "active": false,
        "label": "&laquo; Previous",
        "url": null
      },
      {
        "active": true,
        "label": "1",
        "url": "{{base_url}}/api/public/v1/components/search?page%5Bnumber%5D=1"
      },
      {
        "active": false,
        "label": "Next &raquo;",
        "url": null
      }
    ],
    "path": "{{base_url}}/api/public/v1/components/search",
    "per_page": 15,
    "to": 2,
    "total": 2
  }
}
```

**SDK Code**

```python 200 - Components found on wordpress.org
import requests

url = "https://api.modulards.com/api/public/v1/components/search"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript 200 - Components found on wordpress.org
const url = 'https://api.modulards.com/api/public/v1/components/search';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go 200 - Components found on wordpress.org
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.modulards.com/api/public/v1/components/search"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby 200 - Components found on wordpress.org
require 'uri'
require 'net/http'

url = URI("https://api.modulards.com/api/public/v1/components/search")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java 200 - Components found on wordpress.org
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.modulards.com/api/public/v1/components/search")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php 200 - Components found on wordpress.org
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.modulards.com/api/public/v1/components/search', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp 200 - Components found on wordpress.org
using RestSharp;

var client = new RestClient("https://api.modulards.com/api/public/v1/components/search");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift 200 - Components found on wordpress.org
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.modulards.com/api/public/v1/components/search")! 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()
```