> ## Documentation Index
> Fetch the complete documentation index at: https://docs.up2data.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Search posts

> What the market is talking about, as it happens.

**Cost: 2 credits per page scraped (up to 25 posts per page) · zero-result pages free**

<Note>
  **How to search — provide at least one**

  1. **`keywords`** — match on post body.
  2. **`hashtags`** — without the `#` (e.g. `["hiring", "b2bsales"]`).
  3. **`author_url`** / **`author_urn`** — pull a specific person's or company's recent posts.

  You can combine these. Pass `max_results` and Up2Data paginates internally.
</Note>

Live post search by keyword, hashtag, or author feed — with engagement metrics.

<ParamField body="keywords" type="string[]">
  Match on post body. Provide at least one of `keywords`, `hashtags`, `author_url`.
</ParamField>

<ParamField body="hashtags" type="string[]">
  Without the `#` (e.g. `["hiring", "b2bsales"]`).
</ParamField>

<ParamField body="author_url" type="string">
  Pull a specific person's or company's recent posts.
</ParamField>

<ParamField body="author_urn" type="string">
  Author member URN — faster than URL when available.
</ParamField>

<ParamField body="posted_within" type="string" default="all">
  `24h` | `week` | `month` | `all`.
</ParamField>

<ParamField body="sort" type="string" default="recent">
  `recent` | `top` | `relevance`.
</ParamField>

<ParamField body="max_results" type="integer" default="25">
  1–100. Target number of posts to return. Up2Data paginates internally.
</ParamField>

### Response

<ResponseField name="data.posts" type="object[]">
  <Expandable title="Post fields">
    <ResponseField name="url" type="string" />

    <ResponseField name="urn" type="string">Post activity URN — use for comments/reactions.</ResponseField>

    <ResponseField name="share_urn" type="string" />

    <ResponseField name="author" type="object">`name`, `url`, `headline`.</ResponseField>
    <ResponseField name="text" type="string">Full post body.</ResponseField>

    <ResponseField name="posted_at" type="string" />

    <ResponseField name="reactions_count" type="integer" />

    <ResponseField name="comments_count" type="integer" />

    <ResponseField name="reposts_count" type="integer" />

    <ResponseField name="media" type="object[]">`type` (`image` | `video` | `document`), `url`.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api.up2data.ai/v1/search/posts \
    -H "X-API-Key: $UP2DATA_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "keywords": ["migrating off Salesforce"],
      "sort": "recent",
      "max_results": 25
    }'
  ```

  ```python Python theme={null}
  resp = requests.post(
      "https://api.up2data.ai/v1/search/posts",
      headers={"X-API-Key": UP2DATA_API_KEY},
      json={"keywords": ["migrating off Salesforce"], "sort": "recent", "max_results": 25},
  )
  posts = resp.json()["data"]["posts"]
  ```

  ```javascript Node theme={null}
  const resp = await fetch("https://api.up2data.ai/v1/search/posts", {
    method: "POST",
    headers: { "X-API-Key": process.env.UP2DATA_API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({ keywords: ["migrating off Salesforce"], sort: "recent", max_results: 25 }),
  });
  const { posts } = (await resp.json()).data;
  ```

  ```go Go theme={null}
  body, _ := json.Marshal(map[string]any{
  	"keywords": []string{"migrating off Salesforce"}, "sort": "recent", "max_results": 25,
  })
  req, _ := http.NewRequest("POST",
  	"https://api.up2data.ai/v1/search/posts", bytes.NewReader(body))
  req.Header.Set("X-API-Key", os.Getenv("UP2DATA_API_KEY"))
  req.Header.Set("Content-Type", "application/json")
  resp, err := http.DefaultClient.Do(req)
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": {
      "posts": [
        {
          "url": "https://linkedin.com/posts/example_activity-7215",
          "urn": "7267273010393358336",
          "share_urn": "7315779815297421316",
          "author": {
            "name": "Jane Doe",
            "url": "https://linkedin.com/in/janedoe",
            "headline": "VP RevOps at Example"
          },
          "text": "Six months after migrating off Salesforce, here's what we learned…",
          "posted_at": "2026-07-06T18:45:00Z",
          "reactions_count": 483,
          "comments_count": 67,
          "reposts_count": 21,
          "media": [],
          "scraped_at": "2026-07-08T12:00:00Z"
        }
      ],
      "pagination": { "returned": 25, "max_results": 25, "pages_scraped": 1, "has_more": true }
    },
    "meta": {
      "creditsUsed": 2,
      "creditsRemaining": 98385,
      "billed": true,
      "reason": "page_returned",
      "requestId": "req_m20d8vhh",
      "latencyMs": 4700
    }
  }
  ```
</ResponseExample>

**Rate limit:** counts as 1 request against your [tier limit](/rate-limits).
