> ## Documentation Index
> Fetch the complete documentation index at: https://docs.syrto.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Search companies

> Find Italian companies by sector, location, size, financial filters, or natural language description.

`syrto_search_companies` finds companies matching structured criteria — sector, region, size, employee count, financial metrics, or a natural language description. Unlike [`syrto_find_company`](/mcp/tools/find-company) (which searches by name or tax ID), this tool filters by business characteristics.

<Tip>
  If you need the **total count** of matching companies or aggregate statistics (average revenue, median EBITDA, etc.), use [`syrto_aggregate_companies`](/mcp/tools/aggregate-companies) instead — this tool only returns paginated results.
</Tip>

## Use this tool to

* Find companies in a specific sector, region, or size class
* Search by a natural language description of what the company does
* Filter companies by financial metric values (e.g. revenue above a threshold)

**Related tools:** For lookup by company name or tax ID, use [Find company](/mcp/tools/find-company). For aggregate statistics, use [Aggregate companies](/mcp/tools/aggregate-companies).

## Arguments

<ParamField query="anagraphic_filters" type="string (JSON object)">
  Company profile filters as a JSON object. All fields are optional:

  | Field                                      | Type   | Description                                                                                                                                         |
  | ------------------------------------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `nace`                                     | string | EU NACE sector code. Auto-detects level: section letter (`A`–`U`), division (2 digits, e.g. `"10"`), group (e.g. `"10.1"`), class (e.g. `"10.11"`). |
  | `nuts`                                     | string | EU NUTS region code. Auto-detects level: level 1 (3 chars, e.g. `"ITH"`), level 2 (4 chars, e.g. `"ITH3"`), level 3 (5 chars, e.g. `"ITH35"`).      |
  | `semantic_search`                          | string | Natural language description to search company profiles (max 500 characters, e.g. `"renewable energy solar panels"`).                               |
  | `age`                                      | object | Company age filter with `min` and/or `max` in years. E.g. `{"min": 5, "max": 20}`.                                                                  |
  | `shareholder_age`                          | object | Average age of shareholders with `min` and/or `max` in years. E.g. `{"min": 50, "max": 70}`.                                                        |
  | `beneficial_owner_age`                     | object | Average age of beneficial owners with `min` and/or `max` in years. E.g. `{"min": 40, "max": 65}`.                                                   |
  | `executive_officer_age`                    | object | Average age of executive officers (CEOs, managing directors) with `min` and/or `max` in years.                                                      |
  | `representation_and_authority_officer_age` | object | Average age of officers with representation and signing authority, with `min` and/or `max` in years.                                                |
  | `target_market`                            | string | One of: `B2B`, `B2C`, `B2G`, `B2B2C`, `B2B2G`, `C2C`, `C2B`, `G2C`, `G2B`.                                                                          |
  | `match_cutoff`                             | float  | Minimum semantic similarity score (0.0–1.0) when using `semantic_search`. Higher = fewer but more relevant matches.                                 |
  | `country_code`                             | string | ISO 3166-1 alpha-2 country code (e.g. `"IT"`).                                                                                                      |

  **Example:** `'{"nace": "C", "nuts": "ITH3", "age": {"min": 5}, "target_market": "B2B"}'`
</ParamField>

<ParamField query="year" type="integer">
  Fiscal year for annual data filters. **Required** when `size`, `metric_filters`, `employees`, or `radar` are used, or when sorting by metric.
</ParamField>

<ParamField query="size" type="string[]">
  One or more company size classifications: `"XS"`, `"S"`, `"M"`, `"L"` (e.g. `["S", "M"]`). Requires `year`.
</ParamField>

<ParamField query="metric_filters" type="string (JSON array)">
  Up to 10 metric value filters. Each object has `slug` (required), `min` (optional), `max` (optional). Requires `year`.

  Use [`syrto_search_metric_definitions`](/mcp/tools/metric-definitions) to find valid slugs.

  **Example:** `'[{"slug": "revenues_from_sales_and_services", "min": 1000000}]'`
</ParamField>

