> ## 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.

# Radar map

> Plot companies on the Syrto radar as an interactive chart.

`syrto_radar_map` plots companies on the Syrto radar - a two-axis positioning chart where right means larger and up means more efficient. It returns an interactive widget plus a text summary of what is on screen.

The two radar scores run 0-100 and are computed across Syrto's whole database rather than within a sector, so companies from **different** sectors sit on the same axes and can be compared directly. Each company draws a path across its filed years ending in an arrow at the latest, with forecast years continuing as a dotted lead.

<Frame caption="Pariani S.r.l. (blue) against a Competitors list (green), a Suppliers list (pink), and two reference lines (amber and orange). Each company traces its filed years, with the forecast continuing as a dotted lead.">
  <img src="https://mintcdn.com/syrtosrl/cHL2hC8rTAtbpQuJ/images/radar/radar-example.svg?fit=max&auto=format&n=cHL2hC8rTAtbpQuJ&q=85&s=6bb1951ac88c0f86ab8de1611fd8ff49" alt="Syrto radar chart plotting Pariani S.r.l. against competitor and supplier lists, with Piedmont and Italian food manufacturing reference lines" width="1100" height="620" data-path="images/radar/radar-example.svg" />
</Frame>

<Info>
  The interactive chart needs a host that renders MCP Apps. Where the chart cannot be shown, the text summary still stands on its own. To get the same chart as an embeddable image instead, use [`syrto_radar_chart`](/mcp/tools/radar-chart).
</Info>

## Use this tool to

* Compare, rank, benchmark, or position two or more companies at a glance
* See which way a company is moving, not just where it stands
* Place a company against its sector, region, or size band as reference lines

**Related tools:** For an exact metric value, use [Compare companies](/mcp/tools/compare-companies). For one company's per-theme profile, use [Spider graphs](/mcp/tools/spider-graphs). For a single company in depth, use [Company analysis](/mcp/tools/company-analysis).

<Note>
  The scores are not percentiles, and 50 is not an average - it is just the midpoint of the scale, and the population is unevenly spread across it. Read positions relative to the other companies on the map rather than to the centre.
</Note>

## Arguments

Five sources put companies on one map. Everything across `company_id`, `peer_ids`, `peer_filters`, and `company_lists` counts toward a single 148-company limit.

<ParamField query="company_id" type="string">
  The company the map is about, from [`syrto_find_company`](/mcp/tools/find-company) or [`syrto_lookup_companies_by_tax_id`](/mcp/tools/lookup-companies-by-tax-id). Drawn in its own colour and always labelled. Optional - a map can be company lists and reference lines alone, with nothing singled out.
</ParamField>

<ParamField query="peer_ids" type="string[]">
  Other companies to plot, by ID. Use this when the companies are named rather than grouped or described.
</ParamField>

