Profile reactions
A person's reactions, each with the post it was left on.
https://api.easydata.win/v1/profiles/reactionsUp to 100 reactions by one person, each carrying which reaction it was and a stub of the post.
One profile fetch plus one feed, so two credits. There is no partial case here the way there is on `profiles/activity`: this operation asks for a single feed, so if LinkedIn refuses it there is nothing to return. The item fails, `credits_used` is 0, and you are not charged for an empty list. The result is a ProfileActivity with the other two arrays absent.
Need it in the response?POST https://api.easydata.win/v1/profiles/reactions/sync runs the same operation inside your request and hands back the record, for 4per 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 #
| Field | Type | Notes |
|---|---|---|
targetsrequired | array | What 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_id | string | Your 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_url | string | Where 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_tag | string | Route 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 -X POST "https://api.easydata.win/v1/profiles/reactions" \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"targets":["https://linkedin.com/in/satyanadella"]}'Response #
{
"data": {
"batch_id": "afec9131-080b-4b96-b3bb-726249e4bbf8",
"operation": "profiles.reactions",
"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.
{
"item_index": 0,
"input": "https://linkedin.com/in/satyanadella",
"status": "succeeded",
"credits_used": 2,
"data": {
"profile": { "...": "Profile" },
"urn": "ACoAAA8BYqEBCGLg_vT9kbxlBWbLnLGVsBWc_pI",
"reactions": [ { "...": "ActivityReaction" } ],
"scraped_at": "2026-09-01T10:00:04Z"
},
"created_at": "2026-09-01T10:00:04Z"
}Errors #
| Status | Type | When |
|---|---|---|
| 400 | invalid_request | The 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. |
| 401 | invalid_api_key | Missing, malformed, revoked or expired key. Never metered. |
| 403 | quota_exhausted | This month's allowance cannot cover the submission. Nothing is reserved and nothing is charged. |
| 403 | email_unverified | Nobody 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. |
| 429 | rate_limited | Too 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. |
| 422 | unprocessable_target | Per item, on the result entry: the profile is private, deleted or unreachable. credits_used is 0 and the batch carries on. |
| 422 | capacity_unavailable | Per 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.