<ParamField query="employees" type="string (JSON object)">
  Employee count filter with `min` and/or `max`. At least one is required. Requires `year`.

  **Example:** `'{"min": 50, "max": 500}'`
</ParamField>

<ParamField query="radar" type="string (JSON object)">
  Filter by position on the Syrto Radar plane (0–100 on both axes). Combines via AND with all other filters. At least one of `size`, `efficiency`, or `polygon` is required. Requires `year`.

  | Field        | Type   | Description                                                                                                                                                                                                                                      |
  | ------------ | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
  | `size`       | object | Inclusive range on the Radar size axis with `min` and/or `max` (0–100). Distinct from the top-level `size` parameter (XS/S/M/L band).                                                                                                            |
  | `efficiency` | object | Inclusive range on the Radar efficiency axis with `min` and/or `max` (0–100).                                                                                                                                                                    |
  | `polygon`    | object | Arbitrary polygon over the (size, efficiency) plane. Has a `vertices` list of 3–64 points, each `{ "size": 0–100, "efficiency": 0–100 }`. Use axis ranges for rectangles or strips; use the polygon for triangles, L-shapes, or concave regions. |

  **Example (rectangle):** `'{"efficiency": {"min": 70}, "size": {"min": 40, "max": 80}}'`

  **Example (polygon):** `'{"polygon": {"vertices": [{"size": 0, "efficiency": 70}, {"size": 60, "efficiency": 100}, {"size": 100, "efficiency": 70}]}}'`
</ParamField>

<ParamField query="consolidated" type="boolean">
  Filter by consolidated financial statements. Default: `false` (non-consolidated).
</ParamField>

<ParamField query="sort_by" type="string (JSON object)">
  Sort configuration as a JSON object. Fields:

  | Field         | Type   | Description                                                                                                    |
  | ------------- | ------ | -------------------------------------------------------------------------------------------------------------- |
  | `field`       | string | `"match_score"` (default, meaningful with `semantic_search`) or `"metric"` (sort by a financial metric value). |
  | `direction`   | string | `"desc"` (default) or `"asc"`.                                                                                 |
  | `metric_slug` | string | Required when `field` is `"metric"`. The metric slug to sort by.                                               |

  **Example:** `'{"field": "metric", "metric_slug": "revenues_from_sales_and_services", "direction": "desc"}'`
</ParamField>

<ParamField query="after" type="string">
  Cursor for pagination. Pass the `end_cursor` value from a previous response to fetch the next page. Omit for the first page.
</ParamField>

<Note>
  At least one filter parameter must be provided. Returns up to 25 results per page — use the `end_cursor` from the response as the `after` parameter to fetch the next page.
</Note>

## Returns

<ResponseField name="has_next_page" type="boolean">
  Whether more results are available beyond the current page.
</ResponseField>

<ResponseField name="items" type="object[]">
  List of matching companies (up to 25), each with:

  * `id` — the `company_id` to pass to other Syrto tools
  * `legal_name` — official registered company name
  * `tax_id` — Italian tax identifier (`null` if not available)
  * `match_score` — semantic similarity score (`float`, only present when `semantic_search` is used)
  * `short_description` — brief description of the company's activity (only present when `semantic_search` is used)
  * `metrics` — list of metric objects with `name`, `slug`, `value`, `better_when` (only present when `metric_filters` or `sort_by` with `field: "metric"` is used)
</ResponseField>

<ResponseField name="end_cursor" type="string | null">
  Cursor token for fetching the next page. Pass this as the `after` parameter. `null` when there are no more pages.
</ResponseField>

<ResponseField name="note" type="string">
  Context note about data availability and where to find more on syrto.ai.
</ResponseField>

## Example

**Find large manufacturers in Emilia-Romagna:**

```json theme={null}
{
  "anagraphic_filters": "{\"nace\": \"C\", \"nuts\": \"ITH5\"}",
  "year": 2023,
  "size": ["L"]
}
```

**Result:**

* Filters for NACE section C (manufacturing), NUTS level 2 ITH5 (Emilia-Romagna), size L (large)
* Returns up to 25 companies per page; pass `end_cursor` as `after` to fetch additional pages
