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

# CrustData V3: Social Post Search

> Search indexed LinkedIn posts by author profile URL, author title or company, keyword, hashtag, date, engagement, reactors, commenters, and mentions: what a.

Search indexed LinkedIn posts by author profile URL, author title or company, keyword, hashtag, date, engagement, reactors, commenters, and mentions: what a.

> [!NOTE]
>
> Tool ID: `crustdata_v3_social_post_search`

## Run this action

Use the TypeScript SDK for one call. Use `ctx.tools.execute(...)` inside a Play for durable calls, scheduled calls, or CSV processing.

```ts theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
import { Deepline } from 'deepline';

const deepline = await Deepline.connect();
const result = await deepline.tools.execute(
  'crustdata_v3_social_post_search',
  {
    "filters": {
      "field": "email",
      "type": "=",
      "value": {}
    },
    "cursor": "cursor_123",
    "limit": 20
  },
);

console.log(result.toolResponse.raw);
```

### CLI

```bash theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
deepline tools execute crustdata_v3_social_post_search --input '{
  "filters": {
    "field": "email",
    "type": "=",
    "value": {}
  },
  "cursor": "cursor_123",
  "limit": 20
}' --json
```

## Example response

The SDK returns this shape at `result.toolResponse.raw`. The example values illustrate the response.

```json theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
{
  "data": {
    "posts": [
      {
        "share_urn": "example"
      }
    ],
    "next_cursor": "cursor_123",
    "total_count": 123
  }
}
```

Use `deepline describe crustdata_v3_social_post_search --json` for the latest machine-readable contract.

## Input reference

Request body for the indexed social post search. Every key is optional. `&#123;&#125;` matches the whole dataset.

| Name | Type | Required | Default | Details |
| - | - | - | - | - |
| `payload.filters` | `object` | No | — | A single `SocialPostDbSearchCondition` or a nested `SocialPostDbSearchConditionGroup`. Omit to match every indexed post. |
| `payload.cursor` | `string` | No | — | Opaque cursor from a prior response's `next_cursor`. Send the same `filters`, `sorts`, and `fields` with it. A cursor issued for a different body is rejected with `Invalid cursor`. |
| `payload.limit` | `integer` | No | `20` | Posts per page. `0` returns `total_count` alone and costs nothing. Minimum: 0. Maximum: 1000. |
| `payload.sorts` | `array` | No | — | Ordering rules applied in array order. Defaults to `date_posted` descending. |
| `payload.fields` | `array` | No | — | Dot-paths to include in each returned post, for example `actor.name` or a whole group such as `engagement`. Omit to return everything. `actor.location` and `reposter.location` are selected whole. their sub-keys are filterable but not selectable. `reactors` and `comments` are returned in full and can be long, so leave them out unless you need them. Filter-only fields (`content_type`, `materialized_at`) are rejected here. |

