# st.searchPosts

This action allows you to search for posts applying various filtering criteria.

## Constraints

> ⏺️ **Root Start:** allowed.

> ⬆️ **Parent Actions:** N/A.

> ⬇️ **Child Actions:** [st.doForPosts](/docs/action-st-do-for-posts).

## Parameters

```json
{
  "actionType": "st.searchPosts",
  "label": "climateTechSearch1",
  "term": "climate tech",
  "limit": 20,
  "filter": {
    "sort": "latest",
    "datePosted": "pastWeek",
    "contentType": "images",
    "postedBy": ["firstConnections", "peopleYouFollow"],
    "fromMembers": [
      { "name": "Bill Gates", "urn": "urn:li:member:251749025" }
    ],
    "fromCompanies": ["Example Company"],
    "mentioningMembers": [
      { "name": "Example Person", "personHashedUrl": "https://www.linkedin.com/in/ACoAAAKKvC4BR-qLHi0BnO-dJ8CP81tLsY0kKyc" }
    ],
    "mentioningCompanies": [
      { "name": "Another Company", "companyHashedUrl": "https://www.linkedin.com/company/12345678" }
    ],
    "authorCompanies": [
      { "name": "Example Company", "urn": "urn:li:organization:1234567" }
    ],
    "authorIndustries": ["Software Development"]
  },
  "customSearchUrl": "https://www.linkedin.com/search/results/content/?keywords=climate%20tech",
  "then": { ... }
}
```

- `label` (optional) – custom label for tracking this action in workflow completion.
- `term` (optional) – keyword or phrase to search, from 1 to 50 characters. Either `term` or `customSearchUrl` must be provided; a request with neither (for example, with `filter` only) is rejected.
- `limit` (optional) – number of search results to return. Defaults to **10**, with a maximum value of **100**, or **20** when child actions are used. A value above the applicable maximum is rejected when the workflow is submitted. A search may return fewer posts than `limit`, because how many results come back depends on what LinkedIn loads for that account on that search.
- `filter` (optional) – object that specifies filtering criteria for posts. Every specified field is applied, or the action fails. When multiple filter fields are specified, they are combined using `AND` logic. Ignored entirely when `customSearchUrl` is specified.
  - `sort` (optional) – enum with possible values:
    - `topMatch`.
    - `latest`.
  - `datePosted` (optional) – enum with possible values:
    - `past24Hours`.
    - `pastWeek`.
    - `pastMonth`.
  - `contentType` (optional) – enum with possible values:
    - `videos`.
    - `images`.
    - `jobPosts`.
    - `liveVideos`.
    - `documents`.
  - `postedBy` (optional) – array of enums with possible values:
    - `me`.
    - `firstConnections`.
    - `peopleYouFollow`.
  - `fromMembers` (optional) – array of people whose posts to keep. Matches if the post was published by any of the listed people.
  - `fromCompanies` (optional) – array of companies whose posts to keep. Matches if the post was published by any of the listed companies.
  - `mentioningMembers` (optional) – array of people to look for in post text. Matches if the post mentions any of the listed people.
  - `mentioningCompanies` (optional) – array of companies to look for in post text. Matches if the post mentions any of the listed companies.
  - `authorCompanies` (optional) – array of companies the author works at. Matches if the post's author works at any of the listed companies.
  - `authorIndustries` (optional) – array of industry names the author works in. Matches if the post's author works in any of the listed industries. Takes specific values available in the LinkedIn interface. An industry is a taxonomy value rather than an entity, so it is matched by name only.
- `customSearchUrl` (optional) – URL copied from a LinkedIn content search page after configuring desired filters. When specified, `filter` is ignored entirely and the facets already encoded in the URL are the only ones applied. Either `term` or `customSearchUrl` must be provided.
- `then` (optional) – object or array of child actions to be executed within this action.

LinkedIn widens a narrow query on its own and returns loosely related posts, so a non-empty result does not mean your `term` matched. Check the returned posts against your own criteria when an exact match matters.

### Identifying people and companies in filters

`fromMembers`, `fromCompanies`, `mentioningMembers`, `mentioningCompanies`, and `authorCompanies` all take the same entry shape. A plain string is shorthand for the name alone, so `["Bill Gates"]` and `[{ "name": "Bill Gates" }]` mean the same thing, and both forms can be mixed in one array. Here is one array using every accepted form at once:

```json
{
  "fromMembers": [
    "Bill Gates",
    { "name": "Satya Nadella" },
    { "name": "Example Person", "urn": "urn:li:member:251749025" },
    {
      "name": "Another Person",
      "personHashedUrl": "https://www.linkedin.com/in/ACoAAAKKvC4BR-qLHi0BnO-dJ8CP81tLsY0kKyc"
    }
  ]
}
```

The company filters take the same four forms, with `urn:li:organization:<id>` and `companyHashedUrl` in place of the member ones:

```json
{
  "fromCompanies": [
    "Microsoft",
    { "name": "Example Company" },
    { "name": "Another Company", "urn": "urn:li:organization:1234567" },
    {
      "name": "Third Company",
      "companyHashedUrl": "https://www.linkedin.com/company/12345678"
    }
  ]
}
```

