{
  "openapi": "3.0.1",
  "info": {
    "title": "LinkedIn Ads Scraper — LinkedIn Ads Library Transcripts & Text",
    "description": "LinkedIn Ad Library ads as text: video ads become transcripts with the first-3s hook, image ads return their on-image copy, plus CTA and advertiser data per ad. Search by advertiser, keyword or market — no login. From $8.00 per 1,000 ad creative transcripts. Silent and blocked ads are never charged.",
    "version": "1.0",
    "x-build-id": "ftR5bwvcxya03jcLA"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~linkedin-ads-transcript-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-linkedin-ads-transcript-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/steadyfetch~linkedin-ads-transcript-scraper/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-linkedin-ads-transcript-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/steadyfetch~linkedin-ads-transcript-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-linkedin-ads-transcript-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "accountOwners": {
            "title": "Advertiser names",
            "type": "array",
            "description": "Company names as they appear in the Ad Library (e.g. \"Salesforce\", \"HubSpot\") — each is searched with the Ad Library's own advertiser search. Searching is never charged, and neither is a search that matches no ads or an ad with no readable text. A Facebook Ad Library advertiser belongs in steadyfetch/facebook-ads-transcript-scraper. Leave everything empty and click Start and the run is a 3-creative sample (a browse of the United States, last 30 days, charged like any run) — the fastest way to see real output.",
            "items": {
              "type": "string"
            }
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Free-text Ad Library searches, e.g. \"crm software\" or \"recruiting\" — one keyword returns the video and image ads of many advertisers in a niche, so use it when you want the market rather than one company. Never charged: a search that matches no ads, a creative with nothing readable, a blocked page, and an ad this account already has. A Facebook Ad Library keyword goes to steadyfetch/facebook-ads-transcript-scraper; an ordinary video or audio file to steadyfetch/media-transcriber.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Countries as the Ad Library lists them — the code or the country name both work, so US, USA and United States are one market, and UK reaches GB. \"ALL\" searches every country. LinkedIn searches one country at a time, so each one you add is its own search (they add up against \"Max ads to process\"). A country the Ad Library does not offer is refused, uncharged, and the row says which of the three things went wrong (a real market it does not offer, a region-wide ask, or a value nothing could place).",
            "items": {
              "type": "string"
            }
          },
          "dateOption": {
            "title": "Date range",
            "type": "string",
            "description": "When the ads first ran. The value or the name of the window both work — last-30-days and \"Last 30 days\" are the same range. LinkedIn only serves ads created in roughly the last 12 months, whichever option you pick. Choose \"custom-date-range\" to use the two date fields below. A window this actor cannot read is never swapped for another period — it scopes every search the run makes, so the run stops with uncharged rows naming this field, the accepted values and every search it did not run."
          },
          "startdate": {
            "title": "Custom range — start date",
            "type": "string",
            "description": "YYYY-MM-DD, e.g. 2026-08-01. Used with \"custom-date-range\" (setting both dates selects it for you). LinkedIn rejects dates more than about a year old."
          },
          "enddate": {
            "title": "Custom range — end date",
            "type": "string",
            "description": "YYYY-MM-DD, e.g. 2026-08-30. Must be on or after the start date."
          },
          "payer": {
            "title": "Payer name",
            "type": "string",
            "description": "The organisation that paid for the ads, as the Ad Library's \"Payer\" filter spells it. Often differs from the advertiser on the creative (an agency, or a regional entity)."
          },
          "impressionsMin": {
            "title": "Minimum impressions",
            "minimum": 0,
            "type": "integer",
            "description": "Whole number of impressions, e.g. 50000. The filter goes up to 1,000,000,000; ask for a bigger number and the run continues at that ceiling, with one uncharged row saying so. LinkedIn only publishes impression counts for ads shown in the EU, so this filter also limits results to EU-served ads — on a US-only market it returns nothing."
          },
          "impressionsMax": {
            "title": "Maximum impressions",
            "minimum": 0,
            "type": "integer",
            "description": "Whole number of impressions, higher than the minimum. Goes up to 1,000,000,000, the same way. EU-served ads only, same as the minimum above."
          },
          "videoUrls": {
            "title": "Ad URLs, video URLs or search links",
            "type": "array",
            "description": "Ad Library detail URLs (linkedin.com/ad-library/detail/…), numeric ad IDs, direct video URLs (dms.licdn.com/playlist/vid/…) from any LinkedIn Ad Library scraper result — or a whole Ad Library search link (linkedin.com/ad-library/search?…), which is run as a search with the filters already in it. A direct audio or video FILE on any other host is not read here — that goes to our media transcriber (apify.com/steadyfetch/media-transcriber), pasted into its \"Media URLs\" field; a link here that is not a LinkedIn one comes back as an uncharged row saying so.",
            "items": {
              "type": "string"
            }
          },
          "datasetId": {
            "title": "Dataset ID (chain a scraper run)",
            "type": "string",
            "description": "The default dataset ID of a finished LinkedIn Ad Library scraper run: the first 10,000 rows are read and up to maxItems ads (1,000 by default, 10,000 at most) are processed per run. Ads this account already has are handed back uncharged and do not count against maxItems, so a re-run of the same dataset carries on with what is new. With Apify's 'Connect actor' integration this is filled automatically — the cleanest way to chain."
          },
          "datasetItems": {
            "title": "Dataset items (paste rows)",
            "type": "array",
            "description": "Paste rows from your Ad Library scraper run. The actor deep-scans each row for video URLs, ad detail links, and metadata — works with any scraper's output shape. Non-video rows come back as uncharged metadata rows. Leave it empty to search directly or use the other inputs instead."
          },
          "watchlistId": {
            "title": "Watchlist name",
            "type": "string",
            "description": "A short name for the list, e.g. `acme-competitors` (letters, numbers and hyphens). The list lives in a named key-value store in your account called `linkedin-ads-watch-<name>`, so you can inspect or clear it any time. Leave empty for a one-off run — your account's memory of delivered ads still applies."
          },
          "newAdsOnly": {
            "title": "New ads only",
            "type": "boolean",
            "description": "OFF (default): every ad runs as usual; an ad your account already has comes back from the earlier run, not charged (`repeat: true`), and every row carries `isNew` / `firstSeenAt`. ON: ads already on your watchlist — or, with no list name, already delivered to your account — are skipped before anything is fetched: not fetched, not charged, and the run's status line and OUTPUT say how many. Only an ad the actor actually answered counts (a delivered transcript, image text or on-screen text, or a final uncharged verdict such as no speech); an ad it could not answer — a blocked page, a failed fetch, an ad your cost cap left out — does not, so the next run tries it again.",
            "default": false
          },
          "includeImageText": {
            "title": "Read the text on image ads",
            "type": "boolean",
            "description": "ON (default): image ads get their on-image copy read and delivered as `imageText` — each delivered extraction is charged like a video transcript (same event, same price; never a long-video surcharge). Image ads with no readable text are always uncharged. Most LinkedIn ads are image ads, so a keyword run charges for many more rows with this on than a video-only run did — set `maxItems` and the run's max total charge to match. OFF: image ads pass through uncharged with their metadata, as before.",
            "default": true
          },
          "includeOnScreenText": {
            "title": "Read on-screen text on silent video ads",
            "type": "boolean",
            "description": "OFF (default): a video ad with no speech is never charged. ON: silent and music-only video ads have their on-screen text read from the video's own frames and delivered as `onScreenText`, charged like a transcript. Ads with no readable on-screen text stay uncharged either way. About half of LinkedIn's video ads are silent.",
            "default": false
          },
          "includeNonVideo": {
            "title": "Include the remaining formats as uncharged rows",
            "type": "boolean",
            "description": "When searching by advertiser/keyword, also output one uncharged metadata row (advertiser, format, ad link) for each creative this actor does not read — document, carousel, article, message and text-only ads. Off by default.",
            "default": false
          },
          "maxItems": {
            "title": "Max ads to process",
            "minimum": 1,
            "type": "integer",
            "description": "Safety cap on how many ads to process in one run (every attempted video ad and image ad counts toward it, including uncharged misses; the formats above never do). Up to 10,000 per run; ask for a bigger number and the run continues at 10,000, with one uncharged row saying so. Long videos: the first 3 minutes of every video are included in the transcript price; each started minute beyond that is charged as a \"Long-video minute (surcharge)\" at $0.005 — only when the transcript is delivered, never on image ads or on-screen text.",
            "default": 1000
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}