{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/generect-com/json-schema/generect-com-database-company-search-request-schema.json",
  "title": "DatabaseCompanySearchRequest",
  "x-generated": "2026-11-09",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/generect-com-openapi.yaml#/components/schemas/DatabaseCompanySearchRequest",
  "allOf": [
    {
      "$ref": "#/$defs/CompanySearchRequest"
    },
    {
      "type": "object",
      "properties": {
        "detail": {
          "type": "string",
          "enum": [
            "full",
            "thin"
          ],
          "default": "full",
          "description": "Row shape. `full` (the default) returns full rows, billed per row. `thin` returns the company's name, industry, size and location at no charge, up to a daily quota per account (currently 2,000 rows per UTC day); a thin row has no domain, website, LinkedIn URL or contacts. A spent quota is refused with `429` until 00:00 UTC, never billed. Accounts on a custom API contract get `400` unless their contract includes thin search. The count endpoints ignore this field: counts are always free."
        },
        "limit_by": {
          "type": "integer",
          "default": 100,
          "description": "Maximum number of companies to return, from 1 to 10000. Without it, a search returns 100 rows: `results_count` is the whole match, and `offset_by` reaches the rest."
        },
        "offset_by": {
          "type": "integer",
          "description": "Number of companies to skip (0-9999, for pagination)."
        },
        "founded_year": {
          "description": "Founding year of the company — the \"company age\" filter. Accepts either an explicit list of years, or a `{\"min\", \"max\"}` range of founding years; both bounds are inclusive and either may be omitted (an omitted `max` means \"up to the current year\").\n\nDatabase mode only. Realtime company search has no founded-year facet upstream, so it rejects this field rather than accepting it and returning a wider result set than you asked for.\n\nCoverage matters here: the founding year is known for roughly 57% of companies, and a company without one never matches. Filtering by company age therefore also drops records that simply lack the data, not only those outside your range.",
          "oneOf": [
            {
              "type": "array",
              "items": {
                "type": "integer"
              }
            },
            {
              "type": "object",
              "properties": {
                "min": {
                  "type": "integer",
                  "description": "Earliest founding year, inclusive. Clamped up to 1800 — earlier values in the data are junk, not history."
                },
                "max": {
                  "type": "integer",
                  "description": "Latest founding year, inclusive. Clamped down to the current year."
                }
              },
              "description": "A range that names bounds but covers no year after clamping — `max` before `min`, or a window entirely in the future or before 1800 — is a 400, not an empty result set. Omitting both bounds is not a filter at all and is rejected by the \"at least one search filter\" rule."
            }
          ]
        }
      }
    }
  ],
  "$defs": {
    "CompanySearchRequest": {
      "type": "object",
      "properties": {
        "industries": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Industries of the target companies; a company is included if it matches at least one. Values follow LinkedIn's industry taxonomy. Examples: \"Software Development\", \"Financial Services\", \"Information Technology\"."
        },
        "exclude_industries": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Industries to exclude."
        },
        "sub_industries": {
          "type": "boolean",
          "default": false,
          "description": "Controls how the `industries` filter maps onto LinkedIn's industry taxonomy. By default (`false`), a selected industry also matches companies in its sub-industries. Set to `true` to match only the industries you specify and exclude their sub-industries, for finer sub-category targeting — for example, \"Manufacturing\" without \"Chemicals\"."
        },
        "headcounts": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Company size, as employee-count ranges; a company is included if it falls into at least one. Allowed values: \"1-10\", \"11-50\", \"51-200\", \"201-500\", \"501-1000\", \"1001-5000\", \"5001-10000\", \"10 000+\"."
        },
        "locations": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Company headquarters locations — matches across cities, states/regions and countries; a company is included if its HQ matches at least one. Examples: \"United States\", \"San Francisco, California, United States\", \"Germany\"."
        },
        "exclude_locations": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Locations to exclude."
        },
        "company_types": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Company types: \"Public Company\", \"Privately Held\", \"Non Profit\", \"Government Agency\", \"Educational\", etc."
        },
        "exclude_ids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Exclude companies by LinkedIn ID or URN."
        },
        "exclude_domains": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Exclude companies by domain."
        },
        "limit_by": {
          "type": "integer",
          "description": "Maximum number of companies to return (1-1600)."
        },
        "offset_by": {
          "type": "integer",
          "description": "Number of companies to skip (0-1599, for pagination)."
        },
        "strict": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Fields to apply strict matching on (e.g. \"company_locations\")."
        },
        "apply_domain_blocklist": {
          "type": "boolean",
          "default": true,
          "description": "Apply Generect's blocked-domain list, which removes staffing agencies, directories and similar low-signal records that match broad industry filters. Set to `false` to receive them. On by default on the company search endpoints, in both database and realtime mode; the company-leads endpoints do not apply it. In database search the exclusion happens before `results_count`, so the count always matches what the pages can deliver; in realtime the records are dropped after retrieval, so a page may hold fewer companies than `results_count` implies."
        },
        "include_companies_without_website": {
          "type": "boolean",
          "default": false,
          "description": "Also return companies that have a LinkedIn page but no website, such as many hospitals, clinics and local businesses. Off by default: the company search endpoints drop every company without a website, in both database and realtime mode. Such a company has no website and no domain, so there are no corporate emails to find for its people and lead matching by domain does not work for it; an `exclude_domains` entry cannot remove it (use `exclude_ids`). Each one is returned and billed as a result like any other, and many of them have few or no leads on LinkedIn. The other quality rules stay: a company with zero employees on LinkedIn is still dropped, and the blocked-domain list still applies to companies that have a website. In database search these companies are counted in `results_count`; the realtime count comes from LinkedIn and always included them. The company-leads endpoints do not read it."
        }
      }
    }
  }
}