{
"items": [
{
"profile_status": "success",
"linkedin_url": "https://www.linkedin.com/in/example-person-000000",
"profile_picture_url": "https://www.example.org/images/example-person.png",
"first_name": "Example",
"last_name": "Person",
"full_name": "Example Person",
"company_name": "Example Company",
"job_title": "Example role",
"location": "Example City",
"domain": "example.org",
"linkedin_company_url": "https://www.linkedin.com/company/example-company",
"headline": "Example role at Example Company",
"reaction_type": "COMMENT",
"comment": "Example comment",
"post_url": "https://www.linkedin.com/posts/example_activity-7376356221991178240"
}
],
"pagination": {
"next_cursor": "pje1.synthetic_cursor",
"has_more": true
},
"retrieval": {
"reported_total": 120,
"returned_count": 1,
"retrieved_total": 1,
"status": "more_available",
"stop_reason": "page_limit"
},
"billing": {
"credits_consumed": 0.2,
"credits_refunded": 4.8,
"outcomes": {
"success": 1,
"not_found": 0,
"error": 0
}
}
}{
"status": "pending",
"code": "page_pending",
"idempotency_key": "00000000-0000-4000-8000-000000000001",
"retry_after_ms": 15000,
"message": "Retry the identical page with this Idempotency-Key to retrieve its result."
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}Post commenters
Retrieve and enrich people who commented on a LinkedIn post. Rate limit: 180 requests per fixed minute per workspace, shared by post-likers and post-commenters; pagination requests and retries count.
{
"items": [
{
"profile_status": "success",
"linkedin_url": "https://www.linkedin.com/in/example-person-000000",
"profile_picture_url": "https://www.example.org/images/example-person.png",
"first_name": "Example",
"last_name": "Person",
"full_name": "Example Person",
"company_name": "Example Company",
"job_title": "Example role",
"location": "Example City",
"domain": "example.org",
"linkedin_company_url": "https://www.linkedin.com/company/example-company",
"headline": "Example role at Example Company",
"reaction_type": "COMMENT",
"comment": "Example comment",
"post_url": "https://www.linkedin.com/posts/example_activity-7376356221991178240"
}
],
"pagination": {
"next_cursor": "pje1.synthetic_cursor",
"has_more": true
},
"retrieval": {
"reported_total": 120,
"returned_count": 1,
"retrieved_total": 1,
"status": "more_available",
"stop_reason": "page_limit"
},
"billing": {
"credits_consumed": 0.2,
"credits_refunded": 4.8,
"outcomes": {
"success": 1,
"not_found": 0,
"error": 0
}
}
}{
"status": "pending",
"code": "page_pending",
"idempotency_key": "00000000-0000-4000-8000-000000000001",
"retry_after_ms": 15000,
"message": "Retry the identical page with this Idempotency-Key to retrieve its result."
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}{
"error": "<string>",
"message": "<string>",
"code": "<string>",
"idempotency_key": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"retry_after_ms": 1
}enrich_profiles omitted or true, reserve limit × 0.2 credits and charge 0.2 credits per successfully enriched profile. Unused slots and definitive not_found or error outcomes are refunded. Uncertain work keeps its reservation until the identical request is reconciled.Extraction-only mode
Setenrich_profiles: false to return available engagement fields without profile lookups. Rows use profile_status: "not_enriched". This works with V1 and V2 workspace keys.
Extraction-only costs 1 credit per fresh native provider page, including valid empty terminal pages. limit controls returned people; one response can consume several native pages. Cached remainder slices and identical same-key retries are free. Read billing.credits_consumed for the actual charge. V1 balances update asynchronously through its billing queue.
Keep enrich_profiles: false and the returned cursor for continuation; use a new key for the next page. A response can preserve paid rows with retrieval.status: "partial" and stop_reason: "insufficient_credits" or "provider_failure". Keep those rows, billing and cursor. An uncertain page_attempt_pending outcome must retain the original body and key for reconciliation; starting fresh can repeat work and charges.
Rate limit
The limit is 180 requests per minute per workspace, shared by Post likers and Post commenters, including different API keys for the same workspace. Pagination requests and retries each count toward this limit. The counter uses a fixed minute window and resets at the next minute boundary. Requests above the limit receive HTTP429 without starting the page or charging credits. Wait until the next minute, then retry the identical page with the same Idempotency-Key using bounded backoff. This is a request limit, not a guarantee of enrichment throughput; the maximum page size remains 25.
Pagination
Omitcursor on the first request. When pagination.next_cursor is not null, send it unchanged with the same post URL, limit, and enrich_profiles mode to fetch the next page. The page size is 1–25 (default 25). New cursors expire after 10 minutes and are bound to the workspace, post, engagement type, page size, and enrichment mode.
Optional retrieval metadata contains reported_total, returned_count, status, and stop_reason, and can include retrieved_total. A partial status with stop_reason: "provider_total_mismatch" means fewer engagements could be retrieved than the post reports. A provider_exhausted status means there are no more pages available for this request; it does not guarantee that every LinkedIn engagement was accessible. Reported totals can change, and comment events are not the same count as unique authors. Public pagination does not promise every reply returned by the dashboard’s background extraction.
Safe retries
Supply an optional UUID in theIdempotency-Key header. Save that key together with the endpoint and exact request body before sending the request. Reuse the same key with the identical post_url, limit, cursor, and enrich_profiles mode if the response is lost or processing is uncertain. Use a new key for the next page.
The code examples read AIRSCALE_PAGE_KEY from your environment. Set it to a UUID once for each new page, and keep that value for every retry of that page. Replace the synthetic post URL and cursor with your own values.
Omitting the header remains supported. However, an independent retry without the original key can reserve credits again. When a pending or uncertain response includes idempotency_key, retain and send that returned key even if your first request omitted the header.
Completed enriched results remain replayable for 24 hours after completion, including after the input cursor expires. An expired cursor cannot fetch a new extraction-only page; an exact saved retry can finish an outstanding refund before returning invalid_cursor. A reservation for unresolved work does not automatically become a refund after 24 hours.
Pending and error responses
A202 response with status: "pending" and code: "page_pending" means the request did not finish within 90 seconds. The outcome is unconfirmed; processing may still be running or may not have started. Wait for Retry-After (15 seconds for this response), then resend the identical page with the returned idempotency_key. The body also supplies retry_after_ms.
| Response | Next action |
|---|---|
409 replay_in_progress | Wait, then retry the identical page with the same key. |
409 replay_request_mismatch | Restore the original request fields for that key. Use a new key only for intentionally different work. |
503 account_busy, rate_limited, or provider_unavailable | Keep the page and key unchanged. Wait for the supplied delay and retry with bounded backoff. |
503 provider_page_unavailable | Wait for the supplied delay, then retry the same cursor and key. |
503 account_restart_required | Start again without a cursor and with a new key. Deduplicate results already received. |
Other 502 or 503 responses carrying idempotency_key | Preserve the original body and returned key. Retry with bounded backoff; do not assume that an unconfirmed request was refunded. |
429 Too Many Requests | Wait and retry the same page and key with bounded exponential backoff. |
Avoid duplicate charges
Retry the same page with the same key to resume it without charging again for profiles already paid for. Keep that key until you receive a final result. Starting again with a new key is a new billable request.Next step
Use Post likers for the other engagement type, or read the post engagement workflow for the dashboard flow.Authorizations
Use an Airscale workspace API key. Never expose the key in client-side code.
Headers
Create a UUID for this page and reuse it with the identical endpoint, post_url, limit, cursor and enrich_profiles mode on every retry. Use a new key for the next page. Completed results are replayable for 24 hours after completion. Omitting the header is supported, but an independent retry without the original key can reserve credits again.
Body
Provide a LinkedIn post URL, an optional page size from 1 to 25, and the opaque cursor when continuing pagination. The JSON body must not exceed 128 KiB.
An HTTP(S) LinkedIn post URL containing an activity identifier.
1 - 2048Number of engagements to request on this page.
1 <= x <= 25Omitted or true enriches profiles at 0.2 credits per successful profile. False returns available engagement fields without profile lookups and costs 1 credit per fresh native provider page, including empty terminal pages; cached slices and identical retries are free. Keep the mode unchanged when continuing a cursor.
An opaque cursor returned by the preceding page. Send it unchanged.
1 - 8192Response
A page of LinkedIn post engagements with profile enrichment or extraction-only fields, depending on enrich_profiles.
The requested engagements with public profile fields and enrichment status.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Optional pagination details. Reaching the last available page does not guarantee that every LinkedIn engagement was accessible.
Show child attributes
Show child attributes