---
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, location, followersCount, logoUrl. To read a single result in more depth, pass its profileUrl to **publicCompany**, which adds the full description, follower and employee counts, the website, and recent posts. Detailed firmographics (headquarter address, founding year, specialities, verification status, call to action) are not available from either surface, so do not promise them.

## 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 |
| `B` | 2-10 |
| `C` | 11-50 |
| `D` | 51-200 |
| `E` | 201-500 |
| `F` | 501-1,000 |
| `G` | 1,001-5,000 |
| `H` | 5,001-10,000 |
| `I` | 10,001+ |

## 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 |
| `logoUrl` | string\|null | Company logo, present only when the result entity carries one |

## 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, several bands allowed and combined as OR. Pass a human employee range and it is converted for you, which is the safer form: the underlying codes are A=1, B=2-10, C=11-50, D=51-200, E=201-500, F=501-1000, G=1001-5000, H=5001-10000, I=10001+, and passing the wrong letter searches the wrong band silently rather than failing.
  - `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
  - `warnings` object[] — Caveats about this result set. Absent or empty means the search ran exactly as asked.
    - `field` string, required — Which part of the request this is about, or `search` when it is about the whole result set.
    - `value` string, required — The value involved: what was dropped, or a code naming the condition.
    - `type` string, required — What kind of caveat this is. SEARCH_QUOTA: LinkedIn capped this account for the month, so the set is TRUNCATED and not the whole market. PARSE_EMPTY: the page answered and no rows could be read, and LinkedIn did not say the market is empty, so treat it as unread rather than as nobody matching. URL_FACET: a pasted search URL carried a filter this search cannot apply, so it ran wider than the one on screen. ENUM: a value was not recognised and that filter was dropped. LANE_FALLBACK: some or all rows came from the public lane, which fills fewer fields. AND_BLOB / OR_OVERFLOW: the keyword shape over-constrained and was retried or flagged. SEARCH_PLAN: the ask was spread across a search budget rather than paged.
    - `hint` string — One sentence a caller can show a person.
  - `creditsUsed` integer, required — Credits consumed by this call. 0 for free endpoints, cached results, duplicates, and for every query that does not touch LinkedIn.
  - `retryAfter` integer, required — Seconds to wait before another call of the same type. 0 means no wait is needed.
  - `_meta` object — Credit balance carried on every response so a caller never has to ask for it separately. Absent when the caller has no connected account.
    - `credits` object, required
      - `current` number, required — Credits spent this period.
      - `limit` number, nullable, required — Period allowance, or null when unlimited.
      - `remaining` number, nullable, required — Allowance left, or null when unlimited.
      - `percentage` number, required — Share of the allowance spent, 0 to 100.
      - `isUnlimited` boolean, required
      - `accountPlan` string, required — The credential's plan.

## 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/a1e86af2406d/schema)
