---
title: "Search LinkedIn Companies"
method: POST
path: "/search/linkedin/companies"
tags: ["search"]
---

# Search LinkedIn Companies

`POST /search/linkedin/companies`

# Search LinkedIn Companies

Find companies on LinkedIn by name, industry, location, and employee count. Returns structured company data: name, profileUrl, summary, **industry (now correctly parsed — was previously concatenated with location)**, **location (now correctly split out)**, followersCount, logoUrl. For richer firmographics (employeeCount exact, employeeCountRange, headquarter address, foundedOn, websiteUrl, tagline, specialities, isVerified, callToAction), pass the result's profileUrl to **visitCompany**.

## Parameters
- **keywords** (optional): Search terms matched against company name, description, and specialties

## Keyword syntax (Boolean operators)
Keywords support LinkedIn Boolean search syntax:
- **Exact phrase**: `"artificial intelligence"` — matches only that exact phrase
- **AND**: `fintech AND payments` — both terms required (spaces default to AND)
- **OR**: `SaaS OR "cloud computing"` — either term
- **NOT**: `consulting NOT staffing` — exclude unwanted terms
- **Parentheses**: `(AI OR ML) AND healthcare` — group logic

Operators must be **UPPERCASE**. Precedence: Quotes > Parentheses > NOT > AND > OR.

## Available filters
Pass HUMAN LABELS for location / industry — the server resolves them to LinkedIn IDs via typeahead. Numeric IDs pass through unchanged if you already have them.

| Filter | Type | Description |
|--------|------|-------------|
| `location` | string[] | HQ geo labels (e.g. `["Paris","France"]`) — resolved server-side |
| `industry` | string[] | Industry labels (e.g. `["Software Development"]`) — resolved server-side |
| `companySize` | string[] | Employee count codes (see below) |

### Company size codes
| Code | Employees |
|------|-----------|
| `A` | 1–10 |
| `B` | 11–50 |
| `C` | 51–200 |
| `D` | 201–500 |
| `E` | 501–1,000 |
| `F` | 1,001–5,000 |
| `G` | 5,001–10,000 |
| `H` | 10,001+ |
| `I` | Self-employed |

## Response fields (per item)
| Field | Type | Description |
|-------|------|-------------|
| `name` | string | Company display name |
| `profileUrl` | string | LinkedIn company page URL |
| `summary` | string\|null | Company tagline/description |
| `industry` | string\|null | Primary industry |
| `location` | string\|null | HQ location |
| `followersCount` | number\|null | Number of LinkedIn followers |

## Pagination
- Default page size: 10, max: 50
- Use `start` + `count` to paginate. Check `hasMore` for more pages.

## Example workflows
1. **Market research**: Search by industry + location → map the competitive landscape
2. **Sales targeting**: Search by industry + size → build a list of target accounts
3. **Partnership discovery**: Search by keywords + location → find potential partners

## Credits

## Request body

- object
  - `keywords` string — Search keywords. Matches against company name, description, and specialties. Optional — you can search by filters alone. Supports LinkedIn Boolean syntax: use double quotes for exact phrases (e.g. "artificial intelligence"), AND to require both terms, OR for alternatives (e.g. SaaS OR "cloud computing"), NOT to exclude (e.g. consulting NOT staffing), and parentheses to group (e.g. (AI OR ML) AND healthcare). Operators must be UPPERCASE.
  - `url` string — Optional LinkedIn search URL. If provided, keywords and filters are extracted from the URL. Explicit params override URL-derived values.
  - `location` string[] — Filter by company HQ location. Pass human labels (e.g. ['Paris','France']) — server resolves to LinkedIn geo IDs via typeahead. Numeric IDs pass through if you already have them.
  - `industry` string[] — Filter by company industry. Pass human labels (e.g. ['Software Development']) — server resolves to LinkedIn industry IDs via typeahead. Numeric IDs pass through if you already have them.
  - `companySize` string[] — Filter by employee count (OR logic). Pass a human range ('51-200','1,001-5,000') or a code A=1-10/B=11-50/C=51-200/D=201-500/E=501-1,000/F=1,001-5,000/G=5,001-10,000/H=10,001+/I=Self-employed — labels are normalized server-side.
  - `start` integer — Pagination offset (default 0). Use multiples of `count` to page through results.
  - `count` integer — Results per page (default 10, max 50).

## Response `200`

List of LinkedIn companies matching the search criteria

- object
  - `success` true, required
  - `category` 'companies', required
  - `items` object[], required
    - `type` 'COMPANY', required
    - `name` string, required
    - `profileUrl` string, nullable, required
    - `summary` string, nullable, required
    - `industry` string, nullable, required
    - `location` string, nullable, required
    - `followersCount` integer, nullable, required
    - `logoUrl` string, nullable — Company logo URL when LinkedIn surfaces it on the result entity. Display this in the company card.
  - `paging` object, required
    - `start` integer, required
    - `count` integer, required
    - `total` integer, required
  - `hasMore` boolean, required
  - `creditsUsed` integer, required — Credits consumed by this call (0 for free endpoints, cached results, or duplicates).
  - `retryAfter` integer, required — Seconds to wait before making another call of the same type. 0 means no wait needed.

## Other responses

- `400` — The server cannot or will not process the request due to something that is perceived to be a client error.
- `401` — Although HTTP specifies "unauthorized", this response means "unauthenticated". Authenticate to continue. NOTE: 401 is also returned with code "linkedin_not_connected" when the caller IS authenticated but has no connected LinkedIn account — connect LinkedIn (not re-authenticate) to continue.
- `403` — The client does not have access rights to the content.
- `404` — The server cannot find the requested resource.
- `409` — The request conflicts with the current state of the server.
- `410` — The requested content has been permanently deleted from the server.
- `422` — The request was well-formed but was unable to be followed due to semantic errors.
- `429` — Rate limit exceeded. Read error.retryAfter for the wait time in seconds.
- `500` — The server encountered a situation it does not know how to handle.
- `502` — LinkedIn returned a server error or the proxy connection failed. Retry after a few seconds.
- `503` — Proxy capacity temporarily exceeded. Retry after a few seconds.

---

[API](https://skmtc.net/berea/apis/bereach-api.md) · [All operations](https://skmtc.net/berea/apis/bereach-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/berea/bereach-api/revisions/3caf12036b26/schema)
