How to scrape Facebook Ad Library Search Ads with JavaScript
Search This tutorial gets it with a short JavaScript program and the Facebook Ad Library Search Ads API. Each successful call costs 1 credit; errors and not-found answers are free.
1. Get an API key
Sign in to get a key and 100 free credits, no card. Then put the key in an environment variable so it stays out of your code:
export SCRAPEIO_API_KEY="your_key_here"2. Set up JavaScript
npm install axios3. Write the code
Save this as scrape.js.
const axios = require("axios");
async function main() {
const params = { "query": "coffee" };
const headers = { "x-api-key": process.env.SCRAPEIO_API_KEY };
const items = [];
while (true) {
const { data: body } = await axios.get("https://scrapeio.com/v1/facebook/adLibrary/search/ads", { params, headers });
const data = body.data;
items.push(...(data.items || []));
if (!data.has_more || !data.cursor || items.length >= 100) break;
params.cursor = data.cursor;
}
console.log(items.length, "items");
console.log(items.slice(0, 3));
}
main().catch((err) => {
console.error(err.response ? err.response.status : err.message);
process.exit(1);
});The loop follows data.cursor until data.has_more is false, and stops at 100 items. Each page is one call, so it costs 1 credit.
4. Run it
node scrape.jsThe response has the same envelope on every endpoint: success, cached, credits_used, credits_remaining and data. Shared fields such as handle, followers, plays, likes and created_at have the same names on every platform.
Parameters
| Name | Type | Description |
|---|---|---|
query (required) | string | Keyword to search for |
sort_by | total_impressions, relevancy_monthly_grouped | Sort by impressions (high to low), or Most Recent (relevancymonthlygrouped). |
search_type | keyword_unordered, keyword_exact_phrase | If you want to search by exact phrase or not |
ad_type | all, political_and_issue_ads | Search for all ads or only political and issue ads |
country | string | This can only be one country. |
language | string | Language to filter ads on. |
status | ALL, ACTIVE, INACTIVE | Status of the ad. |
media_type | ALL, IMAGE, VIDEO, MEME, IMAGE_AND_MEME, NONE | Media type of the ad. |
start_date | string | Impressions start date. |
end_date | string | Impressions end date. |
trim | boolean | Set to true for a trimmed down version of the response |
cursor | string | Cursor to paginate through results |
Errors and what you pay
| Status | Meaning | Charged |
|---|---|---|
200 | Success | Yes, unless cached |
400 | A parameter is missing or wrong | No |
401 | The key is missing or invalid | No |
402 | Not enough credits | No |
403 | The account or post is private | No |
404 | Not found on the platform | No |
429 | More than 300 requests a minute | No |
502 | Every source is down; retry shortly | No |
Same endpoint in other languages
Python · Node.js · TypeScript · Go · Rust · Java · C# · PHP · Ruby · Kotlin · Swift · R
Prefer no code?
Connect the MCP server to Claude Code, Cursor or Codex and ask in plain English. The agent uses call_endpoint with path /v1/facebook/adLibrary/search/ads for you.
100 free credits, no card. Credits never expire.
Get API key