<details>
  <summary>Show raw input schema</summary>

  ### Input JSON Schema

  ```json theme={"languages":{"custom":["/languages/deepline-prompt.json"]}}
  {
    "type": "object",
    "description": "Request body for the indexed social post search. Every key is optional; `{}` matches the whole dataset.",
    "properties": {
      "filters": {
        "description": "A single `SocialPostDbSearchCondition` or a nested `SocialPostDbSearchConditionGroup`. Omit to match every indexed post.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "field": {
                "type": "string",
                "description": "Filterable field. Post: share_urn, backend_urn, entity_urn, parent_post_urn, share_url, text, hashtags, post_type, date_posted, is_edited, has_video. Author: actor.actor_type, actor.crustdata_entity_id, actor.linkedin_id, actor.professional_network_urn, actor.professional_network_url, actor.name, actor.headline, actor.title, actor.company_name, actor.industry, actor.location (geo target), actor.location.raw, actor.location.city, actor.location.state, actor.location.country, actor.location.continent. Reposter: reposter.actor_type, reposter.linkedin_id, reposter.professional_network_urn, reposter.professional_network_url, reposter.name, reposter.headline. Engagement: engagement.total_reactions, engagement.total_comments, engagement.num_shares, engagement.reactions_by_type.{LIKE,PRAISE,EMPATHY,INTEREST,APPRECIATION,ENTERTAINMENT}. Reactors (nested): reactors.reaction_type, reactors.actor_type, reactors.crustdata_entity_id, reactors.linkedin_id, reactors.name, reactors.headline, reactors.location, reactors.title, reactors.company, reactors.industry, reactors.professional_network_url. Comments (nested): comments.text, comments.created_at, comments.actor_type, comments.crustdata_entity_id, comments.linkedin_id, comments.name, comments.headline, comments.location, comments.title, comments.company, comments.industry, comments.professional_network_url, comments.comment_reactions.{LIKE,PRAISE,EMPATHY,INTEREST,APPRECIATION,ENTERTAINMENT}. Mentions and attachments: mentions.person_id, mentions.company_id, mentions.person_url, mentions.company_url, document.title, document.page_count, article.title, poll.question, poll.closed, poll.multi_select. Filter-only: content_type (video, image, document, article, poll), materialized_at. Any other path returns 400."
              },
              "type": {
                "type": "string",
                "description": "Filter operator. `=` exact match (case-insensitive on strings), `(.)` all-words match with typo tolerance, `[.]` exact-phrase match, `in`/`not_in` set membership (value must be an array), `is_null`/`is_not_null` presence checks (send `\"value\": null`), `geo_distance` and `geo_exclude` radius filters on `actor.location` only, and `has_all` for nested arrays (every value matched by some reactor or commenter).",
                "enum": [
                  "=",
                  "!=",
                  "<",
                  "=<",
                  ">",
                  "=>",
                  "in",
                  "not_in",
                  "is_null",
                  "is_not_null",
                  "(.)",
                  "[.]",
                  "geo_distance",
                  "geo_exclude",
                  "has_all"
                ]
              },
              "value": {
                "description": "Filter value. Scalar for `=`, `!=`, ` `, `=>`, `(.)`, and `[.]`. Array of scalars for `in`, `not_in`, and `has_all`. `null` for `is_null` and `is_not_null`. For `geo_distance` and `geo_exclude`: an object with `location` (string) or `lat_lng` ([lat, lng]), plus `distance` (number) and optional `unit` (km, mi, miles, m, meters, ft, feet)."
              }
            },
            "required": [
              "field",
              "type",
              "value"
            ],
            "additionalProperties": false
          },
          {
            "type": "object",
            "properties": {
              "op": {
                "type": "string",
                "description": "`and` and `or` combine conditions at the post level; over one nested array they bind to the same element. `all_of` is cross-element: each condition must be satisfied by some element of the nested array, evaluated independently. `all_of` accepts only positive predicates and only the nested `reactors` and `comments` fields.",
                "enum": [
                  "and",
                  "or",
                  "all_of"
                ]
              },
              "conditions": {
                "type": "array",
                "description": "One or more conditions or nested groups. An empty array returns 400.",
                "minItems": 1,
                "items": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "field": {
                          "type": "string",
                          "description": "Filterable field. Post: share_urn, backend_urn, entity_urn, parent_post_urn, share_url, text, hashtags, post_type, date_posted, is_edited, has_video. Author: actor.actor_type, actor.crustdata_entity_id, actor.linkedin_id, actor.professional_network_urn, actor.professional_network_url, actor.name, actor.headline, actor.title, actor.company_name, actor.industry, actor.location (geo target), actor.location.raw, actor.location.city, actor.location.state, actor.location.country, actor.location.continent. Reposter: reposter.actor_type, reposter.linkedin_id, reposter.professional_network_urn, reposter.professional_network_url, reposter.name, reposter.headline. Engagement: engagement.total_reactions, engagement.total_comments, engagement.num_shares, engagement.reactions_by_type.{LIKE,PRAISE,EMPATHY,INTEREST,APPRECIATION,ENTERTAINMENT}. Reactors (nested): reactors.reaction_type, reactors.actor_type, reactors.crustdata_entity_id, reactors.linkedin_id, reactors.name, reactors.headline, reactors.location, reactors.title, reactors.company, reactors.industry, reactors.professional_network_url. Comments (nested): comments.text, comments.created_at, comments.actor_type, comments.crustdata_entity_id, comments.linkedin_id, comments.name, comments.headline, comments.location, comments.title, comments.company, comments.industry, comments.professional_network_url, comments.comment_reactions.{LIKE,PRAISE,EMPATHY,INTEREST,APPRECIATION,ENTERTAINMENT}. Mentions and attachments: mentions.person_id, mentions.company_id, mentions.person_url, mentions.company_url, document.title, document.page_count, article.title, poll.question, poll.closed, poll.multi_select. Filter-only: content_type (video, image, document, article, poll), materialized_at. Any other path returns 400."
                        },
                        "type": {
                          "type": "string",
                          "description": "Filter operator. `=` exact match (case-insensitive on strings), `(.)` all-words match with typo tolerance, `[.]` exact-phrase match, `in`/`not_in` set membership (value must be an array), `is_null`/`is_not_null` presence checks (send `\"value\": null`), `geo_distance` and `geo_exclude` radius filters on `actor.location` only, and `has_all` for nested arrays (every value matched by some reactor or commenter).",
                          "enum": [
                            "=",
                            "!=",
                            "<",
                            "=<",
                            ">",
                            "=>",
                            "in",
                            "not_in",
                            "is_null",
                            "is_not_null",
                            "(.)",
                            "[.]",
                            "geo_distance",
                            "geo_exclude",
                            "has_all"
                          ]
                        },
                        "value": {
                          "description": "Filter value. Scalar for `=`, `!=`, ` `, `=>`, `(.)`, and `[.]`. Array of scalars for `in`, `not_in`, and `has_all`. `null` for `is_null` and `is_not_null`. For `geo_distance` and `geo_exclude`: an object with `location` (string) or `lat_lng` ([lat, lng]), plus `distance` (number) and optional `unit` (km, mi, miles, m, meters, ft, feet)."
                        }
                      },
                      "required": [
                        "field",
                        "type",
                        "value"
                      ],
                      "additionalProperties": false
                    },
                    {
                      "type": "object",
                      "description": "Recursive OpenAPI schema reference #/components/schemas/SocialPostDbSearchConditionGroup.",
                      "additionalProperties": true
                    }
                  ]
                }
              }
            },
            "required": [
              "op",
              "conditions"
            ],
            "additionalProperties": false
          }
        ]
      },
      "cursor": {
        "type": "string",
        "description": "Opaque cursor from a prior response's `next_cursor`. Send the same `filters`, `sorts`, and `fields` with it; a cursor issued for a different body is rejected with `Invalid cursor`."
      },
      "limit": {
        "type": "integer",
        "description": "Posts per page. `0` returns `total_count` alone and costs nothing.",
        "default": 20,
        "minimum": 0,
        "maximum": 1000
      },
      "sorts": {
        "type": "array",
        "description": "Ordering rules applied in array order. Defaults to `date_posted` descending.",
        "items": {
          "type": "object",
          "properties": {
            "field": {
              "type": "string",
              "description": "Sortable field: date_posted (default, desc), post_type, actor.actor_type, engagement.total_reactions, engagement.total_comments, engagement.num_shares, engagement.reactions_by_type.{LIKE,PRAISE,EMPATHY,INTEREST,APPRECIATION,ENTERTAINMENT}, is_edited, has_video, poll.closed, poll.multi_select, document.page_count. Any other field returns 400."
            },
            "order": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ]
            }
          },
          "required": [
            "field",
            "order"
          ],
          "additionalProperties": false
        }
      },
      "fields": {
        "type": "array",
        "description": "Dot-paths to include in each returned post, for example `actor.name` or a whole group such as `engagement`. Omit to return everything. `actor.location` and `reposter.location` are selected whole; their sub-keys are filterable but not selectable. `reactors` and `comments` are returned in full and can be long, so leave them out unless you need them. Filter-only fields (`content_type`, `materialized_at`) are rejected here.",
        "items": {
          "type": "string"
        }
      }
    },
    "required": [],
    "additionalProperties": false
  }
  ```
</details>

## Output reference

Standard tool result payload.

| Name | Type | Required | Default | Details |
| - | - | - | - | - |
| `result.data` | `object` | Yes | — | Provider response payload. |
| `result.data.posts` | `array` | Yes | — | Matching posts for the current page. Empty when `limit` is 0 or nothing matches. |
| `result.data.posts[].share_urn` | `string` | Yes | — | Post URN, the stable post id. |
| `result.data.posts[].backend_urn` | `string \| null` | No | — | — |
| `result.data.posts[].entity_urn` | `string \| null` | No | — | — |
| `result.data.posts[].parent_post_urn` | `string \| null` | No | — | URN of the original post on reposts. Empty string on original posts. |
| `result.data.posts[].share_url` | `string \| null` | No | — | Public URL of the post. |
| `result.data.posts[].text` | `string \| null` | No | — | — |
| `result.data.posts[].post_type` | `"original" \| "repost_without_thoughts" \| "repost_quote"` | No | — | Allowed: `original`, `repost_without_thoughts`, `repost_quote`. |
| `result.data.posts[].is_edited` | `boolean \| null` | No | — | — |
| `result.data.posts[].has_video` | `boolean \| null` | No | — | — |
| `result.data.posts[].date_posted` | `string \| null` | No | — | ISO-8601 UTC timestamp. |
| `result.data.posts[].hashtags` | `array \| null` | No | — | — |
| `result.data.posts[].content_types` | `array` | No | — | Attachment classes present on the post (video, image, document, article, poll). |
| `result.data.posts[].actor` | `object` | No | — | The post author (`actor`) or the resharing account (`reposter`). Keys the source record lacks are omitted rather than returned as null. |
| `result.data.posts[].actor.actor_type` | `"person" \| "company"` | No | — | Allowed: `person`, `company`. |
| `result.data.posts[].actor.crustdata_entity_id` | `integer` | No | — | Crustdata person id or company id, per `actor_type`. |
| `result.data.posts[].actor.linkedin_id` | `string` | No | — | Numeric professional network id, when known. |
| `result.data.posts[].actor.professional_network_urn` | `string` | No | — | Profile URN in URL form. |
| `result.data.posts[].actor.professional_network_url` | `string` | No | — | Public profile URL. |
| `result.data.posts[].actor.name` | `string` | No | — | — |
| `result.data.posts[].actor.headline` | `string` | No | — | — |
| `result.data.posts[].actor.title` | `string` | No | — | Current job title. People only. |
| `result.data.posts[].actor.company_name` | `string` | No | — | Current employer name. People only. |
| `result.data.posts[].actor.industry` | `string` | No | — | — |
| `result.data.posts[].actor.location` | `object` | No | — | — |
| `result.data.posts[].actor.location.raw` | `string` | No | — | — |
| `result.data.posts[].actor.location.city` | `string` | No | — | — |
| `result.data.posts[].actor.location.state` | `string` | No | — | — |
| `result.data.posts[].actor.location.country` | `string` | No | — | — |
| `result.data.posts[].actor.location.continent` | `string` | No | — | — |
| `result.data.posts[].actor.profile_picture_url` | `string` | No | — | — |
| `result.data.posts[].reposter` | `object` | No | — | The post author (`actor`) or the resharing account (`reposter`). Keys the source record lacks are omitted rather than returned as null. |
| `result.data.posts[].reposter.actor_type` | `"person" \| "company"` | No | — | Allowed: `person`, `company`. |
| `result.data.posts[].reposter.crustdata_entity_id` | `integer` | No | — | Crustdata person id or company id, per `actor_type`. |
| `result.data.posts[].reposter.linkedin_id` | `string` | No | — | Numeric professional network id, when known. |
| `result.data.posts[].reposter.professional_network_urn` | `string` | No | — | Profile URN in URL form. |
| `result.data.posts[].reposter.professional_network_url` | `string` | No | — | Public profile URL. |
| `result.data.posts[].reposter.name` | `string` | No | — | — |
| `result.data.posts[].reposter.headline` | `string` | No | — | — |
| `result.data.posts[].reposter.title` | `string` | No | — | Current job title. People only. |
| `result.data.posts[].reposter.company_name` | `string` | No | — | Current employer name. People only. |
| `result.data.posts[].reposter.industry` | `string` | No | — | — |
| `result.data.posts[].reposter.location` | `object` | No | — | — |
| `result.data.posts[].reposter.location.raw` | `string` | No | — | — |
| `result.data.posts[].reposter.location.city` | `string` | No | — | — |
| `result.data.posts[].reposter.location.state` | `string` | No | — | — |
| `result.data.posts[].reposter.location.country` | `string` | No | — | — |
| `result.data.posts[].reposter.location.continent` | `string` | No | — | — |
| `result.data.posts[].reposter.profile_picture_url` | `string` | No | — | — |

The table shows the first 50 fields. Expand the raw schema below for every field.

> [!NOTE]
>
> This output schema is too large for an inline display. Read the complete live contract with `deepline describe crustdata_v3_social_post_search --json`.

## Deepline cost

* Pricing model: `per_result` (per result).
* Estimated Deepline credits: `0.2` per pricing unit.

## Related documentation

* [CrustData V3 provider guide](https://deepline.com/docs/providers/crustdata-v3/guide.md)
* [SDK V2 quickstart](https://deepline.com/docs/sdk-v2/quickstart.md)
* [SDK reference](https://deepline.com/docs/sdk-v2/sdk-reference.md)
* [Run tools across a CSV](https://deepline.com/docs/sdk-v2/batch-csv.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.