<ParamField query="peer_filters" type="object">
  A peer group described by criteria instead of listed by ID - "its sector", "hazelnut processors in Piedmont". Its members are plotted individually.

  | Field     | Type    | Description                                                                                                                                                                                                       |
  | --------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `filters` | object  | Which companies to plot, as the same filters object taken by [`syrto_search_companies`](/mcp/tools/search-companies#filter-sections). At least one filter is required.                                            |
  | `limit`   | integer | How many companies to take from the population. Default 25, max 148. Fetched 25 at a time, so a large number costs several calls.                                                                                 |
  | `sort_by` | object  | Which companies the limit keeps - the largest by revenue, the best by ROE. Omit it and the order is the API's own, so the companies drawn are an arbitrary sample of the population rather than its top anything. |
  | `year`    | integer | Fiscal year the filters are evaluated in. It decides who is in the population, not which years are drawn. Defaults to the latest year most companies have filed.                                                  |
</ParamField>

<ParamField query="company_lists" type="object[]">
  Named sets of companies, each drawn in its own colour - a portfolio against a watchlist, this year's wins against last year's. Up to 4 lists. Each entry has:

  * `name` - label for the set, e.g. `"Portfolio"`. Shown on hover and used when a user's selection is reported back.
  * `company_ids` - the company IDs belonging to the set.
</ParamField>

<ParamField query="aggregates" type="object[]">
  Reference lines, each a population average with a name you choose. Up to 4. The axes are global and carry no sector reference, so this is how a map answers "compared to whom". Each entry has:

  * `name` - the label drawn on the line, e.g. `"Piedmont hazelnut processors"`. Say which population it averages - this is the only thing distinguishing one reference line from another.
  * `filters` - which companies to average, as the same filters object taken by [`syrto_search_companies`](/mcp/tools/search-companies#filter-sections).
</ParamField>

<Note>
  The `filters` object in `peer_filters` and `aggregates` includes the `company_ids` section, so a reference line or peer group can be an explicit list of companies. A **pure** ID list - no other filter sections - skips the implicit membership-year filter and behaves like `peer_ids`: every listed company joins, contributing the years it filed.

  Adding any year-dependent criterion, or an explicit `peer_filters.year`, restores that gate. Membership is then fixed once, at that year, and a listed company without that year's filing is absent from the **whole** reference line rather than from one year of it.
</Note>

<ParamField query="trajectories" type="boolean">
  Draw each company's whole run (`true`, default), or one dot per company at its latest filed year (`false`). Turning it off is what makes a map of twenty peers readable when the runs cross. On this tool it is only the state the chart opens in - the reader can put the paths back with the chart's own Trajectories button.
</ParamField>

<ParamField query="language" type="string">
  `"en"` for English (default) or `"it"` for Italian.
</ParamField>

## Returns

A summary of what is now on screen. The full year-by-year map goes to the rendered chart and is not repeated in the summary.

<ResponseField name="axes" type="object">
  The `x` and `y` axis names.
</ResponseField>

<ResponseField name="companies" type="object[]">
  One entry per company on the map:

  * `id`, `name` - identity
  * `role` - `"focus"`, `"peer"`, or `"aggregate"` (a reference line, so a population average rather than a firm)
  * `group` - the `company_lists` name the company came from
  * `color` - the colour it is drawn in, as a name rather than a hex: blue for the focus company, violet for companies in no list, then green/pink/lime/magenta per list and amber/orange/yellow/slate per reference line, in the order they were passed
  * `consolidated` - `false` for the company's own figures, `true` for its group's, absent on an aggregate. Two entries can share a name and differ only here.
  * `latest` - its most recent position, as a `{year, size, efficiency}` point on the 0-100 axes
  * `start` - its earliest filed position, omitted when only one year is filed. `start` to `latest` is the trend.
  * `forecast` - where its projection ends, omitted when nothing is projected
  * `dropped_years` - years that could not be plotted. A run carrying one is not the continuous path it looks like, and `latest` is not the newest filed year.
</ResponseField>

<ResponseField name="latest_year" type="integer | null">
  The most recent year drawn on the map.
</ResponseField>

<ResponseField name="unavailable_ids" type="string[]">
  Requested companies with no plottable radar data. Every company asked for is either in `companies` or here.
</ResponseField>

<ResponseField name="unavailable_aggregates" type="string[] | null">
  Reference lines whose filters matched nothing.
</ResponseField>

<ResponseField name="peer_population" type="object | null">
  Present only when `peer_filters` was passed, saying what it contributed: `selected` companies, `plotted` of them with radar data, and `more_available` when the population continued past what was drawn. Where it did, the chart shows a slice of that population rather than the whole of it.
</ResponseField>

<Warning>
  When `unavailable_ids` or `unavailable_aggregates` is non-empty, the chart is missing something the caller asked for and cannot show that itself.
</Warning>

## Example

**A company against a competitor list, a supplier list, and two reference lines:**

```json theme={null}
{
  "company_id": "Zm86SVRfMTA2MTU1MTAwMTJfVTox",
  "company_lists": [
    {
      "name": "Competitors",
      "company_ids": [
        "Zm86SVRfMDAxODI1NDAwNDdfVTox",
        "Zm86SVRfODAwNTEyMTAwMTNfVTox",
        "Zm86SVRfMDM3MjMwNDAwNDhfVTox"
      ]
    },
    {
      "name": "Suppliers",
      "company_ids": [
        "Zm86SVRfMDMzNzM1NjAwNDhfVTox",
        "Zm86SVRfMDIzMTI4NTAwNDlfVTox"
      ]
    }
  ],
  "aggregates": [
    {
      "name": "Piedmont food manufacturing",
      "filters": { "anagraphic": { "nace": ["10"], "nuts": ["ITC1"] } }
    },
    {
      "name": "Italian food manufacturing",
      "filters": { "anagraphic": { "nace": ["10"], "country_code": "IT" } }
    }
  ]
}
```

This produces the chart at the top of this page.

**A snapshot of a described population, largest first:**

```json theme={null}
{
  "company_id": "Zm86SVRfMTA2MTU1MTAwMTJfVTox",
  "peer_filters": {
    "filters": { "anagraphic": { "nace": ["10"], "nuts": ["ITC1"] } },
    "limit": 20,
    "sort_by": { "field": "metric", "metric_slug": "revenues_from_sales_and_services" },
    "year": 2023
  },
  "trajectories": false
}
```
