Skip to main content
syrto_search_companies finds companies matching structured criteria - sector, region, size, employee count, financial metrics, radar position, associated people, public subsidies, or a natural language description. Unlike syrto_find_company (which searches by name or tax ID), this tool filters by business characteristics.
If you need the total count of matching companies or aggregate statistics (average revenue, median EBITDA, etc.), use syrto_aggregate_companies instead - this tool only returns paginated results.

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 or 1-5 scores
  • Screen by radar position, ownership, or public subsidies received
Related tools: For lookup by company name or tax ID, use Find company. For aggregate statistics, use Aggregate companies. For the filter catalog as the server serves it, use Search filter docs.

Arguments

object
A single structured filter object. Its top-level keys are the filter sections documented below: company_ids, anagraphic, state_aids, people, financial, and radar.All set filters combine with AND, both within a section and across sections.
integer
Fiscal year the annual filters are evaluated in. Required whenever filters.financial (except its consolidated field) or filters.radar is used, or when sorting by a metric.
object
Sort configuration. Omit for the default order - semantic relevance when anagraphic.semantic_search is set, otherwise the API’s own default.Sorting is by metric value only - the API cannot rank by score.Example: {"field": "metric", "metric_slug": "revenues_from_sales_and_services", "direction": "desc"}
string
Cursor for pagination. Pass the end_cursor value from a previous response to fetch the next page of 20 results. Omit for the first page.
string
"en" for English (default) or "it" for Italian.

Filter sections

Each heading below is a top-level key of filters, and its fields nest under that key. Range fields take {"min": N, "max": N} with at least one bound; both bounds are inclusive.

company_ids - a known list of companies

Does not require year. Unlike the others, this one is not an object: it is a JSON array of company IDs directly under filters. Use it to sub-filter a list you already hold - a company’s participations, say, or companies resolved from someone’s own list of tax IDs. Up to 200 IDs, no duplicates, and it combines with every other section.
  • IDs come only from syrto_find_company or syrto_lookup_companies_by_tax_id. A fabricated ID can silently match the wrong company, and an invalid one fails the whole call - the error reports which entry is invalid, so re-resolve that ID rather than constructing a replacement.
  • Each ID names one statement, individual or consolidated. No consolidation default is applied when this key is present; set financial.consolidated only to restrict the basis further.
  • An ID absent from the results matched no row for the supplied criteria - but only once has_next_page is false. Results come one page at a time, so an early page says nothing about the IDs it has not reached.
  • A filtered search returns only the matches, so “below threshold” and “no filing for that year” look identical. Where the distinction matters, pair the screen with syrto_aggregate_companies over the same ID list and year: company_ids_requested minus company_count is how many IDs had no row at all.

anagraphic - company profile

Does not require year. semantic_search searches business activity only - not company name, financials, ownership, or legal form. Use a list for genuine alternatives (“solar panels” OR “wind turbines”); keep one query per activity, since matching is by meaning rather than keyword. name is matched literally, so pass the name as written - a legal-form suffix such as “S.r.l.” narrows the match to companies whose registered name really carries one. Two spelling rules pull in opposite directions: apostrophes must be the straight ASCII one (Dell'Orto, not a curly variant), while accented letters must be the real character (Nicolò, never NICOLO'). The index stores each in exactly one of those forms; an apostrophe substitute is refused, with the spelling to send instead, while accented letters are passed through untouched. This filter screens and never ranks: results come back in the default order, or in whatever sort_by asks for, with no notion of a better name match. To look one company up by name, use syrto_find_company - name is for combining a name with sector, location or financial criteria. The three location filters - nuts, lau and country_code - match a company’s registered headquarters, not its branches. has_branch_in is the one that matches a branch: a company is kept when any one of its registered branches is in the given area. It combines with the headquarters filters rather than replacing them, so {"nuts": ["ITC4"], "has_branch_in": {"nuts": ["ITF4"]}} means headquartered in ITC4 and holding at least one branch in ITF4. “Companies with a presence in X” is the two questions together - run one search on the headquarters filters and one on has_branch_in. A branch match does not change how results are described: each company still comes back with its headquarters, and no field says which branch matched. For one company’s own registered branches, use Company branches.

state_aids - public subsidies received

Does not require year - the summary is not per-fiscal-year. Amounts are in EUR.

people - associated people

Does not require year. Resolve person IDs first with syrto_find_person. Within each list, any listed person matches; the relationship fields you set combine with AND.

financial - size, employees, metric values and scores

Requires year for size, employees, and metric_filters. Without it each company is measured against a different reference period. Each metric_filters entry is {"slug": ..., "min": N, "max": N, "score_min": 1-5, "score_max": 1-5} with at least one of the four bounds. Find valid slugs with syrto_search_metric_definitions.
  • min / max bound the raw value on the API’s native scale, never multiplied by 100: pass 0.1 for “EBIT margin at or above 10%”, 1.2 for “ROI at or above 120%”. Values may be negative, e.g. -0.15 for a -15% margin.
  • score_min / score_max bound the score - the API’s own 1-5 rating of that value against the company’s reference market. It is already normalised for direction, so 5 is always the best rating whichever way the raw metric reads. Use it for “companies scoring 4 or 5 on ROE” without knowing what a good ROE is in that sector.
  • Value and score bounds on the same entry combine with AND: {"slug": "roe", "min": 0.2, "score_min": 4} means ROE at or above 20% and rated 4+.
  • Companies with no score for the metric are excluded by any score bound, including a score_max one - an absent score never counts as a low score. Some metrics are never scored at all (their better_if comes back empty from syrto_search_metric_definitions); a score bound on one of those matches nothing, so filter those by value instead.

radar - Syrto radar position

Requires year. The radar plane has two proprietary synthetic 0-100 axes: size (how big a company is overall) and efficiency (how good it is overall). The same score means the same thing in every industry. Set at least one of size, efficiency, or polygon. Use axis ranges for axis-aligned rectangles or strips, and polygon for triangles, L-shapes, or concave regions.
At least one filter must be provided. Returns up to 20 results per page - use the end_cursor from the response as the after parameter to fetch the next page. That page size matches the cap on the tools a page of results feeds, so one page can be handed straight to Compare companies, Company overview or Company structure in a single call.

Returns

boolean
Whether more results are available beyond the current page.
object[]
List of matching companies (up to 20), each with:
  • id - the company ID to pass to other Syrto tools in their company_ids list
  • legal_name - official registered company name
  • tax_id - Italian tax identifier (null if not available)
  • consolidated - always present. false = the company’s own figures, true = its group’s consolidated figures
Beyond those, each field below is present only when its filter was used, so a result shows the company’s value for whatever you searched on:state_aids.last_grant_date and anagraphic.has_branch_in are the filters with no echo counterpart.
string | null
Cursor token for fetching the next page. Pass this as the after parameter. null when there are no more pages.
When nothing matches, items is an empty list and warning suggests how to widen the search - not an error. Beside result, the response carries the fields every tool returns. Here display_title is the matching company’s legal name, or a count of the companies on this page, and subtitle says when more results are available.

Example

Find large manufacturers in Emilia-Romagna:
Find well-rated solar or wind manufacturers with public subsidy headroom: