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

# Profile posts

> Retrieve a LinkedIn profile's feed, newest first, including the person's posts and reposts. Rate limit: 180 requests per fixed minute per workspace, counted separately for each LinkedIn content endpoint; pagination requests and retries count.

Retrieve one synchronous page of up to 50 posts from a LinkedIn profile's feed, newest first, including the person's own posts and their reposts. Each post carries its author, content, publication date, engagement counts, and image URLs. Rows are returned as found on LinkedIn, without profile enrichment.

<Note>
  Each successful request costs **1 credit**, whatever the number of posts returned. A successful empty page is also charged. Invalid input and failed requests are not charged. The workspace needs at least 1 credit to start a request.
</Note>

## Authentication

Send your Airscale workspace API key as a Bearer token. Both V1 and V2 workspace API keys are accepted.

## Request fields

Send `profile_url` as a LinkedIn profile URL (`linkedin.com/in/...`). Optionally set `posted_within` to `1h`, `24h`, `week`, `month`, `3months`, `6months`, or `year` to return only recent posts. Unknown fields are rejected with `400`.

The period is applied to each fetched page, so a page can hold fewer than 50 posts. Pagination stops at the first page with no post inside the period.

Rows use the same post fields as [Post search](/api-reference/post-search). A repost keeps the original post's `author`; `feed_context` then holds LinkedIn's feed label, such as `"Example Person reposted this"`. It is `null` for a plain post by the profile.

## Rate limit

The limit is **180 requests per minute per workspace** for Profile posts, including requests made with different API keys for the same workspace. [Company posts](/api-reference/company-posts), [Post search](/api-reference/post-search), [Profile comments](/api-reference/profile-comments), and [Comment likers](/api-reference/comment-likers) each have their own separate 180-request allowance. Pagination requests and retries count toward the limit.

The counter uses a fixed minute window and resets at the next minute boundary. Requests above the limit receive HTTP `429` and are not charged. When LinkedIn content capacity is busy for all workspaces, the response is a free `503` with `Retry-After: 5`.

## Pagination

Omit `cursor` on the first request. When `pagination.next_cursor` is not `null`, send it unchanged together with the same `profile_url` and `posted_within` to fetch the next page. A cursor sent with different fields, or to another endpoint, returns `400`.

`pagination.total` is always `null` for this endpoint because no reliable total is reported. Use `has_more` and `next_cursor` to decide whether to continue.

## Retries

This endpoint does not accept an idempotency key. Retrying a request fetches the page again and is charged again. Retry only responses that were not charged:

| Response | Next action |
| - | - |
| `400 Bad Request` | Correct the body or cursor. The `message` field names the problem. |
| `403 Forbidden` | Add credits to the workspace before retrying. |
| `413 Payload Too Large` | Keep the JSON body under 16 KiB. |
| `429 Too Many Requests` | Wait for the next minute boundary, then retry with bounded exponential backoff. |
| `502 Bad Gateway` or `504 Gateway Timeout` | Retry with increasing delays and a fixed retry limit. |
| `503 Service Unavailable` | Wait for `Retry-After` when present, then retry with bounded backoff. |

## Next step

Use [Profile comments](/api-reference/profile-comments) to see what the same profile comments on, or [Post likers](/api-reference/post-likers) to retrieve enriched people who liked one of the returned posts.


## OpenAPI

````yaml openapi.json POST /v1/profile-posts
openapi: 3.1.0
info:
  title: Airscale Public API
  version: '2026-09-11'
  description: Search, enrich, and resolve public business data with Airscale.
  x-airscale-source-repository: ViceScale/airscale-code
  x-airscale-source-sha: 1de19e1b70a052a4b8d9c2075021a7e5e7a94d51
servers:
  - url: https://api.airscale.io
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Search and discovery
    description: Search people, companies, and the web.
  - name: Contact data
    description: Find professional and personal contact data.
  - name: Profiles and reverse lookup
    description: Extract profiles or resolve a person from known contact data.
  - name: Post engagement
    description: Retrieve and enrich people who liked or commented on LinkedIn posts.
  - name: LinkedIn content
    description: >-
      Search LinkedIn posts, read profile and company feeds, and retrieve
      profile comments and comment reactions.
  - name: Account
    description: Inspect workspace account state.
  - name: Miscellaneous
    description: Check WhatsApp availability, Meta ads, and email deliverability.
