---
title: "Discover companies by several criteria"
method: GET
path: "/api/network/search"
---

# Discover companies by several criteria

`GET /api/network/search`

## Request

- Base URL: `https://trooth.co`
- URL: `https://trooth.co/api/network/search`
- Auth: none required

Multi-criteria discovery over the same published companies the directory lists: free text, industry, HQ country, data residency region, deployment model, product name, whether Trooth holds a witnessed reading, and profile changes since a date. A company is matched only by facts its public page shows: residency and deployment are searchable only while the company shows the section that renders them. Filters are exact, case-insensitive matches on what the company published; a company that published nothing for a filtered field is absent from the answer, which is not a no. Order is the directory's: witnessed first, then the most recent reading, then name; never by a figure. Each result carries facts, whole days counted from timestamps on the record (days_since_last_witnessed, days_since_profile_updated), which rate nothing. Cursor pagination only; a cursor is bound to the filters it was issued with. An unknown filter is refused. Errors are always RFC 9457 problem details (codes at /api/problems). Cached at the edge for 60 seconds with a 300 second stale-while-revalidate window. Readable cross-origin: the response carries Access-Control-Allow-Origin: * and never Access-Control-Allow-Credentials, so a browser on any site may read it without cookies.

## Query parameters

- `q` string
- `industry` string
- `country` string
- `residency` string
- `hosting` string
- `product` string
- `witnessed` 'true' | 'false'
- `updated_since` string
- `limit` integer
- `cursor` string

## Response `200`

A page of matching companies.

- NetworkSearch: A page of matching companies. Canonical JSON Schema: https://trooth.co/schemas/network-search.v1.schema.json; embedded here with its $defs as NetworkSearch_* components.
  - `format` 'trooth.network-search.v1', required: Names this shape.
  - `results` NetworkSearchResult[], required: The companies on this page.
    - `slug` string, nullable, required: Profile slug.
    - `domain` string, nullable, required: Domain.
    - `name` string, required: The company's name as it publishes it.
    - `record_url` string, nullable, required: URL.
    - `profile_url` string, nullable, required: URL.
    - `witnessed` boolean, required: True when the company is in Trooth's live witnessed feed. A statement about whether evidence exists, not about the company.
    - `last_witnessed_at` string, nullable, required: ISO 8601 time.
    - `profile_updated_at` string, nullable, required: ISO 8601 time.
    - `industries` string[], required: Industries the company published.
    - `products` string[], required: Product names from the company's visible offering section.
    - `country` string, nullable, required: Country.
    - `residency` string[], required: Data residency regions the company published, when its page shows them.
    - `hosting` string[], required: Deployment models the company published, when its page shows them.
    - `facts` object, required: Whole days counted from timestamps on the record at the time of the response. They rate nothing.
      - `days_since_last_witnessed` integer, nullable, required: Days.
      - `days_since_profile_updated` integer, nullable, required: Days.
  - `total` integer, required: How many companies match, across all pages, on this read.
  - `next_cursor` string, nullable, required: Send as cursor, with the same filters, for the next page; null at the end.
  - `partial` object, nullable, required: Present when the read stopped at its ceiling.
    - `shown` integer, required: Profiles read.
    - `total` integer, nullable, required: Published profiles in all.
  - `order` string, required: The ordering rule, in words.
  - `how_to_read` string, required: How to read this answer.
  - `consistency` object, required: What a walk of this list promises and does not.
    - `mode` 'best-effort', required: Pages read the live directory; there is no snapshot.
    - `completeEnumeration` unknown, required
    - `note` string, required: The guarantee, in words.
    - `cursorScope` string, required: What a cursor is bound to.

## Other responses

- `400`: An unknown filter, a value that cannot be used, or a cursor issued for different filters.
- `429`: Rate limited.
- `503`: The directory could not be read. Not an empty result.

---

[API](https://skmtc.dev/trooth/apis/trooth-public-api.md) · [All operations](https://skmtc.dev/trooth/apis/trooth-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/trooth/apis/trooth-public-api/revisions/e4d4e92641d9?raw)
