# LinkedIn Ad Detail

Get one public LinkedIn Ad Library ad by its numeric ID: ad copy, advertiser, payer, run dates, and the targeting panel. The targeting keys are the panel headings as LinkedIn publishes them, lower-cased and underscored, so the set differs per ad and per region — the sample below is illustrative, not a fixed schema. The impression breakdown depends on where the ad actually ran and is returned as null when LinkedIn does not publish one. upstream_calls reports the number of real upstream requests made; it exceeds 1 only when a request was refused and retried, which is not a fan-out and not an extra charge. The Errors section lists the common cases rather than every code: any failed request carries an error_code, and none of them is billed.

- **Documentation:** [https://scrappa.co/docs/linkedin-api/linkedin_ads_detail](https://scrappa.co/docs/linkedin-api/linkedin_ads_detail)
- **API group:** LinkedIn API
- **Endpoint:** `GET https://scrappa.co/api/linkedin/ads/detail`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `ad_id` | string | Yes | Numeric LinkedIn Ad Library ad ID, as returned by the Ads Search endpoint. |

## Example request

```bash
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/linkedin/ads/detail?ad_id=541239876501"
```

## Example response

```json
{
    "ad_id": "541239876501",
    "copy": "See the full platform in action.",
    "advertiser": "Acme Analytics",
    "payer": "Acme Analytics GmbH",
    "run_dates": "1 Mar 2026 - 30 Apr 2026",
    "targeting": {
        "language": "English",
        "location": "United States"
    },
    "impression_breakdown": null,
    "upstream_calls": 1
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | The ad_id parameter is missing or is not numeric. |
| 404 | Ad Not Found | No ad with this ID, or LinkedIn answered with a different ad than the one requested (a redirect, an expired ad, or a slug that moved). A bad or expired ad_id is served by LinkedIn as a 200 with no ad on it rather than a 404, so the id is checked before the page is read. Size discriminates only on a true 404: a 404 document far larger than a real absent ad means LinkedIn has dropped the route entirely and is answered with 503 below instead. A real answer rather than an outage, so do not retry. Not billed. |
| 503 | Upstream Route Changed | LinkedIn answered with a full-size page instead of an ad, which is what a dropped route looks like. The ad may well still exist; our upstream route has moved. Retrying may succeed. Not billed, and not reported as "ad not found" because that would be untrue about your data. |
| 403 | Ad Library Refused | LinkedIn answered with a full-size page carrying no ad, which is how it refuses a blocked request. Retrying usually succeeds. Not billed. |
| 503 | No Ad Details | LinkedIn returned the requested ad but none of its fields could be read, which is parser drift on a real ad page rather than a missing ad. Terminal rather than transient, so it is not retried. Not billed. |
| 503 | Upstream Error | LinkedIn answered with a non-success status that is neither a refusal wall nor a missing ad. Failed requests are never billed. |
| 503 | Request Not Dispatched | Scrappa could not send this request to LinkedIn at all, so no data was retrieved. Please try again in a moment. Failed requests are never billed. |
| 503 | Transport Unavailable | The request never produced a usable answer, so the retrieval path was unavailable. Failed requests are never billed. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