paths:
  /v1/profile-posts:
    post:
      tags:
        - LinkedIn content
      summary: List a LinkedIn profile's posts
      description: >-
        Returns one page of up to 50 posts from a LinkedIn profile's feed,
        newest first, including the person's posts and reposts. Costs 1 credit
        per successful request.
      operationId: listLinkedinProfilePosts
      requestBody:
        required: true
        description: >-
          A LinkedIn profile URL, an optional period, and an optional cursor.
          The JSON body must not exceed 16 KiB.
        content:
          application/json:
            schema:
              type: object
              required:
                - profile_url
              additionalProperties: false
              properties:
                profile_url:
                  type: string
                  minLength: 1
                  maxLength: 2048
                  description: LinkedIn profile URL (linkedin.com/in/...).
                posted_within:
                  type:
                    - string
                    - 'null'
                  enum:
                    - 1h
                    - 24h
                    - week
                    - month
                    - 3months
                    - 6months
                    - year
                    - null
                  description: >-
                    Only return posts from this period. The period is applied to
                    each fetched page, so pages can hold fewer than 50 posts,
                    and pagination stops at the first page with no post inside
                    the period.
                cursor:
                  type:
                    - string
                    - 'null'
                  minLength: 1
                  maxLength: 2048
                  description: >-
                    The opaque `pagination.next_cursor` from the previous page.
                    Send it unchanged with the same filters as the first page.
            examples:
              firstPage:
                summary: First page
                value:
                  profile_url: https://www.linkedin.com/in/example-person
                  posted_within: 3months
              nextPage:
                summary: Next page
                value:
                  profile_url: https://www.linkedin.com/in/example-person
                  posted_within: 3months
                  cursor: eyJ2IjoxLCJyIjoiZXhhbXBsZSJ9
      responses:
        '200':
          description: A page of posts from the profile's feed, newest first.
          content:
            application/json:
              schema:
                type: object
                required:
                  - items
                  - pagination
                  - billing
                additionalProperties: false
                properties:
                  items:
                    type: array
                    items:
                      type: object
                      required:
                        - post_url
                        - post_id
                        - content
                        - posted_at
                        - author
                        - likes
                        - comments
                        - shares
                        - feed_context
                        - image_urls
                      additionalProperties: false
                      properties:
                        post_url:
                          type: string
                        post_id:
                          type:
                            - string
                            - 'null'
                        content:
                          type:
                            - string
                            - 'null'
                        posted_at:
                          type:
                            - string
                            - 'null'
                          format: date-time
                        author:
                          type:
                            - object
                            - 'null'
                          required:
                            - type
                            - name
                            - linkedin_url
                            - headline
                            - picture_url
                          additionalProperties: false
                          properties:
                            type:
                              type: string
                              enum:
                                - person
                                - company
                            name:
                              type:
                                - string
                                - 'null'
                            linkedin_url:
                              type:
                                - string
                                - 'null'
                              description: Canonical LinkedIn profile or company URL.
                            headline:
                              type:
                                - string
                                - 'null'
                            picture_url:
                              type:
                                - string
                                - 'null'
                        likes:
                          type:
                            - integer
                            - 'null'
                          minimum: 0
                        comments:
                          type:
                            - integer
                            - 'null'
                          minimum: 0
                        shares:
                          type:
                            - integer
                            - 'null'
                          minimum: 0
                        feed_context:
                          type:
                            - string
                            - 'null'
                          description: >-
                            LinkedIn's feed label when the row is not a plain
                            post by the author, such as "Example Person reposted
                            this" or "Example Company collaborated on this".
                            Null for a plain post.
                        image_urls:
                          type: array
                          items:
                            type: string
                    description: Posts and reposts from the profile's feed, newest first.
                  pagination:
                    type: object
                    required:
                      - has_more
                      - next_cursor
                      - total
                    additionalProperties: false
                    properties:
                      has_more:
                        type: boolean
                      next_cursor:
                        type:
                          - string
                          - 'null'
                        description: >-
                          Opaque cursor for the next page, or null when no
                          further page is available.
                      total:
                        type:
                          - integer
                          - 'null'
                        minimum: 0
                        description: >-
                          Always null: no reliable total is reported for profile
                          posts.
                  billing:
                    type: object
                    required:
                      - credits_consumed
                    additionalProperties: false
                    properties:
                      credits_consumed:
                        type: integer
                        const: 1
              examples:
                page:
                  summary: Synthetic page
                  value:
                    items:
                      - post_url: >-
                          https://www.linkedin.com/posts/example-person_sales-activity-7511035039397339136-8myb
                        post_id: '7511035039397339136'
                        content: Example post about sales automation.
                        posted_at: '2026-09-30T12:11:41.675Z'
                        author:
                          type: person
                          name: Example Person
                          linkedin_url: https://www.linkedin.com/in/example-person
                          headline: Head of Sales at Example Company
                          picture_url: https://www.example.org/images/example-person.png
                        likes: 4
                        comments: 1
                        shares: 0
                        feed_context: null
                        image_urls:
                          - https://www.example.org/images/example-post.png
                      - post_url: >-
                          https://www.linkedin.com/posts/example-company_launch-activity-7511035039397339137-abcd
                        post_id: '7511035039397339137'
                        content: Launch day
                        posted_at: '2026-09-30T11:00:00.000Z'
                        author:
                          type: company
                          name: Example Company
                          linkedin_url: https://www.linkedin.com/company/example-company
                          headline: 1,117 followers
                          picture_url: https://www.example.org/images/example-company.png
                        likes: 0
                        comments: 0
                        shares: 0
                        feed_context: Example Person reposted this
                        image_urls: []
                    pagination:
                      has_more: true
                      next_cursor: eyJ2IjoxLCJyIjoiZXhhbXBsZSJ9
                      total: null
                    billing:
                      credits_consumed: 1
        '400':
          description: >-
            The JSON body is invalid, contains an unsupported field, or carries
            a cursor that is malformed or belongs to a different request. Not
            charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          description: >-
            The workspace does not have enough credits for this request. Not
            charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '413':
          description: The JSON request body exceeds the 16 KiB limit.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: >-
            The workspace has exceeded 180 requests per minute for this
            endpoint. Each LinkedIn content endpoint has its own counter. Wait
            until the next minute boundary, then retry with bounded backoff. Not
            charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: >-
            The LinkedIn content lookup failed. Not charged; retry with
            increasing delays.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: >-
            The lookup is busy (the response includes Retry-After: 5) or a
            required service is unavailable. Not charged; wait and retry with
            bounded backoff.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
          headers:
            Retry-After:
              description: Seconds to wait before retrying when the lookup is busy.
              schema:
                type: string
              example: '5'
        '504':
          description: The LinkedIn content lookup timed out. Not charged; retry later.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    Error:
      type: object
      additionalProperties: true
      properties:
        error:
          type: string
        message:
          type: string
  responses:
    Unauthorized:
      description: The Bearer token is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        Use an Airscale workspace API key. Never expose the key in client-side
        code.

````