# LinkedIn Posts Search

Search public LinkedIn posts by keyword and return post URLs with titles, snippets, and numeric activity IDs. One upstream search per request, and no LinkedIn page is fetched: use the LinkedIn Post Transcript endpoint to enrich a specific post with its comments. The response paginates: pagination.current_page is the page that was served, and you request the next one with the page parameter. pagination.pages is reserved by the shared search backend and is currently always empty, so use current_page rather than it. pagination.source reads derived_from_request when the page block was built from your request rather than reported by the search engine. total_results is the engine estimate for the whole query, not for this page, and people_also_search_for carries related queries when the engine offers them.  The upstream search provider serves a window of 190 results at most, so the last page starts where that window ends: page 10 with num=20 overlaps the previous page instead of coming back empty for a combination this endpoint accepts.The Errors section lists the common cases rather than every code: any failed request carries an error_code, and none of them is billed.

- **Documentation:** [https://scrappa.co/docs/linkedin-api/linkedin_posts_search](https://scrappa.co/docs/linkedin-api/linkedin_posts_search)
- **API group:** LinkedIn API
- **Endpoint:** `GET https://scrappa.co/api/linkedin/posts/search`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `query` | string | Yes | Search phrase. |
| `num` | integer | No | Results per page (1-20, default 10). |
| `page` | integer | No | Page number (1-based). |
| `hl` | string | No | Interface language (e.g., en, de). |
| `gl` | string | No | 2-letter country code for geolocation (e.g., us, de). |
| `cr` | string | No | Restrict results to a country (format: countryXX). |
| `safe` | string | No | Adult content filtering (active or off). |
| `filter` | integer | No | Enable/disable duplicate filtering (0 or 1). |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/linkedin/posts/search?query=artificial+intelligence+hiring&num=10"
```

## Example response

```json
{
    "organic_results": [
        {
            "position": 1,
            "title": "Why we are hiring for AI roles in 2026",
            "link": "https://www.linkedin.com/posts/john-doe_hiring-for-ai-roles-activity-7123456789012345678",
            "displayed_link": "linkedin.com \u203a posts \u203a john-doe",
            "snippet": "We are opening three roles on the applied AI team...",
            "activity_id": "7123456789012345678"
        }
    ],
    "search_information": {
        "query_displayed": "artificial intelligence hiring",
        "total_results": 1
    },
    "pagination": {
        "current_page": 1,
        "pages": [],
        "source": "derived_from_request"
    },
    "total_results": 1,
    "people_also_search_for": []
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | The query parameter is missing, or num/page are out of range. |
| 404 | No Posts Found | No LinkedIn post URLs matched this query. Not billed. |
| 503 | Search Unavailable | The shared search backend could not be reached or returned no usable result set. Failed requests are never billed. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