- `name` (required) – name to type into the LinkedIn filter panel, from 1 to 100 characters.
- `urn` (optional) – [URN](/docs/core-concepts#linkedin-urns) of the person (`urn:li:member:<id>`) in `fromMembers` and `mentioningMembers`, or of the company (`urn:li:organization:<id>`) in `fromCompanies`, `mentioningCompanies`, and `authorCompanies`.
- `personHashedUrl` (optional) – [hashed](/faq/what-are-hashed-url-and-public-url) LinkedIn URL of the person, in `fromMembers` and `mentioningMembers`.
- `companyHashedUrl` (optional) – [hashed](/faq/what-are-hashed-url-and-public-url) LinkedIn URL of the company, in `fromCompanies`, `mentioningCompanies`, and `authorCompanies`.

> **A name on its own does not guarantee the right person or company.** LinkedIn's filter panel accepts typed text and nothing else, so with `name` alone the entry that gets picked is whichever suggestion LinkedIn ranked first for that name – which may be a namesake rather than the entity you meant. Supply `urn`, `personHashedUrl`, or `companyHashedUrl` alongside `name` to pin the exact one.

> An identifier you supply is matched, never approximated – the action fails with `filterIdentityMismatch` instead of quietly filtering by a namesake.

## Result options

1. **Successful search:**

```json
{
  "actionType": "st.searchPosts",
  "label": "climateTechSearch1",
  "success": true,
  "data": [
    {
      "url": "https://www.linkedin.com/feed/update/urn:li:activity:1234567890123456789",
      "activityUrn": "urn:li:activity:1234567890123456789",
      "time": "2023-01-02T12:30:00Z",
      "type": "original",
      "author": {
        "type": "person",
        "name": "Example Person",
        "profileUrl": "https://www.linkedin.com/in/example-person",
        "headline": "Product Marketing Lead"
      },
      "reposter": null,
      "text": "Check out our latest product launch!",
      "repostText": null,
      "hashtags": ["product", "launch"],
      "mentions": ["https://www.linkedin.com/company/example-company"],
      "externalLinks": ["https://example.com/launch"],
      "images": [
        "https://static.linkedin.com/image1.jpg",
        "https://static.linkedin.com/image2.jpg"
      ],
      "documentSlides": [],
      "hasVideo": false,
      "videoThumbnail": null,
      "hasPoll": false,
      "reactionsCount": 27,
      "commentsCount": 8,
      "repostsCount": 12,
      "then": { ... }
    },
    {
      "url": "https://www.linkedin.com/feed/update/urn:li:activity:2345678901234567890",
      "activityUrn": "urn:li:activity:2345678901234567890",
      "time": "2023-01-01T09:15:00Z",
      "type": "repost",
      "author": {
        "type": "company",
        "name": "Example Company",
        "companyUrl": "https://www.linkedin.com/company/example-company"
      },
      "reposter": {
        "type": "person",
        "name": "Example Reposter",
        "profileUrl": "https://www.linkedin.com/in/example-reposter",
        "headline": null
      },
      "text": "Original post content about the webinar.",
      "repostText": "A useful summary for anyone planning a launch.",
      "hashtags": [],
      "mentions": [],
      "externalLinks": [],
      "images": [],
      "documentSlides": [],
      "hasVideo": true,
      "videoThumbnail": "https://media.licdn.com/dms/image/video-cover.jpg",
      "hasPoll": false,
      "reactionsCount": 6,
      "commentsCount": 0,
      "repostsCount": 1,
      "then": { ... }
    }
  ]
}
```

- `label` – included only if specified in the action parameters.
- `data` – array of search outputs with results of child actions execution.
  - `url` – URL of the post.
  - `activityUrn` – LinkedIn activity or UGC URN of the post, if available.
  - `time` – timestamp when the post was published.
  - `type` – type of the post. Enum with possible values:
    - `original` – for original posts.
    - `repost` – for reposts.
  - `author` – original content creator. Can be `null` if the actor cannot be parsed.
    - For person authors: `type`, `name`, `profileUrl`, `headline`.
    - For company authors: `type`, `name`, `companyUrl`.
  - `reposter` – person or company that reshared the post. Non-null only when `type` is `repost`.
    - For person reposters: `type`, `name`, `profileUrl`, `headline`.
    - For company reposters: `type`, `name`, `companyUrl`.
  - `text` – original author's post text, if available.
  - `repostText` – text added by the reposter on a repost with comment, if available.
  - `hashtags` – array of hashtags found in the post text, without leading `#`.
  - `mentions` – array of person and company profile URLs found in the post text.
  - `externalLinks` – array of outbound URLs found in the post text.
  - `images` – array of up to 3 preview image URLs, if available.
  - `documentSlides` – array of carousel or document slide image URLs, if available.
  - `hasVideo` – boolean indicating if the post contains a video.
  - `videoThumbnail` – URL of the video thumbnail, if available.
  - `hasPoll` – boolean indicating if the post contains a poll.
  - `reactionsCount` – number of reactions on the post.
  - `commentsCount` – number of comments on the post.
  - `repostsCount` – number of reposts on the post.
  - `then` – results of child actions execution.

> Unlike posts returned by [st.openPost](/docs/action-st-open-post), the `author` and `reposter` of a search result carry **no** `urn` field. The URN is read from the post's own page, so open the post with [st.doForPosts](/docs/action-st-do-for-posts) and [st.openPost](/docs/action-st-open-post) when you need it.

2. **Failed search:**

```json
{
  "actionType": "st.searchPosts",
  "label": "climateTechSearch1",
  "success": false,
  "error": {
    "type": "searchingNotAllowed",
    "message": "LinkedIn has blocked performing the search."
  }
}
```

- `label` – included only if specified in the action parameters.
- `error.type` – enum with the following possible values:
  - `filterIdentityMismatch` – a person or company requested in the search filter was not among the options LinkedIn offered for that name. Raised when a filter entry carries `urn`, `personHashedUrl`, or `companyHashedUrl` and none of the suggestions LinkedIn offers for the typed name resolves to it, including when an `urn` and a hashed URL are supplied together but point to different entities. It does not mean the person or company is gone – the usual cause is a `name` that does not match the entity the identifier names, so correct the entry rather than retrying.
  - `searchingNotAllowed` – LinkedIn has blocked performing the search due to exceeding limits or other restrictions.
