LinkedIn Reactions
Reações em qualquer post. Perfil completo de cada reação.
Rode como Apify Actor. Extraia todas as reações de qualquer post do LinkedIn.
Início rápido (Apify API)
# Trigger the actor with the Apify APIcurl -X POST "https://api.apify.com/v2/acts/atomus~linkedin-reactions-scraper-pro/runs?token=YOUR_APIFY_TOKEN" \ -H "Content-Type: application/json" \ -d '{ }'O que faz
Pegue todas as reações de um post do LinkedIn com o perfil
completo de quem reagiu. Pagine até cerca de 1.200 reações por
post (limite da lista pública do LinkedIn). Filtros opcionais
marcam entradas via matches_filters mas nunca reduzem
a contagem da página. 1 crédito por página (100 reações).
Endpoint
POST https://api.atomusapi.dev/v1/linkedin-reactions/extractAutenticação
Mande sua API key como Bearer token no header Authorization. As chaves são escopadas por tenant.
Authorization: Bearer atm_live_xxxxxxxxxxxxxx — or X-RapidAPI-Proxy-Secret: <secret> when calling through the RapidAPI gatewayIdempotency
Send Idempotency-Key: <uuid> to make a request safely retryable. Atomus stores the response for 24h and replays it on retries with the same key.
Entrada
Request body
| Field | Type | Description | |
|---|---|---|---|
| postUrl | string | obrigatório | Identificador de um post do LinkedIn. Aceita: URLs /feed/update/urn:li:share:... ou /feed/update/urn:li:activity:..., URLs /posts/..., URNs share/activity, ou um activity ID bruto de 10+ dígitos. Share URNs são resolvidas para activity IDs no upstream na primeira chamada. |
| cursor | string | null | opcional | Cursor opaco de paginação retornado por uma chamada anterior. Omita na primeira requisição. Devolva data.pagination.cursor verbatim para buscar a próxima página. |
| filters.reactionType | string | null | opcional | Filtra reactors por tipo de reação. ALL (ou omitido) retorna todas as reações. Tipos do LinkedIn: LIKE, PRAISE (Celebrar), EMPATHY (Amei), APPRECIATION (Achei interessante), INTEREST (Curioso), ENTERTAINMENT (Engraçado). |
| filters.headlineKeywords | string[] | opcional | Até 20 keywords case-insensitive. Um reactor dá match quando o headline dele contém ao menos uma. Marca os reactors via matches_filters; os reactors continuam sendo retornados de qualquer forma. |
| filters.excludeCompanies | boolean | null | opcional | Quando true, marca reactors que são páginas de empresa (URLs /company/ do LinkedIn) como não-correspondentes aos filtros. Eles continuam retornados com is_company=true para você auditar o corte. |
| metadataOnly | boolean | null | opcional | Quando true, pula a extração de reactors e retorna apenas data.pagination.total_reactions_on_post. data.reactions é sempre [], pagination.has_more é sempre false, cursor e filters são ignorados. Mais barato que uma extração completa (RapidAPI: 1 reaction unit; Atomus: 1 crédito). Use pra verificar se um post tem novas reactions antes de pagar uma extração completa. |
Saída
Response object
| Field | Type | Description | |
|---|---|---|---|
| data.reactions | object[] | obrigatório | Reactors desta página, na ordem do upstream. Tamanho máximo de 100 (o LinkedIn devolve páginas de reactors de tamanho fixo; a última página pode ser menor). |
| data.reactions[].reaction_type | string | obrigatório | Tipo de reação bruto vindo do LinkedIn (LIKE, PRAISE, EMPATHY, APPRECIATION, INTEREST, ENTERTAINMENT). |
| data.reactions[].is_company | boolean | obrigatório | True quando o reactor é uma página de empresa do LinkedIn ao invés de uma pessoa. |
| data.reactions[].matches_filters | boolean | obrigatório | True quando este reactor satisfaz todos os filtros enviados (reactionType, headlineKeywords, excludeCompanies). True para todos os reactors quando nenhum filtro é enviado. |
| data.reactions[].reactor.id | string | obrigatório | ID estilo URN do LinkedIn para o reactor. Estável entre chamadas; use como chave de dedup quando agregar entre páginas ou execuções. |
| data.reactions[].reactor.name | string | obrigatório | Nome de exibição do reactor. |
| data.reactions[].reactor.headline | string | obrigatório | Headline do reactor (a frase curta abaixo do nome no LinkedIn). String vazia quando o perfil upstream não tem. |
| data.reactions[].reactor.linkedinUrl | string | obrigatório | URL canônica do LinkedIn — /in/<slug>/ para pessoas, /company/<slug>/ para páginas de empresa. Segmentos de path e query strings finais são removidos. |
| data.reactions[].reactor.profile_pic | string | null | obrigatório | URL do avatar quando o LinkedIn expõe, null caso contrário. |
| data.reactions[]._metadata.post_url | string | obrigatório | Repete o postUrl enviado após resolução share-to-activity. |
| data.reactions[]._metadata.activity_id | string | obrigatório | Activity ID do LinkedIn do post ao qual esta reação pertence. |
| data.reactions[]._metadata.extracted_at | string | obrigatório | Timestamp ISO 8601 UTC registrado quando esta reação foi extraída. |
| data.pagination.cursor | string | null | obrigatório | Token opaco. Devolva em request.cursor para buscar a próxima página. null quando has_more=false. |
| data.pagination.has_more | boolean | obrigatório | True enquanto houver mais páginas. False na última página. |
| data.pagination.total_reactions_on_post | number | obrigatório | Contagem total de reactors no post reportada pelo upstream. Pode exceder o que está acessível via paginação — veja truncated. |
| data.pagination.truncated | boolean | obrigatório | True na última página quando o LinkedIn não expôs todos os reactors em sua lista pública. O LinkedIn limita a lista pública de reactions em aproximadamente 1.200-1.250 entradas por post; reactors acima desse limite não são acessíveis a nenhuma API sem cookie. False quando has_more=true (a truncagem só pode ser detectada na última página). |
| data.pagination.truncation_note | string | null | obrigatório | Explicação legível quando truncated=true; null caso contrário. Use verbatim em respostas ao suporte. |
| meta.request_id | string | obrigatório | ID de rastreio opaco. Inclua ao abrir um chamado de suporte. |
| meta.api | string | obrigatório | Identificador da API: linkedin-reactions. |
| meta.version | string | obrigatório | Versão da API. |
| meta.mode | string | obrigatório | Modo de ambiente em que a requisição foi executada. live e test são autenticação Bearer Atomus; rapidapi indica que a requisição veio pelo gateway RapidAPI e é cobrada lá, não pelo Atomus. |
| meta.credits_used | number | obrigatório | Créditos cobrados nesta requisição. Sempre 0 no modo rapidapi (o RapidAPI cobra o consumidor do lado dele). |
| meta.credits_remaining | number | null | obrigatório | Saldo de créditos do tenant após esta requisição. null no modo rapidapi (nenhuma conta de crédito Atomus é debitada). |
| meta.duration_ms | number | obrigatório | Duração do processamento no servidor em milissegundos. |
Exemplo de request
curl
curl -X POST "https://api.atomusapi.dev/v1/linkedin-reactions/extract" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7404946870776868864/" }'JavaScript
// Atomus Bearer auth. Pass cursor on subsequent calls to paginate.async function* extractAllReactions(postUrl) { let cursor; do { const res = await fetch( "https://api.atomusapi.dev/v1/linkedin-reactions/extract", { method: "POST", headers: { "Authorization": "Bearer YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ postUrl, cursor }), } );
if (!res.ok) { const { error } = await res.json(); throw new Error(`${error.code}: ${error.message}`); }
const { data } = await res.json(); for (const r of data.reactions) yield r; cursor = data.pagination.cursor; } while (cursor);}
for await (const r of extractAllReactions( "https://www.linkedin.com/feed/update/urn:li:activity:7404946870776868864/")) { if (r.matches_filters) console.log(r.reactor.name, "—", r.reactor.headline);}Python
import requests
# Atomus Bearer auth. Pass cursor on subsequent calls to paginate.def extract_all_reactions(post_url, api_key): cursor = None while True: res = requests.post( "https://api.atomusapi.dev/v1/linkedin-reactions/extract", headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", }, json={"postUrl": post_url, "cursor": cursor}, timeout=60, ) if not res.ok: err = res.json()["error"] raise RuntimeError(f"{err['code']}: {err['message']}") data = res.json()["data"] for r in data["reactions"]: yield r cursor = data["pagination"]["cursor"] if not cursor: break
for r in extract_all_reactions( "https://www.linkedin.com/feed/update/urn:li:activity:7404946870776868864/", "YOUR_API_KEY",): if r["matches_filters"]: print(r["reactor"]["name"], "—", r["reactor"]["headline"])curl (RapidAPI)
# RapidAPI gateway auth. Use this when calling the API through your# RapidAPI subscription instead of an Atomus account. RapidAPI bills# the consumer at the gateway; the response reports mode="rapidapi"# and credits_used=0.curl -X POST "https://api.atomusapi.dev/v1/linkedin-reactions/extract" \ -H "X-RapidAPI-Proxy-Secret: YOUR_RAPIDAPI_PROXY_SECRET" \ -H "Content-Type: application/json" \ -d '{ "postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7404946870776868864/" }'curl (metadata only)
# Metadata-only mode. Returns just the post's total reaction count# without extracting individual reactors. RapidAPI: 1 reaction unit;# Atomus: 1 credit. Useful as a cheap pre-check before committing to# a full scrape — e.g. compare against a previous total to decide# whether new reactions arrived since last run.curl -X POST "https://api.atomusapi.dev/v1/linkedin-reactions/extract" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7404946870776868864/", "metadataOnly": true }'Erros e limites
{ "error": { "code": "rate_limit_exceeded", "message": "Human-readable explanation.", "retryable": true, "request_id": "req_01HXXX..." }}unauthenticatedHTTP 401 : Header Authorization ausente ou mal formado. (não retente)invalid_api_keyHTTP 401 : API key não reconhecida ou revogada. (não retente)insufficient_creditsHTTP 402 : Saldo de créditos do tenant Atomus abaixo de 1. Não é lançado para chamadas autenticadas via RapidAPI gateway (essas são cobradas pelo RapidAPI). (não retente)invalid_inputHTTP 400 : Corpo da requisição não é JSON válido ou o cursor está mal formado (precisa ser o token opaco devolvido por uma chamada anterior). (não retente)validation_failedHTTP 422 : postUrl está faltando, tem mais de 500 chars, ou o upstream rejeitou como post público inválido do LinkedIn. (não retente)rate_limit_exceededHTTP 429 : Taxa sustentada de requisições excedeu o limite do tenant. (pode retentar)upstream_errorHTTP 502 : Provedor upstream retornou uma resposta de erro. (pode retentar)upstream_timeoutHTTP 504 : Provedor upstream não respondeu dentro do tempo limite. (pode retentar)internal_errorHTTP 500 : Erro inesperado no servidor. (pode retentar)
Limites de taxa
5 requests/segundo por conta (compartilhado entre todas as API keys da mesma conta). Cada chamada busca uma página do upstream (até 100 reactors). Picos acima do limite retornam 429 rate_limit_exceeded; faça backoff usando os response headers. A janela por segundo é enforced no servidor; as linhas por minuto, hora, dia, semana e mês são derivações de throughput sustentado.
| Janela | Máx. requests |
|---|---|
| Por segundo | 5 |
| Por minuto | 300 |
| Por hora | 18,000 |
| Por dia | 432,000 |
| Por semana | 3,024,000 |
| Por mês | 12,960,000 |
x-ratelimit-limit: máximo de requests por segundo da conta (compartilhado entre todas as keys)x-ratelimit-remaining: requests restantes na janela atualx-ratelimit-reset: unix epoch (segundos) quando a janela reseta
Cobrança
- US$ 0,005 por reactor retornado (US$ 5 por 1.000) — cobrado como 1 crédito Atomus por página (100 reactors) = US$ 0,50 por página
Modo Atomus (live): um crédito reservado por chamada, settled em um crédito no sucesso independente de quantas reactions o LinkedIn retornou (filtros marcam entradas via matches_filters mas nunca reduzem a contagem da página). Erros antes de qualquer chamada upstream estornam a reserva. Modo RapidAPI (X-RapidAPI-Proxy-Secret): o RapidAPI cobra o consumidor no gateway via response header X-RapidAPI-Billing (objeto de quota Reactions, US$ 0,005 cada); o Atomus não deduz créditos e reporta credits_used=0 com credits_remaining=null no meta da resposta.
Use o gateway RapidAPI. Cobrança por reação no gateway, sem precisar de conta Atomus.
Início rápido (gateway RapidAPI)
# RapidAPI gateway authenticationcurl -X POST "https://api.atomusapi.dev/v1/linkedin-reactions/extract" \ -H "X-RapidAPI-Key: YOUR_RAPIDAPI_KEY" \ -H "X-RapidAPI-Host: api.atomusapi.dev" \ -H "Content-Type: application/json" \ -d '{ }'Rodando altos volumes?
Pule os tiers do marketplace e tenha preço unitário ajustado ao seu volume real de chamadas, com linha direta para quem opera o pipeline.
Ver preço por volume