---
title: "Get the account's home feed"
method: GET
path: "/v1/{account_id}/feed/home"
tags: ["Feed"]
---

# Get the account's home feed

`GET /v1/{account_id}/feed/home`

## Request

- Base URL: `https://api.curviate.com`
- URL: `https://api.curviate.com/v1/{account_id}/feed/home`
- Auth: HTTP bearer

Returns the account's LinkedIn home feed as agent-actionable posts. sort=recent (default) is always available; sort=relevant can rate-limit. Each post carries the activity id for the Posts group. Page until cursor is null.

## Path parameters

- `account_id` string, required

## Query parameters

- `sort` 'recent' | 'relevant'
- `limit` integer
- `cursor` string

## Response `200`

The connected account's home feed as agent-actionable posts. `sort=recent` (default) resolves each post's activity id + created_at + text + author name + post URL + kind, with engagement null; `sort=relevant` resolves the full shape (text, engagement, author id-triple). An empty feed is a valid 200 (items:[], cursor:null). Page until cursor is null.

- object
  - `object` 'feed_post_list', required: Response type discriminator.
  - `items` object[], required: The feed posts, in feed order (for recent, appearance order == recency). [] for an empty feed (a 200 success). A page may return slightly more than `limit` (whole pages up to the next boundary).
    - `object` 'feed_post', required: Item type discriminator.
    - `activity_urn_id` string, required: The post's numeric activity id (no urn prefix), the primary durable handle to react/comment/fetch-detail, and the feed dedup key (the feed reorders; there is no disjoint-page guarantee). Both sorts.
    - `author` object, required: The post's author. On `sort=recent` only `name` resolves (`type` is `other`, the rest null).
      - `type` 'individual' | 'organization' | 'other', required: Person -> individual; company/showcase/sponsored -> organization; unresolved (every recent author) -> other.
      - `name` string, nullable, required: Author display name.
      - `headline` string, nullable, required: Author headline/tagline. null on recent.
      - `posted_ago` string, nullable, required: Relative time label as rendered ("6d", "1w") or "Promoted" for sponsored posts. Locale-dependent. null on recent.
      - `member_id` string, nullable, required: Obfuscated member id (ACoAA...), set for person authors (relevant).
      - `numeric_id` string, nullable, required: Numeric member id, the strongest durable cross-action join key. Person authors (relevant).
      - `vanity` string, nullable, required: Public identifier slug. Person authors (relevant).
      - `company_id` string, nullable, required: Numeric company/organization id, organization authors (relevant), instead of a member id.
      - `profile_url` string, nullable, required: Canonical profile URL.
    - `text` string, nullable, required: Full post body, verbatim, on both sorts. null when the post has no body. Pass-through, never stored.
    - `created_at` string, nullable, required: ISO-8601 UTC datetime the feed activity was created, derived from the activity id (the same source as get-post's `created_at`). Both sorts. For a reshare this is when the reshare was made. null when the id does not carry a time.
    - `post_url` string, nullable, required: Canonical post URL (recent). null on relevant.
    - `kind` string, nullable, required: Post type parsed from the URL slug: ugcPost | share | groupPost | activity | post (recent). Open enum. null on relevant.
    - `is_promoted` boolean, required: true for sponsored/promoted posts (relevant). Defaults false.
    - `is_reshare` boolean, required: true if this post reshares another (relevant). Defaults false.
    - `reshared_from` object, nullable, required: When `is_reshare`, the original post's { name, text }; else null.
      - `name` string, nullable, required: Original author's display name.
      - `text` string, nullable, required: Original post body (pass-through; never stored).
    - `engagement` object, required: Engagement counts. Every count is null on recent, which cannot read them; use sort=relevant for counts. A null count is unknown, never zero.
      - `likes` number, nullable, required: Reaction count, or null when the sort cannot read it.
      - `comments` number, nullable, required: Comment count, or null when the sort cannot read it.
      - `shares` number, nullable, required: Reshare count, or null when the sort cannot read it.
  - `cursor` string, nullable, required: Opaque cursor for the next page; null when the walk is exhausted. Self-describing of the sort, pass it back verbatim as `cursor`. The relevant cursor expires (~1h). There is no total (an unbounded, reordering stream); page until cursor is null.
  - `safety_warning` SafetyWarning: Present on a successful response when this account crossed an account-safety ceiling while the affected budget row is on the default warn posture. The action still happened. Field-identical to the BUDGET_EXHAUSTED error body except that blocked is false and hint.message describes the outcome, so one branch handles both postures and switching the account to enforce is a configuration change rather than a client rewrite.
    - `row` string, nullable, required: The budget row that breached, for example profile_views or pending_invites. Null when the breach is not about a row: an activity_window warning on an action that spends no budget of its own (editing a message, dismissing a notification, a Recruiter or Sales Navigator admin action) is still governed by the hours the account works in. Read hint.parameter for what to change; whenever this is null it names posture, because the activity window edges are set per action type and this action has none, so the levers that reach it are the account timezone and posture.
    - `reset_at` string, nullable, required: The instant the refusal lifts: the window roll on a ceiling refusal, the next window open on an activity-window one. Null in the two cases no clock frees, the pending_invites gauge and InMail credits (row inmail).
    - `hint` object, required
      - `parameter` string, required: The settable parameter on PATCH /v1/{account_id}/safety-policy.
      - `message` string, required: What the condition is and what changing that parameter would do. This is the one field whose text differs from the BUDGET_EXHAUSTED refusal: here it says the action went through, and on a ceiling breach how far past the ceiling this row now stands, rather than telling you to set posture to warn when it already is. Branch on parameter, reason and blocked, never on this text.
    - `reason` 'ceiling' | 'activity_window', required: Which rule was crossed. ceiling means the row's configured limit is spent; activity_window means the account is outside the hours it works in, which is a different fact with a different remedy. hint.parameter names the right setting for each.
    - `blocked` boolean, required: Always false here. True on the BUDGET_EXHAUSTED refusal carrying the same payload.

## Other responses

- `400`: Invalid request, an unsupported `sort`, an out-of-range `limit`, or a corrupt/expired `cursor`.
- `401`: The connected LinkedIn account's session is disconnected, reconnect the account.
- `403`: The LinkedIn account lacks a feature backing the feed. Not expected, both free and premium accounts read the home feed; documented for completeness.
- `404`: The account_id does not belong to this tenant, or the account is unknown. An id whose connection was replaced or removed also stops resolving here, and it is already absent from the list, so re-read `GET /v1/accounts` for the current id.
- `429`: Rate limited. `sort=relevant` draws on a shared, throttled ranked-feed budget; when it is exhausted this is returned (never a silent empty feed). `sort=recent` is not rate-limited, prefer it when the budget is tight. Retry after the hinted delay.
- `500`: Internal error.
- `502`: A temporary upstream error occurred, or the upstream response could not be interpreted. Check `retry_likely_to_succeed`: a temporary error is worth retrying, a response that could not be interpreted is not, and carries `retry_hint: {"kind": "never"}`.
- `503`: Service unavailable.
- `504`: Gateway timeout.

---

[API](https://skmtc.dev/curviate/apis/curviate-api.md) · [All operations](https://skmtc.dev/curviate/apis/curviate-api/llms.txt) · [OpenAPI document](https://skmtc.dev/curviate/apis/curviate-api/revisions/eab848801d95?raw)
