Enrich posts

The post record for each target: author, body, media, engagement.

POSThttps://api.easydata.win/v1/posts/enrich
1  per target1 fetch

Returns the post record for every identifier you send: its author, body, media, engagement counts and the top comments, all from a single request.

A post URL and a bare post URN both resolve to the same record - which one you hold is an accident of where you copied it from, not a decision the API should ask you to make.

One credit, because this is one request to LinkedIn: a single Voyager query returns the post, its author, media, engagement breakdown and top comments together.

Need it in the response?POST https://api.easydata.win/v1/posts/enrich/sync runs the same operation inside your request and hands back the record, for 2per target - twice the price above, because it outranks every queued batch for a worker and holds one open while you wait. It takes target, one entity, never a targets array. See Synchronous requests.

Request #

FieldTypeNotes
targetsrequiredarrayWhat to look up. Each entry is a bare string - read as a URL or a public identifier - or an object. At most 50,000 per submission; splitting a larger job into several batches costs nothing.
external_idstringYour own correlation handle. It comes back on the batch, on the completion webhook and in the usage rollup, so spend can be attributed to your pipeline rather than only to ours.
callback_urlstringWhere to deliver batch.completed. Optional - polling is a first-class path, not a fallback. Validated when you send it and again when we dial it. Mutually exclusive with webhook_tag.
webhook_tagstringRoute the completion to the endpoints carrying this tag instead of to the untagged ones, so you can name a destination without knowing its URL. A tag matching no enabled endpoint is refused here rather than discovered as a webhook that never fired.

Call it #

cURL
curl -X POST "https://api.easydata.win/v1/posts/enrich" \
  -H "X-API-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"targets":["https://www.linkedin.com/feed/update/urn:li:activity:7000000000000000000/"]}'

Response #

JSON
{
  "data": {
    "batch_id": "afec9131-080b-4b96-b3bb-726249e4bbf8",
    "operation": "posts.enrich",
    "status": "queued",
    "total": 2,
    "succeeded": 0,
    "failed": 0,
    "pending": 2,
    "results_available": 0,
    "credits_used": 0,
    "external_id": "crm-sync-2026-09-01",
    "created_at": "2026-09-01T10:00:00Z",
    "completed_at": null,
    "recommended_poll_ms": 2000
  },
  "meta": { "requestId": "req_8f2ka91x", "recommendedPollMs": 2000 }
}

A result entry #

Once the batch has drained, this is what reading its results gives you.

JSON
{
  "item_index": 0,
  "input": "https://www.linkedin.com/feed/update/urn:li:activity:7000000000000000000/",
  "status": "succeeded",
  "credits_used": 1,
  "data": {
    "urn": "7000000000000000000",
    "share_urn": "urn:li:share:7000000000000000000",
    "url": "https://www.linkedin.com/feed/update/urn:li:activity:7000000000000000000/",
    "author": {
      "name": "Satya Nadella",
      "url": "https://www.linkedin.com/in/satyanadella",
      "headline": "Chairman and CEO at Microsoft",
      "avatar_url": "https://media.licdn.com/dms/image/..."
    },
    "text": "Congratulations to the team on today's launch.",
    "posted_at": "2026-08-28T09:11:00Z",
    "content_type": "image",
    "media": [ { "...": "PostMedia" } ],
    "mentions": [ { "...": "PostMention" } ],
    "hashtags": ["AI", "Copilot"],
    "reaction_count": 412,
    "comment_count": 38,
    "repost_count": 12,
    "reactions_by_type": [
      { "type": "PRAISE", "count": 210 },
      { "type": "LIKE", "count": 160 }
    ],
    "is_repost": false,
    "comments": [
      {
        "urn": "7000000000000001",
        "url": "https://www.linkedin.com/feed/update/urn:li:activity:7000000000000000000/?commentUrn=...",
        "text": "Huge milestone. Congratulations to everyone involved.",
        "commented_at": "2026-08-28T11:04:00Z",
        "author": {
          "name": "Elina Virtanen",
          "url": "https://www.linkedin.com/in/ACwAAAyHg0MB",
          "headline": "Head of Engineering",
          "avatar_url": "https://media.licdn.com/dms/image/..."
        },
        "reaction_count": 14,
        "reply_count": 2,
        "replies": [ { "...": "PostComment" } ]
      },
      { "...": "PostComment" }
    ],
    "scraped_at": "2026-09-01T10:00:04Z"
  },
  "created_at": "2026-09-01T10:00:04Z"
}

Comments come back only here. profiles/posts returns posts without them, because a feed page carries no comment bodies and fetching them per post would turn one request into a hundred.

comment_count is LinkedIn's own total and is routinely larger than the comments array, as it is in the sample above: the array is the top comments LinkedIn served with this one request, each carrying the first reply, and it is not every comment on the post.

Errors #

StatusTypeWhen
400invalid_requestThe body could not be accepted as sent. `error.field` names what was wrong. A field this reference does not list is one of these: an unknown key is refused rather than accepted and ignored, because a typo that is silently dropped is indistinguishable from one that worked.
401invalid_api_keyMissing, malformed, revoked or expired key. Never metered.
403quota_exhaustedThis month's allowance cannot cover the submission. Nothing is reserved and nothing is charged.
403email_unverifiedNobody on the account has confirmed their email address, and the account is on the default allowance rather than an agreed one. Open the link sent when the account was created, or request a new one from the console.
429rate_limitedToo fast: the request budget for your key, too many batches in flight, too many synchronous requests (per minute or at once), or an agreed hourly spend already met. `message` says which. Carries `Retry-After`. Never metered.
422unprocessable_targetPer item, on the result entry: the post is deleted, private or unreachable. credits_used is 0 and the batch carries on.
422capacity_unavailablePer item: we had no capacity able to run it right now. The message narrows it - Sales Navigator capacity on a search, general capacity elsewhere. credits_used is 0, so retrying later costs you only the wait.

Every failure uses the same envelope, and none of them is metered - see Errors.