[{"data":1,"prerenderedAt":33743},["ShallowReactive",2],{"blog-guide-\u002Fblog\u002Fguides\u002Fjob-postings-api-hiring-signals":3,"blog-guide-related-\u002Fblog\u002Fguides\u002Fjob-postings-api-hiring-signals":802},{"id":4,"title":5,"author":6,"body":7,"category":782,"cover":783,"description":784,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":788,"meta":789,"navigation":790,"ogImage":787,"path":791,"publishedAt":792,"readTime":793,"seo":794,"stem":795,"tags":796,"toolCategory":318,"updatedAt":792,"__hash__":801},"blogGuides\u002Fblog\u002Fguides\u002Fjob-postings-api-hiring-signals.md","Job Postings API: Turning Hiring Into a Buying Signal","Jasper Li",{"type":8,"value":9,"toc":765},"minimark",[10,14,23,26,31,34,42,51,59,67,75,86,107,111,114,130,201,208,221,231,236,245,252,261,265,315,319,334,338,341,344,350,356,362,368,379,383,386,417,420,424,428,431,437,443,452,469,477,481,598,609,615,619,622,625,636,642,648,654,658,664,670,676,682,693,697,700,711,726,730,737,743,749,755,761],[11,12,13],"p",{},"A company's job ads describe what it is building roughly a quarter before its website does. Marketing pages are written after a decision; a job ad is written to execute one, which is why hiring is the cleanest early signal available in public data.",[11,15,16,17,22],{},"Most people reach for jobs data as a job seeker or a recruiter. This is about the third use: reading postings as evidence about a company. Monid is ",[18,19,21],"a",{"href":20},"\u002Fopenrouter-for-agent-tools","the OpenRouter for agent tools",", and the endpoints below sit on one key.",[11,24,25],{},"Fair disclosure: you are on the Monid blog. The section near the end says where a dedicated jobs platform beats this, and it is a real list.",[27,28,30],"h2",{"id":29},"what-can-you-actually-learn-from-a-job-posting","What can you actually learn from a job posting?",[11,32,33],{},"More than the title, and the fields that carry the signal are not the ones people read.",[11,35,36,37,41],{},"We ran a search on 2026-08-17 and read one record end to end: ",[38,39,40],"strong",{},"32 fields, only two empty."," The obvious ones are there, title, location, description, company, posted date. These are the ones worth knowing about:",[11,43,44,50],{},[38,45,46],{},[47,48,49],"code",{},"applicants"," returned 25. A count of how many people applied, on a posting made the same day. That is a competitive-pressure reading you cannot get any other way, and for a recruiter or a candidate it is the single most decision-relevant number in the record.",[11,52,53,58],{},[38,54,55],{},[47,56,57],{},"hiringTeam"," returned a named person with a LinkedIn URL and a job title. Not the company, a human, on the posting. For outbound that is the difference between a company-level signal and a contactable one.",[11,60,61,66],{},[38,62,63],{},[47,64,65],{},"applicantTrackingSystem"," returned the ATS the posting runs on. That is technographic data arriving inside a jobs record, for free, and it tells you what recruiting stack a company has bought.",[11,68,69,74],{},[38,70,71],{},[47,72,73],{},"expireAt"," returned a date a month out. Postings have a shelf life, and knowing when one closes is what separates a live signal from a stale one.",[11,76,77,78,81,82,85],{},"Two more that matter for filtering: ",[47,79,80],{},"workplaceType"," (remote, hybrid, onsite) and ",[47,83,84],{},"experienceLevel",", both normalised rather than free text, so they filter cleanly.",[11,87,88,94,95,98,99,102,103,106],{},[38,89,90,93],{},[47,91,92],{},"salary"," came back empty."," Its structure is there, with ",[47,96,97],{},"text",", ",[47,100,101],{},"min"," and ",[47,104,105],{},"max",", and all three were null. Salary is only populated where a jurisdiction requires disclosure or an employer volunteers it, so any analysis built on compensation will have large holes that are not random: they cluster by geography.",[27,108,110],{"id":109},"which-api-returns-job-postings","Which API returns job postings?",[11,112,113],{},"Two shapes, and they answer different questions.",[11,115,116,119,120,129],{},[38,117,118],{},"Search across the market."," ",[18,121,126],{"href":122,"rel":123},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fjobs",[124,125],"noopener","noreferrer",[47,127,128],{},"apify \u002Fharvestapi\u002Flinkedin-job-search"," takes job titles and locations with filters, and returns postings. This is the one for signal work, because you are asking \"who is hiring for this\" rather than \"what is this company hiring for\".",[131,132,137],"pre",{"className":133,"code":134,"language":135,"meta":136,"style":136},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","monid inspect -p apify -e \u002Fharvestapi\u002Flinkedin-job-search\nmonid run -p apify -e \u002Fharvestapi\u002Flinkedin-job-search \\\n  -i '{\"jobTitles\":[\"data engineer\"],\"locations\":[\"Berlin\"],\"maxItems\":25}'\n","bash","",[47,138,139,164,185],{"__ignoreMap":136},[140,141,144,148,152,155,158,161],"span",{"class":142,"line":143},"line",1,[140,145,147],{"class":146},"sBMFI","monid",[140,149,151],{"class":150},"sfazB"," inspect",[140,153,154],{"class":150}," -p",[140,156,157],{"class":150}," apify",[140,159,160],{"class":150}," -e",[140,162,163],{"class":150}," \u002Fharvestapi\u002Flinkedin-job-search\n",[140,165,167,169,172,174,176,178,181],{"class":142,"line":166},2,[140,168,147],{"class":146},[140,170,171],{"class":150}," run",[140,173,154],{"class":150},[140,175,157],{"class":150},[140,177,160],{"class":150},[140,179,180],{"class":150}," \u002Fharvestapi\u002Flinkedin-job-search",[140,182,184],{"class":183},"sTEyZ"," \\\n",[140,186,188,191,195,198],{"class":142,"line":187},3,[140,189,190],{"class":150},"  -i",[140,192,194],{"class":193},"sMK4o"," '",[140,196,197],{"class":150},"{\"jobTitles\":[\"data engineer\"],\"locations\":[\"Berlin\"],\"maxItems\":25}",[140,199,200],{"class":193},"'\n",[11,202,203,204,207],{},"Read the billing note on that endpoint before scaling it: it runs once per query in ",[47,205,206],{},"jobTitles",", so results are roughly queries multiplied by the per-query limit. Two extra titles is not a small change to the bill. Pass one query first and look at what comes back.",[11,209,210,119,213,220],{},[38,211,212],{},"A known company's openings.",[18,214,217],{"href":215,"rel":216},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fapollo",[124,125],[47,218,219],{},"apollo \u002Forganizations\u002F{id}\u002Fjob_postings"," returns the active postings for a company you have already identified. This is the one for account research: you have the account, you want to know what it is staffing up.",[11,222,223,224,230],{},"There is also ",[18,225,227],{"href":122,"rel":226},[124,125],[47,228,229],{},"strale \u002Fx402\u002Fjob-posting-analyze",", which takes a single posting and extracts structured attributes from the prose. Useful when the description text carries what you need and the structured fields do not.",[232,233,235],"h3",{"id":234},"for-agents","For agents",[11,237,238,239,244],{},"Grab an API key at ",[18,240,243],{"href":241,"rel":242},"https:\u002F\u002Fapp.monid.ai\u002F",[124,125],"app.monid.ai",", then paste this to your agent and hand it the key:",[131,246,250],{"className":247,"code":249,"language":97,"meta":136},[248],"language-text","set up https:\u002F\u002Fmonid.ai\u002FSKILL.md\n",[47,251,249],{"__ignoreMap":136},[11,253,254,255,260],{},"It learns the whole discover, inspect, run workflow itself. More in the ",[18,256,259],{"href":257,"rel":258},"https:\u002F\u002Fmonid.ai\u002Fdocs\u002Fguide\u002Fquickstart-skill",[124,125],"agent quickstart",".",[232,262,264],{"id":263},"for-humans","For humans",[131,266,268],{"className":133,"code":267,"language":135,"meta":136,"style":136},"npm install -g @monid-ai\u002Fcli\nmonid keys add -k \u003Cyour-key> -l main\n",[47,269,270,284],{"__ignoreMap":136},[140,271,272,275,278,281],{"class":142,"line":143},[140,273,274],{"class":146},"npm",[140,276,277],{"class":150}," install",[140,279,280],{"class":150}," -g",[140,282,283],{"class":150}," @monid-ai\u002Fcli\n",[140,285,286,288,291,294,297,300,303,306,309,312],{"class":142,"line":166},[140,287,147],{"class":146},[140,289,290],{"class":150}," keys",[140,292,293],{"class":150}," add",[140,295,296],{"class":150}," -k",[140,298,299],{"class":193}," \u003C",[140,301,302],{"class":150},"your-ke",[140,304,305],{"class":183},"y",[140,307,308],{"class":193},">",[140,310,311],{"class":150}," -l",[140,313,314],{"class":150}," main\n",[316,317],"skill-prompt",{"category":318},"jobs",[320,321,322],"blockquote",{},[11,323,324,325,119,328,333],{},"📖 ",[38,326,327],{},"See also",[18,329,332],{"href":330,"rel":331},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Flinkedin-job-data-which-api-stays-fresh",[124,125],"which LinkedIn job API stays fresh",", which tests the freshness question directly.",[27,335,337],{"id":336},"how-do-you-turn-postings-into-a-buying-signal","How do you turn postings into a buying signal?",[11,339,340],{},"By reading the pattern across postings, not the content of any one.",[11,342,343],{},"A single job ad tells you a company needs a person. A pattern tells you what it decided. Four readings that hold up:",[11,345,346,349],{},[38,347,348],{},"Volume by function is a budget signal."," A company posting six sales roles has closed a funding round or hit a number. Sales headcount is the most reliably lagging indicator of revenue confidence there is.",[11,351,352,355],{},[38,353,354],{},"A first hire in a function is the strongest signal of all."," The first data engineer, the first security hire, the first solutions architect. It means the function is being started rather than staffed, which is exactly when tooling gets bought, because nothing has been chosen yet.",[11,357,358,361],{},[38,359,360],{},"Titles in the description are a technographic read."," A posting naming Snowflake and dbt has told you the stack more reliably than any detection tool, because someone had to be sure enough to hire against it.",[11,363,364,367],{},[38,365,366],{},"The ATS field tells you how they buy."," A company on an enterprise ATS runs a procurement process. One on a lightweight tool does not. That changes who you talk to and how long it takes.",[11,369,370,371,374,375,378],{},"The one that misleads: ",[38,372,373],{},"a role reposted is not a new signal."," Postings expire and get refreshed, so a naive daily pull counts the same opening repeatedly and reads as accelerating hiring. Deduplicate on the posting id and treat ",[47,376,377],{},"postedDate"," as the truth, not the day you saw it.",[232,380,382],{"id":381},"the-pipeline-that-works","The pipeline that works",[11,384,385],{},"Resolve, filter, then enrich, in that order.",[131,387,389],{"className":133,"code":388,"language":135,"meta":136,"style":136},"monid run -p akta -e \u002Fv1\u002Fcompany\u002Fsearch --query '{\"query\":\"\u003Ccompany name>\"}'\n",[47,390,391],{"__ignoreMap":136},[140,392,393,395,397,399,402,404,407,410,412,415],{"class":142,"line":143},[140,394,147],{"class":146},[140,396,171],{"class":150},[140,398,154],{"class":150},[140,400,401],{"class":150}," akta",[140,403,160],{"class":150},[140,405,406],{"class":150}," \u002Fv1\u002Fcompany\u002Fsearch",[140,408,409],{"class":150}," --query",[140,411,194],{"class":193},[140,413,414],{"class":150},"{\"query\":\"\u003Ccompany name>\"}",[140,416,200],{"class":193},[11,418,419],{},"Resolution is free, so start there and get domains. Filter your list on what the postings say. Only then pay for enrichment on what survives, because enrichment is priced per record and filtering is not.",[421,422],"tool-cta",{"category":318,"title":423},"Browse the jobs endpoints, with live pricing",[232,425,427],{"id":426},"what-the-record-cannot-tell-you","What the record cannot tell you",[11,429,430],{},"Three limits worth knowing before a dashboard is built on this.",[11,432,433,436],{},[38,434,435],{},"A posting is not a hire."," Roles get cancelled, filled internally, or left open as a pipeline-building exercise. Counting postings as headcount growth overstates it, and the overstatement is largest at companies that always have openings.",[11,438,439,442],{},[38,440,441],{},"Volume is confounded by turnover."," Six sales postings can mean growth or churn, and the record cannot distinguish them. The tell is repetition over time: the same title reappearing every quarter is a retention problem wearing a growth signal's clothes.",[11,444,445,448,449,451],{},[38,446,447],{},"Location is where the role sits, not where the company is."," A remote posting in one market says nothing about headquarters, and the ",[47,450,80],{}," field matters more than location for any territory analysis.",[11,453,454,455,458,459,463,464,468],{},"The general shape: ",[38,456,457],{},"postings are strong evidence about intent and weak evidence about outcome."," For what a company decided to build, they are close to the best public source. For how big it is or how fast it is growing, use headcount and firmographics, which is what ",[18,460,462],{"href":461},"\u002Fblog\u002Fturn-a-domain-into-full-firmographics","turning a domain into full firmographics"," covers, and pair it with ",[18,465,467],{"href":466},"\u002Fblog\u002Fautomate-linkedin-company-data-pulls","company data pulled on a schedule"," if the trend matters more than the snapshot.",[11,470,471,472,476],{},"If the postings are feeding a prospect list rather than a report, ",[18,473,475],{"href":474},"\u002Fblog\u002Fwire-up-icp-prospect-search","wiring up an ICP search"," is the step that follows.",[27,478,480],{"id":479},"which-endpoint-should-i-use-for-which-job","Which endpoint should I use for which job?",[482,483,484,503],"table",{},[485,486,487],"thead",{},[488,489,490,494,497,500],"tr",{},[491,492,493],"th",{},"Job",[491,495,496],{},"Endpoint",[491,498,499],{},"Takes",[491,501,502],{},"Billing shape",[504,505,506,525,543,560,580],"tbody",{},[488,507,508,512,519,522],{},[509,510,511],"td",{},"Who is hiring for this role",[509,513,514],{},[18,515,517],{"href":122,"rel":516},[124,125],[47,518,128],{},[509,520,521],{},"Titles, locations, filters",[509,523,524],{},"Per result plus flat fee",[488,526,527,530,537,540],{},[509,528,529],{},"What is this company hiring for",[509,531,532],{},[18,533,535],{"href":215,"rel":534},[124,125],[47,536,219],{},[509,538,539],{},"Organization id",[509,541,542],{},"Per call",[488,544,545,548,555,558],{},[509,546,547],{},"Structure one posting's prose",[509,549,550],{},[18,551,553],{"href":122,"rel":552},[124,125],[47,554,229],{},[509,556,557],{},"A posting",[509,559,542],{},[488,561,562,565,574,577],{},[509,563,564],{},"Resolve a company name first",[509,566,567],{},[18,568,571],{"href":569,"rel":570},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fcompany-enrichment",[124,125],[47,572,573],{},"akta \u002Fv1\u002Fcompany\u002Fsearch",[509,575,576],{},"Name or website",[509,578,579],{},"Free per call",[488,581,582,585,593,596],{},[509,583,584],{},"Enrich the companies that pass",[509,586,587],{},[18,588,590],{"href":569,"rel":589},[124,125],[47,591,592],{},"pdl \u002Fv5\u002Fcompany\u002Fenrich",[509,594,595],{},"Website",[509,597,542],{},[11,599,600,601,604,605,608],{},"Verified present on 2026-08-17 with ",[47,602,603],{},"monid discover",". The billing column gives the shape rather than a figure; ",[47,606,607],{},"monid inspect"," prints the current figure and costs nothing.",[11,610,611,612,614],{},"The multiplication on the first row is the one to watch. It bills per result, and results scale with your title list times your limit, so the cheapest mistake in this category is an ambitious ",[47,613,206],{}," array on the first run.",[232,616,618],{"id":617},"reading-a-description-properly","Reading a description properly",[11,620,621],{},"The structured fields filter; the description text is where the signal lives, and most pipelines throw it away.",[11,623,624],{},"Three things worth extracting from the prose, none of which appear in a structured field:",[11,626,627,630,631,635],{},[38,628,629],{},"Named technologies."," A description listing the stack is the strongest technographic evidence available publicly, because someone had to be certain enough to hire against it. We compared that against page-based detection in ",[18,632,634],{"href":633},"\u002Fblog\u002Fguides\u002Ftechnographic-data-platforms-vs-per-call","the technographic comparison",", where a scan of a major site returned only infrastructure.",[11,637,638,641],{},[38,639,640],{},"Team shape."," \"Reporting to the Head of Data\" and \"you will be our first data hire\" describe two different companies with the same job title, and only the prose distinguishes them.",[11,643,644,647],{},[38,645,646],{},"Urgency language."," \"Immediate start\", \"backfill\", \"newly created role\". Each implies a different buying situation, and the first two often mean the budget already exists.",[11,649,650,651,653],{},"The structured route for this is ",[47,652,229],{},", which extracts attributes from a posting's text. The cheaper route, if you are already holding the description, is to read it: the field is in the record and costs nothing extra.",[27,655,657],{"id":656},"when-should-you-not-use-monid","When should you not use Monid?",[11,659,660,663],{},[38,661,662],{},"You are building a job board."," That is a licensing conversation with the sources, not a scraping one, and the terms matter more than the endpoint does.",[11,665,666,669],{},[38,667,668],{},"You need complete market coverage."," A search returns what the platform surfaces for your query, which is not every opening that exists. For headcount analytics that must be exhaustive, buy a dataset built for it.",[11,671,672,675],{},[38,673,674],{},"You need salary data."," As measured above, the field exists and is mostly empty, and its emptiness correlates with geography. Compensation benchmarking needs a source that specialises in it.",[11,677,678,681],{},[38,679,680],{},"You need historical postings."," These endpoints read what is live. A closed role is gone, so trend analysis means collecting daily from now rather than querying backwards.",[11,683,684,687,688,692],{},[38,685,686],{},"And the caution about us."," Metadata in this catalogue has disagreed with real behaviour before, including an endpoint that ",[18,689,691],{"href":690},"\u002Fblog\u002Fguides\u002Famazon-pa-api-alternatives","returned empty commercial fields at full price",". Run one small call, read the fields and the charge, then scale.",[27,694,696],{"id":695},"conclusion","Conclusion",[11,698,699],{},"A job posting is a company telling you what it decided, in public, before it announces anything. The reason it is under-used as a signal is that people read the title and stop, when the useful fields are the applicant count, the named hiring contact, the ATS and the expiry date.",[11,701,702,703,706,707,710],{},"Two things matter more than which endpoint you pick. ",[38,704,705],{},"Read patterns, not postings",": the first hire in a function beats ten more of the same role, because it means the function is being started rather than staffed. And ",[38,708,709],{},"deduplicate on posting id",", because refreshed listings otherwise read as accelerating hiring and every dashboard built on a daily pull gets this wrong at least once.",[11,712,713,714,717,718,720,721,260],{},"Start with the free part: ",[47,715,716],{},"monid discover -q \"job postings\""," lists what exists, ",[47,719,607],{}," shows the schema and price without spending, and company resolution costs nothing. Then run one title before you run twenty. Begin at ",[18,722,725],{"href":723,"rel":724},"https:\u002F\u002Fmonid.ai",[124,125],"monid.ai",[27,727,729],{"id":728},"faq","FAQ",[731,732,734],"faq-item",{"q":733},"Why is the salary field usually empty?",[11,735,736],{},"Because disclosure is a legal requirement in some jurisdictions and voluntary everywhere else. The field is structured with text, minimum and maximum, and on the record we measured all three were null. The important part is that the gaps are not random: they cluster by geography, so any comparison across regions is comparing places that must disclose against places that need not.",[731,738,740],{"q":739},"Can I see how many people applied?",[11,741,742],{},"Yes, on the platform that reports it. The record we measured carried an applicant count on a posting made the same day. Treat it as a snapshot rather than a series, because it only rises and there is no history in the record: if you want the curve, you have to collect it yourself on a schedule.",[731,744,746],{"q":745},"How do I avoid counting the same job twice?",[11,747,748],{},"Deduplicate on the posting id and trust the posted date over the date you collected it. Postings expire and employers refresh them, so a role that has been open for months can appear repeatedly in a daily pull and read as new demand. This is the most common error in hiring dashboards and it always inflates in the same direction.",[731,750,752],{"q":751},"Is scraping job postings allowed?",[11,753,754],{},"Public postings sit in the same contested area as other public-page scraping, and each platform's terms restrict automated access differently. Get your own legal read before running at scale, prefer verified providers, and note that building a competing job board is a different question from reading postings as a business signal, with different exposure.",[11,756,757],{},[758,759,760],"em",{},"Last updated August 2026.",[762,763,764],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":136,"searchDepth":166,"depth":166,"links":766},[767,768,772,776,779,780,781],{"id":29,"depth":166,"text":30},{"id":109,"depth":166,"text":110,"children":769},[770,771],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":336,"depth":166,"text":337,"children":773},[774,775],{"id":381,"depth":187,"text":382},{"id":426,"depth":187,"text":427},{"id":479,"depth":166,"text":480,"children":777},[778],{"id":617,"depth":187,"text":618},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"Sales & enrichment","\u002Fimg\u002Fblog\u002Fjob-postings-api-hiring-signals.png","A job ad says what a company is building before its website does. Which endpoint returns postings, what the record contains, and the fields nobody reads.",false,"md",null,"\u002Fimg\u002Fblog\u002Fjob-postings-api-hiring-signals-card.png",{},true,"\u002Fblog\u002Fguides\u002Fjob-postings-api-hiring-signals","2026-08-17","11 min",{"title":5,"description":784},"blog\u002Fguides\u002Fjob-postings-api-hiring-signals",[797,798,799,800],"job postings api","hiring signals","jobs data","gtm","ZqtjzuVEdTpTHW-KK2t9O0SDmuwO8ghwTCkz1-qxj7U",[803,1691,2392,3325,4345,5176,5720,6629,7432,8216,8989,9736,10502,11202,12079,12759,13520,14174,14778,15536,16208,16814,17194,17827,18431,19076,19435,20111,20707,21342,21939,22510,23090,23735,24285,24795,25293,25937,26565,27081,27704,28238,29158,29688,30211,30688,31245,31780,32322,32854,33476,33536,33604,33670],{"id":804,"title":805,"author":6,"body":806,"category":1674,"cover":1675,"description":1676,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":1677,"meta":1678,"navigation":790,"ogImage":787,"path":1679,"publishedAt":1680,"readTime":1681,"seo":1682,"stem":1683,"tags":1684,"toolCategory":1638,"updatedAt":1680,"__hash__":1690},"blogGuides\u002Fblog\u002Fguides\u002Fagentic-browser-when-your-agent-needs-one.md","Agentic Browser: When Your Agent Actually Needs One",{"type":8,"value":807,"toc":1650},[808,812,858,867,871,874,878,881,884,888,897,900,904,907,990,993,1003,1007,1010,1014,1017,1020,1024,1039,1042,1046,1049,1059,1063,1066,1068,1073,1078,1083,1085,1123,1127,1133,1144,1149,1191,1225,1234,1238,1243,1251,1255,1359,1364,1369,1373,1378,1386,1398,1403,1413,1417,1420,1423,1426,1429,1431,1558,1564,1568,1571,1584,1587,1590,1592,1595,1598,1610,1612,1618,1624,1630,1636,1643,1647],[11,809,811],{"style":810},"font-size:18px !important;line-height:1.65 !important;margin:0 0 24px;color:inherit;","Copy this line to your agent to get a remote browser session it can drive.",[131,813,817],{"className":814,"code":815,"language":816,"meta":136,"style":136},"language-sh shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use x402.browserbase.com \u002Fbrowser\u002Fsession\u002Fcreate to open a browser session\n","sh",[47,818,819],{"__ignoreMap":136},[140,820,821,825,828,831,834,837,840,843,846,849,852,855],{"class":142,"line":143},[140,822,824],{"class":823},"s2Zo4","set",[140,826,827],{"class":150}," up",[140,829,830],{"class":150}," https:\u002F\u002Fmonid.ai\u002FSKILL.md",[140,832,833],{"class":150}," and",[140,835,836],{"class":150}," use",[140,838,839],{"class":150}," x402.browserbase.com",[140,841,842],{"class":150}," \u002Fbrowser\u002Fsession\u002Fcreate",[140,844,845],{"class":150}," to",[140,847,848],{"class":150}," open",[140,850,851],{"class":150}," a",[140,853,854],{"class":150}," browser",[140,856,857],{"class":150}," session\n",[11,859,860,861,98,865,260],{},"Two different things are called an agentic browser and they have almost nothing in common. One is an application a person installs and sits in front of, where an assistant reads the tab and clicks on their behalf. The other is a headless browser somewhere in a data centre that your code opens, drives and closes. The search results for the term answer whichever half the author was selling. This guide separates them, then argues that most jobs people reach for either one to do need no browser at all, and shows the version that runs through ",[18,862,864],{"href":723,"rel":863},[124,125],"Monid",[18,866,21],{"href":20},[27,868,870],{"id":869},"what-is-an-agentic-browser","What is an agentic browser?",[11,872,873],{},"An agentic browser is a browser where a model takes actions instead of only rendering pages. That definition covers both products in the category, which is exactly the problem, because the two are bought by different people for opposite reasons.",[232,875,877],{"id":876},"the-consumer-agentic-browser","The consumer agentic browser",[11,879,880],{},"This one is an application. Perplexity's Comet is the best known, OpenAI's Atlas is the other name people mean, and Brave, Opera and others ship assistant modes in the same shape. You install it, browse normally, and ask it to do things with the page in front of you: summarise this, fill this in, find the cheapest of these and add it to the cart. The agent shares your session, which is the whole point and also the whole risk. It is already logged into your email, your bank and your work tools because you are.",[11,882,883],{},"The buyer here is a person, and the product is convenience.",[232,885,887],{"id":886},"the-programmable-agentic-browser","The programmable agentic browser",[11,889,890,891,896],{},"This one is infrastructure. It is a headless Chrome running remotely that your program connects to over the Chrome DevTools Protocol, drives with Playwright or Puppeteer, and shuts down when the job finishes. There is no user, no personal session and no interface. ",[18,892,895],{"href":893,"rel":894},"https:\u002F\u002Fwww.browserbase.com\u002F",[124,125],"Browserbase"," is the reference example and there are several others.",[11,898,899],{},"The buyer here is a developer, and the product is a browser they do not have to operate.",[232,901,903],{"id":902},"why-keeping-them-apart-matters","Why keeping them apart matters",[11,905,906],{},"Because every question about the category resolves differently depending on which one you meant. \"Is an agentic browser safe\" is a serious question about the first and a mostly irrelevant one about the second, since a throwaway session with no credentials cannot leak your inbox. \"How much does an agentic browser cost\" is a subscription question for one and a per-minute infrastructure question for the other. Read any comparison in this category and the first thing to establish is which product it is about.",[482,908,909,922],{},[485,910,911],{},[488,912,913,916,919],{},[491,914,915],{},"Aspect",[491,917,918],{},"Consumer agentic browser",[491,920,921],{},"Programmable agentic browser",[504,923,924,935,946,957,968,979],{},[488,925,926,929,932],{},[509,927,928],{},"Who drives it",[509,930,931],{},"A person, in a window",[509,933,934],{},"Your code, over CDP",[488,936,937,940,943],{},[509,938,939],{},"Whose session",[509,941,942],{},"Yours, already logged in",[509,944,945],{},"A fresh, empty one",[488,947,948,951,954],{},[509,949,950],{},"Bought for",[509,952,953],{},"Convenience",[509,955,956],{},"Not operating a browser fleet",[488,958,959,962,965],{},[509,960,961],{},"Priced as",[509,963,964],{},"A subscription",[509,966,967],{},"Per session or per minute",[488,969,970,973,976],{},[509,971,972],{},"Main risk",[509,974,975],{},"Your credentials, exposed to page content",[509,977,978],{},"Cost, if sessions leak",[488,980,981,984,987],{},[509,982,983],{},"Examples",[509,985,986],{},"Comet, Atlas, assistant modes",[509,988,989],{},"Browserbase and similar",[11,991,992],{},"The pattern is that the consumer version borrows your identity and the programmable one deliberately has none.",[320,994,995],{},[11,996,324,997,119,999],{},[38,998,327],{},[18,1000,1002],{"href":1001},"\u002Fblog\u002Fguides\u002Fwhat-is-an-mcp-gateway","What Is an MCP Gateway? Two Products, One Name",[27,1004,1006],{"id":1005},"how-does-an-agentic-browser-work","How does an agentic browser work?",[11,1008,1009],{},"Both kinds work by giving a model a loop: look at the page, decide on an action, perform it, look again. What differs is where the page comes from and what the model is allowed to touch.",[232,1011,1013],{"id":1012},"the-loop-concretely","The loop, concretely",[11,1015,1016],{},"The model receives some representation of the current page, usually the accessibility tree, a simplified DOM, a screenshot, or a mix. It emits an action: click this element, type this text, scroll, navigate, extract. A runtime performs the action against the real browser and returns the new state. Repeat until the goal is met or a step budget runs out.",[11,1018,1019],{},"The interesting engineering is in the representation. A full DOM is far too large for a context window and a screenshot alone loses element identity, so every product in this space has an opinion about how to compress a page into something a model can reason over. That opinion is most of what differentiates them.",[232,1021,1023],{"id":1022},"the-failure-mode-the-category-has-not-solved","The failure mode the category has not solved",[11,1025,1026,1027,1032,1033,1038],{},"The loop treats page content as information, and a model reading a page cannot reliably tell the page's content apart from its own instructions. That is indirect prompt injection, and in an agentic browser it is not theoretical. Brave's security team published a working attack against Comet in which ",[18,1028,1031],{"href":1029,"rel":1030},"https:\u002F\u002Fbrave.com\u002Fblog\u002Fcomet-prompt-injection\u002F",[124,125],"instructions hidden in a page"," were executed when the user simply asked for a summary, and a follow-up showing the same thing achieved with ",[18,1034,1037],{"href":1035,"rel":1036},"https:\u002F\u002Fbrave.com\u002Fblog\u002Funseeable-prompt-injections\u002F",[124,125],"text hidden inside a screenshot",", invisible to a person and legible to the model.",[11,1040,1041],{},"This is a systemic property of the design rather than one vendor's bug, and it is the strongest argument for the programmable kind wherever you have a choice: a session with no credentials in it has very little for an injected instruction to steal.",[232,1043,1045],{"id":1044},"what-the-browser-is-actually-for","What the browser is actually for",[11,1047,1048],{},"Strip the loop back and a browser buys you exactly two things a fetch cannot: it executes JavaScript, and it holds state across requests. Everything else about it is overhead. Once you see it that way, the design question becomes narrow and answerable, which is the next section.",[320,1050,1051],{},[11,1052,324,1053,119,1055],{},[38,1054,327],{},[18,1056,1058],{"href":1057},"\u002Fblog\u002Fguides\u002Fmcp-vs-api-for-ai-agents","MCP vs API for AI Agents: Who Does the Wrapping?",[27,1060,1062],{"id":1061},"how-do-you-use-an-agentic-browser-from-your-own-code","How do you use an agentic browser from your own code?",[11,1064,1065],{},"Open a remote session, attach your automation library to it, and treat it as a resource with a lifetime. The point of doing it this way rather than launching a local Chrome is that you stop owning the browser: no driver to keep in step, no memory per tab on your machine, no pool to build when you need five at once.",[232,1067,235],{"id":234},[11,1069,238,1070,244],{},[18,1071,243],{"href":241,"rel":1072},[124,125],[131,1074,1076],{"className":1075,"code":249,"language":97,"meta":136},[248],[47,1077,249],{"__ignoreMap":136},[11,1079,254,1080,260],{},[18,1081,259],{"href":257,"rel":1082},[124,125],[232,1084,264],{"id":263},[131,1086,1088],{"className":133,"code":1087,"language":135,"meta":136,"style":136},"npm install -g @monid-ai\u002Fcli\nmonid keys add -k \u003Cyour-api-key> -l main\n",[47,1089,1090,1100],{"__ignoreMap":136},[140,1091,1092,1094,1096,1098],{"class":142,"line":143},[140,1093,274],{"class":146},[140,1095,277],{"class":150},[140,1097,280],{"class":150},[140,1099,283],{"class":150},[140,1101,1102,1104,1106,1108,1110,1112,1115,1117,1119,1121],{"class":142,"line":166},[140,1103,147],{"class":146},[140,1105,290],{"class":150},[140,1107,293],{"class":150},[140,1109,296],{"class":150},[140,1111,299],{"class":193},[140,1113,1114],{"class":150},"your-api-ke",[140,1116,305],{"class":183},[140,1118,308],{"class":193},[140,1120,311],{"class":150},[140,1122,314],{"class":150},[232,1124,1126],{"id":1125},"step-1-open-a-session","Step 1. Open a session",[11,1128,1129,1132],{},[38,1130,1131],{},"What it does."," Creates a remote browser and returns the address your automation library connects to.",[11,1134,1135,119,1138,260],{},[38,1136,1137],{},"The endpoints.",[18,1139,1141],{"href":1140},"\u002Ftools\u002Fbrowserbase",[47,1142,1143],{},"x402.browserbase.com\u002Fbrowser\u002Fsession\u002Fcreate",[11,1145,1146],{},[38,1147,1148],{},"The call.",[131,1150,1152],{"className":133,"code":1151,"language":135,"meta":136,"style":136},"monid inspect -p x402.browserbase.com -e \u002Fbrowser\u002Fsession\u002Fcreate\n\nmonid run -p x402.browserbase.com -e \u002Fbrowser\u002Fsession\u002Fcreate -w\n",[47,1153,1154,1169,1174],{"__ignoreMap":136},[140,1155,1156,1158,1160,1162,1164,1166],{"class":142,"line":143},[140,1157,147],{"class":146},[140,1159,151],{"class":150},[140,1161,154],{"class":150},[140,1163,839],{"class":150},[140,1165,160],{"class":150},[140,1167,1168],{"class":150}," \u002Fbrowser\u002Fsession\u002Fcreate\n",[140,1170,1171],{"class":142,"line":166},[140,1172,1173],{"emptyLinePlaceholder":790},"\n",[140,1175,1176,1178,1180,1182,1184,1186,1188],{"class":142,"line":187},[140,1177,147],{"class":146},[140,1179,171],{"class":150},[140,1181,154],{"class":150},[140,1183,839],{"class":150},[140,1185,160],{"class":150},[140,1187,842],{"class":150},[140,1189,1190],{"class":150}," -w\n",[11,1192,1193,119,1196,98,1199,98,1202,98,1205,98,1208,98,1211,1214,1215,1218,1219,1221,1222,1224],{},[38,1194,1195],{},"What comes back.",[47,1197,1198],{},"sessionId",[47,1200,1201],{},"connectUrl",[47,1203,1204],{},"liveUrl",[47,1206,1207],{},"authToken",[47,1209,1210],{},"paidMinutes",[47,1212,1213],{},"expiresAt"," and a ",[47,1216,1217],{},"pricing"," object. Verified against a live run on 21 August 2026, which returned five paid minutes and an explicit ",[47,1220,1213],{},". The ",[47,1223,1204],{}," opens a DevTools inspector on the running session, which is the single most useful thing here when a script misbehaves.",[11,1226,1227,1230,1231,260],{},[38,1228,1229],{},"What it costs."," Per call to open, with the session carrying a fixed block of minutes. Current figures on ",[18,1232,1233],{"href":1140},"monid.ai\u002Ftools",[232,1235,1237],{"id":1236},"step-2-drive-it-with-playwright","Step 2. Drive it with Playwright",[11,1239,1240,1242],{},[38,1241,1131],{}," Connects your existing automation code to the remote browser instead of a local one.",[11,1244,1245,1247,1248,1250],{},[38,1246,1137],{}," None. This is your code talking to the ",[47,1249,1201],{}," from step one.",[11,1252,1253],{},[38,1254,1148],{},[131,1256,1260],{"className":1257,"code":1258,"language":1259,"meta":136,"style":136},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import json\nimport subprocess\nfrom playwright.sync_api import sync_playwright\n\nsession = json.loads(subprocess.run(\n    [\"monid\", \"run\", \"-p\", \"x402.browserbase.com\",\n     \"-e\", \"\u002Fbrowser\u002Fsession\u002Fcreate\", \"-w\", \"-j\"],\n    capture_output=True, text=True, check=True,\n    env={\"NO_COLOR\": \"1\"},\n).stdout)\n\nwith sync_playwright() as p:\n    browser = p.chromium.connect_over_cdp(session[\"connectUrl\"])\n    page = browser.contexts[0].pages[0]\n    page.goto(\"https:\u002F\u002Fexample.com\")\n    print(page.title())\n    browser.close()\n","python",[47,1261,1262,1267,1272,1277,1282,1288,1294,1300,1306,1312,1318,1323,1329,1335,1341,1347,1353],{"__ignoreMap":136},[140,1263,1264],{"class":142,"line":143},[140,1265,1266],{},"import json\n",[140,1268,1269],{"class":142,"line":166},[140,1270,1271],{},"import subprocess\n",[140,1273,1274],{"class":142,"line":187},[140,1275,1276],{},"from playwright.sync_api import sync_playwright\n",[140,1278,1280],{"class":142,"line":1279},4,[140,1281,1173],{"emptyLinePlaceholder":790},[140,1283,1285],{"class":142,"line":1284},5,[140,1286,1287],{},"session = json.loads(subprocess.run(\n",[140,1289,1291],{"class":142,"line":1290},6,[140,1292,1293],{},"    [\"monid\", \"run\", \"-p\", \"x402.browserbase.com\",\n",[140,1295,1297],{"class":142,"line":1296},7,[140,1298,1299],{},"     \"-e\", \"\u002Fbrowser\u002Fsession\u002Fcreate\", \"-w\", \"-j\"],\n",[140,1301,1303],{"class":142,"line":1302},8,[140,1304,1305],{},"    capture_output=True, text=True, check=True,\n",[140,1307,1309],{"class":142,"line":1308},9,[140,1310,1311],{},"    env={\"NO_COLOR\": \"1\"},\n",[140,1313,1315],{"class":142,"line":1314},10,[140,1316,1317],{},").stdout)\n",[140,1319,1321],{"class":142,"line":1320},11,[140,1322,1173],{"emptyLinePlaceholder":790},[140,1324,1326],{"class":142,"line":1325},12,[140,1327,1328],{},"with sync_playwright() as p:\n",[140,1330,1332],{"class":142,"line":1331},13,[140,1333,1334],{},"    browser = p.chromium.connect_over_cdp(session[\"connectUrl\"])\n",[140,1336,1338],{"class":142,"line":1337},14,[140,1339,1340],{},"    page = browser.contexts[0].pages[0]\n",[140,1342,1344],{"class":142,"line":1343},15,[140,1345,1346],{},"    page.goto(\"https:\u002F\u002Fexample.com\")\n",[140,1348,1350],{"class":142,"line":1349},16,[140,1351,1352],{},"    print(page.title())\n",[140,1354,1356],{"class":142,"line":1355},17,[140,1357,1358],{},"    browser.close()\n",[11,1360,1361,1363],{},[38,1362,1195],{}," A normal Playwright page object. Every selector, wait and assertion you already wrote works unchanged, which is the reason to use CDP rather than a bespoke API.",[11,1365,1366,1368],{},[38,1367,1229],{}," The session, not the actions. Ten clicks inside one session cost the same as one.",[232,1370,1372],{"id":1371},"step-3-close-it-and-mean-it","Step 3. Close it, and mean it",[11,1374,1375,1377],{},[38,1376,1131],{}," Ends the session so the meter stops.",[11,1379,1380,1382,1383,1385],{},[38,1381,1137],{}," None, though sessions carry an ",[47,1384,1213],{}," as a backstop.",[11,1387,1388,119,1390,1393,1394,1397],{},[38,1389,1148],{},[47,1391,1392],{},"browser.close()"," in a ",[47,1395,1396],{},"finally"," block, or a context manager. This is the entire cost control story for browser work: sessions that leak are the only way this gets expensive, and they leak when an exception skips the cleanup.",[11,1399,1400,1402],{},[38,1401,1195],{}," Nothing, which is the point.",[320,1404,1405],{},[11,1406,324,1407,119,1409],{},[38,1408,327],{},[18,1410,1412],{"href":1411},"\u002Fblog\u002Fhow-i-gave-my-agent-eyes-on-the-live-web","How I Gave My Agent Eyes on the Live Web",[27,1414,1416],{"id":1415},"how-do-you-build-an-agentic-browser","How do you build an agentic browser?",[11,1418,1419],{},"Assemble three parts: a browser you can drive remotely, a way to turn a page into something a model can read, and a loop that turns model output into actions. None of the three is research any more, and open source implementations of the loop exist to start from.",[11,1421,1422],{},"The part that decides whether it works is the page representation. Feeding raw HTML is the naive version and it burns the context window on markup. The approaches that hold up are the accessibility tree, which is compact and carries element roles, or a numbered overlay where interactive elements get short ids the model can refer to. Pick one before you write the loop, because everything else depends on it.",[11,1424,1425],{},"The part that decides whether it is safe is what the session is allowed to reach. Build it with no credentials by default, add them per task, and treat every instruction that arrives via page content as data rather than a command. That is the direct lesson of the Comet research above, and it is much easier to design in at the start than to retrofit.",[11,1427,1428],{},"The part people underestimate is the browser fleet. One session on a laptop is a demo. Concurrent sessions with clean state, sensible timeouts and no leaks is an operations project, and it is the reason remote session endpoints exist as products at all.",[27,1430,480],{"id":479},[482,1432,1433,1450],{},[485,1434,1435],{},[488,1436,1437,1439,1441,1444,1447],{},[491,1438,493],{},[491,1440,496],{},[491,1442,1443],{},"Input",[491,1445,1446],{},"Output",[491,1448,1449],{},"Billing",[504,1451,1452,1472,1493,1514,1536],{},[488,1453,1454,1457,1463,1466,1469],{},[509,1455,1456],{},"A task with a session",[509,1458,1459],{},[18,1460,1461],{"href":1140},[47,1462,1143],{},[509,1464,1465],{},"none",[509,1467,1468],{},"sessionId, connectUrl, liveUrl, paidMinutes, expiresAt",[509,1470,1471],{},"per call",[488,1473,1474,1477,1485,1488,1491],{},[509,1475,1476],{},"Page text, no browser",[509,1478,1479],{},[18,1480,1482],{"href":1481},"\u002Ftools\u002Fcontext-dev",[47,1483,1484],{},"context.dev\u002Fweb\u002Fscrape\u002Fmarkdown",[509,1486,1487],{},"url, useMainContentOnly, waitForMs",[509,1489,1490],{},"markdown plus page metadata",[509,1492,1471],{},[488,1494,1495,1498,1506,1509,1512],{},[509,1496,1497],{},"Rendered HTML for a parser",[509,1499,1500],{},[18,1501,1503],{"href":1502},"\u002Ftools\u002Fweb",[47,1504,1505],{},"context.dev\u002Fweb\u002Fscrape\u002Fhtml",[509,1507,1508],{},"url, render options",[509,1510,1511],{},"fully rendered HTML",[509,1513,1471],{},[488,1515,1516,1519,1527,1530,1533],{},[509,1517,1518],{},"Ten URLs, free",[509,1520,1521],{},[18,1522,1524],{"href":1523},"\u002Ftools\u002Ftinyfish",[47,1525,1526],{},"tinyfish\u002Ffetch",[509,1528,1529],{},"urls, purpose, format",[509,1531,1532],{},"text, title, language, latency",[509,1534,1535],{},"free",[488,1537,1538,1541,1549,1552,1555],{},[509,1539,1540],{},"Find pages first",[509,1542,1543],{},[18,1544,1546],{"href":1545},"\u002Ftools\u002Fsearch",[47,1547,1548],{},"context.dev\u002Fweb\u002Fsearch",[509,1550,1551],{},"query, numResults, freshness",[509,1553,1554],{},"ranked results, optional markdown",[509,1556,1557],{},"per result",[11,1559,1560,1561,1563],{},"Every row verified with ",[47,1562,607],{}," on 21 August 2026. The table gives the billing shape rather than a figure, because the shape is what changes your design and a number goes stale silently.",[27,1565,1567],{"id":1566},"when-does-your-agent-not-need-a-browser","When does your agent not need a browser?",[11,1569,1570],{},"Most of the time, and this is the section that will save you the most money. The test is one question: does the task carry state across requests? Logins, carts, multi-step forms and wizards do. Reading a page does not, and reading a page is what the majority of agent web tasks turn out to be.",[11,1572,1573,1574,1578,1579,1583],{},"If the answer is no, a fetch endpoint does the same job for a small fraction of the cost and none of the operational surface. ",[18,1575,1576],{"href":1481},[47,1577,1484],{}," renders JavaScript on its side, so the usual reason people cite for needing a browser is already handled, and it returns markdown rather than a DOM you then have to reduce. That endpoint is the fourth of the four kinds of scraping tool, and ",[18,1580,1582],{"href":1581},"\u002Fblog\u002Fguides\u002Fweb-scraping-tools-which-kind","the taxonomy guide"," covers where the other three fit.",[11,1585,1586],{},"If the site has an API, use the API and skip both. Driving a browser against a service that publishes structured data is the most expensive way to get information that was available for free, and agent frameworks make it easy to do by accident because clicking feels more general than integrating.",[11,1588,1589],{},"And if you are doing consumer browsing rather than building, a consumer agentic browser is genuinely the right tool and nothing here argues otherwise. Just read the security research first, and be deliberate about which tabs it can see.",[27,1591,696],{"id":695},[11,1593,1594],{},"Agentic browser names two products, and once you know which one a given article means, most of the confusion in the category disappears. One shares your identity to save you time; the other has no identity at all and saves you from operating a browser fleet.",[11,1596,1597],{},"The decision rule that matters more than the vendor choice is state. A browser exists to run JavaScript and to remember things between requests. If your task needs the second, open a session. If it only needs the first, an endpoint already renders the page and you are paying for a browser to reach a result you could have fetched.",[11,1599,1600,1601,102,1604,1606,1607,260],{},"Free next step: run ",[47,1602,1603],{},"monid discover -q \"headless browser automation session\"",[47,1605,607],{}," the top row alongside the markdown scrape endpoint. Both are free, and comparing the two schemas is the fastest way to see which side of the state question your job falls on. Start at ",[18,1608,725],{"href":723,"rel":1609},[124,125],[27,1611,729],{"id":728},[731,1613,1615],{"q":1614},"What is Comet, and is it an agentic browser?",[11,1616,1617],{},"Comet is Perplexity's browser with a built-in assistant that can act on the page you are viewing, so yes, it is an agentic browser of the consumer kind. Atlas from OpenAI is the other name that comes up most often and sits in the same category. Neither is something you call from code; if you are looking for an agentic browser your program can drive, you want a remote session endpoint instead.",[731,1619,1621],{"q":1620},"Do you still need playwright-stealth or undetected-chromedriver?",[11,1622,1623],{},"Only if you are running the browser yourself. Both projects exist to make a locally launched automated Chrome look less automated, and both are in a permanent race against detection they cannot win outright. A hosted session removes the reason to run that race, because keeping the browser presentable is the provider's job rather than a dependency in your requirements file. If the underlying task is just reading a page, neither library nor a browser is the answer.",[731,1625,1627],{"q":1626},"Are agentic browsers safe?",[11,1628,1629],{},"Consumer ones carry a real and currently unsolved risk, which is indirect prompt injection: instructions hidden in page content that the model executes as if you had typed them. Brave's researchers demonstrated this against Comet using both hidden page text and text concealed inside a screenshot, in cases as ordinary as asking for a page summary. Programmable sessions dodge most of the impact by holding no credentials, which is a good reason to prefer them for anything automated.",[731,1631,1633],{"q":1632},"Can you run an agentic browser with a local LLM?",[11,1634,1635],{},"Yes, and the loop is model agnostic, so a local model works as long as it can follow a structured action format reliably. The practical limits are context and consistency: page representations are long, and a small local model tends to drift over a multi-step task in a way that shows up as clicking the wrong element rather than as an error. Start by keeping the browser remote and the model local, since those two choices are independent.",[421,1637,1640],{"category":1638,"title":1639},"agents","Give your agent a browser it does not have to run",[11,1641,1642],{},"Discover the endpoint, read its schema and current price for free, then run it. One key, one balance, no browser fleet.",[11,1644,1645],{},[758,1646,760],{},[762,1648,1649],{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":136,"searchDepth":166,"depth":166,"links":1651},[1652,1657,1662,1669,1670,1671,1672,1673],{"id":869,"depth":166,"text":870,"children":1653},[1654,1655,1656],{"id":876,"depth":187,"text":877},{"id":886,"depth":187,"text":887},{"id":902,"depth":187,"text":903},{"id":1005,"depth":166,"text":1006,"children":1658},[1659,1660,1661],{"id":1012,"depth":187,"text":1013},{"id":1022,"depth":187,"text":1023},{"id":1044,"depth":187,"text":1045},{"id":1061,"depth":166,"text":1062,"children":1663},[1664,1665,1666,1667,1668],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":1125,"depth":187,"text":1126},{"id":1236,"depth":187,"text":1237},{"id":1371,"depth":187,"text":1372},{"id":1415,"depth":166,"text":1416},{"id":479,"depth":166,"text":480},{"id":1566,"depth":166,"text":1567},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"Product","\u002Fimg\u002Fblog\u002Fagentic-browser-when-your-agent-needs-one.png","Agentic browser names two products: one you sit in front of and one your agent drives. Most jobs need neither. The test is whether the task carries state.","\u002Fimg\u002Fblog\u002Fagentic-browser-when-your-agent-needs-one-card.png",{},"\u002Fblog\u002Fguides\u002Fagentic-browser-when-your-agent-needs-one","2026-08-21","12 min",{"title":805,"description":1676},"blog\u002Fguides\u002Fagentic-browser-when-your-agent-needs-one",[1685,1686,1687,1688,1689],"agentic browser","browser automation","ai agents","playwright","browserbase","0XvJJx-7aUz6-UcYBkE4TqvHi_bF_bsUPMUq1347aWU",{"id":1692,"title":1693,"author":6,"body":1694,"category":2378,"cover":2379,"description":2380,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":2381,"meta":2382,"navigation":790,"ogImage":787,"path":2383,"publishedAt":1680,"readTime":1681,"seo":2384,"stem":2385,"tags":2386,"toolCategory":2343,"updatedAt":1680,"__hash__":2391},"blogGuides\u002Fblog\u002Fguides\u002Fdo-ai-agents-need-a-rotating-proxy.md","Do You Still Need a Rotating Proxy in 2026?",{"type":8,"value":1695,"toc":2355},[1696,1699,1738,1746,1750,1753,1757,1760,1763,1767,1770,1773,1777,1780,1866,1869,1879,1883,1886,1890,1893,1897,1900,1907,1911,1914,1924,1928,1931,1934,1937,1940,1944,1954,1958,1961,1965,1970,1989,1993,2048,2082,2100,2104,2107,2109,2114,2119,2124,2134,2136,2261,2266,2270,2273,2276,2279,2281,2284,2287,2298,2300,2311,2317,2327,2341,2348,2352],[11,1697,1698],{"style":810},"Copy this line to your agent to read a defended page without owning any proxies.",[131,1700,1702],{"className":814,"code":1701,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use context.dev \u002Fweb\u002Fscrape\u002Fmarkdown to read a page into markdown\n",[47,1703,1704],{"__ignoreMap":136},[140,1705,1706,1708,1710,1712,1714,1716,1719,1722,1724,1727,1729,1732,1735],{"class":142,"line":143},[140,1707,824],{"class":823},[140,1709,827],{"class":150},[140,1711,830],{"class":150},[140,1713,833],{"class":150},[140,1715,836],{"class":150},[140,1717,1718],{"class":150}," context.dev",[140,1720,1721],{"class":150}," \u002Fweb\u002Fscrape\u002Fmarkdown",[140,1723,845],{"class":150},[140,1725,1726],{"class":150}," read",[140,1728,851],{"class":150},[140,1730,1731],{"class":150}," page",[140,1733,1734],{"class":150}," into",[140,1736,1737],{"class":150}," markdown\n",[11,1739,1740,1741,98,1744,260],{},"A rotating proxy is an input. You buy gigabytes of it, point your scraper through it, and hope the requests land. What you actually wanted was a rendered page, and the distance between those two things is where the proxy bill goes. This guide explains what rotating proxies are and how they work, then makes the case that most teams buying one are buying a component when the outcome is available directly through ",[18,1742,864],{"href":723,"rel":1743},[124,125],[18,1745,21],{"href":20},[27,1747,1749],{"id":1748},"what-is-a-rotating-proxy","What is a rotating proxy?",[11,1751,1752],{},"A rotating proxy is a service that sends each of your requests out from a different IP address, drawn from a pool the provider maintains. You connect to one endpoint, the provider handles the selection, and the site you are calling sees a different origin each time rather than a stream from one machine.",[232,1754,1756],{"id":1755},"residential-datacentre-and-mobile-and-why-the-labels-cost-different-amounts","Residential, datacentre and mobile, and why the labels cost different amounts",[11,1758,1759],{},"The pool has to come from somewhere, and where it comes from is the entire pricing story. Datacentre addresses belong to hosting providers, are cheap and plentiful, and are the easiest kind for a site to identify as automated traffic. Residential addresses belong to consumer internet connections, look like ordinary people because they are ordinary people's connections, and cost far more. Mobile addresses come from carrier networks, are the most expensive, and are also the hardest to block because carriers share one address across many subscribers.",[11,1761,1762],{},"That ordering is why \"residential proxy\" carries eight times the search volume of \"rotating proxy\" in the United States: the rotation is the mechanism, and the address type is what people are actually shopping for.",[232,1764,1766],{"id":1765},"why-the-pricing-model-matters-more-than-the-pool","Why the pricing model matters more than the pool",[11,1768,1769],{},"Residential and mobile pools are almost always sold by bandwidth, which is a strange unit for the job. You are billed for the bytes that cross the connection whether or not the page you wanted came back, so a blocked request, a challenge page and a successful fetch all cost you something, and only one of them is worth anything. Datacentre pools are usually sold per IP or per month, which is easier to reason about and buys you a resource that is worse at the task.",[11,1771,1772],{},"Neither model prices what you care about, which is pages retrieved.",[232,1774,1776],{"id":1775},"the-consent-question-nobody-in-the-category-leads-with","The consent question nobody in the category leads with",[11,1778,1779],{},"Residential pools are assembled from real people's connections, generally through software those people installed for some other reason with the proxy participation somewhere in the terms. The reputable providers audit this and publish how they source it, and it is worth reading before you buy rather than after. If your own product is going to be judged on data provenance, the provenance of the pipe counts too.",[482,1781,1782,1797],{},[485,1783,1784],{},[488,1785,1786,1788,1791,1794],{},[491,1787,915],{},[491,1789,1790],{},"Datacentre",[491,1792,1793],{},"Residential",[491,1795,1796],{},"Mobile",[504,1798,1799,1813,1827,1841,1855],{},[488,1800,1801,1804,1807,1810],{},[509,1802,1803],{},"Address belongs to",[509,1805,1806],{},"A hosting provider",[509,1808,1809],{},"A consumer connection",[509,1811,1812],{},"A carrier network",[488,1814,1815,1818,1821,1824],{},[509,1816,1817],{},"Typical billing",[509,1819,1820],{},"Per IP or per month",[509,1822,1823],{},"Per gigabyte",[509,1825,1826],{},"Per gigabyte, higher",[488,1828,1829,1832,1835,1838],{},[509,1830,1831],{},"Easy to identify",[509,1833,1834],{},"Yes",[509,1836,1837],{},"No",[509,1839,1840],{},"Rarely",[488,1842,1843,1846,1849,1852],{},[509,1844,1845],{},"Cost per successful page",[509,1847,1848],{},"Low, when it works",[509,1850,1851],{},"High",[509,1853,1854],{},"Highest",[488,1856,1857,1860,1862,1864],{},[509,1858,1859],{},"You pay for failures",[509,1861,1834],{},[509,1863,1834],{},[509,1865,1834],{},[11,1867,1868],{},"The bottom row is the pattern: every one of these is priced on the attempt and none of them on the result.",[320,1870,1871],{},[11,1872,324,1873,119,1875],{},[38,1874,327],{},[18,1876,1878],{"href":1877},"\u002Fblog\u002Fguides\u002Fscraper-blocked-what-gets-through","Your Scraper Is Blocked: What Actually Gets Through in 2026",[27,1880,1882],{"id":1881},"how-does-a-rotating-proxy-work","How does a rotating proxy work?",[11,1884,1885],{},"It works as a gateway. You send your request to one host and port with your credentials attached, the provider picks an exit address from its pool, forwards your request from there, and returns the response back down the same connection. Your code changes by one line, which is most of the appeal.",[232,1887,1889],{"id":1888},"what-the-provider-decides-on-your-behalf","What the provider decides on your behalf",[11,1891,1892],{},"Which address to use, how long to keep it, and what to do when the target refuses. Those three decisions are the product, and they are usually opaque: you set a session parameter and a country, and the rest is the provider's policy. When a job works this is invisible, and when it does not you have very little to debug with, because the layer that made the decision is not yours.",[232,1894,1896],{"id":1895},"what-a-rotation-cannot-fix","What a rotation cannot fix",[11,1898,1899],{},"Rotation changes where a request appears to come from. It does not change what the request looks like. Modern bot detection reads the shape of the connection and the browser fingerprint alongside the address, so an obviously automated client from a perfect residential IP is still an obviously automated client. This is why teams add a proxy, see no improvement, and conclude they need a more expensive pool, when the address was never the failing part.",[11,1901,1902,1903,1906],{},"It also does nothing about rendering. If the content arrives through JavaScript after the page loads, a proxied ",[47,1904,1905],{},"requests"," call returns the same empty shell it returned before, from a nicer address.",[232,1908,1910],{"id":1909},"where-that-leaves-the-rotation","Where that leaves the rotation",[11,1912,1913],{},"As one component of three: an acceptable address, a client that looks like a browser, and a renderer. Buying one of the three and expecting the outcome is the mistake, and it is a natural one to make because only one of the three has an obvious marketplace.",[320,1915,1916],{},[11,1917,324,1918,119,1920],{},[38,1919,327],{},[18,1921,1923],{"href":1922},"\u002Fblog\u002Freal-cost-of-scraping-youtube-yourself","The Real Cost of Scraping YouTube Yourself",[27,1925,1927],{"id":1926},"rotating-proxy-vs-sticky-session-which-do-you-want","Rotating proxy vs sticky session: which do you want?",[11,1929,1930],{},"Sticky, more often than people assume. A rotating configuration gives you a new address per request, and a sticky one keeps the same address for a set window, usually a few minutes. The choice is decided by whether your target needs to recognise you across requests.",[11,1932,1933],{},"Rotate when every request is independent: a list of unrelated URLs, a wide crawl, a batch of lookups where nothing carries over. Rotation spreads the load and no request cares what the previous one did.",[11,1935,1936],{},"Stick when there is a session. Anything with a login, a cart, pagination that depends on a cursor, or a multi-step form will break if the address changes underneath it, and the failure is confusing because it looks like the site logged you out at random. A static residential address, held for the length of the job, is the version of this you buy when the session lasts hours rather than minutes.",[11,1938,1939],{},"The rule that resolves it: rotation is for breadth, stickiness is for depth. If your job has state, you do not want the address changing, and if it does not, you do not want to pay for the address to persist.",[27,1941,1943],{"id":1942},"how-do-you-rotate-proxies-in-python","How do you rotate proxies in Python?",[11,1945,1946,1947,1949,1950,1953],{},"You point your HTTP client at the gateway and let the provider do it. In ",[47,1948,1905],{}," that is a ",[47,1951,1952],{},"proxies"," dictionary; in Selenium or Playwright it is a launch argument. The mechanics are five lines and every provider documents them, so the interesting question is not how, it is what you inherit once you have.",[232,1955,1957],{"id":1956},"what-you-inherit","What you inherit",[11,1959,1960],{},"A credential to rotate, a bandwidth budget to watch, a failure mode that is invisible from your side, a retry policy you now have to write, and a bill that grows with attempts rather than results. None of that is hard individually. Collectively it is a system, and it is a system that exists to deliver page text.",[232,1962,1964],{"id":1963},"the-version-where-the-fetch-is-the-endpoint","The version where the fetch is the endpoint",[11,1966,1967,1969],{},[38,1968,1131],{}," Returns the page, with the address selection, the browser and the retry policy on the provider's side of the call.",[11,1971,1972,119,1974,98,1978,98,1982,1988],{},[38,1973,1137],{},[18,1975,1976],{"href":1481},[47,1977,1484],{},[18,1979,1980],{"href":1502},[47,1981,1505],{},[18,1983,1985],{"href":1984},"\u002Ftools\u002Focten",[47,1986,1987],{},"octen\u002Fextract"," for batches.",[11,1990,1991],{},[38,1992,1148],{},[131,1994,1996],{"className":133,"code":1995,"language":135,"meta":136,"style":136},"monid inspect -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown\n\nmonid run -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown \\\n  --query '{\"url\":\"https:\u002F\u002Fexample.com\",\"useMainContentOnly\":true}' -w\n",[47,1997,1998,2013,2017,2033],{"__ignoreMap":136},[140,1999,2000,2002,2004,2006,2008,2010],{"class":142,"line":143},[140,2001,147],{"class":146},[140,2003,151],{"class":150},[140,2005,154],{"class":150},[140,2007,1718],{"class":150},[140,2009,160],{"class":150},[140,2011,2012],{"class":150}," \u002Fweb\u002Fscrape\u002Fmarkdown\n",[140,2014,2015],{"class":142,"line":166},[140,2016,1173],{"emptyLinePlaceholder":790},[140,2018,2019,2021,2023,2025,2027,2029,2031],{"class":142,"line":187},[140,2020,147],{"class":146},[140,2022,171],{"class":150},[140,2024,154],{"class":150},[140,2026,1718],{"class":150},[140,2028,160],{"class":150},[140,2030,1721],{"class":150},[140,2032,184],{"class":183},[140,2034,2035,2038,2040,2043,2046],{"class":142,"line":1279},[140,2036,2037],{"class":150},"  --query",[140,2039,194],{"class":193},[140,2041,2042],{"class":150},"{\"url\":\"https:\u002F\u002Fexample.com\",\"useMainContentOnly\":true}",[140,2044,2045],{"class":193},"'",[140,2047,1190],{"class":150},[11,2049,2050,119,2052,98,2055,98,2058,98,2061,2064,2065,2068,2069,98,2072,98,2075,102,2078,2081],{},[38,2051,1195],{},[47,2053,2054],{},"success",[47,2056,2057],{},"markdown",[47,2059,2060],{},"contentLength",[47,2062,2063],{},"url",", and a ",[47,2066,2067],{},"metadata"," object carrying ",[47,2070,2071],{},"sourceUrl",[47,2073,2074],{},"finalUrl",[47,2076,2077],{},"title",[47,2079,2080],{},"language",". Verified against a live run on 21 August 2026.",[11,2083,2084,2086,2087,2090,2091,2095,2096,2099],{},[38,2085,1229],{}," A fraction of a cent per page, billed per call, with current figures on ",[18,2088,1233],{"href":2089},"\u002Ftools\u002Fscrapers",". The line that matters is in the endpoint's own pricing note, verified the same day: JavaScript rendering, anti-bot bypass and premium proxies are included, and failed or blocked requests are not billed. ",[18,2092,2093],{"href":1984},[47,2094,1987],{}," says the same thing in its own terms, returning failed URLs with a ",[47,2097,2098],{},"failed"," status and not charging for them.",[232,2101,2103],{"id":2102},"why-the-billing-unit-is-the-whole-argument","Why the billing unit is the whole argument",[11,2105,2106],{},"Because it moves the risk. Bandwidth pricing charges you for attempts, so every block is a small payment for nothing and the incentive to keep the pool working sits with you. Per-page pricing that excludes failures charges you for results, so the incentive sits with the provider. That is the same reason a fixed-price quote feels different from an hourly rate, and it is a bigger practical difference than any pool quality claim on either side.",[232,2108,235],{"id":234},[11,2110,238,2111,244],{},[18,2112,243],{"href":241,"rel":2113},[124,125],[131,2115,2117],{"className":2116,"code":249,"language":97,"meta":136},[248],[47,2118,249],{"__ignoreMap":136},[11,2120,254,2121,260],{},[18,2122,259],{"href":257,"rel":2123},[124,125],[320,2125,2126],{},[11,2127,324,2128,119,2130],{},[38,2129,327],{},[18,2131,2133],{"href":2132},"\u002Fblog\u002Fguides\u002Fpython-web-scraping-without-a-scraper","Web Scraping in Python Without Maintaining a Scraper",[27,2135,480],{"id":479},[482,2137,2138,2152],{},[485,2139,2140],{},[488,2141,2142,2144,2146,2148,2150],{},[491,2143,493],{},[491,2145,496],{},[491,2147,1443],{},[491,2149,1446],{},[491,2151,1449],{},[504,2153,2154,2173,2190,2210,2226,2244],{},[488,2155,2156,2159,2165,2168,2170],{},[509,2157,2158],{},"One defended page to markdown",[509,2160,2161],{},[18,2162,2163],{"href":1481},[47,2164,1484],{},[509,2166,2167],{},"url, useMainContentOnly, waitForMs, country",[509,2169,1490],{},[509,2171,2172],{},"per call, failures unbilled",[488,2174,2175,2178,2184,2186,2188],{},[509,2176,2177],{},"Rendered HTML for your parser",[509,2179,2180],{},[18,2181,2182],{"href":1502},[47,2183,1505],{},[509,2185,1508],{},[509,2187,1511],{},[509,2189,1471],{},[488,2191,2192,2195,2201,2204,2207],{},[509,2193,2194],{},"Twenty URLs in one request",[509,2196,2197],{},[18,2198,2199],{"href":1984},[47,2200,1987],{},[509,2202,2203],{},"urls, optional query",[509,2205,2206],{},"markdown or text per URL",[509,2208,2209],{},"per result, failures unbilled",[488,2211,2212,2214,2220,2222,2224],{},[509,2213,1518],{},[509,2215,2216],{},[18,2217,2218],{"href":1523},[47,2219,1526],{},[509,2221,1529],{},[509,2223,1532],{},[509,2225,1535],{},[488,2227,2228,2231,2237,2239,2242],{},[509,2229,2230],{},"A job that needs a real session",[509,2232,2233],{},[18,2234,2235],{"href":1140},[47,2236,1143],{},[509,2238,1465],{},[509,2240,2241],{},"sessionId, connectUrl, liveUrl, paidMinutes",[509,2243,1471],{},[488,2245,2246,2249,2255,2257,2259],{},[509,2247,2248],{},"Search rather than fetch",[509,2250,2251],{},[18,2252,2253],{"href":1545},[47,2254,1548],{},[509,2256,1551],{},[509,2258,1554],{},[509,2260,1557],{},[11,2262,1560,2263,2265],{},[47,2264,607],{}," on 21 August 2026. The table gives the billing shape rather than a figure, because the shape is the argument and a number goes stale silently.",[27,2267,2269],{"id":2268},"when-do-you-actually-need-to-own-the-proxies","When do you actually need to own the proxies?",[11,2271,2272],{},"When the address itself is the requirement rather than a means to a page. Geolocation testing is the clearest case: if your job is to see what a site serves in twelve countries, you need to control the exit point, and no page-fetch endpoint will give you that granularity. Ad verification and localisation QA are the same shape.",[11,2274,2275],{},"You need your own pool when the protocol is not HTTP. Fetch endpoints return web pages. If you are speaking to a socket service, a mail server or a game protocol, buy proxies, because nothing in this guide applies to you.",[11,2277,2278],{},"And you need one at sustained volume against a single target where you have negotiated a rate. If a proxy provider will sell you a committed plan that undercuts per-page pricing for the traffic you actually run, take it, and run the fetch layer. That is Bright Data's genuine strength: at the top end their pool is deeper than anything you get bundled, their country and city targeting is real, and if you have the engineering to operate it, you will beat a per-page price. The honest position is that most teams asking this question are nowhere near that volume and are buying the operating cost along with the pool.",[27,2280,696],{"id":695},[11,2282,2283],{},"Do you still need a rotating proxy in 2026? Only if you need an address. If you need a page, you have been buying a component of the answer and assembling the rest yourself, and the assembly is where the cost and the maintenance live.",[11,2285,2286],{},"The thing worth carrying away is the billing unit. Bandwidth pricing charges you for attempts and puts the risk of a block on you; per-page pricing that excludes failures puts it on the provider. That difference survives every argument about pool quality, and it is the one to check first when you compare two offers.",[11,2288,1600,2289,102,2292,2294,2295,260],{},[47,2290,2291],{},"monid discover -q \"scrape any website url to markdown\"",[47,2293,607],{}," the top result. Both are free, and the pricing note will tell you exactly what is bundled before you spend anything. Start at ",[18,2296,725],{"href":723,"rel":2297},[124,125],[27,2299,729],{"id":728},[731,2301,2303],{"q":2302},"How do you get a free rotating proxy?",[11,2304,2305,2306,2310],{},"Public free proxy lists exist and they are a bad idea for anything you care about, because you cannot know who operates the exit node your traffic passes through. Free tiers from real providers are the safer version and are sized for testing. If what you want is free page fetching rather than free addresses, ",[18,2307,2308],{"href":1523},[47,2309,1526],{}," handles batches of up to ten URLs at no cost, which covers a lot of evaluation work without any proxy at all.",[731,2312,2314],{"q":2313},"What is the difference between a rotating and a static residential proxy?",[11,2315,2316],{},"A rotating residential proxy gives you a different consumer IP per request; a static one gives you the same consumer IP for as long as you hold it. Rotating is for breadth across many independent requests, static is for jobs with a session that must not change identity mid way. Static residential addresses usually cost more per unit and are sold per IP rather than purely by bandwidth, which makes them easier to budget.",[731,2318,2320],{"q":2319},"Is there a rotating proxy with pay as you go pricing?",[11,2321,2322,2323,260],{},"Several providers sell prepaid bandwidth with no monthly commitment, and that is the closest thing the proxy category has to pay as you go. It is still pay per gigabyte, which means you pay for blocked attempts. Pay per successful page is a different pricing shape and it comes from fetch endpoints rather than proxy sellers. There is a fuller treatment of why the unit matters in ",[18,2324,2326],{"href":2325},"\u002Fblog\u002Fguides\u002Fpay-per-call-data-api-vs-subscription","the pay-per-call guide",[731,2328,2330],{"q":2329},"Do I need a proxy to scrape with Selenium?",[11,2331,2332,2333,2337,2338,2340],{},"Not usually, and reaching for one first is a common misdiagnosis. Selenium already solves the rendering problem, so if pages are still failing, check whether the response is a block or an empty render before you buy addresses. When you do need both a browser and an address you did not have to source, a hosted session such as ",[18,2334,2335],{"href":1140},[47,2336,1143],{}," gives you a ",[47,2339,1201],{}," to attach Playwright to and keeps both concerns off your machine.",[421,2342,2345],{"category":2343,"title":2344},"scrapers","Buy the page, not the pipe",[11,2346,2347],{},"Discover the endpoint, read its schema and current price for free, then run it. One key, one balance, no bandwidth budget.",[11,2349,2350],{},[758,2351,760],{},[762,2353,2354],{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":136,"searchDepth":166,"depth":166,"links":2356},[2357,2362,2367,2368,2374,2375,2376,2377],{"id":1748,"depth":166,"text":1749,"children":2358},[2359,2360,2361],{"id":1755,"depth":187,"text":1756},{"id":1765,"depth":187,"text":1766},{"id":1775,"depth":187,"text":1776},{"id":1881,"depth":166,"text":1882,"children":2363},[2364,2365,2366],{"id":1888,"depth":187,"text":1889},{"id":1895,"depth":187,"text":1896},{"id":1909,"depth":187,"text":1910},{"id":1926,"depth":166,"text":1927},{"id":1942,"depth":166,"text":1943,"children":2369},[2370,2371,2372,2373],{"id":1956,"depth":187,"text":1957},{"id":1963,"depth":187,"text":1964},{"id":2102,"depth":187,"text":2103},{"id":234,"depth":187,"text":235},{"id":479,"depth":166,"text":480},{"id":2268,"depth":166,"text":2269},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"Search & RAG","\u002Fimg\u002Fblog\u002Fdo-ai-agents-need-a-rotating-proxy.png","A rotating proxy is an input you buy by the gigabyte and hope works. Most teams wanted the outcome instead. Here is how to tell which one you need.","\u002Fimg\u002Fblog\u002Fdo-ai-agents-need-a-rotating-proxy-card.png",{},"\u002Fblog\u002Fguides\u002Fdo-ai-agents-need-a-rotating-proxy",{"title":1693,"description":2380},"blog\u002Fguides\u002Fdo-ai-agents-need-a-rotating-proxy",[2387,2388,2389,1687,2390],"rotating proxy","residential proxy","web scraping","infrastructure","JXitk50yGV94rt6IVZXTwt8pNrBT2gzsaJJoHqGZTH8",{"id":2393,"title":2133,"author":6,"body":2394,"category":2378,"cover":3315,"description":3316,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":3317,"meta":3318,"navigation":790,"ogImage":787,"path":2132,"publishedAt":1680,"readTime":1681,"seo":3319,"stem":3320,"tags":3321,"toolCategory":2343,"updatedAt":1680,"__hash__":3324},"blogGuides\u002Fblog\u002Fguides\u002Fpython-web-scraping-without-a-scraper.md",{"type":8,"value":2395,"toc":3291},[2396,2399,2431,2439,2443,2446,2450,2461,2465,2468,2471,2475,2478,2549,2552,2562,2566,2569,2571,2576,2581,2586,2588,2624,2628,2633,2652,2656,2694,2702,2707,2711,2716,2724,2728,2838,2860,2867,2871,2881,2886,2890,2968,2973,2978,2988,2992,2998,3002,3005,3009,3012,3022,3026,3037,3045,3049,3052,3055,3058,3068,3070,3194,3199,3203,3209,3212,3215,3217,3220,3223,3233,3235,3248,3263,3273,3279,3285,3289],[11,2397,2398],{"style":810},"Copy this line to your agent to pull a page into clean text without writing a fetcher.",[131,2400,2401],{"className":814,"code":1701,"language":816,"meta":136,"style":136},[47,2402,2403],{"__ignoreMap":136},[140,2404,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2425,2427,2429],{"class":142,"line":143},[140,2406,824],{"class":823},[140,2408,827],{"class":150},[140,2410,830],{"class":150},[140,2412,833],{"class":150},[140,2414,836],{"class":150},[140,2416,1718],{"class":150},[140,2418,1721],{"class":150},[140,2420,845],{"class":150},[140,2422,1726],{"class":150},[140,2424,851],{"class":150},[140,2426,1731],{"class":150},[140,2428,1734],{"class":150},[140,2430,1737],{"class":150},[11,2432,2433,2434,98,2437,260],{},"Every Python scraping tutorial teaches the same twenty lines, and those twenty lines work on the sites nobody needed help with. The gap between a tutorial that parses a static page and a job that runs every morning against a site that does not want you is not a Python problem, and no amount of better Python closes it. This guide splits the task into the half Python is genuinely best at and the half it is the wrong place to solve, then shows the second half as one call through ",[18,2435,864],{"href":723,"rel":2436},[124,125],[18,2438,21],{"href":20},[27,2440,2442],{"id":2441},"what-is-web-scraping-in-python","What is web scraping in Python?",[11,2444,2445],{},"Web scraping in Python is two separate jobs that share a name: getting the bytes, and turning the bytes into records. Python is excellent at the second and has no particular advantage at the first, and almost every difficulty people describe belongs to the first.",[232,2447,2449],{"id":2448},"the-parsing-half-which-python-owns","The parsing half, which Python owns",[11,2451,2452,2453,2456,2457,2460],{},"Once you hold the HTML, Python is close to unbeatable. BeautifulSoup makes a messy document navigable in a line, ",[47,2454,2455],{},"lxml"," is fast enough for anything, ",[47,2458,2459],{},"pandas"," turns a table into a dataframe, and the whole downstream stack for cleaning, joining and storing the result already exists in the same language. Nobody writes a blog post complaining about this half, which is why it fills the tutorials.",[232,2462,2464],{"id":2463},"the-fetching-half-which-is-infrastructure","The fetching half, which is infrastructure",[11,2466,2467],{},"Getting the bytes means owning an exit address the site will accept, a browser or a close enough imitation of one, a retry policy, a proxy pool, and a plan for the week the markup changes. None of that is Python code. It is operations work that happens to be triggered from Python, and it is the part that turns a weekend script into a thing you maintain.",[11,2469,2470],{},"The honest way to see the split is to ask what breaks in production. It is never the selector logic. It is a 403 that appeared overnight, a page that now renders its content after a JavaScript call, or a cookie wall that was not there in April.",[232,2472,2474],{"id":2473},"what-scraper-hides","What \"scraper\" hides",[11,2476,2477],{},"The word bundles both halves, so a decision that should be made twice gets made once. Teams evaluate \"should we build or buy a scraper\" as a single question, decide building is fine because the parsing is easy, and inherit the fetching. Split the two and the answer is usually obvious: keep the parsing in Python, where you want the control, and stop operating the fetch.",[482,2479,2480,2492],{},[485,2481,2482],{},[488,2483,2484,2486,2489],{},[491,2485,915],{},[491,2487,2488],{},"The parsing half",[491,2490,2491],{},"The fetching half",[504,2493,2494,2505,2516,2527,2538],{},[488,2495,2496,2499,2502],{},[509,2497,2498],{},"What it is",[509,2500,2501],{},"Selectors, cleaning, records",[509,2503,2504],{},"Exit IPs, browsers, retries",[488,2506,2507,2510,2513],{},[509,2508,2509],{},"Where it lives",[509,2511,2512],{},"Your code",[509,2514,2515],{},"Someone's infrastructure",[488,2517,2518,2521,2524],{},[509,2519,2520],{},"Fails when",[509,2522,2523],{},"The markup changes",[509,2525,2526],{},"The site changes its mind about you",[488,2528,2529,2532,2535],{},[509,2530,2531],{},"Cost of owning it",[509,2533,2534],{},"An afternoon per site",[509,2536,2537],{},"Ongoing, and unpredictable",[488,2539,2540,2543,2546],{},[509,2541,2542],{},"Python's advantage",[509,2544,2545],{},"Large",[509,2547,2548],{},"None",[11,2550,2551],{},"The pattern is that the half people build is the half that was cheap, and the half they inherit is the one with the running cost.",[320,2553,2554],{},[11,2555,324,2556,119,2558],{},[38,2557,327],{},[18,2559,2561],{"href":2560},"\u002Fblog\u002Fguides\u002Fweb-scraping-api-for-ai-agents","The Best Web Scraping API for AI Agents in 2026",[27,2563,2565],{"id":2564},"how-do-you-do-web-scraping-in-python","How do you do web scraping in Python?",[11,2567,2568],{},"Do the fetch as a call and the parse as code. The three steps below are the working shape: find an endpoint that returns the page already rendered, call it from Python, then do everything after that in the language you chose Python for.",[232,2570,235],{"id":234},[11,2572,238,2573,244],{},[18,2574,243],{"href":241,"rel":2575},[124,125],[131,2577,2579],{"className":2578,"code":249,"language":97,"meta":136},[248],[47,2580,249],{"__ignoreMap":136},[11,2582,254,2583,260],{},[18,2584,259],{"href":257,"rel":2585},[124,125],[232,2587,264],{"id":263},[131,2589,2590],{"className":133,"code":1087,"language":135,"meta":136,"style":136},[47,2591,2592,2602],{"__ignoreMap":136},[140,2593,2594,2596,2598,2600],{"class":142,"line":143},[140,2595,274],{"class":146},[140,2597,277],{"class":150},[140,2599,280],{"class":150},[140,2601,283],{"class":150},[140,2603,2604,2606,2608,2610,2612,2614,2616,2618,2620,2622],{"class":142,"line":166},[140,2605,147],{"class":146},[140,2607,290],{"class":150},[140,2609,293],{"class":150},[140,2611,296],{"class":150},[140,2613,299],{"class":193},[140,2615,1114],{"class":150},[140,2617,305],{"class":183},[140,2619,308],{"class":193},[140,2621,311],{"class":150},[140,2623,314],{"class":150},[232,2625,2627],{"id":2626},"step-1-find-an-endpoint-that-already-renders-the-page","Step 1. Find an endpoint that already renders the page",[11,2629,2630,2632],{},[38,2631,1131],{}," Returns a URL as clean markdown or fully rendered HTML, with the browser, proxies and anti-bot handling on the far side.",[11,2634,2635,119,2637,2641,2642,2646,2647,2651],{},[38,2636,1137],{},[18,2638,2639],{"href":1481},[47,2640,1484],{}," for markdown, ",[18,2643,2644],{"href":1502},[47,2645,1505],{}," when you want to keep your selectors, ",[18,2648,2649],{"href":1523},[47,2650,1526],{}," for a free batch of up to ten URLs.",[11,2653,2654],{},[38,2655,1148],{},[131,2657,2659],{"className":133,"code":2658,"language":135,"meta":136,"style":136},"monid discover -q \"scrape any website url to markdown\"\nmonid inspect -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown\n",[47,2660,2661,2680],{"__ignoreMap":136},[140,2662,2663,2665,2668,2671,2674,2677],{"class":142,"line":143},[140,2664,147],{"class":146},[140,2666,2667],{"class":150}," discover",[140,2669,2670],{"class":150}," -q",[140,2672,2673],{"class":193}," \"",[140,2675,2676],{"class":150},"scrape any website url to markdown",[140,2678,2679],{"class":193},"\"\n",[140,2681,2682,2684,2686,2688,2690,2692],{"class":142,"line":166},[140,2683,147],{"class":146},[140,2685,151],{"class":150},[140,2687,154],{"class":150},[140,2689,1718],{"class":150},[140,2691,160],{"class":150},[140,2693,2012],{"class":150},[11,2695,2696,2698,2699,260],{},[38,2697,1195],{}," The schema, the billing shape and the current price, plus the vendor's own note on what is included. For the markdown endpoint that note reads: JavaScript rendering, anti-bot bypass and premium proxies included, and failed or blocked requests are not billed. Verified 21 August 2026. Those last two clauses are the reason most Python scrapers never need ",[18,2700,2701],{"href":2383},"a rotating proxy of their own",[11,2703,2704,2706],{},[38,2705,1229],{}," Nothing for these two commands. Discovery and inspection are free, so you can read the exact price of every candidate before you spend.",[232,2708,2710],{"id":2709},"step-2-call-it-from-python","Step 2. Call it from Python",[11,2712,2713,2715],{},[38,2714,1131],{}," Puts the fetch behind one function, so the rest of your program never learns that scraping was involved.",[11,2717,2718,119,2720,260],{},[38,2719,1137],{},[18,2721,2722],{"href":1481},[47,2723,1484],{},[11,2725,2726],{},[38,2727,1148],{},[131,2729,2731],{"className":1257,"code":2730,"language":1259,"meta":136,"style":136},"import json\nimport subprocess\n\ndef fetch_markdown(url: str) -> dict:\n    proc = subprocess.run(\n        [\n            \"monid\", \"run\",\n            \"-p\", \"context.dev\",\n            \"-e\", \"\u002Fweb\u002Fscrape\u002Fmarkdown\",\n            \"--query\", json.dumps({\"url\": url, \"useMainContentOnly\": True}),\n            \"-w\", \"-j\",\n        ],\n        capture_output=True,\n        text=True,\n        check=True,\n        env={\"NO_COLOR\": \"1\"},\n    )\n    return json.loads(proc.stdout)\n\npage = fetch_markdown(\"https:\u002F\u002Fexample.com\")\nprint(page[\"metadata\"][\"title\"], page[\"contentLength\"])\n",[47,2732,2733,2737,2741,2745,2750,2755,2760,2765,2770,2775,2780,2785,2790,2795,2800,2805,2810,2815,2821,2826,2832],{"__ignoreMap":136},[140,2734,2735],{"class":142,"line":143},[140,2736,1266],{},[140,2738,2739],{"class":142,"line":166},[140,2740,1271],{},[140,2742,2743],{"class":142,"line":187},[140,2744,1173],{"emptyLinePlaceholder":790},[140,2746,2747],{"class":142,"line":1279},[140,2748,2749],{},"def fetch_markdown(url: str) -> dict:\n",[140,2751,2752],{"class":142,"line":1284},[140,2753,2754],{},"    proc = subprocess.run(\n",[140,2756,2757],{"class":142,"line":1290},[140,2758,2759],{},"        [\n",[140,2761,2762],{"class":142,"line":1296},[140,2763,2764],{},"            \"monid\", \"run\",\n",[140,2766,2767],{"class":142,"line":1302},[140,2768,2769],{},"            \"-p\", \"context.dev\",\n",[140,2771,2772],{"class":142,"line":1308},[140,2773,2774],{},"            \"-e\", \"\u002Fweb\u002Fscrape\u002Fmarkdown\",\n",[140,2776,2777],{"class":142,"line":1314},[140,2778,2779],{},"            \"--query\", json.dumps({\"url\": url, \"useMainContentOnly\": True}),\n",[140,2781,2782],{"class":142,"line":1320},[140,2783,2784],{},"            \"-w\", \"-j\",\n",[140,2786,2787],{"class":142,"line":1325},[140,2788,2789],{},"        ],\n",[140,2791,2792],{"class":142,"line":1331},[140,2793,2794],{},"        capture_output=True,\n",[140,2796,2797],{"class":142,"line":1337},[140,2798,2799],{},"        text=True,\n",[140,2801,2802],{"class":142,"line":1343},[140,2803,2804],{},"        check=True,\n",[140,2806,2807],{"class":142,"line":1349},[140,2808,2809],{},"        env={\"NO_COLOR\": \"1\"},\n",[140,2811,2812],{"class":142,"line":1355},[140,2813,2814],{},"    )\n",[140,2816,2818],{"class":142,"line":2817},18,[140,2819,2820],{},"    return json.loads(proc.stdout)\n",[140,2822,2824],{"class":142,"line":2823},19,[140,2825,1173],{"emptyLinePlaceholder":790},[140,2827,2829],{"class":142,"line":2828},20,[140,2830,2831],{},"page = fetch_markdown(\"https:\u002F\u002Fexample.com\")\n",[140,2833,2835],{"class":142,"line":2834},21,[140,2836,2837],{},"print(page[\"metadata\"][\"title\"], page[\"contentLength\"])\n",[11,2839,2840,119,2842,98,2844,98,2846,98,2848,2064,2850,2068,2852,98,2854,98,2856,102,2858,2081],{},[38,2841,1195],{},[47,2843,2054],{},[47,2845,2057],{},[47,2847,2060],{},[47,2849,2063],{},[47,2851,2067],{},[47,2853,2071],{},[47,2855,2074],{},[47,2857,2077],{},[47,2859,2080],{},[11,2861,2862,2864,2865,260],{},[38,2863,1229],{}," A fraction of a cent per page, billed per call, and only on pages that came back. Current figures on ",[18,2866,1233],{"href":2089},[232,2868,2870],{"id":2869},"step-3-parse-in-python-which-is-the-part-you-kept","Step 3. Parse in Python, which is the part you kept",[11,2872,2873,2875,2876,98,2878,2880],{},[38,2874,1131],{}," Turns the returned document into records. This is where BeautifulSoup, ",[47,2877,2455],{},[47,2879,2459],{}," and your own judgement belong, and none of it changes because the fetch moved.",[11,2882,2883,2885],{},[38,2884,1137],{}," None. This step is your code.",[11,2887,2888],{},[38,2889,1148],{},[131,2891,2893],{"className":1257,"code":2892,"language":1259,"meta":136,"style":136},"import pandas as pd\n\nrows = []\nfor url in urls:\n    page = fetch_markdown(url)\n    if not page.get(\"success\"):\n        continue\n    rows.append({\n        \"url\": page[\"metadata\"][\"finalUrl\"],\n        \"title\": page[\"metadata\"][\"title\"],\n        \"language\": page[\"metadata\"].get(\"language\"),\n        \"text\": page[\"markdown\"],\n    })\n\npd.DataFrame(rows).to_parquet(\"pages.parquet\")\n",[47,2894,2895,2900,2904,2909,2914,2919,2924,2929,2934,2939,2944,2949,2954,2959,2963],{"__ignoreMap":136},[140,2896,2897],{"class":142,"line":143},[140,2898,2899],{},"import pandas as pd\n",[140,2901,2902],{"class":142,"line":166},[140,2903,1173],{"emptyLinePlaceholder":790},[140,2905,2906],{"class":142,"line":187},[140,2907,2908],{},"rows = []\n",[140,2910,2911],{"class":142,"line":1279},[140,2912,2913],{},"for url in urls:\n",[140,2915,2916],{"class":142,"line":1284},[140,2917,2918],{},"    page = fetch_markdown(url)\n",[140,2920,2921],{"class":142,"line":1290},[140,2922,2923],{},"    if not page.get(\"success\"):\n",[140,2925,2926],{"class":142,"line":1296},[140,2927,2928],{},"        continue\n",[140,2930,2931],{"class":142,"line":1302},[140,2932,2933],{},"    rows.append({\n",[140,2935,2936],{"class":142,"line":1308},[140,2937,2938],{},"        \"url\": page[\"metadata\"][\"finalUrl\"],\n",[140,2940,2941],{"class":142,"line":1314},[140,2942,2943],{},"        \"title\": page[\"metadata\"][\"title\"],\n",[140,2945,2946],{"class":142,"line":1320},[140,2947,2948],{},"        \"language\": page[\"metadata\"].get(\"language\"),\n",[140,2950,2951],{"class":142,"line":1325},[140,2952,2953],{},"        \"text\": page[\"markdown\"],\n",[140,2955,2956],{"class":142,"line":1331},[140,2957,2958],{},"    })\n",[140,2960,2961],{"class":142,"line":1337},[140,2962,1173],{"emptyLinePlaceholder":790},[140,2964,2965],{"class":142,"line":1343},[140,2966,2967],{},"pd.DataFrame(rows).to_parquet(\"pages.parquet\")\n",[11,2969,2970,2972],{},[38,2971,1195],{}," A dataframe, and a program with no proxy configuration in it.",[11,2974,2975,2977],{},[38,2976,1229],{}," Your time, which is the resource this whole exercise was trying to protect.",[320,2979,2980],{},[11,2981,324,2982,119,2984],{},[38,2983,327],{},[18,2985,2987],{"href":2986},"\u002Fblog\u002Fany-url-to-llm-ready-markdown","Any URL to LLM-Ready Markdown",[27,2989,2991],{"id":2990},"how-do-you-scrape-a-page-beautifulsoup-cannot-read","How do you scrape a page BeautifulSoup cannot read?",[11,2993,2994,2995,2997],{},"You cannot, and that is the correct answer rather than a defeat. BeautifulSoup is a parser: it reads a document you already have. If ",[47,2996,1905],{}," returned a shell with no content in it, there is nothing for BeautifulSoup to find, and every hour spent on selectors is spent on the wrong layer.",[232,2999,3001],{"id":3000},"tell-the-two-failures-apart-first","Tell the two failures apart first",[11,3003,3004],{},"Print what you actually received before changing anything. If the HTML contains your data and your selector missed it, that is a parsing bug and you are ten minutes from fixing it. If the HTML is a skeleton, a challenge page, or a login form, the fetch failed and the parser is irrelevant. People lose days by skipping this check, because a wrong selector and an empty page produce the same empty list.",[232,3006,3008],{"id":3007},"selenium-is-a-fetch-fix-and-an-expensive-one","Selenium is a fetch fix, and an expensive one",[11,3010,3011],{},"Reaching for Selenium or Playwright is the standard next move and it does work, because it solves a fetch problem with a real browser. What it also does is move a browser into your process: a driver to keep in step with Chrome, memory per session, a stealth patch set that goes stale, and a pool to run more than one page at a time. That is a reasonable thing to own when browser control is your product. It is a lot to own when you wanted the text off a page.",[11,3013,3014,3015,3017,3018,3021],{},"The endpoint version of the same fix is a query parameter. ",[47,3016,1505],{}," returns the fully rendered HTML, so your existing BeautifulSoup code keeps working with no driver anywhere in your repo, and ",[47,3019,3020],{},"waitForMs"," covers the pages that populate late.",[232,3023,3025],{"id":3024},"when-the-page-needs-a-session-not-a-fetch","When the page needs a session, not a fetch",[11,3027,3028,3029,3033,3034,3036],{},"Logins, carts, multi-step forms and anything behind a wizard need state carried across requests, which no single-shot fetch endpoint provides. That is a genuine browser job, and the way to do it without hosting the browser is a remote session: ",[18,3030,3031],{"href":1140},[47,3032,1143],{}," returns a ",[47,3035,1201],{}," you attach Playwright to over CDP, so the driver runs somewhere else and your code stays a client.",[320,3038,3039],{},[11,3040,324,3041,119,3043],{},[38,3042,327],{},[18,3044,1878],{"href":1877},[27,3046,3048],{"id":3047},"python-vs-javascript-vs-go-for-scraping-does-the-language-matter","Python vs JavaScript vs Go for scraping: does the language matter?",[11,3050,3051],{},"Less than the search volume on that question suggests, and the reason is the split above. All three languages parse HTML competently and none of them changes whether a site serves you. Pick the one your team already writes and spend the argument budget elsewhere.",[11,3053,3054],{},"Where the languages genuinely differ is concurrency shape. Go gives you cheap parallel fetches with no ceremony, which matters if you are running your own fetch layer at volume. Node sits closest to the browser automation ecosystem, so Playwright and Puppeteer feel native there. Python has the best analysis stack downstream, which is usually why the data was being collected in the first place.",[11,3056,3057],{},"Notice that two of those three advantages evaporate if the fetch is an endpoint. Concurrency becomes the provider's problem, browser automation happens on their side, and what is left is the analysis, which is Python's home ground. The language question is really a proxy for \"who runs the fetch\", and answering the real question makes the proxy one uninteresting.",[320,3059,3060],{},[11,3061,324,3062,119,3064],{},[38,3063,327],{},[18,3065,3067],{"href":3066},"\u002Fblog\u002Fguides\u002Fapify-alternatives","Apify Alternatives: You Probably Want a Different Way to Buy It",[27,3069,480],{"id":479},[482,3071,3072,3086],{},[485,3073,3074],{},[488,3075,3076,3078,3080,3082,3084],{},[491,3077,493],{},[491,3079,496],{},[491,3081,1443],{},[491,3083,1446],{},[491,3085,1449],{},[504,3087,3088,3105,3122,3142,3160,3177],{},[488,3089,3090,3093,3099,3101,3103],{},[509,3091,3092],{},"One page to clean markdown",[509,3094,3095],{},[18,3096,3097],{"href":1481},[47,3098,1484],{},[509,3100,1487],{},[509,3102,1490],{},[509,3104,1471],{},[488,3106,3107,3110,3116,3118,3120],{},[509,3108,3109],{},"Keep your existing selectors",[509,3111,3112],{},[18,3113,3114],{"href":1502},[47,3115,1505],{},[509,3117,1508],{},[509,3119,1511],{},[509,3121,1471],{},[488,3123,3124,3127,3134,3137,3140],{},[509,3125,3126],{},"A whole site, not one page",[509,3128,3129],{},[18,3130,3131],{"href":1502},[47,3132,3133],{},"context.dev\u002Fweb\u002Fcrawl",[509,3135,3136],{},"start url, crawl limits",[509,3138,3139],{},"one markdown document per page",[509,3141,1557],{},[488,3143,3144,3147,3153,3155,3158],{},[509,3145,3146],{},"Up to twenty URLs at once",[509,3148,3149],{},[18,3150,3151],{"href":1984},[47,3152,1987],{},[509,3154,2203],{},[509,3156,3157],{},"markdown or text per URL, failures unbilled",[509,3159,1557],{},[488,3161,3162,3164,3170,3172,3175],{},[509,3163,1518],{},[509,3165,3166],{},[18,3167,3168],{"href":1523},[47,3169,1526],{},[509,3171,1529],{},[509,3173,3174],{},"text, title, language, latency per URL",[509,3176,1535],{},[488,3178,3179,3182,3188,3190,3192],{},[509,3180,3181],{},"A page that needs a session",[509,3183,3184],{},[18,3185,3186],{"href":1140},[47,3187,1143],{},[509,3189,1465],{},[509,3191,2241],{},[509,3193,1471],{},[11,3195,1560,3196,3198],{},[47,3197,607],{}," on 21 August 2026. The table gives the billing shape rather than a figure, because the shape is what changes your code and a number ages badly.",[27,3200,3202],{"id":3201},"when-should-you-just-write-the-scraper","When should you just write the scraper?",[11,3204,3205,3206,3208],{},"When the site is static, public and small. A council page, a docs site, a table of reference data: ",[47,3207,1905],{}," plus BeautifulSoup in fifteen lines is the right answer, it has no running cost, and reaching for a service would be silly. Most of what people scrape is this, and most of it never appears in a blog post because it works.",[11,3210,3211],{},"Write it yourself when the extraction logic is the value. If your product is a parser that understands one site's quirks better than anyone else's, that logic is your moat and it belongs in your repo. Buying the fetch does not conflict with this; it is exactly the split this guide argues for.",[11,3213,3214],{},"And go direct to one vendor when a single site dominates your usage. If ninety percent of your calls hit one platform, its official API or a committed plan with a specialist will beat per-call pricing on a catalog. A catalog is worth it when the list of sites is long, changes, or is not known until run time.",[27,3216,696],{"id":695},[11,3218,3219],{},"Python web scraping is not one skill, and treating it as one is why the tutorials feel useless in production. Parsing is a Python problem with a good Python answer. Fetching is an infrastructure problem that Python cannot improve, and the cost of pretending otherwise is a browser pool, a proxy bill and a maintenance rota nobody signed up for.",[11,3221,3222],{},"The check that saves the most time is the cheapest one: print the HTML you received before you touch a selector. It tells you which of the two problems you actually have, and half the questions in this category are people debugging the wrong layer.",[11,3224,1600,3225,102,3227,3229,3230,260],{},[47,3226,2291],{},[47,3228,607],{}," the top row. Both are free, and the schema will tell you in under a minute whether the fetch you were about to build already exists. Start at ",[18,3231,725],{"href":723,"rel":3232},[124,125],[27,3234,729],{"id":728},[731,3236,3238],{"q":3237},"What is the best Python library for web scraping?",[11,3239,3240,3241,3244,3245,3247],{},"BeautifulSoup for parsing, ",[47,3242,3243],{},"httpx"," or ",[47,3246,1905],{}," for fetching, and Scrapy when you need a crawl framework with queues and pipelines rather than a script. That answer has been stable for years because the library layer was never the bottleneck. If you are choosing a library to solve a blocking or rendering problem, no library on the list will fix it, and that is worth knowing before you refactor.",[731,3249,3251],{"q":3250},"Possible to scrape Amazon for just price, stock and availability daily?",[11,3252,3253,3254,3258,3259,260],{},"Yes, and the reliable version does not fetch the product page at all. Amazon is one of the most defended sites on the web and a daily poller written against its HTML will break on a schedule you do not control, so use a product endpoint that returns the fields as data instead. Monid carries several, and the ",[18,3255,3257],{"href":3256},"\u002Ftools\u002Famazon","Amazon tool page"," lists them with their billing shape. There is a fuller walkthrough in the ",[18,3260,3262],{"href":3261},"\u002Fblog\u002Fevery-amazon-review-for-an-asin-one-call","Amazon review guide",[731,3264,3266],{"q":3265},"How do you web scrape Reddit with Python?",[11,3267,3268,3269,260],{},"Reddit has a public JSON interface and an official API, and for small volumes those are the right tools with no scraping involved. It gets harder at volume and for historical data, where rate limits and pagination make a scraper the wrong shape. The endpoint route returns posts and comments as records, which is covered in the ",[18,3270,3272],{"href":3271},"\u002Fblog\u002Fguides\u002Freddit-scraper","Reddit scraper guide",[731,3274,3276],{"q":3275},"How do you scrape a page that needs authentication?",[11,3277,3278],{},"Not with a single-shot fetch, because a login is state and a fetch is stateless. You need a session that carries cookies across requests, which means a real browser somewhere: either one you run with Playwright, or a remote one you attach to. Before building it, check whether the data is available without the login, because an authenticated scrape usually means agreeing to terms that prohibit it.",[421,3280,3282],{"category":2343,"title":3281},"Keep the parser, drop the fetch layer",[11,3283,3284],{},"Discover the endpoint, read its schema and current price for free, then run it. One key, one balance, no proxy pool.",[11,3286,3287],{},[758,3288,760],{},[762,3290,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":3292},[3293,3298,3305,3310,3311,3312,3313,3314],{"id":2441,"depth":166,"text":2442,"children":3294},[3295,3296,3297],{"id":2448,"depth":187,"text":2449},{"id":2463,"depth":187,"text":2464},{"id":2473,"depth":187,"text":2474},{"id":2564,"depth":166,"text":2565,"children":3299},[3300,3301,3302,3303,3304],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":2626,"depth":187,"text":2627},{"id":2709,"depth":187,"text":2710},{"id":2869,"depth":187,"text":2870},{"id":2990,"depth":166,"text":2991,"children":3306},[3307,3308,3309],{"id":3000,"depth":187,"text":3001},{"id":3007,"depth":187,"text":3008},{"id":3024,"depth":187,"text":3025},{"id":3047,"depth":166,"text":3048},{"id":479,"depth":166,"text":480},{"id":3201,"depth":166,"text":3202},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fpython-web-scraping-without-a-scraper.png","Python web scraping is two jobs wearing one name. Python is the best tool for one of them and the wrong place to solve the other. Here is the split.","\u002Fimg\u002Fblog\u002Fpython-web-scraping-without-a-scraper-card.png",{},{"title":2133,"description":3316},"blog\u002Fguides\u002Fpython-web-scraping-without-a-scraper",[1259,2389,3322,3323,1687],"beautifulsoup","selenium","kAgb04hxOkSqIWS3qeYjTqu141EtsAgn0WG9RQCHw14",{"id":3326,"title":3327,"author":6,"body":3328,"category":2378,"cover":4332,"description":4333,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":4334,"meta":4335,"navigation":790,"ogImage":787,"path":4336,"publishedAt":1680,"readTime":1681,"seo":4337,"stem":4338,"tags":4339,"toolCategory":4297,"updatedAt":1680,"__hash__":4344},"blogGuides\u002Fblog\u002Fguides\u002Fserp-api-for-ai-agents.md","What Is a SERP API, and Which Kind Do You Need?",{"type":8,"value":3329,"toc":4308},[3330,3333,3377,3385,3389,3392,3396,3410,3428,3432,3441,3444,3448,3457,3552,3555,3565,3569,3572,3576,3579,3597,3601,3604,3608,3623,3626,3636,3640,3643,3645,3650,3655,3660,3662,3698,3702,3707,3728,3732,3768,3773,3778,3782,3787,3801,3805,3873,3926,3938,3942,3947,3966,3970,4003,4026,4046,4056,4060,4063,4072,4075,4078,4088,4090,4218,4223,4227,4230,4233,4236,4238,4241,4244,4255,4257,4266,4283,4289,4295,4302,4306],[11,3331,3332],{"style":810},"Copy this line to your agent to give it live search it can call.",[131,3334,3336],{"className":814,"code":3335,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use context.dev \u002Fweb\u002Fsearch to answer a question from the live web\n",[47,3337,3338],{"__ignoreMap":136},[140,3339,3340,3342,3344,3346,3348,3350,3352,3355,3357,3360,3362,3365,3368,3371,3374],{"class":142,"line":143},[140,3341,824],{"class":823},[140,3343,827],{"class":150},[140,3345,830],{"class":150},[140,3347,833],{"class":150},[140,3349,836],{"class":150},[140,3351,1718],{"class":150},[140,3353,3354],{"class":150}," \u002Fweb\u002Fsearch",[140,3356,845],{"class":150},[140,3358,3359],{"class":150}," answer",[140,3361,851],{"class":150},[140,3363,3364],{"class":150}," question",[140,3366,3367],{"class":150}," from",[140,3369,3370],{"class":150}," the",[140,3372,3373],{"class":150}," live",[140,3375,3376],{"class":150}," web\n",[11,3378,3379,3380,98,3383,260],{},"Three different products are sold as a SERP API, and picking the wrong one is why people say the results were useless. One mirrors a Google results page and hands you positions. One runs its own index and hands you an answer set. One searches, then reads the pages, and hands you text. They overlap enough to look interchangeable in a feature table and they are not. This guide separates them, then shows how to call each through ",[18,3381,864],{"href":723,"rel":3382},[124,125],[18,3384,21],{"href":20},[27,3386,3388],{"id":3387},"what-is-a-serp-api","What is a SERP API?",[11,3390,3391],{},"A SERP API is an HTTP endpoint that returns search engine results as structured data instead of as a web page you have to parse. That is the whole definition, and it is why the category name tells you almost nothing about the product. What actually differs is where the results came from.",[232,3393,3395],{"id":3394},"the-google-mirror","The Google mirror",[11,3397,3398,3399,102,3404,3409],{},"This kind runs a Google query on your behalf and gives you back the page as JSON: organic results with their positions, plus whatever blocks Google rendered that day. ",[18,3400,3403],{"href":3401,"rel":3402},"https:\u002F\u002Fserpapi.com\u002F",[124,125],"SerpApi",[18,3405,3408],{"href":3406,"rel":3407},"https:\u002F\u002Fserper.dev\u002F",[124,125],"Serper"," are the reference examples, and Bright Data sells one too. You reach for a mirror when the position is the data. Rank tracking, share of voice, checking whether an AI Overview fired for a query, pulling the People Also Ask box: none of that survives a summary, so you need the page itself.",[11,3411,3412,3413,98,3416,98,3419,98,3422,98,3425,260],{},"The tell is in the response. A mirror returns fields no independent index can invent, because they describe Google's layout rather than the web: ",[47,3414,3415],{},"position",[47,3417,3418],{},"answer_box",[47,3420,3421],{},"knowledge_graph",[47,3423,3424],{},"people_also_ask",[47,3426,3427],{},"sitelinks",[232,3429,3431],{"id":3430},"the-independent-index","The independent index",[11,3433,3434,3435,3440],{},"This kind crawls the web itself and answers your query from its own store. ",[18,3436,3439],{"href":3437,"rel":3438},"https:\u002F\u002Fexa.ai\u002F",[124,125],"Exa"," is the clearest example, and Brave's search API is another. There is no Google in the path at all, which means no positions, no SERP features, and no reason for the ranking to match what a person would see. What you get instead is a result set tuned for a machine reader: neural retrieval on the meaning of the query, filters for category and publish date, and a stable schema that does not change when Google redesigns something.",[11,3442,3443],{},"You reach for an index when you want documents about a thing, not what ranks for a string. Most retrieval augmented generation belongs here, and using a mirror for it is the most common mismatch in this category.",[232,3445,3447],{"id":3446},"the-read-through-fetcher","The read-through fetcher",[11,3449,3450,3451,3456],{},"This kind searches, then fetches the pages it found and returns their text. ",[18,3452,3455],{"href":3453,"rel":3454},"https:\u002F\u002Fcontext.dev\u002F",[124,125],"Context.dev"," does it with one flag on its search endpoint, and Firecrawl is built around the idea. The output is markdown you can hand a model without a second round trip, which matters more than it sounds: search results are titles and two-line snippets, and a snippet is almost never enough to answer with.",[482,3458,3459,3474],{},[485,3460,3461],{},[488,3462,3463,3465,3468,3471],{},[491,3464,915],{},[491,3466,3467],{},"Google mirror",[491,3469,3470],{},"Independent index",[491,3472,3473],{},"Read-through fetcher",[504,3475,3476,3490,3502,3515,3527,3541],{},[488,3477,3478,3481,3484,3487],{},[509,3479,3480],{},"Results come from",[509,3482,3483],{},"Google's live page",[509,3485,3486],{},"The vendor's own crawl",[509,3488,3489],{},"Search, then the publisher",[488,3491,3492,3495,3497,3499],{},[509,3493,3494],{},"Gives you positions",[509,3496,1834],{},[509,3498,1837],{},[509,3500,3501],{},"Usually not",[488,3503,3504,3507,3509,3512],{},[509,3505,3506],{},"Gives you page text",[509,3508,1837],{},[509,3510,3511],{},"Optional",[509,3513,3514],{},"Yes, by design",[488,3516,3517,3520,3522,3524],{},[509,3518,3519],{},"Ranking matches a browser",[509,3521,1834],{},[509,3523,1837],{},[509,3525,3526],{},"Partly",[488,3528,3529,3532,3535,3538],{},[509,3530,3531],{},"Best for",[509,3533,3534],{},"Rank tracking, SERP features",[509,3536,3537],{},"Retrieval, research, RAG",[509,3539,3540],{},"Answering a question in one hop",[488,3542,3543,3545,3547,3549],{},[509,3544,502],{},[509,3546,542],{},[509,3548,542],{},[509,3550,3551],{},"Per result",[11,3553,3554],{},"The pattern the table shows is that positions and content pull in opposite directions, and no product in this category gives you both cheaply.",[320,3556,3557],{},[11,3558,324,3559,119,3561],{},[38,3560,327],{},[18,3562,3564],{"href":3563},"\u002Fblog\u002Fbest-web-search-api-for-ai-agents-2026","The Best Web Search API for AI Agents in 2026",[27,3566,3568],{"id":3567},"how-does-a-serp-api-work","How does a SERP API work?",[11,3570,3571],{},"A Google mirror works by scraping, and every honest vendor in that group will tell you so. The endpoint takes your query, issues it against Google from infrastructure the vendor operates, parses the HTML that comes back, and returns the parsed shape. Nothing about that is exotic, and everything hard about it lives in the parts you do not see.",[232,3573,3575],{"id":3574},"what-a-mirror-actually-does-on-each-request","What a mirror actually does on each request",[11,3577,3578],{},"It picks an exit address, renders or fetches the page, survives whatever bot check fires, and parses a layout that changes without notice. That last part is the real product. Google ships SERP layout changes constantly, and the value of a mirror is that somebody else maintains the parser. Run one yourself and you are not buying search, you are volunteering to maintain a parser for a page you do not control.",[11,3580,3581,3582,3588,3589,3592,3593,3596],{},"You can read the provenance straight out of the response. Calling ",[18,3583,3585],{"href":3584},"\u002Ftools\u002Fstrale",[47,3586,3587],{},"api.strale.io\u002Fx402\u002Fgoogle-search"," through Monid on 21 August 2026 returned a ",[47,3590,3591],{},"_meta.provenance.source"," of ",[47,3594,3595],{},"google-serper",", which is the endpoint telling you exactly whose crawl it sits on. That is the right amount of honesty for this category, and it is worth checking before you architect around a result.",[232,3598,3600],{"id":3599},"why-the-same-query-returns-three-different-answers","Why the same query returns three different answers",[11,3602,3603],{},"Because the three kinds are not sampling the same thing. Ask a mirror and an index the same question and the overlap is often under half, and neither is wrong. The mirror reports what Google ranked, which is shaped by commercial intent, freshness signals and personalisation defaults. The index reports what its own retrieval thinks is closest to the meaning of the query. If your evaluation harness assumes the two should agree, it will report a bug that is really a category difference.",[232,3605,3607],{"id":3606},"the-legal-shape-changed-in-july-2026","The legal shape changed in July 2026",[11,3609,3610,3611,3616,3617,3622],{},"This is the part the explainers skip, and it belongs in an architecture decision. Google sued SerpApi on 19 December 2025 over scraping and reselling search results. On 20 July 2026 the Northern District of California ",[18,3612,3615],{"href":3613,"rel":3614},"https:\u002F\u002Fsearchengineland.com\u002Fgoogle-loses-key-dmca-claims-against-serpapi-in-scraping-lawsuit-483185",[124,125],"dismissed both of Google's DMCA claims",", one of them permanently, holding that Google had not shown its SearchGuard protection operated with the authority of a copyright owner. Google's standing and its circumvention allegation survived, and Google ",[18,3618,3621],{"href":3619,"rel":3620},"https:\u002F\u002Fblog.google\u002Finnovation-and-ai\u002Ftechnology\u002Fsafety-security\u002Fserpapi-lawsuit\u002F",[124,125],"filed an amended complaint"," weeks later. The case is live as of August 2026.",[11,3624,3625],{},"The practical read is not that mirrors are doomed. It is that the three kinds carry structurally different exposure: a mirror resells someone else's results page, an independent index resells its own crawl, and a read-through fetcher takes the text from the publisher. If that distinction matters to your legal team, it is a design input rather than a footnote.",[320,3627,3628],{},[11,3629,324,3630,119,3632],{},[38,3631,327],{},[18,3633,3635],{"href":3634},"\u002Fblog\u002Fguides\u002Fbing-search-api-retired-alternatives","Bing Search API Retired: What Actually Replaces It",[27,3637,3639],{"id":3638},"how-do-you-use-a-serp-api","How do you use a SERP API?",[11,3641,3642],{},"The three steps below are the same whichever kind you picked: find the endpoint, run one small query, then decide whether you need the page bodies. Everything expensive is in the third step, so it goes last on purpose.",[232,3644,235],{"id":234},[11,3646,238,3647,244],{},[18,3648,243],{"href":241,"rel":3649},[124,125],[131,3651,3653],{"className":3652,"code":249,"language":97,"meta":136},[248],[47,3654,249],{"__ignoreMap":136},[11,3656,254,3657,260],{},[18,3658,259],{"href":257,"rel":3659},[124,125],[232,3661,264],{"id":263},[131,3663,3664],{"className":133,"code":1087,"language":135,"meta":136,"style":136},[47,3665,3666,3676],{"__ignoreMap":136},[140,3667,3668,3670,3672,3674],{"class":142,"line":143},[140,3669,274],{"class":146},[140,3671,277],{"class":150},[140,3673,280],{"class":150},[140,3675,283],{"class":150},[140,3677,3678,3680,3682,3684,3686,3688,3690,3692,3694,3696],{"class":142,"line":166},[140,3679,147],{"class":146},[140,3681,290],{"class":150},[140,3683,293],{"class":150},[140,3685,296],{"class":150},[140,3687,299],{"class":193},[140,3689,1114],{"class":150},[140,3691,305],{"class":183},[140,3693,308],{"class":193},[140,3695,311],{"class":150},[140,3697,314],{"class":150},[232,3699,3701],{"id":3700},"step-1-find-the-endpoint-before-you-pick-a-vendor","Step 1. Find the endpoint before you pick a vendor",[11,3703,3704,3706],{},[38,3705,1131],{}," Searches the catalog by capability, so you compare response shapes rather than marketing pages.",[11,3708,3709,119,3711,3715,3716,3722,3723,3727],{},[38,3710,1137],{},[18,3712,3713],{"href":3584},[47,3714,3587],{}," for the mirror, ",[18,3717,3719],{"href":3718},"\u002Ftools\u002Fexa",[47,3720,3721],{},"exa\u002Fsearch"," for the index, ",[18,3724,3725],{"href":1545},[47,3726,1548],{}," for the read-through.",[11,3729,3730],{},[38,3731,1148],{},[131,3733,3735],{"className":133,"code":3734,"language":135,"meta":136,"style":136},"monid discover -q \"google search results serp\"\nmonid inspect -p api.strale.io -e \u002Fx402\u002Fgoogle-search\n",[47,3736,3737,3752],{"__ignoreMap":136},[140,3738,3739,3741,3743,3745,3747,3750],{"class":142,"line":143},[140,3740,147],{"class":146},[140,3742,2667],{"class":150},[140,3744,2670],{"class":150},[140,3746,2673],{"class":193},[140,3748,3749],{"class":150},"google search results serp",[140,3751,2679],{"class":193},[140,3753,3754,3756,3758,3760,3763,3765],{"class":142,"line":166},[140,3755,147],{"class":146},[140,3757,151],{"class":150},[140,3759,154],{"class":150},[140,3761,3762],{"class":150}," api.strale.io",[140,3764,160],{"class":150},[140,3766,3767],{"class":150}," \u002Fx402\u002Fgoogle-search\n",[11,3769,3770,3772],{},[38,3771,1195],{}," A ranked list carrying the provider, the billing shape and the current price, then the full input schema for whichever row you inspect.",[11,3774,3775,3777],{},[38,3776,1229],{}," Nothing. Discovery and inspection never bill, which is the point of doing them before you commit to a vendor.",[232,3779,3781],{"id":3780},"step-2-pull-ranked-results","Step 2. Pull ranked results",[11,3783,3784,3786],{},[38,3785,1131],{}," Runs one query and returns the structured result set.",[11,3788,3789,119,3791,3795,3796,3800],{},[38,3790,1137],{},[18,3792,3793],{"href":3584},[47,3794,3587],{}," when you need positions, ",[18,3797,3798],{"href":1545},[47,3799,1548],{}," when you need coverage.",[11,3802,3803],{},[38,3804,1148],{},[131,3806,3808],{"className":133,"code":3807,"language":135,"meta":136,"style":136},"monid run -p api.strale.io -e \u002Fx402\u002Fgoogle-search \\\n  --query '{\"query\":\"rotating proxy\",\"country\":\"us\",\"num_results\":10}' -w\n\nmonid run -p context.dev -e \u002Fweb\u002Fsearch \\\n  -i '{\"query\":\"rotating residential proxy pricing 2026\",\"numResults\":10}' -w\n",[47,3809,3810,3827,3840,3844,3860],{"__ignoreMap":136},[140,3811,3812,3814,3816,3818,3820,3822,3825],{"class":142,"line":143},[140,3813,147],{"class":146},[140,3815,171],{"class":150},[140,3817,154],{"class":150},[140,3819,3762],{"class":150},[140,3821,160],{"class":150},[140,3823,3824],{"class":150}," \u002Fx402\u002Fgoogle-search",[140,3826,184],{"class":183},[140,3828,3829,3831,3833,3836,3838],{"class":142,"line":166},[140,3830,2037],{"class":150},[140,3832,194],{"class":193},[140,3834,3835],{"class":150},"{\"query\":\"rotating proxy\",\"country\":\"us\",\"num_results\":10}",[140,3837,2045],{"class":193},[140,3839,1190],{"class":150},[140,3841,3842],{"class":142,"line":187},[140,3843,1173],{"emptyLinePlaceholder":790},[140,3845,3846,3848,3850,3852,3854,3856,3858],{"class":142,"line":1279},[140,3847,147],{"class":146},[140,3849,171],{"class":150},[140,3851,154],{"class":150},[140,3853,1718],{"class":150},[140,3855,160],{"class":150},[140,3857,3354],{"class":150},[140,3859,184],{"class":183},[140,3861,3862,3864,3866,3869,3871],{"class":142,"line":1284},[140,3863,190],{"class":150},[140,3865,194],{"class":193},[140,3867,3868],{"class":150},"{\"query\":\"rotating residential proxy pricing 2026\",\"numResults\":10}",[140,3870,2045],{"class":193},[140,3872,1190],{"class":150},[11,3874,3875,3877,3878,3881,3882,3885,3886,98,3888,98,3890,98,3892,98,3895,102,3898,3900,3901,98,3904,98,3906,102,3908,3910,3911,3885,3913,98,3915,98,3917,98,3920,1214,3923,3925],{},[38,3876,1195],{}," From the mirror, verified on 21 August 2026: ",[47,3879,3880],{},"query",", then ",[47,3883,3884],{},"results[]"," carrying ",[47,3887,3415],{},[47,3889,2077],{},[47,3891,2063],{},[47,3893,3894],{},"snippet",[47,3896,3897],{},"date",[47,3899,3427],{},", plus ",[47,3902,3903],{},"result_count",[47,3905,3421],{},[47,3907,3418],{},[47,3909,3424],{},". Those three block fields come back empty when Google did not render the block, which is information rather than a failure. From the read-through: ",[47,3912,3884],{},[47,3914,2063],{},[47,3916,2077],{},[47,3918,3919],{},"description",[47,3921,3922],{},"relevance",[47,3924,2057],{}," object.",[11,3927,3928,3930,3931,3933,3934,3937],{},[38,3929,1229],{}," The mirror bills per call and sits well above the read-through, which bills per result. Current figures live on ",[18,3932,1233],{"href":1545},", and ",[47,3935,3936],{},"inspect"," shows the exact number before anything runs.",[232,3939,3941],{"id":3940},"step-3-read-the-pages-but-only-the-ones-you-kept","Step 3. Read the pages, but only the ones you kept",[11,3943,3944,3946],{},[38,3945,1131],{}," Turns the handful of results you actually want into text a model can use.",[11,3948,3949,119,3951,3955,3956,3960,3961,3965],{},[38,3950,1137],{},[18,3952,3953],{"href":1502},[47,3954,1484],{}," for one URL, ",[18,3957,3958],{"href":1984},[47,3959,1987],{}," for up to twenty at once, ",[18,3962,3963],{"href":1523},[47,3964,1526],{}," for a free batch of up to ten.",[11,3967,3968],{},[38,3969,1148],{},[131,3971,3973],{"className":133,"code":3972,"language":135,"meta":136,"style":136},"monid run -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown \\\n  --query '{\"url\":\"https:\u002F\u002Fexample.com\",\"useMainContentOnly\":true}' -w\n",[47,3974,3975,3991],{"__ignoreMap":136},[140,3976,3977,3979,3981,3983,3985,3987,3989],{"class":142,"line":143},[140,3978,147],{"class":146},[140,3980,171],{"class":150},[140,3982,154],{"class":150},[140,3984,1718],{"class":150},[140,3986,160],{"class":150},[140,3988,1721],{"class":150},[140,3990,184],{"class":183},[140,3992,3993,3995,3997,3999,4001],{"class":142,"line":166},[140,3994,2037],{"class":150},[140,3996,194],{"class":193},[140,3998,2042],{"class":150},[140,4000,2045],{"class":193},[140,4002,1190],{"class":150},[11,4004,4005,119,4007,98,4009,98,4011,98,4013,2064,4015,2068,4017,98,4019,98,4021,102,4023,4025],{},[38,4006,1195],{},[47,4008,2054],{},[47,4010,2057],{},[47,4012,2060],{},[47,4014,2063],{},[47,4016,2067],{},[47,4018,2071],{},[47,4020,2074],{},[47,4022,2077],{},[47,4024,2080],{},". Verified 21 August 2026.",[11,4027,4028,4030,4031,4034,4035,4038,4039,4041,4042,4045],{},[38,4029,1229],{}," A fraction of a cent per page. The detail that matters is not the figure: ",[47,4032,4033],{},"context.dev"," bills only successfully scraped pages, so a blocked fetch does not charge, and ",[47,4036,4037],{},"octen"," returns failed URLs with a ",[47,4040,2098],{}," status and does not bill those either. That billing unit is the whole argument against buying bandwidth instead, which ",[18,4043,4044],{"href":2383},"the proxy guide"," works through in full.",[320,4047,4048],{},[11,4049,324,4050,119,4052],{},[38,4051,327],{},[18,4053,4055],{"href":4054},"\u002Fblog\u002Fguides\u002Ffree-api-extract-page-content-rag","A Free API to Extract Page Content for RAG",[27,4057,4059],{"id":4058},"serper-vs-serpapi-vs-tavily-which-comparison-actually-matters","Serper vs SerpApi vs Tavily: which comparison actually matters?",[11,4061,4062],{},"Almost none of the comparisons people search for are between like products, which is why they are hard to resolve. Serper versus SerpApi is a real one, because both are Google mirrors and they differ on latency, price and how much of the page they parse. That comparison you can settle with a benchmark.",[11,4064,4065,4066,4071],{},"The others are category confusions wearing a versus. SerpApi against ",[18,4067,4070],{"href":4068,"rel":4069},"https:\u002F\u002Ftavily.com\u002F",[124,125],"Tavily"," puts a mirror next to a retrieval service built for agents. SerpApi against Firecrawl puts a mirror next to a read-through fetcher. SerpApi against Brave puts a mirror next to an independent index. In each case the honest answer is that they solve different problems, and the useful question is which problem you have.",[11,4073,4074],{},"So run the comparison in this order. First, do you need positions? If yes, only a mirror qualifies and the rest of the field is irrelevant. If no, do you need page text in the same hop? If yes, you want a read-through fetcher, and paying mirror prices for snippets is waste. If neither, you want an index, and you should be evaluating recall and freshness rather than SERP fidelity.",[11,4076,4077],{},"That ordering matters more than any feature table because the wrong kind fails quietly. A mirror pointed at a RAG job returns ten plausible titles and no substance, and the pipeline downstream produces confident thin answers rather than an error anyone can see.",[320,4079,4080],{},[11,4081,324,4082,119,4084],{},[38,4083,327],{},[18,4085,4087],{"href":4086},"\u002Fblog\u002Fautomate-serp-tracking","Automate SERP Tracking with a Structured Google Search API",[27,4089,480],{"id":479},[482,4091,4092,4106],{},[485,4093,4094],{},[488,4095,4096,4098,4100,4102,4104],{},[491,4097,493],{},[491,4099,496],{},[491,4101,1443],{},[491,4103,1446],{},[491,4105,1449],{},[504,4107,4108,4126,4145,4164,4182,4200],{},[488,4109,4110,4112,4118,4121,4124],{},[509,4111,3534],{},[509,4113,4114],{},[18,4115,4116],{"href":3584},[47,4117,3587],{},[509,4119,4120],{},"query, country, language, num_results",[509,4122,4123],{},"positions, snippets, answer box, PAA, knowledge graph",[509,4125,1471],{},[488,4127,4128,4131,4137,4140,4143],{},[509,4129,4130],{},"Broad retrieval for RAG",[509,4132,4133],{},[18,4134,4135],{"href":1545},[47,4136,1548],{},[509,4138,4139],{},"query, numResults, domain filters, freshness",[509,4141,4142],{},"ranked results, optional inline markdown",[509,4144,1557],{},[488,4146,4147,4150,4156,4159,4162],{},[509,4148,4149],{},"Neural and category search",[509,4151,4152],{},[18,4153,4154],{"href":3718},[47,4155,3721],{},[509,4157,4158],{},"query, type, category, date filters",[509,4160,4161],{},"results with ids, titles, publish dates, authors",[509,4163,1471],{},[488,4165,4166,4169,4175,4178,4180],{},[509,4167,4168],{},"One URL to clean markdown",[509,4170,4171],{},[18,4172,4173],{"href":1502},[47,4174,1484],{},[509,4176,4177],{},"url, extraction options",[509,4179,1490],{},[509,4181,1471],{},[488,4183,4184,4187,4193,4196,4198],{},[509,4185,4186],{},"Batch page extraction",[509,4188,4189],{},[18,4190,4191],{"href":1984},[47,4192,1987],{},[509,4194,4195],{},"up to 20 urls, optional query",[509,4197,3157],{},[509,4199,1557],{},[488,4201,4202,4205,4211,4214,4216],{},[509,4203,4204],{},"Free batch fetch",[509,4206,4207],{},[18,4208,4209],{"href":1523},[47,4210,1526],{},[509,4212,4213],{},"up to 10 urls, purpose, format",[509,4215,3174],{},[509,4217,1535],{},[11,4219,1560,4220,4222],{},[47,4221,607],{}," on 21 August 2026. The table states the billing shape rather than a figure, because the shape changes your architecture and a number goes stale silently.",[27,4224,4226],{"id":4225},"when-should-you-use-googles-own-api-instead","When should you use Google's own API instead?",[11,4228,4229],{},"When the results are the product you are selling. Google runs licensed programmes for exactly this, and a mirror is not a substitute for a licence when your business depends on redistributing search results at scale. The litigation above is the reason to read that sentence as advice rather than as boilerplate.",[11,4231,4232],{},"Use Google's Custom Search JSON API when your job is site search or a narrow set of domains. It is cheap, it is supported, its quota is published, and nothing about it can be taken away by a court. It is a poor general web search and an excellent constrained one, and plenty of teams reach for a SERP API when this was the right tool.",[11,4234,4235],{},"Go direct to a single vendor when one search product dominates your usage. If you send millions of queries a month to one mirror, a committed contract with that vendor will beat per-call pricing, and the honest recommendation is to sign it. A catalog earns its place when you do not know in advance which of the three kinds a given job needs, not when you settled that question a year ago.",[27,4237,696],{"id":695},[11,4239,4240],{},"There is no best SERP API, because SERP API names three products and the winner depends entirely on whether you need positions, documents or text. Deciding that first collapses a twenty-vendor comparison into a three-way one, and the three-way one is easy.",[11,4242,4243],{},"Two things matter more than the vendor choice. The first is that a mirror is a parser somebody else maintains for a page Google changes without notice, and that maintenance is what you are actually buying. The second is that the legal shape of the three kinds genuinely differs, and after July 2026 that is a design input rather than a hypothetical.",[11,4245,1600,4246,102,4249,4251,4252,260],{},[47,4247,4248],{},"monid discover -q \"google search results serp\"",[47,4250,607],{}," the two rows that look closest to your job. Both are free, and comparing two real schemas beats comparing two pricing pages. Start at ",[18,4253,725],{"href":723,"rel":4254},[124,125],[27,4256,729],{"id":728},[731,4258,4260],{"q":4259},"How do you get People Also Ask questions from a SERP API?",[11,4261,4262,4263,4265],{},"Only a Google mirror returns them, because People Also Ask is a block Google renders rather than a property of the web. Endpoints in that group expose it as a ",[47,4264,3424],{}," field alongside the organic results. Expect it to come back empty often: the block does not fire for every query, and on a live call for \"rotating proxy\" on 21 August 2026 it was an empty array while the organic results were full.",[731,4267,4269],{"q":4268},"Is there a free SERP API?",[11,4270,4271,4272,102,4275,4277,4278,4282],{},"There are free tiers, and they are generally sized for evaluation rather than production, which is the honest way to describe every one of them. The more useful free thing is the step before the query: on Monid, ",[47,4273,4274],{},"discover",[47,4276,3936],{}," cost nothing, so you can read the exact schema and current price of every search endpoint in the catalog before spending anything. For page fetching rather than search, ",[18,4279,4280],{"href":1523},[47,4281,1526],{}," is genuinely free for batches of up to ten URLs.",[731,4284,4286],{"q":4285},"Can a SERP API tell me whether an AI Overview appeared?",[11,4287,4288],{},"Yes, if it is a Google mirror, because the AI Overview is part of the page it parses. This is one of the clearest cases where only a mirror will do, since an independent index has no opinion about what Google rendered. It is also a fast growing reason to buy one: knowing which of your queries now trigger an AI answer is a different question from knowing where you rank, and it is answerable only from the live page.",[731,4290,4292],{"q":4291},"Which search API should an AI agent call?",[11,4293,4294],{},"Usually a read-through fetcher, because an agent needs page text and a snippet will not do. The pattern that works is search wide and read narrow: pull twenty results from a per result endpoint, let the model pick three, then fetch only those three in full. That costs a fraction of scraping everything, and it spends the context window on content rather than on titles.",[421,4296,4299],{"category":4297,"title":4298},"search","Search the live web from your agent",[11,4300,4301],{},"Discover the endpoint, read its schema and current price for free, then run it. One key, one balance, no vendor contract.",[11,4303,4304],{},[758,4305,760],{},[762,4307,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":4309},[4310,4315,4320,4327,4328,4329,4330,4331],{"id":3387,"depth":166,"text":3388,"children":4311},[4312,4313,4314],{"id":3394,"depth":187,"text":3395},{"id":3430,"depth":187,"text":3431},{"id":3446,"depth":187,"text":3447},{"id":3567,"depth":166,"text":3568,"children":4316},[4317,4318,4319],{"id":3574,"depth":187,"text":3575},{"id":3599,"depth":187,"text":3600},{"id":3606,"depth":187,"text":3607},{"id":3638,"depth":166,"text":3639,"children":4321},[4322,4323,4324,4325,4326],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":3700,"depth":187,"text":3701},{"id":3780,"depth":187,"text":3781},{"id":3940,"depth":187,"text":3941},{"id":4058,"depth":166,"text":4059},{"id":479,"depth":166,"text":480},{"id":4225,"depth":166,"text":4226},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fserp-api-for-ai-agents.png","A SERP API is three products under one name: a Google mirror, an independent index, and a read-through fetcher. The difference decides which one is yours.","\u002Fimg\u002Fblog\u002Fserp-api-for-ai-agents-card.png",{},"\u002Fblog\u002Fguides\u002Fserp-api-for-ai-agents",{"title":3327,"description":4333},"blog\u002Fguides\u002Fserp-api-for-ai-agents",[4340,4341,4342,1687,4343],"serp api","search api","web search","rag","huVRyoGijyQx3F-cE_PY_p2j_v9996ag_CXEky5z0HQ",{"id":4346,"title":4347,"author":6,"body":4348,"category":2378,"cover":5164,"description":5165,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":5166,"meta":5167,"navigation":790,"ogImage":787,"path":1581,"publishedAt":1680,"readTime":1681,"seo":5168,"stem":5169,"tags":5170,"toolCategory":2343,"updatedAt":1680,"__hash__":5175},"blogGuides\u002Fblog\u002Fguides\u002Fweb-scraping-tools-which-kind.md","Web Scraping Tools: Which Kind Do You Actually Need?",{"type":8,"value":4349,"toc":5138},[4350,4353,4402,4410,4414,4417,4421,4424,4428,4431,4435,4444,4448,4451,4566,4569,4577,4581,4584,4588,4591,4595,4598,4602,4605,4609,4612,4620,4624,4627,4629,4634,4639,4644,4646,4682,4686,4691,4696,4700,4734,4739,4744,4748,4753,4762,4766,4785,4790,4795,4799,4804,4818,4822,4854,4876,4883,4891,4895,4898,4901,4904,4907,4917,4919,5057,5062,5066,5069,5072,5075,5078,5080,5083,5086,5097,5099,5108,5114,5120,5126,5132,5136],[11,4351,4352],{"style":810},"Copy this line to your agent to let it pick the scraping tool itself.",[131,4354,4356],{"className":814,"code":4355,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use monid discover to find the right endpoint for the site you need\n",[47,4357,4358],{"__ignoreMap":136},[140,4359,4360,4362,4364,4366,4368,4370,4373,4375,4377,4380,4382,4385,4388,4391,4393,4396,4399],{"class":142,"line":143},[140,4361,824],{"class":823},[140,4363,827],{"class":150},[140,4365,830],{"class":150},[140,4367,833],{"class":150},[140,4369,836],{"class":150},[140,4371,4372],{"class":150}," monid",[140,4374,2667],{"class":150},[140,4376,845],{"class":150},[140,4378,4379],{"class":150}," find",[140,4381,3370],{"class":150},[140,4383,4384],{"class":150}," right",[140,4386,4387],{"class":150}," endpoint",[140,4389,4390],{"class":150}," for",[140,4392,3370],{"class":150},[140,4394,4395],{"class":150}," site",[140,4397,4398],{"class":150}," you",[140,4400,4401],{"class":150}," need\n",[11,4403,4404,4405,98,4408,260],{},"Search for web scraping tools and you get ranked lists comparing a Chrome extension, a Python library, a hosted actor and an API as though you were choosing between them. You are not. They differ on who operates the thing, and the operator is the decision, because it determines who gets paged when a site changes its markup. This guide sorts the category by operator, then shows the fourth kind, the one an agent can call for itself, running through ",[18,4406,864],{"href":723,"rel":4407},[124,125],[18,4409,21],{"href":20},[27,4411,4413],{"id":4412},"what-is-a-web-scraper-tool","What is a web scraper tool?",[11,4415,4416],{},"A web scraper tool is anything that turns a web page into structured data. That definition is useless for choosing one, because it covers a browser extension a marketer clicks and a distributed crawler an engineering team runs. The useful question is who operates it, and there are exactly four answers.",[232,4418,4420],{"id":4419},"the-extension-operated-by-a-person","The extension, operated by a person",[11,4422,4423],{},"A browser plugin where you click the fields you want and it produces a table. Nothing installs, nothing runs when your laptop is closed, and it is genuinely the fastest way to get a few hundred rows out of a site you are looking at right now. The operator is you, once, and the tool ends when you close the tab.",[232,4425,4427],{"id":4426},"the-library-operated-by-a-developer-forever","The library, operated by a developer forever",[11,4429,4430],{},"Scrapy, BeautifulSoup, Playwright, and their equivalents in every other language. Maximum control, no vendor, and the whole of the running cost lands on your team: proxies, retries, rendering, and the morning the selectors break. The operator is a person on your payroll, indefinitely.",[232,4432,4434],{"id":4433},"the-hosted-actor-operated-by-a-vendor","The hosted actor, operated by a vendor",[11,4436,4437,4438,4443],{},"A prebuilt scraper for one specific site, run on someone else's infrastructure, sold per run or per result. ",[18,4439,4442],{"href":4440,"rel":4441},"https:\u002F\u002Fapify.com\u002F",[124,125],"Apify","'s store is the largest example of this shape. Somebody else maintains the parser for that site, which is exactly what you want when the site is defended and popular. The operator is their team, and you inherit their coverage: brilliant for sites they support, nothing at all for sites they do not.",[232,4445,4447],{"id":4446},"the-endpoint-operated-at-run-time-by-whatever-is-calling","The endpoint, operated at run time by whatever is calling",[11,4449,4450],{},"A capability behind a URL that anything can call, including a program that did not know the URL existed until a moment ago. What makes it a distinct kind rather than a hosted actor with a different label is discovery: the caller can search the catalog, read the schema and decide, rather than a developer wiring one integration in advance. This is the only one of the four an autonomous agent can use for a site nobody anticipated.",[482,4452,4453,4470],{},[485,4454,4455],{},[488,4456,4457,4459,4462,4465,4468],{},[491,4458,915],{},[491,4460,4461],{},"Extension",[491,4463,4464],{},"Library",[491,4466,4467],{},"Hosted actor",[491,4469,496],{},[504,4471,4472,4489,4502,4517,4534,4550],{},[488,4473,4474,4477,4480,4483,4486],{},[509,4475,4476],{},"Operator",[509,4478,4479],{},"A person, once",[509,4481,4482],{},"Your developers, forever",[509,4484,4485],{},"The vendor's team",[509,4487,4488],{},"The caller, at run time",[488,4490,4491,4494,4496,4498,4500],{},[509,4492,4493],{},"Runs when you sleep",[509,4495,1837],{},[509,4497,1834],{},[509,4499,1834],{},[509,4501,1834],{},[488,4503,4504,4507,4510,4512,4515],{},[509,4505,4506],{},"Who fixes a markup change",[509,4508,4509],{},"You do",[509,4511,4509],{},[509,4513,4514],{},"They do",[509,4516,4514],{},[488,4518,4519,4522,4525,4528,4531],{},[509,4520,4521],{},"Site coverage",[509,4523,4524],{},"Whatever you can see",[509,4526,4527],{},"Anything you build",[509,4529,4530],{},"Their catalog",[509,4532,4533],{},"The catalog, discoverable",[488,4535,4536,4539,4542,4545,4547],{},[509,4537,4538],{},"Chosen by",[509,4540,4541],{},"A human, now",[509,4543,4544],{},"A developer, at build time",[509,4546,4544],{},[509,4548,4549],{},"A human or an agent, at run time",[488,4551,4552,4554,4557,4560,4563],{},[509,4553,1449],{},[509,4555,4556],{},"Subscription",[509,4558,4559],{},"Your salaries",[509,4561,4562],{},"Per run or per result",[509,4564,4565],{},"Per call or per result",[11,4567,4568],{},"The pattern is that only the last row of \"chosen by\" ever changes at run time, and that single difference is what makes the fourth kind interesting to anyone building agents.",[320,4570,4571],{},[11,4572,324,4573,119,4575],{},[38,4574,327],{},[18,4576,3067],{"href":3066},[27,4578,4580],{"id":4579},"what-are-web-scraping-tools-used-for","What are web scraping tools used for?",[11,4582,4583],{},"Four jobs cover almost all of it, and each one pulls toward a different operator, which is the practical reason the taxonomy above is worth having.",[232,4585,4587],{"id":4586},"one-off-collection","One-off collection",[11,4589,4590],{},"Somebody needs a list. Competitor prices for a deck, event attendees for an outreach push, a directory of suppliers. It happens once, nobody will maintain it, and the answer is an extension or a short script. Buying infrastructure for this is how teams end up with a subscription nobody remembers signing up for.",[232,4592,4594],{"id":4593},"monitoring-on-a-schedule","Monitoring on a schedule",[11,4596,4597],{},"Prices, stock, rankings, job postings, reviews. The volume is modest and the requirement is that it keeps working on a Tuesday when nobody is watching. This is where hosted actors and endpoints earn their keep, because the failure you are insuring against is a markup change at three in the morning.",[232,4599,4601],{"id":4600},"feeding-a-model","Feeding a model",[11,4603,4604],{},"Retrieval augmented generation, research agents, anything that needs page text as context. The output format matters more than the extraction rules here: you want clean markdown, not a DOM, and you want it in one call rather than in a fetch and a parse. This is the newest of the four uses and the one the older tools fit worst.",[232,4606,4608],{"id":4607},"filling-a-database","Filling a database",[11,4610,4611],{},"Lead lists, firmographics, product catalogues. Half of what people call scraping in this bucket is not scraping at all, it is enrichment, and the right tool is a data endpoint that already holds the record rather than anything that visits a page. Recognising this early saves entire projects.",[320,4613,4614],{},[11,4615,324,4616,119,4618],{},[38,4617,327],{},[18,4619,1923],{"href":1922},[27,4621,4623],{"id":4622},"how-do-you-use-a-web-scraper-tool","How do you use a web scraper tool?",[11,4625,4626],{},"Whichever kind you picked, the shape is the same: find the tool that covers your site, run it once small, then decide what happens on a schedule. Below is that shape for the endpoint kind, which is the one you can try without installing anything.",[232,4628,235],{"id":234},[11,4630,238,4631,244],{},[18,4632,243],{"href":241,"rel":4633},[124,125],[131,4635,4637],{"className":4636,"code":249,"language":97,"meta":136},[248],[47,4638,249],{"__ignoreMap":136},[11,4640,254,4641,260],{},[18,4642,259],{"href":257,"rel":4643},[124,125],[232,4645,264],{"id":263},[131,4647,4648],{"className":133,"code":1087,"language":135,"meta":136,"style":136},[47,4649,4650,4660],{"__ignoreMap":136},[140,4651,4652,4654,4656,4658],{"class":142,"line":143},[140,4653,274],{"class":146},[140,4655,277],{"class":150},[140,4657,280],{"class":150},[140,4659,283],{"class":150},[140,4661,4662,4664,4666,4668,4670,4672,4674,4676,4678,4680],{"class":142,"line":166},[140,4663,147],{"class":146},[140,4665,290],{"class":150},[140,4667,293],{"class":150},[140,4669,296],{"class":150},[140,4671,299],{"class":193},[140,4673,1114],{"class":150},[140,4675,305],{"class":183},[140,4677,308],{"class":193},[140,4679,311],{"class":150},[140,4681,314],{"class":150},[232,4683,4685],{"id":4684},"step-1-search-by-capability-not-by-vendor","Step 1. Search by capability, not by vendor",[11,4687,4688,4690],{},[38,4689,1131],{}," Returns endpoints that do the job, ranked, with the provider and the billing shape attached.",[11,4692,4693,4695],{},[38,4694,1137],{}," Discovery covers the whole catalog, so this step is where you find out whether a purpose-built endpoint exists for your site instead of a generic scraper.",[11,4697,4698],{},[38,4699,1148],{},[131,4701,4703],{"className":133,"code":4702,"language":135,"meta":136,"style":136},"monid discover -q \"scrape any website url to markdown\"\nmonid discover -q \"instagram profile posts\"\n",[47,4704,4705,4719],{"__ignoreMap":136},[140,4706,4707,4709,4711,4713,4715,4717],{"class":142,"line":143},[140,4708,147],{"class":146},[140,4710,2667],{"class":150},[140,4712,2670],{"class":150},[140,4714,2673],{"class":193},[140,4716,2676],{"class":150},[140,4718,2679],{"class":193},[140,4720,4721,4723,4725,4727,4729,4732],{"class":142,"line":166},[140,4722,147],{"class":146},[140,4724,2667],{"class":150},[140,4726,2670],{"class":150},[140,4728,2673],{"class":193},[140,4730,4731],{"class":150},"instagram profile posts",[140,4733,2679],{"class":193},[11,4735,4736,4738],{},[38,4737,1195],{}," A ranked table of provider, endpoint, price, description and whether the endpoint is verified. Running two searches like the pair above is the fastest way to learn which of your targets already has a specific tool and which need the generic one.",[11,4740,4741,4743],{},[38,4742,1229],{}," Nothing. Discovery is free and unlimited, which is what makes it reasonable to check before writing anything.",[232,4745,4747],{"id":4746},"step-2-read-the-schema-before-you-commit","Step 2. Read the schema before you commit",[11,4749,4750,4752],{},[38,4751,1131],{}," Shows the exact inputs, the outputs, the billing shape and the current price.",[11,4754,4755,119,4757,4761],{},[38,4756,1137],{},[18,4758,4759],{"href":1481},[47,4760,1484],{}," as the generic case.",[11,4763,4764],{},[38,4765,1148],{},[131,4767,4769],{"className":133,"code":4768,"language":135,"meta":136,"style":136},"monid inspect -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown\n",[47,4770,4771],{"__ignoreMap":136},[140,4772,4773,4775,4777,4779,4781,4783],{"class":142,"line":143},[140,4774,147],{"class":146},[140,4776,151],{"class":150},[140,4778,154],{"class":150},[140,4780,1718],{"class":150},[140,4782,160],{"class":150},[140,4784,2012],{"class":150},[11,4786,4787,4789],{},[38,4788,1195],{}," The full input schema plus the provider's own pricing note. For this endpoint that note reads: JavaScript rendering, anti-bot bypass and premium proxies included, and failed or blocked requests are not billed. Verified 21 August 2026.",[11,4791,4792,4794],{},[38,4793,1229],{}," Nothing, and this is the step people skip. Reading two schemas side by side settles vendor comparisons that a week of blog posts will not.",[232,4796,4798],{"id":4797},"step-3-run-one-page-then-decide","Step 3. Run one page, then decide",[11,4800,4801,4803],{},[38,4802,1131],{}," Executes the endpoint. This is the only step that bills.",[11,4805,4806,119,4808,4812,4813,4817],{},[38,4807,1137],{},[18,4809,4810],{"href":1481},[47,4811,1484],{},", or ",[18,4814,4815],{"href":1523},[47,4816,1526],{}," if you want the trial to cost nothing at all.",[11,4819,4820],{},[38,4821,1148],{},[131,4823,4824],{"className":133,"code":3972,"language":135,"meta":136,"style":136},[47,4825,4826,4842],{"__ignoreMap":136},[140,4827,4828,4830,4832,4834,4836,4838,4840],{"class":142,"line":143},[140,4829,147],{"class":146},[140,4831,171],{"class":150},[140,4833,154],{"class":150},[140,4835,1718],{"class":150},[140,4837,160],{"class":150},[140,4839,1721],{"class":150},[140,4841,184],{"class":183},[140,4843,4844,4846,4848,4850,4852],{"class":142,"line":166},[140,4845,2037],{"class":150},[140,4847,194],{"class":193},[140,4849,2042],{"class":150},[140,4851,2045],{"class":193},[140,4853,1190],{"class":150},[11,4855,4856,119,4858,98,4860,98,4862,98,4864,2064,4866,2068,4868,98,4870,98,4872,102,4874,2081],{},[38,4857,1195],{},[47,4859,2054],{},[47,4861,2057],{},[47,4863,2060],{},[47,4865,2063],{},[47,4867,2067],{},[47,4869,2071],{},[47,4871,2074],{},[47,4873,2077],{},[47,4875,2080],{},[11,4877,4878,4880,4881,260],{},[38,4879,1229],{}," A fraction of a cent for the page, and nothing for the two steps before it. Current figures on ",[18,4882,1233],{"href":2089},[320,4884,4885],{},[11,4886,324,4887,119,4889],{},[38,4888,327],{},[18,4890,2133],{"href":2132},[27,4892,4894],{"id":4893},"what-are-the-best-web-scraping-apis-for-ai-agents-and-automation","What are the best web scraping APIs for AI agents and automation?",[11,4896,4897],{},"The ones an agent can find without you. That sounds like a slogan and it is a functional requirement: an agent asked to do something you did not anticipate has to locate a capability at run time, and an API it cannot discover may as well not exist. Everything else on the usual shortlist is secondary to that.",[11,4899,4900],{},"Disclosure, since it changes how you should read this: you are on the Monid blog, and Monid is the fourth kind. So here is where the others genuinely win. Apify wins when your target is a popular defended site and somebody has already built and maintained an actor for it, because their parser will beat yours. Bright Data wins at the top of the volume curve when you have the engineering to operate a pool and the traffic to justify a committed rate. Firecrawl wins when crawling a whole site into markdown is the entire job and you want one vendor who does exactly that well.",[11,4902,4903],{},"What none of them changes is the shape of the problem for an agent. Each is a signup, a key and usually a plan, chosen in advance by a developer. When an agent needs a capability nobody predicted, the cost of the vendor is not the price, it is the three weeks between wanting it and having it approved.",[11,4905,4906],{},"The practical requirements are therefore narrower than a feature table suggests: the agent must be able to search the catalog, read a schema without paying, and call anything in it on one credential. Judge candidates on those three and the shortlist stops looking like a ranked list of scrapers.",[320,4908,4909],{},[11,4910,324,4911,119,4913],{},[38,4912,327],{},[18,4914,4916],{"href":4915},"\u002Fblog\u002Fguides\u002Fmcp-server-live-web-data-agents","Which MCP Server Gives an AI Agent Live Web Data?",[27,4918,480],{"id":479},[482,4920,4921,4935],{},[485,4922,4923],{},[488,4924,4925,4927,4929,4931,4933],{},[491,4926,493],{},[491,4928,496],{},[491,4930,1443],{},[491,4932,1446],{},[491,4934,1449],{},[504,4936,4937,4954,4971,4988,5004,5021,5040],{},[488,4938,4939,4942,4948,4950,4952],{},[509,4940,4941],{},"Any page to clean markdown",[509,4943,4944],{},[18,4945,4946],{"href":1481},[47,4947,1484],{},[509,4949,1487],{},[509,4951,1490],{},[509,4953,2172],{},[488,4955,4956,4959,4965,4967,4969],{},[509,4957,4958],{},"A whole site",[509,4960,4961],{},[18,4962,4963],{"href":1502},[47,4964,3133],{},[509,4966,3136],{},[509,4968,3139],{},[509,4970,1557],{},[488,4972,4973,4976,4982,4984,4986],{},[509,4974,4975],{},"Twenty URLs at once",[509,4977,4978],{},[18,4979,4980],{"href":1984},[47,4981,1987],{},[509,4983,2203],{},[509,4985,2206],{},[509,4987,2209],{},[488,4989,4990,4992,4998,5000,5002],{},[509,4991,1518],{},[509,4993,4994],{},[18,4995,4996],{"href":1523},[47,4997,1526],{},[509,4999,1529],{},[509,5001,1532],{},[509,5003,1535],{},[488,5005,5006,5009,5015,5017,5019],{},[509,5007,5008],{},"Find the pages first",[509,5010,5011],{},[18,5012,5013],{"href":1545},[47,5014,1548],{},[509,5016,1551],{},[509,5018,1554],{},[509,5020,1557],{},[488,5022,5023,5026,5032,5035,5038],{},[509,5024,5025],{},"A site-specific scraper",[509,5027,5028],{},[18,5029,5031],{"href":5030},"\u002Ftools\u002Fapify","Apify actors",[509,5033,5034],{},"varies per actor",[509,5036,5037],{},"structured records for that site",[509,5039,1557],{},[488,5041,5042,5045,5051,5053,5055],{},[509,5043,5044],{},"A job that needs a session",[509,5046,5047],{},[18,5048,5049],{"href":1140},[47,5050,1143],{},[509,5052,1465],{},[509,5054,2241],{},[509,5056,1471],{},[11,5058,1560,5059,5061],{},[47,5060,607],{}," on 21 August 2026. The table gives the billing shape rather than a figure, because the shape changes your architecture and a number goes stale silently.",[27,5063,5065],{"id":5064},"when-is-a-no-code-tool-the-right-answer","When is a no-code tool the right answer?",[11,5067,5068],{},"More often than a developer will admit. If somebody needs four hundred rows off a site once, a point-and-click extension gets it in twenty minutes with no ticket, no key and no code review, and every alternative in this guide is slower. The instinct to route that through engineering is how a two-hour task becomes a two-week one.",[11,5070,5071],{},"It is also right when the person with the need cannot write code and the need is real. A marketer who can collect their own list will collect it weekly; the same person waiting on a queue will do it once and give up. That is a genuine outcome difference and it beats architectural tidiness.",[11,5073,5074],{},"Where no-code stops is anything that has to run without a human. The moment the requirement is \"every morning\", you need something with a schedule, a retry and an owner, and a browser extension has none of the three. That is the boundary, and it is cleaner than most of the advice in this category admits: not scale, not difficulty, just whether a person is present when it runs.",[11,5076,5077],{},"Finally, if one site dominates your usage and it has an official API, use the API. It is faster, cheaper, allowed, and nothing on any tools list beats a documented endpoint from the source.",[27,5079,696],{"id":695},[11,5081,5082],{},"There is no best web scraping tool, because the four kinds are not substitutes and a ranked list that mixes them is comparing a hammer to a contractor. Decide who operates the thing first: you now, your developers forever, a vendor's team, or the caller at run time. That single question resolves most of the shortlist before you read a single feature comparison.",[11,5084,5085],{},"The part that has changed recently is the fourth kind. When the caller is an agent rather than a person, the ability to find and read a tool at run time stops being a convenience and becomes the requirement, because an agent cannot fill in a signup form and wait for procurement.",[11,5087,1600,5088,5090,5091,5093,5094,260],{},[47,5089,603],{}," for the specific site you have been meaning to scrape, then ",[47,5092,607],{}," the top result. Both are free, and you will know in a minute whether a purpose-built endpoint already exists or whether the generic one is your answer. Start at ",[18,5095,725],{"href":723,"rel":5096},[124,125],[27,5098,729],{"id":728},[731,5100,5102],{"q":5101},"What are the best web scraping tools in Python?",[11,5103,5104,5105,260],{},"Scrapy for crawling at scale, BeautifulSoup for parsing, and Playwright when the page needs a browser. That list has been stable for years, which is a hint: the library layer was never the hard part. If you are choosing between them to solve blocking or rendering, none of the three will fix it, and the fuller version of that argument is in ",[18,5106,5107],{"href":2132},"the Python guide",[731,5109,5111],{"q":5110},"Are there good open source web scraping tools?",[11,5112,5113],{},"Yes, and the open source layer of this category is genuinely excellent: Scrapy, Playwright, Crawlee and the newer LLM-oriented crawlers all do serious work and cost nothing. What none of them gives you is the part that is not code, which is an acceptable exit address, a browser fleet and somebody to fix the parser. Open source solves the extraction and leaves you the operations, so the honest comparison is not free versus paid, it is your time versus a bill.",[731,5115,5117],{"q":5116},"What is the best web scraping API in 2026?",[11,5118,5119],{},"It depends on whether the caller is a person or a program, which is the split most 2026 roundups still miss. For a developer wiring one known site, the best API is whichever vendor has the best coverage of that site, and a specialist usually beats a generalist. For an agent that has to handle sites nobody listed in advance, the best API is the one it can discover, inspect and call on a single credential, because a vendor it cannot sign up for is not a candidate.",[731,5121,5123],{"q":5122},"Is a Chrome extension enough for web scraping?",[11,5124,5125],{},"For a one-off collection with you sitting there, usually yes, and it is the fastest option available. It stops being enough the moment the job has to repeat without you: an extension has no schedule, no retry and nowhere to log a failure. Treat the presence of a human as the dividing line rather than the size of the dataset, since a nightly job of fifty rows needs infrastructure and a one-time pull of five thousand does not.",[421,5127,5129],{"category":2343,"title":5128},"Let the agent pick the scraper",[11,5130,5131],{},"Discover the endpoint, read its schema and current price for free, then run it. One key, one balance, no vendor per site.",[11,5133,5134],{},[758,5135,760],{},[762,5137,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":5139},[5140,5146,5152,5159,5160,5161,5162,5163],{"id":4412,"depth":166,"text":4413,"children":5141},[5142,5143,5144,5145],{"id":4419,"depth":187,"text":4420},{"id":4426,"depth":187,"text":4427},{"id":4433,"depth":187,"text":4434},{"id":4446,"depth":187,"text":4447},{"id":4579,"depth":166,"text":4580,"children":5147},[5148,5149,5150,5151],{"id":4586,"depth":187,"text":4587},{"id":4593,"depth":187,"text":4594},{"id":4600,"depth":187,"text":4601},{"id":4607,"depth":187,"text":4608},{"id":4622,"depth":166,"text":4623,"children":5153},[5154,5155,5156,5157,5158],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":4684,"depth":187,"text":4685},{"id":4746,"depth":187,"text":4747},{"id":4797,"depth":187,"text":4798},{"id":4893,"depth":166,"text":4894},{"id":479,"depth":166,"text":480},{"id":5064,"depth":166,"text":5065},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fweb-scraping-tools-which-kind.png","Web scraping tools come in four kinds and they differ on who operates them, not on features. Pick the operator first and the shortlist writes itself.","\u002Fimg\u002Fblog\u002Fweb-scraping-tools-which-kind-card.png",{},{"title":4347,"description":5165},"blog\u002Fguides\u002Fweb-scraping-tools-which-kind",[5171,5172,5173,1687,5174],"web scraping tools","no code scraper","scraping api","apify","qEu6p51LasqNn_e7pZhGszf2nxAF9rJkfC90b3MHZT0",{"id":5177,"title":5178,"author":6,"body":5179,"category":5706,"cover":5707,"description":5708,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":5709,"meta":5710,"navigation":790,"ogImage":787,"path":5711,"publishedAt":5712,"readTime":1681,"seo":5713,"stem":5714,"tags":5715,"toolCategory":5565,"updatedAt":5712,"__hash__":5719},"blogGuides\u002Fblog\u002Fguides\u002Fautonomous-store-agent-outside-data.md","Runner AI Runs the Store. Monid Feeds It the Market.",{"type":8,"value":5180,"toc":5695},[5181,5190,5196,5199,5205,5208,5212,5215,5218,5221,5240,5243,5249,5256,5260,5263,5309,5312,5318,5328,5334,5352,5361,5365,5371,5377,5384,5387,5397,5400,5406,5419,5422,5426,5429,5528,5535,5538,5556,5563,5570,5574,5577,5585,5591,5598,5602,5605,5611,5617,5623,5629,5632,5634,5637,5640,5647,5649,5655,5661,5675,5689,5693],[11,5182,5183,5184,5189],{},"An agentic commerce platform can now take one sentence and return a working store: products, payments, shipping, tax, live in minutes. ",[18,5185,5188],{"href":5186,"rel":5187},"https:\u002F\u002Frunnerai.com",[124,125],"Runner AI"," does this and then keeps going, running a team of specialist agents for ads, email, CRO, SEO, support and analytics, proposing the next move while the founder approves it.",[11,5191,5192,5193],{},"Which raises the question that the demo never covers. The agent can build the store. ",[38,5194,5195],{},"How does it know whether the store is worth building?",[11,5197,5198],{},"That answer is not inside the store. It is one call away, and this is what came back for a single product idea:",[131,5200,5203],{"className":5201,"code":5202,"language":97,"meta":136},[248],"\"resistance bands set\"          48 products, one call\n\nprice        $3.99  ->  $20.99 median  ->  $59.97\nreviews         18  ->   2,646 median  ->  136,609\nthe leader   $8.98 with 136,609 reviews\nthe keyword  20,000 results deep\n",[47,5204,5202],{"__ignoreMap":136},[11,5206,5207],{},"Fair disclosure. You are on the Monid blog, Monid sells the endpoint that returned those numbers, and Runner AI is a content partner. Runner AI is not in the Monid catalogue. The section near the end says when none of this data is worth fetching.",[27,5209,5211],{"id":5210},"what-can-an-autonomous-store-agent-see-and-what-can-it-not","What can an autonomous store agent see, and what can it not?",[11,5213,5214],{},"It sees everything that happened inside its own walls, in perfect detail, and nothing outside them.",[11,5216,5217],{},"An analytics agent reading a live store knows sessions, conversion rate, average order value, cart abandonment, which product page leaks, which email got opened. That is genuinely a lot, and for a store that already has traffic it is enough to run a competent optimisation loop. A CRO agent that can measure its own funnel does not need anybody's permission to improve it.",[11,5219,5220],{},"Now list what that same agent cannot know at any resolution:",[5222,5223,5224,5228,5231,5234,5237],"ul",{},[5225,5226,5227],"li",{},"Whether its price is high, low or invisible against the field",[5225,5229,5230],{},"Who already owns the category and how entrenched they are",[5225,5232,5233],{},"Whether new entrants are getting traction or bouncing off",[5225,5235,5236],{},"What competitors are actually saying in their ads right now",[5225,5238,5239],{},"Which adjacent search terms have demand it is not serving",[11,5241,5242],{},"Every one of those is a fact about the world, not about the store. No amount of instrumentation surfaces them, because the events never touch your servers.",[11,5244,5245,5248],{},[38,5246,5247],{},"And they are the expensive decisions."," Tuning a checkout flow moves a few percent. Choosing the wrong category to enter wastes the whole quarter, and it is the decision an autonomous platform makes first, fastest, and with the least evidence.",[11,5250,5251],{},[5252,5253],"img",{"alt":5254,"src":5255},"What the store's own instrumentation can see, and the five decisions that live entirely outside it.","\u002Fimg\u002Fblog\u002Fautonomous-store-agent-outside-data-fig-inside-outside.png",[27,5257,5259],{"id":5258},"what-does-the-market-look-like-before-you-enter-it","What does the market look like before you enter it?",[11,5261,5262],{},"One call, forty eight competitors, and a decision that makes itself.",[131,5264,5266],{"className":133,"code":5265,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Faxesso_data\u002Famazon-search-scraper \\\n  -i '{\"input\":[{\"domainCode\":\"com\",\"keyword\":\"resistance bands set\",\"numPages\":1,\"sortBy\":\"relevanceblender\"}]}' \\\n  -w -o market.json\n",[47,5267,5268,5285,5298],{"__ignoreMap":136},[140,5269,5270,5272,5274,5276,5278,5280,5283],{"class":142,"line":143},[140,5271,147],{"class":146},[140,5273,171],{"class":150},[140,5275,154],{"class":150},[140,5277,157],{"class":150},[140,5279,160],{"class":150},[140,5281,5282],{"class":150}," \u002Faxesso_data\u002Famazon-search-scraper",[140,5284,184],{"class":183},[140,5286,5287,5289,5291,5294,5296],{"class":142,"line":166},[140,5288,190],{"class":150},[140,5290,194],{"class":193},[140,5292,5293],{"class":150},"{\"input\":[{\"domainCode\":\"com\",\"keyword\":\"resistance bands set\",\"numPages\":1,\"sortBy\":\"relevanceblender\"}]}",[140,5295,2045],{"class":193},[140,5297,184],{"class":183},[140,5299,5300,5303,5306],{"class":142,"line":187},[140,5301,5302],{"class":150},"  -w",[140,5304,5305],{"class":150}," -o",[140,5307,5308],{"class":150}," market.json\n",[11,5310,5311],{},"Forty eight products came back. Read them in the order an agent would.",[11,5313,5314,5317],{},[38,5315,5316],{},"The price band is wide and the bottom is defended."," Prices run $3.99 to $59.97 with a median of $20.99. That spread alone says the category is not one product, it is at least two: cheap loop bands and handled sets. Those are different buyers and different margins, and a platform that reads \"resistance bands\" as one market will price into the wrong half.",[11,5319,5320,5323,5324,5327],{},[38,5321,5322],{},"The leader is unassailable at the bottom."," The most reviewed product is $8.98 with ",[38,5325,5326],{},"136,609 reviews",". There is no version of a new store winning that position. Any plan that involves competing on price against loop bands is already over, and the agent should know that before it writes a single line of copy.",[11,5329,5330,5333],{},[38,5331,5332],{},"The middle is a different story."," The median product carries 2,646 reviews, and the handled sets clustering around $21 to $28 have review counts in the twenty to thirty thousands rather than the hundred thousands. Two orders of magnitude less entrenched.",[11,5335,5336,5339,5340,5343,5344,5347,5348,5351],{},[38,5337,5338],{},"And newcomers do get in."," Every one of the 48 rows carried a ",[47,5341,5342],{},"salesVolume"," field, with values like ",[47,5345,5346],{},"20K+ bought in past month"," and, on products inside the same top page, ",[47,5349,5350],{},"New on Amazon in past month",". The category admits new entrants. Just not at the bottom.",[11,5353,5354,119,5357,5360],{},[38,5355,5356],{},"The keyword itself is deep.",[47,5358,5359],{},"resultCount"," came back as 20,000 for this term. Competing for it head on means arriving twenty thousand results late.",[232,5362,5364],{"id":5363},"the-adjacent-terms-are-the-actual-opening","The adjacent terms are the actual opening",[11,5366,5367,5370],{},[47,5368,5369],{},"similarKeywords"," returned six phrasings alongside the main one, and reading them together says more than any of them says alone:",[131,5372,5375],{"className":5373,"code":5374,"language":97,"meta":136},[248],"resistance bands for working out\nresistance bands for working out womens\nresistance bands for working out men\nresistance bands for stretching\nexercise bands resistance bands set\npull up assistance bands\n",[47,5376,5374],{"__ignoreMap":136},[11,5378,5379,5380,5383],{},"Three of the six segment by audience, two by use case, one is a synonym. ",[38,5381,5382],{},"That is the shape of every entrenched category",": the head term belongs to the incumbent, and the demand that is still available has already sorted itself into who is buying and what for.",[11,5385,5386],{},"A store agent handed only \"resistance bands set\" builds a general store into a wall. The same agent handed this list can build for one of those segments, which is a narrower store, a cheaper ad buy, and copy that says something. The list arrived in the same response as the price band, at no extra charge, and it is the field most people never read.",[11,5388,5389,5390,102,5394,260],{},"The full endpoint set for this kind of work sits under ",[18,5391,5393],{"href":5392},"\u002Ftools\u002Fecommerce","ecommerce on Monid",[18,5395,5396],{"href":3256},"Amazon specifically",[11,5398,5399],{},"That is a market entry brief, assembled from one request, in the time it takes to run it. The store builder cannot produce it, because none of it is in the store.",[11,5401,5402],{},[5252,5403],{"alt":5404,"src":5405},"One call returns the price band, the entrenchment, the newcomer signal and the adjacent demand.","\u002Fimg\u002Fblog\u002Fautonomous-store-agent-outside-data-fig-one-call.png",[11,5407,5408,5409,5413,5414,5418],{},"We have written the mechanics of this call up separately, in ",[18,5410,5412],{"href":5411},"\u002Fblog\u002Fguides\u002Fconnect-claude-to-amazon-search-data","connecting an assistant to Amazon search data"," and in ",[18,5415,5417],{"href":5416},"\u002Fblog\u002Fwire-up-amazon-search-tracking","tracking rank on a schedule",", so this piece stays on what the numbers mean rather than how to fetch them.",[316,5420],{"prompt":5421},"search Amazon for my product keyword, then tell me the price range, the review count of the leader, and which adjacent keywords have demand",[27,5423,5425],{"id":5424},"which-agent-needs-which-outside-source","Which agent needs which outside source?",[11,5427,5428],{},"Each specialist has exactly one blind spot, and they are not the same blind spot.",[482,5430,5431,5446],{},[485,5432,5433],{},[488,5434,5435,5438,5441,5444],{},[491,5436,5437],{},"Specialist",[491,5439,5440],{},"Blind without",[491,5442,5443],{},"Where it comes from",[491,5445,502],{},[504,5447,5448,5461,5475,5488,5501,5514],{},[488,5449,5450,5453,5456,5459],{},[509,5451,5452],{},"Store",[509,5454,5455],{},"Price band, entrenchment, category depth",[509,5457,5458],{},"Marketplace search",[509,5460,3551],{},[488,5462,5463,5466,5469,5472],{},[509,5464,5465],{},"Analyst",[509,5467,5468],{},"Competitor movement over time",[509,5470,5471],{},"The same search, repeated",[509,5473,5474],{},"Per result, per run",[488,5476,5477,5480,5483,5486],{},[509,5478,5479],{},"Creative",[509,5481,5482],{},"What buyers actually complain about",[509,5484,5485],{},"Reviews on the leaders",[509,5487,3551],{},[488,5489,5490,5493,5496,5499],{},[509,5491,5492],{},"Ads",[509,5494,5495],{},"What competitors are running right now",[509,5497,5498],{},"Ad archives",[509,5500,542],{},[488,5502,5503,5506,5509,5512],{},[509,5504,5505],{},"SEO",[509,5507,5508],{},"What ranks and for which phrasings",[509,5510,5511],{},"Search results, adjacent terms",[509,5513,542],{},[488,5515,5516,5519,5522,5525],{},[509,5517,5518],{},"Support",[509,5520,5521],{},"Nothing external",[509,5523,5524],{},"The store's own data",[509,5526,5527],{},"Free",[11,5529,5530,5531,5534],{},"Read the last row before the others. ",[38,5532,5533],{},"Not every agent needs outside data",", and a piece written by a company that sells outside data should say so in the table rather than in a footnote.",[11,5536,5537],{},"The interesting column is the one on the right. A Store agent pulling a category once at launch is a single per result charge. An Analyst agent re-running it weekly is that charge on a schedule. An Ads agent watching competitor creatives is per call and flat, so it can poll hourly for the same money. Those are different cost curves, and if you are wiring these yourself, the shape decides your architecture more than the price does.",[11,5539,5540,5541,5545,5546,5550,5551,5555],{},"The reviews line is worth expanding because it is the one people skip. The leaders in this category have 136,609 and 36,420 reviews between them, which is an enormous corpus of buyers saying precisely what is wrong with the incumbent products. That is the Creative agent's brief, written by the market. We pulled that thread in ",[18,5542,5544],{"href":5543},"\u002Fblog\u002Fi-read-10k-amazon-reviews-so-you-dont-have-to","reading 10,000 Amazon reviews"," and compared the endpoints in ",[18,5547,5549],{"href":5548},"\u002Fblog\u002Fguides\u002Fbest-amazon-reviews-api-2026","the reviews API guide",". For the ads side, ",[18,5552,5554],{"href":5553},"\u002Fblog\u002Fguides\u002Fmeta-ad-library-longest-running-ads","the Meta Ad Library as a feed"," covers what competitors are actually running.",[11,5557,5558,5559,5562],{},"This is the division the partnership sits on, and it is a clean one. ",[18,5560,5188],{"href":5186,"rel":5561},[124,125]," is the orchestration: the central intelligence that reads the business, proposes the highest-impact move, and summons the specialist to execute it while the founder approves. Monid is the tool layer those specialists reach through, one key and one balance for every outside source, billed per call. Neither replaces the other, and the reason to write this down is that most descriptions of agentic commerce quietly assume the data is already there.",[421,5564,5567],{"category":5565,"title":5566},"ecommerce","Read the category before an agent builds the store",[11,5568,5569],{},"Inspect the marketplace endpoints free, see the billing shape, and run one keyword before committing a catalogue.",[27,5571,5573],{"id":5572},"what-does-feeding-the-agents-cost","What does feeding the agents cost?",[11,5575,5576],{},"Less than being wrong about the category, and the shape matters more than the number.",[11,5578,5579,5580,5584],{},"The search endpoint above bills per result, so the 48 rows are 48 units and a market brief lands in small change. That is per launch, and per re-check. An Ads agent watching an archive bills per call, flat, so its cost tracks how often it looks rather than how much it finds. Current magnitudes live on ",[18,5581,1233],{"href":5582,"rel":5583},"https:\u002F\u002Fmonid.ai\u002Ftools",[124,125],", because a figure written into an article goes stale quietly.",[11,5586,5587,5588],{},"Runner AI's own pricing is a flat monthly plan with a free tier, which their reference pack contrasts against the five figures a month an equivalent human team of ads, email, CRO, SEO, support, analyst, ops and creative would cost. We are not going to reprint their number here for the same reason we do not print ours, but the shape of the argument is the point: ",[38,5589,5590],{},"the specialists got cheap, and the data they consume did too, and neither of those was true two years ago.",[11,5592,5593,5594,5597],{},"The general case for ",[18,5595,5596],{"href":2325},"paying per call rather than a subscription"," covers why this suits agent workloads specifically: an agent that carries a whole catalogue and pays only for what it calls can afford to check things a human team would have skipped.",[27,5599,5601],{"id":5600},"when-does-an-agent-not-need-outside-data","When does an agent not need outside data?",[11,5603,5604],{},"Four cases, and they are more common than a data vendor would like.",[11,5606,5607,5610],{},[38,5608,5609],{},"When the store already has traffic."," A CRO agent optimising a funnel with real sessions has better evidence than any competitor scrape. Your own conversion data beats inference about somebody else's. Fetch outside data for entry decisions, not for optimisation ones.",[11,5612,5613,5616],{},[38,5614,5615],{},"When the category is one you already know."," If you have sold in this space for five years, a price band read from a search page tells you nothing you had not priced in. The value here is highest exactly where the agent is least informed, which is a new category.",[11,5618,5619,5622],{},[38,5620,5621],{},"When the decision is small."," Checking a competitor's price before changing a product title is effort spent on a reversible choice. Reserve the research for the decisions that are expensive to undo, which is mostly what to sell and to whom.",[11,5624,5625,5628],{},[38,5626,5627],{},"When the data does not exist for your model."," Booking-based services, digital products and subscriptions are all things an agentic platform can run, and none of them have a marketplace search page to read. The method in this article is marketplace shaped, and outside that shape it degrades to ordinary web research.",[11,5630,5631],{},"We sell the endpoints, so weigh that list accordingly. The honest summary is that outside data earns its place at two moments, entry and periodic re-check, and that an agent asking for it continuously is usually a design mistake rather than a diligent one.",[27,5633,696],{"id":695},[11,5635,5636],{},"Building the store stopped being the hard part. An agentic commerce platform will stand one up from a sentence, wire the payments, and put a team of specialists on it by the afternoon.",[11,5638,5639],{},"What did not get easier is knowing whether that store should exist. The category leader at $8.98 with 136,609 reviews is a fact about the world, and no dashboard, no matter how good the agents reading it are, contains it.",[11,5641,5642,5643,5646],{},"The rule worth keeping: ",[38,5644,5645],{},"an agent's judgment is bounded by what it can see, so buy it eyes before you buy it hands."," One call, forty eight competitors, and the plan changes or it does not. Either way you found out in a minute rather than a quarter.",[27,5648,729],{"id":728},[731,5650,5652],{"q":5651},"Is my store's own analytics not enough for an AI agent?",[11,5653,5654],{},"It is enough for optimisation and not for entry. Your analytics describe what happened to your traffic, which is the right evidence for changing a page, a price or an email. They contain nothing about who else is in the category, what they charge, or how entrenched they are, and those are the facts that decide whether the category was the right one. Different decisions, different data.",[731,5656,5658],{"q":5657},"How often should an agent refresh competitor data?",[11,5659,5660],{},"Once at entry, then on a cadence matched to how fast the thing moves. Price bands and entrenchment shift over months, so monthly is usually enough and weekly is generous. Ad creative changes weekly. Review volume creeps. Refreshing everything daily mostly buys you a bill, and the endpoints that bill per result punish it hardest.",[731,5662,5664],{"q":5663},"What are the best web scraping APIs for AI agents?",[11,5665,5666,5667,5670,5671,260],{},"There is no single best one, because the platforms are not one problem: marketplace search, ad archives and social each want different providers. The comparison is in ",[18,5668,5669],{"href":2560},"the web scraping guide for agents",", and the argument for reaching them through one integration rather than several is in ",[18,5672,5674],{"href":5673},"\u002Fblog\u002Fguides\u002Fapi-marketplace-for-ai-agents","the API marketplace guide",[731,5676,5678],{"q":5677},"How do I wire this into an agent rather than running it by hand?",[11,5679,5680,5681,5684,5685,260],{},"Monid ships as an MCP server, so an agent discovers the endpoint, reads its schema and calls it inside a conversation, with the prices visible before it commits. That is the setup in ",[18,5682,5683],{"href":4915},"which MCP server gives an agent live web data",", and the model side of the same wiring is covered in ",[18,5686,5688],{"href":5687},"\u002Fblog\u002Fguides\u002Fai-agent-needs-two-integrations","a model is half an agent",[11,5690,5691],{},[758,5692,760],{},[762,5694,764],{},{"title":136,"searchDepth":166,"depth":166,"links":5696},[5697,5698,5701,5702,5703,5704,5705],{"id":5210,"depth":166,"text":5211},{"id":5258,"depth":166,"text":5259,"children":5699},[5700],{"id":5363,"depth":187,"text":5364},{"id":5424,"depth":166,"text":5425},{"id":5572,"depth":166,"text":5573},{"id":5600,"depth":166,"text":5601},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"Ecommerce","\u002Fimg\u002Fblog\u002Fautonomous-store-agent-outside-data.png","One call returned 48 competitors: prices from $3.99 to $59.97 and an incumbent with 136,609 reviews. No store dashboard contains that, and agents need it.","\u002Fimg\u002Fblog\u002Fautonomous-store-agent-outside-data-card.png",{},"\u002Fblog\u002Fguides\u002Fautonomous-store-agent-outside-data","2026-08-20",{"title":5178,"description":5708},"blog\u002Fguides\u002Fautonomous-store-agent-outside-data",[5716,1687,5717,5718],"agentic commerce","ecommerce data","autonomous business","ubO5H4wXHjM2Uut2v1GebLiPlovlruDhH5A_fji8m0c",{"id":5721,"title":3635,"author":6,"body":5722,"category":2378,"cover":6620,"description":6621,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":6622,"meta":6623,"navigation":790,"ogImage":787,"path":3634,"publishedAt":5712,"readTime":1681,"seo":6624,"stem":6625,"tags":6626,"toolCategory":4297,"updatedAt":5712,"__hash__":6628},"blogGuides\u002Fblog\u002Fguides\u002Fbing-search-api-retired-alternatives.md",{"type":8,"value":5723,"toc":6595},[5724,5727,5764,5774,5778,5787,5791,5794,5797,5801,5804,5807,5811,5881,5884,5894,5898,5901,5903,5908,5913,5918,5920,5956,5960,5969,5978,5982,6002,6031,6036,6040,6045,6054,6058,6078,6136,6146,6151,6155,6160,6164,6198,6219,6230,6233,6237,6240,6244,6258,6261,6265,6278,6285,6289,6302,6306,6312,6322,6324,6477,6482,6486,6489,6492,6499,6513,6519,6521,6524,6527,6530,6533,6535,6538,6541,6554,6556,6562,6573,6579,6589,6593],[11,5725,5726],{"style":810},"Copy this line to your agent to replace a dead search integration.",[131,5728,5730],{"className":814,"code":5729,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use tinyfish \u002Fsearch to run a live web search\n",[47,5731,5732],{"__ignoreMap":136},[140,5733,5734,5736,5738,5740,5742,5744,5747,5750,5752,5754,5756,5758,5761],{"class":142,"line":143},[140,5735,824],{"class":823},[140,5737,827],{"class":150},[140,5739,830],{"class":150},[140,5741,833],{"class":150},[140,5743,836],{"class":150},[140,5745,5746],{"class":150}," tinyfish",[140,5748,5749],{"class":150}," \u002Fsearch",[140,5751,845],{"class":150},[140,5753,171],{"class":150},[140,5755,851],{"class":150},[140,5757,3373],{"class":150},[140,5759,5760],{"class":150}," web",[140,5762,5763],{"class":150}," search\n",[11,5765,5766,5767,5770,5771,5773],{},"Microsoft retired the Bing Search APIs on 11 August 2025. This was not a price change or a tier consolidation. The endpoints were decommissioned, new signups were closed in February of that year, and code that still points at them now gets an HTTP 410 rather than JSON. If you built anything on ",[47,5768,5769],{},"api.bing.microsoft.com",", it stopped working on a date somebody else picked. That is the part worth thinking about, more than the replacement itself. Monid is ",[18,5772,21],{"href":20},": one key and one balance across many providers, so the next retirement costs you a parameter instead of a rewrite.",[27,5775,5777],{"id":5776},"why-did-the-bing-search-api-go-away-and-what-broke","Why did the Bing Search API go away, and what broke?",[11,5779,5780,5781,5786],{},"Bing Search was retired as a product, not migrated. Microsoft's ",[18,5782,5785],{"href":5783,"rel":5784},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Flifecycle\u002Fannouncements\u002Fbing-search-api-retirement",[124,125],"lifecycle announcement"," is explicit that the F1 and S1 through S9 Bing Search tiers, along with F0 and S1 through S4 Bing Custom Search, were decommissioned and are no longer available to new or existing customers. The recommended path was not another search endpoint but Grounding with Bing Search inside Azure AI Agents, which is a different product with a different shape.",[232,5788,5790],{"id":5789},"the-timeline-is-the-lesson-not-the-outage","The timeline is the lesson, not the outage",[11,5792,5793],{},"Three dates matter, and they were spread across six months. New Bing Search resources could no longer be created in Azure from February 2025. The formal retirement notice landed on 13 May 2025. The endpoints stopped responding on 11 August 2025.",[11,5795,5796],{},"Anyone watching the Azure portal saw the first date. Anyone reading release notes saw the second. Everyone else found out from an alert. That gap is the actual risk in a single-vendor search dependency: the notice period is real, but it only helps if the dependency is somewhere you look, and a search call buried three layers into a retrieval pipeline is not somewhere you look.",[232,5798,5800],{"id":5799},"a-410-breaks-differently-from-a-500","A 410 breaks differently from a 500",[11,5802,5803],{},"An HTTP 410 means gone, permanently, and that is worse for most codebases than an outage. Retry logic treats a 500 as transient and backs off, which is correct. A 410 is not transient, so a retry loop turns one dead call into a stack of dead calls, and the failure surfaces as latency and burnt tokens rather than as a clear error.",[11,5805,5806],{},"That is the specific way an agent pipeline degrades: it keeps working, the answers get worse, and nothing in the logs says search is dead. One user on r\u002FLocalLLM described the adjacent symptom, extracting web content for a local model wasting a large amount of tokens before anything useful comes back.",[232,5808,5810],{"id":5809},"single-vendor-versus-a-routed-catalogue-what-actually-differs","Single vendor versus a routed catalogue: what actually differs",[482,5812,5813,5825],{},[485,5814,5815],{},[488,5816,5817,5819,5822],{},[491,5818,915],{},[491,5820,5821],{},"One search vendor, one key",[491,5823,5824],{},"A routed catalogue",[504,5826,5827,5838,5849,5860,5871],{},[488,5828,5829,5832,5835],{},[509,5830,5831],{},"Data strategy",[509,5833,5834],{},"One index, one contract",[509,5836,5837],{},"Several indexes, chosen per call",[488,5839,5840,5843,5846],{},[509,5841,5842],{},"Freshness",[509,5844,5845],{},"Whatever that vendor caches",[509,5847,5848],{},"Selectable, including uncached browser rendering",[488,5850,5851,5854,5857],{},[509,5852,5853],{},"Main workflow",[509,5855,5856],{},"Sign up, get key, hard-code endpoint",[509,5858,5859],{},"Discover, inspect, run",[488,5861,5862,5865,5868],{},[509,5863,5864],{},"Failure mode",[509,5866,5867],{},"Retirement rewrites your code",[509,5869,5870],{},"Retirement changes a parameter",[488,5872,5873,5875,5878],{},[509,5874,3531],{},[509,5876,5877],{},"One well-understood query shape",[509,5879,5880],{},"Agents that decide what to search at runtime",[11,5882,5883],{},"The pattern here is not that one is better. It is that the cost of being wrong is paid at different times: a single vendor is cheaper to adopt and more expensive to leave.",[320,5885,5886],{},[11,5887,324,5888,119,5890,5893],{},[38,5889,327],{},[18,5891,5892],{"href":690},"Amazon's PA-API Retires in 2026: How to Move to Monid",", which is the same shape of problem with a different vendor.",[27,5895,5897],{"id":5896},"how-do-you-move-a-search-integration-off-a-retired-api","How do you move a search integration off a retired API?",[11,5899,5900],{},"Replacing a search call is three steps, and the first two are free. The order matters because the schema decides how much of your parsing code survives, and you can read the schema before you spend anything.",[232,5902,235],{"id":234},[11,5904,238,5905,244],{},[18,5906,243],{"href":241,"rel":5907},[124,125],[131,5909,5911],{"className":5910,"code":249,"language":97,"meta":136},[248],[47,5912,249],{"__ignoreMap":136},[11,5914,254,5915,260],{},[18,5916,259],{"href":257,"rel":5917},[124,125],[232,5919,264],{"id":263},[131,5921,5922],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,5923,5924,5934],{"__ignoreMap":136},[140,5925,5926,5928,5930,5932],{"class":142,"line":143},[140,5927,274],{"class":146},[140,5929,277],{"class":150},[140,5931,280],{"class":150},[140,5933,283],{"class":150},[140,5935,5936,5938,5940,5942,5944,5946,5948,5950,5952,5954],{"class":142,"line":166},[140,5937,147],{"class":146},[140,5939,290],{"class":150},[140,5941,293],{"class":150},[140,5943,296],{"class":150},[140,5945,299],{"class":193},[140,5947,302],{"class":150},[140,5949,305],{"class":183},[140,5951,308],{"class":193},[140,5953,311],{"class":150},[140,5955,314],{"class":150},[232,5957,5959],{"id":5958},"step-1-find-what-exists-before-choosing","Step 1. Find what exists before choosing",[11,5961,5962,5964,5965,5968],{},[38,5963,1131],{}," Searches the catalogue semantically and returns ranked endpoints with provider, description, billing shape and a ",[47,5966,5967],{},"verified"," tag, so you are choosing from what is live today rather than from a blog post.",[11,5970,5971,5973,5974,5977],{},[38,5972,1137],{}," Discovery covers the whole ",[18,5975,5976],{"href":1545},"search category",", which currently spans neural search, keyword search, browser-rendered search and search-plus-scrape in one call.",[11,5979,5980],{},[38,5981,1148],{},[131,5983,5985],{"className":133,"code":5984,"language":135,"meta":136,"style":136},"monid discover -q \"web search results\"\n",[47,5986,5987],{"__ignoreMap":136},[140,5988,5989,5991,5993,5995,5997,6000],{"class":142,"line":143},[140,5990,147],{"class":146},[140,5992,2667],{"class":150},[140,5994,2670],{"class":150},[140,5996,2673],{"class":193},[140,5998,5999],{"class":150},"web search results",[140,6001,2679],{"class":193},[11,6003,6004,6006,6007,98,6011,98,6016,98,6020,102,6025,6030],{},[38,6005,1195],{}," A ranked list. Running it on 2026-08-20 returned ",[18,6008,6009],{"href":1545},[47,6010,1548],{},[18,6012,6013],{"href":1545},[47,6014,6015],{},"tinyfish\u002Fsearch",[18,6017,6018],{"href":3718},[47,6019,3721],{},[18,6021,6022],{"href":1545},[47,6023,6024],{},"octen\u002Fsearch",[18,6026,6027],{"href":1545},[47,6028,6029],{},"surf\u002Fsearch\u002Fweb"," among others, each with its billing shape attached.",[11,6032,6033,6035],{},[38,6034,1229],{}," Nothing. Discovery and inspection are both free, which is what makes it reasonable to compare five options before writing any code.",[232,6037,6039],{"id":6038},"step-2-read-the-schema-then-decide-what-your-parser-keeps","Step 2. Read the schema, then decide what your parser keeps",[11,6041,6042,6044],{},[38,6043,1131],{}," Returns the full input schema, the billing shape and the docs URL for one endpoint, so you can diff it against the response shape your code already expects.",[11,6046,6047,119,6049,6053],{},[38,6048,1137],{},[18,6050,6051],{"href":1545},[47,6052,6015],{}," is the closest thing to a like-for-like Bing Web Search replacement: it takes a query and returns ranked results.",[11,6055,6056],{},[38,6057,1148],{},[131,6059,6061],{"className":133,"code":6060,"language":135,"meta":136,"style":136},"monid inspect -p tinyfish -e \u002Fsearch\n",[47,6062,6063],{"__ignoreMap":136},[140,6064,6065,6067,6069,6071,6073,6075],{"class":142,"line":143},[140,6066,147],{"class":146},[140,6068,151],{"class":150},[140,6070,154],{"class":150},[140,6072,5746],{"class":150},[140,6074,160],{"class":150},[140,6076,6077],{"class":150}," \u002Fsearch\n",[11,6079,6080,6082,6083,98,6085,98,6087,98,6089,102,6092,6094,6095,6097,6098,6101,6102,98,6105,102,6108,6111,6112,102,6115,6117,6118,102,6121,6124,6125,6128,6129,102,6132,6135],{},[38,6081,1195],{}," Verified 2026-08-20: results carry ",[47,6084,3415],{},[47,6086,2077],{},[47,6088,2063],{},[47,6090,6091],{},"site_name",[47,6093,3894],{},". Inputs include ",[47,6096,3880],{},", a ",[47,6099,6100],{},"domain_type"," switch across ",[47,6103,6104],{},"web",[47,6106,6107],{},"news",[47,6109,6110],{},"research_paper",", geo and language targeting through ",[47,6113,6114],{},"location",[47,6116,2080],{},", allow and block lists through ",[47,6119,6120],{},"include_domains",[47,6122,6123],{},"exclude_domains",", a freshness window through ",[47,6126,6127],{},"recency_minutes",", calendar bounds through ",[47,6130,6131],{},"after_date",[47,6133,6134],{},"before_date",", and zero-indexed paging up to page 10.",[11,6137,6138,6139,6141,6142,6145],{},"Two of those have no Bing equivalent. ",[47,6140,6127],{}," is a relative freshness window rather than a date filter, which is the right shape for \"what changed in the last hour\". ",[47,6143,6144],{},"purpose"," takes a short statement of the task the results are for and uses it as a ranking signal, which is useful when an agent is searching on behalf of a specific job.",[11,6147,6148,6150],{},[38,6149,1229],{}," Nothing to inspect. The endpoint itself is priced per call.",[232,6152,6154],{"id":6153},"step-3-run-one-query-and-diff-the-output","Step 3. Run one query and diff the output",[11,6156,6157,6159],{},[38,6158,1131],{}," Executes the search and bills your balance at the price already shown, with no separate signup for the underlying provider.",[11,6161,6162],{},[38,6163,1148],{},[131,6165,6167],{"className":133,"code":6166,"language":135,"meta":136,"style":136},"monid run -p tinyfish -e \u002Fsearch \\\n  --query '{\"query\":\"bing search api retirement\",\"domain_type\":\"news\",\"recency_minutes\":1440}' -w\n",[47,6168,6169,6185],{"__ignoreMap":136},[140,6170,6171,6173,6175,6177,6179,6181,6183],{"class":142,"line":143},[140,6172,147],{"class":146},[140,6174,171],{"class":150},[140,6176,154],{"class":150},[140,6178,5746],{"class":150},[140,6180,160],{"class":150},[140,6182,5749],{"class":150},[140,6184,184],{"class":183},[140,6186,6187,6189,6191,6194,6196],{"class":142,"line":166},[140,6188,2037],{"class":150},[140,6190,194],{"class":193},[140,6192,6193],{"class":150},"{\"query\":\"bing search api retirement\",\"domain_type\":\"news\",\"recency_minutes\":1440}",[140,6195,2045],{"class":193},[140,6197,1190],{"class":150},[11,6199,6200,6202,6203,6206,6207,6210,6211,6214,6215,6218],{},[38,6201,1195],{}," Ranked results with publisher and date attached, because ",[47,6204,6205],{},"domain_type: news"," adds those two fields. Note the flag: ",[47,6208,6209],{},"queryParams"," in the inspect output maps to ",[47,6212,6213],{},"--query",", not ",[47,6216,6217],{},"-i",". Getting that wrong is the most common first-run error and it returns a schema complaint rather than a charge.",[11,6220,6221,6223,6224,3933,6227,6229],{},[38,6222,1229],{}," This endpoint is browser-rendered and priced per call, and per call is the shape you want here: one query, one charge, regardless of how many results come back. Current figures are on ",[18,6225,1233],{"href":5582,"rel":6226},[124,125],[47,6228,3936],{}," shows the exact number before anything bills.",[316,6231],{"prompt":6232},"replace my Bing Web Search call with tinyfish \u002Fsearch and keep the same result fields",[27,6234,6236],{"id":6235},"what-are-the-best-alternatives-to-the-brave-search-api","What are the best alternatives to the Brave Search API?",[11,6238,6239],{},"The honest answer is that the question has four answers, because \"search API\" describes four different jobs that happen to share a name. This matters for the Bing reader too: whichever vendor you are leaving, picking the replacement by brand rather than by job is how you end up migrating twice.",[232,6241,6243],{"id":6242},"if-you-want-ranked-links-and-nothing-else","If you want ranked links and nothing else",[11,6245,6246,6247,6251,6252,6257],{},"Use a plain SERP-shaped endpoint. ",[18,6248,6249],{"href":1545},[47,6250,6015],{}," returns position, title, URL, site name and snippet, and it is browser-rendered against the live web rather than served from a cache, so pricing pages and breaking news are current at query time. ",[18,6253,6254],{"href":1545},[47,6255,6256],{},"api.kadec0.xyz\u002Fv1\u002Fserp"," covers the same job with a different trick: it lets you pin the backend engine, choosing Brave, Yahoo or Yandex explicitly rather than accepting a rotation.",[11,6259,6260],{},"That last one is the direct answer for anyone leaving Brave specifically. The index is still reachable, just through a different door.",[232,6262,6264],{"id":6263},"if-you-want-the-page-contents-not-the-links","If you want the page contents, not the links",[11,6266,6267,6268,6272,6273,6277],{},"Search and extraction are separate steps, and paying for them separately is usually right. But ",[18,6269,6270],{"href":1545},[47,6271,1548],{}," collapses them: it searches and optionally scrapes each result to Markdown in one call, which saves a round trip when the agent was always going to read the pages anyway. ",[18,6274,6275],{"href":1545},[47,6276,6024],{}," does the same job with a different billing shape, charging per call by default and switching to per-token billing only when full content is enabled.",[11,6279,6280,6281,6284],{},"The rule of thumb: if fewer than half the results get read, keep the steps separate. We went through the numbers in ",[18,6282,6283],{"href":4054},"a free API to extract page content for RAG",", where a Wikipedia page came back at 74,552 characters through the scraping route and 689 through the official one.",[232,6286,6288],{"id":6287},"if-you-want-meaning-rather-than-keywords","If you want meaning rather than keywords",[11,6290,6291,6295,6296,6301],{},[18,6292,6293],{"href":3718},[47,6294,3721],{}," is neural search, which matches on what a page is about rather than which words it contains. ",[18,6297,6298],{"href":1545},[47,6299,6300],{},"blockrun.ai\u002Fapi\u002Fv1\u002Fexa\u002Fsearch"," exposes the same engine with a category filter across company, research paper, news, PDF, GitHub, tweet, personal site, LinkedIn profile and financial report, which narrows by document type before ranking rather than after.",[232,6303,6305],{"id":6304},"if-your-agent-should-choose-at-runtime","If your agent should choose at runtime",[11,6307,6308,6309,6311],{},"An agent that can call ",[47,6310,4274],{}," picks the endpoint per query rather than per deployment, so a news question goes to the news corpus and a paper question goes to the research corpus without you writing that branch.",[320,6313,6314],{},[11,6315,324,6316,119,6318,102,6320],{},[38,6317,327],{},[18,6319,4916],{"href":4915},[18,6321,3564],{"href":3563},[27,6323,480],{"id":479},[482,6325,6326,6343],{},[485,6327,6328],{},[488,6329,6330,6332,6335,6337,6339,6341],{},[491,6331,496],{},[491,6333,6334],{},"What it does",[491,6336,1443],{},[491,6338,1446],{},[491,6340,3531],{},[491,6342,1449],{},[504,6344,6345,6367,6389,6411,6433,6455],{},[488,6346,6347,6353,6356,6359,6362,6365],{},[509,6348,6349],{},[18,6350,6351],{"href":1545},[47,6352,6015],{},[509,6354,6355],{},"Browser-rendered live web, news or paper search",[509,6357,6358],{},"Query plus filters",[509,6360,6361],{},"Position, title, URL, site name, snippet",[509,6363,6364],{},"The closest like-for-like Bing replacement",[509,6366,542],{},[488,6368,6369,6375,6378,6381,6384,6387],{},[509,6370,6371],{},[18,6372,6373],{"href":1545},[47,6374,1548],{},[509,6376,6377],{},"Search and optionally scrape each result to Markdown",[509,6379,6380],{},"Query",[509,6382,6383],{},"Ranked results with optional page content",[509,6385,6386],{},"Agents that read every result",[509,6388,3551],{},[488,6390,6391,6397,6400,6403,6406,6409],{},[509,6392,6393],{},[18,6394,6395],{"href":3718},[47,6396,3721],{},[509,6398,6399],{},"Neural search over meaning, not keywords",[509,6401,6402],{},"Natural language query",[509,6404,6405],{},"Results with extracted contents",[509,6407,6408],{},"Research and topic discovery",[509,6410,542],{},[488,6412,6413,6419,6422,6425,6428,6431],{},[509,6414,6415],{},[18,6416,6417],{"href":1545},[47,6418,6300],{},[509,6420,6421],{},"Neural and keyword search with a document-type filter",[509,6423,6424],{},"Query plus category",[509,6426,6427],{},"Ranked results",[509,6429,6430],{},"Narrowing to papers, GitHub or filings",[509,6432,542],{},[488,6434,6435,6441,6444,6446,6449,6452],{},[509,6436,6437],{},[18,6438,6439],{"href":1545},[47,6440,6024],{},[509,6442,6443],{},"Live search with optional full page content",[509,6445,6380],{},[509,6447,6448],{},"Results, optionally with content",[509,6450,6451],{},"Mixed workloads",[509,6453,6454],{},"Per call, per token with content on",[488,6456,6457,6463,6466,6469,6472,6475],{},[509,6458,6459],{},[18,6460,6461],{"href":1545},[47,6462,6256],{},[509,6464,6465],{},"SERP with a pinnable backend engine",[509,6467,6468],{},"Query plus engine",[509,6470,6471],{},"Ranked title, URL, snippet",[509,6473,6474],{},"Leaving Brave, Yahoo or Yandex specifically",[509,6476,542],{},[11,6478,1560,6479,6481],{},[47,6480,607],{}," on 2026-08-20. The billing column is the shape, not a figure, because the shape is what changes how you architect and it does not go stale.",[27,6483,6485],{"id":6484},"what-does-a-search-integration-actually-cost","What does a search integration actually cost?",[11,6487,6488],{},"Less than the migration did, which is the uncomfortable part. Work it in three stages.",[11,6490,6491],{},"Discovery and inspection are free, so comparing six endpoints and reading all six schemas costs nothing at all. That stage used to be a week of signups.",[11,6493,6494,6495,6498],{},"A single query on a per-call endpoint is a fraction of a cent, and one of the endpoints above is currently free at the point of use. A realistic retrieval workload, a few thousand searches a month behind an agent, lands in single-digit dollars. The variable that moves the number is not the search step but whether you also pull page content: extraction is where per-token and per-result billing appear, and where a careless ",[47,6496,6497],{},"full_content: true"," turns a cheap call into an expensive one.",[11,6500,6501,6502,6505,6506,6508,6509,6512],{},"Prices are on ",[18,6503,1233],{"href":5582,"rel":6504},[124,125],", and because ",[47,6507,3936],{}," is free the exact figure is visible before a single call bills. That is the point of a pay-as-you-go balance: access costs nothing until it is used, so an agent can carry the whole catalogue and still pay only for the calls it makes. We laid out when metered loses to a subscription in ",[18,6510,6511],{"href":2325},"pay per call versus subscription",", and the honest answer there is that steady predictable volume favours the subscription.",[421,6514,6516],{"category":4297,"title":6515},"Read the schema before you commit to it",[11,6517,6518],{},"Discover what exists, inspect the input and output fields, and see the current price. Nothing bills until you run.",[27,6520,657],{"id":656},[11,6522,6523],{},"If Microsoft's own migration path fits, take it. Grounding with Bing Search inside Azure AI Agents is a supported Microsoft product with Microsoft's index behind it, and if your workload and your compliance story are already written against Azure, adding a second vendor to save a small amount per call is a bad trade. The catch is that it is a grounding feature for an agent, not a search API returning ranked links, so it replaces Bing Search only if what you wanted was grounded answers.",[11,6525,6526],{},"If you need one specific index and only that index, go direct. Nobody should route Google Search through an aggregator when the official Custom Search JSON API covers the use case, and the same holds for any provider whose free tier already covers your volume.",[11,6528,6529],{},"If your search volume is high, steady and unchanging, a committed contract with one vendor will beat metered pricing. Metered wins on bursty and unpredictable workloads and on the long tail of endpoints you call rarely. It does not win on a flat, well-understood load.",[11,6531,6532],{},"And if you need Bing's index specifically, no route gives you the retired product back. What is available is other indexes, reached other ways.",[27,6534,696],{"id":695},[11,6536,6537],{},"The Bing Search API is not deprecated, it is gone, and there is no drop-in replacement because Microsoft did not ship one. What replaces it depends on which of four jobs you were doing: ranked links, links plus page contents, semantic retrieval, or letting an agent decide per query. Pick by job and the migration is one endpoint and a field mapping. Pick by brand and you will do it again.",[11,6539,6540],{},"The thing that matters more than the choice: the reason this hurt was not that Bing went away, it was that the dependency was hard-coded in a place nobody was watching. Whatever you move to, the parameter is worth keeping soft. An endpoint name in config survives a retirement. An endpoint name in a client class does not.",[11,6542,6543,6544,6547,6548,6550,6551,260],{},"The free next step is genuinely free. Run ",[47,6545,6546],{},"monid discover -q \"web search results\""," to see what exists today, ",[47,6549,607],{}," on the two that look closest to read their schemas and current prices, and only then one small paid run to diff the output against what your parser expects. Start at ",[18,6552,725],{"href":723,"rel":6553},[124,125],[27,6555,729],{"id":728},[731,6557,6559],{"q":6558},"Is the Bing Search API really gone, or just deprecated?",[11,6560,6561],{},"Gone. The endpoints were decommissioned on 11 August 2025 and now return HTTP 410, which means permanently unavailable rather than temporarily down. New resource creation had already been disabled in Azure since February 2025, so there is no route back even for previously provisioned accounts.",[731,6563,6565],{"q":6564},"Can I still get Bing results from anywhere?",[11,6566,6567,6568,6572],{},"Not the Bing Search API's results, no. Some SERP endpoints let you pin a backend engine, and ",[18,6569,6570],{"href":1545},[47,6571,6256],{}," exposes Brave, Yahoo and Yandex that way, but Bing's index is not offered as a pinnable option there. Treat the index as unavailable and choose a replacement on its own merits rather than on how closely it imitates Bing.",[731,6574,6576],{"q":6575},"What is Grounding with Bing Search, and is it a drop-in?",[11,6577,6578],{},"It is Microsoft's recommended migration and it is not a drop-in. Grounding with Bing Search is a capability inside Azure AI Agents that lets a model incorporate live public web data when generating a response. It returns grounded model output, not a ranked list of links with positions and snippets, so any code that parsed a SERP response has to be rewritten rather than repointed.",[731,6580,6582],{"q":6581},"How do I stop this happening to the replacement?",[11,6583,6584,6585,6588],{},"Keep the provider and endpoint in configuration rather than in code, and make sure something alerts on a non-200 from the search step specifically. The structural version of the same answer is to call search through a layer that can route to more than one provider, so a retirement changes which endpoint gets called rather than which client library you depend on. That is the whole argument for ",[18,6586,6587],{"href":5673},"a routed tool layer",", and it is worth about a day of setup.",[11,6590,6591],{},[758,6592,760],{},[762,6594,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":6596},[6597,6602,6609,6615,6616,6617,6618,6619],{"id":5776,"depth":166,"text":5777,"children":6598},[6599,6600,6601],{"id":5789,"depth":187,"text":5790},{"id":5799,"depth":187,"text":5800},{"id":5809,"depth":187,"text":5810},{"id":5896,"depth":166,"text":5897,"children":6603},[6604,6605,6606,6607,6608],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":5958,"depth":187,"text":5959},{"id":6038,"depth":187,"text":6039},{"id":6153,"depth":187,"text":6154},{"id":6235,"depth":166,"text":6236,"children":6610},[6611,6612,6613,6614],{"id":6242,"depth":187,"text":6243},{"id":6263,"depth":187,"text":6264},{"id":6287,"depth":187,"text":6288},{"id":6304,"depth":187,"text":6305},{"id":479,"depth":166,"text":480},{"id":6484,"depth":166,"text":6485},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fbing-search-api-retired-alternatives.png","Microsoft turned the Bing Search APIs off in August 2025 and the endpoints now return 410. What a replacement has to do, and which route fits which job.","\u002Fimg\u002Fblog\u002Fbing-search-api-retired-alternatives-card.png",{},{"title":3635,"description":6621},"blog\u002Fguides\u002Fbing-search-api-retired-alternatives",[4297,6104,6627,4343,1638],"api","fW2YPDhftlkpFic-nw5hHDDj0baK0RMPeJBPu0kiUfQ",{"id":6630,"title":6631,"author":6,"body":6632,"category":2378,"cover":7420,"description":7421,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":7422,"meta":7423,"navigation":790,"ogImage":787,"path":7424,"publishedAt":5712,"readTime":793,"seo":7425,"stem":7426,"tags":7427,"toolCategory":6104,"updatedAt":5712,"__hash__":7431},"blogGuides\u002Fblog\u002Fguides\u002Fingest-mixed-documents-llm-embedding.md","Ingesting Mixed Documents for LLM Embedding: PDF to Markdown",{"type":8,"value":6633,"toc":7399},[6634,6637,6683,6689,6693,6696,6700,6703,6706,6710,6713,6716,6720,6726,6730,6799,6802,6811,6815,6818,6820,6825,6830,6835,6837,6873,6877,6882,6892,6896,6945,6966,6973,6981,6985,6990,7010,7014,7048,7057,7065,7069,7074,7077,7080,7083,7095,7099,7102,7105,7108,7110,7286,7291,7295,7298,7301,7304,7310,7316,7318,7321,7324,7327,7330,7332,7335,7338,7352,7354,7368,7374,7380,7393,7397],[11,6635,6636],{"style":810},"Copy this line to your agent to turn a folder of mixed files into clean Markdown.",[131,6638,6640],{"className":814,"code":6639,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use context.dev \u002Fparse to convert these PDFs and Office files to Markdown\n",[47,6641,6642],{"__ignoreMap":136},[140,6643,6644,6646,6648,6650,6652,6654,6656,6659,6661,6664,6667,6670,6672,6675,6678,6680],{"class":142,"line":143},[140,6645,824],{"class":823},[140,6647,827],{"class":150},[140,6649,830],{"class":150},[140,6651,833],{"class":150},[140,6653,836],{"class":150},[140,6655,1718],{"class":150},[140,6657,6658],{"class":150}," \u002Fparse",[140,6660,845],{"class":150},[140,6662,6663],{"class":150}," convert",[140,6665,6666],{"class":150}," these",[140,6668,6669],{"class":150}," PDFs",[140,6671,833],{"class":150},[140,6673,6674],{"class":150}," Office",[140,6676,6677],{"class":150}," files",[140,6679,845],{"class":150},[140,6681,6682],{"class":150}," Markdown\n",[11,6684,6685,6686,6688],{},"Every retrieval pipeline has the same first problem and almost nobody writes it down: the documents are not one format. A knowledge base is PDFs, DOCX, a few spreadsheets, some scanned faxes and a pile of web pages, and the embedding model wants one clean text stream. The conversion step is where quality is won or lost, well before chunking or retrieval, and it is the step that gets three lines of code and no tests. Monid is ",[18,6687,21],{"href":20},": one key and one balance across many providers, so the conversion step can be one endpoint instead of six libraries.",[27,6690,6692],{"id":6691},"why-is-ingesting-mixed-document-types-harder-than-it-looks","Why is ingesting mixed document types harder than it looks?",[11,6694,6695],{},"Because format conversion is not one problem, it is four, and they fail at different points. The r\u002FLocalLLaMA thread that names this best lists them in the title: PDF, Office and HTML conversion, OCR, de-duplication and chunking. Twelve comments in, the consensus is that people underestimate the first and over-engineer the last.",[232,6697,6699],{"id":6698},"a-pdf-is-a-layout-format-not-a-document-format","A PDF is a layout format, not a document format",[11,6701,6702],{},"PDF describes where marks go on a page. It does not describe reading order, and a two-column academic paper or a table-heavy report will extract into interleaved nonsense if the extractor reads coordinates naively. The text is all there and it is in the wrong order, which is worse than missing text, because it embeds cleanly and retrieves garbage.",[11,6704,6705],{},"This is the failure that survives all the way to production, because nothing errors. A chunk of interleaved column text is a valid chunk with a valid embedding. It just answers no question correctly.",[232,6707,6709],{"id":6708},"scanned-documents-have-no-text-at-all","Scanned documents have no text at all",[11,6711,6712],{},"A scanned contract or a fax is an image inside a PDF wrapper. A text extractor returns an empty string and reports success. If your ingestion pipeline logs a page count rather than a character count, an entire scanned archive can pass through it and produce nothing, silently.",[11,6714,6715],{},"The check that catches this is one line: assert a minimum character count per page, and route anything below it to OCR rather than to the embedder.",[232,6717,6719],{"id":6718},"html-brings-furniture-you-did-not-ask-for","HTML brings furniture you did not ask for",[11,6721,6722,6723,6725],{},"Web pages carry navigation, footers, cookie banners and sidebars, and all of it embeds. We measured the extreme version of this in ",[18,6724,6283],{"href":4054},": a Wikipedia page came back at 74,552 characters through a naive scrape, starting with the nav menu, against 689 clean ones through the structured route. Those extra characters are not merely wasted tokens, they dilute the embedding of every chunk they land in.",[232,6727,6729],{"id":6728},"one-library-per-format-versus-one-conversion-endpoint","One library per format versus one conversion endpoint",[482,6731,6732,6744],{},[485,6733,6734],{},[488,6735,6736,6738,6741],{},[491,6737,915],{},[491,6739,6740],{},"A library per format",[491,6742,6743],{},"One conversion endpoint",[504,6745,6746,6757,6768,6779,6789],{},[488,6747,6748,6751,6754],{},[509,6749,6750],{},"Setup",[509,6752,6753],{},"Six dependencies, native builds for OCR",[509,6755,6756],{},"One HTTP call",[488,6758,6759,6762,6765],{},[509,6760,6761],{},"Coverage gaps",[509,6763,6764],{},"Found in production, one format at a time",[509,6766,6767],{},"Format list is published up front",[488,6769,6770,6773,6776],{},[509,6771,6772],{},"OCR",[509,6774,6775],{},"Separate install, separate tuning",[509,6777,6778],{},"A boolean on the same call",[488,6780,6781,6783,6786],{},[509,6782,5864],{},[509,6784,6785],{},"Silent empty string per format",[509,6787,6788],{},"One response shape to assert on",[488,6790,6791,6793,6796],{},[509,6792,3531],{},[509,6794,6795],{},"Full control and offline processing",[509,6797,6798],{},"Getting the corpus in this week",[11,6800,6801],{},"The pattern is control against surface area. Local libraries are the right answer when documents cannot leave your network, and the wrong answer when the real cost is six half-maintained format handlers.",[320,6803,6804],{},[11,6805,324,6806,119,6808],{},[38,6807,327],{},[18,6809,6810],{"href":2986},"Any URL to LLM-Ready Markdown: A Copy-Paste Cookbook",[27,6812,6814],{"id":6813},"what-are-the-best-practices-for-ingesting-mixed-document-types-for-llm-extraction","What are the best practices for ingesting mixed document types for LLM extraction?",[11,6816,6817],{},"Convert first, normalise second, chunk last, and put the assertions between the steps rather than at the end. The order matters because each step can fail quietly, and a check after conversion costs nothing while a check after embedding costs a reindex.",[232,6819,235],{"id":234},[11,6821,238,6822,244],{},[18,6823,243],{"href":241,"rel":6824},[124,125],[131,6826,6828],{"className":6827,"code":249,"language":97,"meta":136},[248],[47,6829,249],{"__ignoreMap":136},[11,6831,254,6832,260],{},[18,6833,259],{"href":257,"rel":6834},[124,125],[232,6836,264],{"id":263},[131,6838,6839],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,6840,6841,6851],{"__ignoreMap":136},[140,6842,6843,6845,6847,6849],{"class":142,"line":143},[140,6844,274],{"class":146},[140,6846,277],{"class":150},[140,6848,280],{"class":150},[140,6850,283],{"class":150},[140,6852,6853,6855,6857,6859,6861,6863,6865,6867,6869,6871],{"class":142,"line":166},[140,6854,147],{"class":146},[140,6856,290],{"class":150},[140,6858,293],{"class":150},[140,6860,296],{"class":150},[140,6862,299],{"class":193},[140,6864,302],{"class":150},[140,6866,305],{"class":183},[140,6868,308],{"class":193},[140,6870,311],{"class":150},[140,6872,314],{"class":150},[232,6874,6876],{"id":6875},"step-1-convert-every-format-through-one-door","Step 1. Convert every format through one door",[11,6878,6879,6881],{},[38,6880,1131],{}," Takes a file at a URL and returns GitHub Flavored Markdown, across more than sixty formats, so the branch in your code is data rather than control flow.",[11,6883,6884,119,6886,6891],{},[38,6885,1137],{},[18,6887,6888],{"href":1502},[47,6889,6890],{},"context.dev\u002Fparse"," handles PDF, DOCX, XLSX, PPTX, RTF, HTML, images, code files and structured data including JSON, CSV, YAML and XML, from any public HTTPS URL up to 25MB.",[11,6893,6894],{},[38,6895,1148],{},[131,6897,6899],{"className":133,"code":6898,"language":135,"meta":136,"style":136},"monid inspect -p context.dev -e \u002Fparse\nmonid run -p context.dev -e \u002Fparse \\\n  -i '{\"file_url\":\"https:\u002F\u002Fexample.com\u002Freport.pdf\",\"useMainContentOnly\":true}' -w\n",[47,6900,6901,6916,6932],{"__ignoreMap":136},[140,6902,6903,6905,6907,6909,6911,6913],{"class":142,"line":143},[140,6904,147],{"class":146},[140,6906,151],{"class":150},[140,6908,154],{"class":150},[140,6910,1718],{"class":150},[140,6912,160],{"class":150},[140,6914,6915],{"class":150}," \u002Fparse\n",[140,6917,6918,6920,6922,6924,6926,6928,6930],{"class":142,"line":166},[140,6919,147],{"class":146},[140,6921,171],{"class":150},[140,6923,154],{"class":150},[140,6925,1718],{"class":150},[140,6927,160],{"class":150},[140,6929,6658],{"class":150},[140,6931,184],{"class":183},[140,6933,6934,6936,6938,6941,6943],{"class":142,"line":187},[140,6935,190],{"class":150},[140,6937,194],{"class":193},[140,6939,6940],{"class":150},"{\"file_url\":\"https:\u002F\u002Fexample.com\u002Freport.pdf\",\"useMainContentOnly\":true}",[140,6942,2045],{"class":193},[140,6944,1190],{"class":150},[11,6946,6947,6949,6950,6953,6954,6957,6958,6961,6962,6965],{},[38,6948,1195],{}," The parsed document as Markdown. Four switches shape it, verified 2026-08-20: ",[47,6951,6952],{},"includeLinks"," preserves hyperlinks and defaults on, ",[47,6955,6956],{},"includeImages"," adds image references and defaults off, ",[47,6959,6960],{},"shortenBase64Images"," truncates inline image payloads and defaults on, and ",[47,6963,6964],{},"useMainContentOnly"," drops headers, footers, sidebars and navigation where they can be detected. That last one is the HTML furniture problem solved with a boolean.",[11,6967,6968,6969,6972],{},"There is also an ",[47,6970,6971],{},"extension"," hint for when neither the URL nor the Content-Type reveals the format, which is the case more often than you would like with files pulled from object storage.",[11,6974,6975,6977,6978,260],{},[38,6976,1229],{}," A fraction of a cent per call, billed per call rather than per page, so a two hundred page report costs the same as a one pager. Current figures at ",[18,6979,1233],{"href":5582,"rel":6980},[124,125],[232,6982,6984],{"id":6983},"step-2-route-the-scanned-files-to-ocr-and-only-those","Step 2. Route the scanned files to OCR, and only those",[11,6986,6987,6989],{},[38,6988,1131],{}," Detects and reads text from images embedded in PDF pages, which is the only way to get anything at all from a scanned archive.",[11,6991,6992,6994,6995,6999,7000,7003,7004,7009],{},[38,6993,1137],{}," The same ",[18,6996,6997],{"href":1502},[47,6998,6890],{}," call with ",[47,7001,7002],{},"ocr: true",". For loose images rather than PDFs, ",[18,7005,7006],{"href":1502},[47,7007,7008],{},"api.strale.io\u002Fx402\u002Fimage-to-text"," runs OCR through vision and returns text with a confidence score, which is useful when you need to threshold on quality.",[11,7011,7012],{},[38,7013,1148],{},[131,7015,7017],{"className":133,"code":7016,"language":135,"meta":136,"style":136},"monid run -p context.dev -e \u002Fparse \\\n  -i '{\"file_url\":\"https:\u002F\u002Fexample.com\u002Fscanned-contract.pdf\",\"ocr\":true}' -w\n",[47,7018,7019,7035],{"__ignoreMap":136},[140,7020,7021,7023,7025,7027,7029,7031,7033],{"class":142,"line":143},[140,7022,147],{"class":146},[140,7024,171],{"class":150},[140,7026,154],{"class":150},[140,7028,1718],{"class":150},[140,7030,160],{"class":150},[140,7032,6658],{"class":150},[140,7034,184],{"class":183},[140,7036,7037,7039,7041,7044,7046],{"class":142,"line":166},[140,7038,190],{"class":150},[140,7040,194],{"class":193},[140,7042,7043],{"class":150},"{\"file_url\":\"https:\u002F\u002Fexample.com\u002Fscanned-contract.pdf\",\"ocr\":true}",[140,7045,2045],{"class":193},[140,7047,1190],{"class":150},[11,7049,7050,7052,7053,7056],{},[38,7051,1195],{}," The Markdown, plus an ",[47,7054,7055],{},"ocr_ran"," field telling you whether OCR actually executed. That field is worth reading rather than ignoring, because it is also how the billing settles.",[11,7058,7059,7061,7062,7064],{},[38,7060,1229],{}," This is the one genuinely clever piece of billing in the ingestion path. Setting ",[47,7063,7002],{}," holds the higher amount, but the OCR line only settles if OCR actually ran, detected from the vendor's own meter. A file with nothing to OCR bills the base rate. So you can set the flag across a mixed batch without paying the OCR price for the text-layer files, which means you do not need to pre-classify the batch yourself.",[232,7066,7068],{"id":7067},"step-3-assert-then-chunk","Step 3. Assert, then chunk",[11,7070,7071,7073],{},[38,7072,1131],{}," Catches the silent failures before they become embeddings.",[11,7075,7076],{},"Three assertions cover almost everything that goes wrong. Check a minimum character count per source page and route failures to OCR. Check that the Markdown contains at least one heading if the source had structure, because a document that converted to one undifferentiated block usually lost its reading order. And hash the normalised text before embedding, because de-duplication is far cheaper on strings than on vectors.",[11,7078,7079],{},"Chunk after all of that. Chunking a bad conversion produces bad chunks efficiently.",[316,7081],{"prompt":7082},"convert these mixed PDFs and Office files to Markdown, turn OCR on, and tell me which files came back with fewer than 200 characters",[320,7084,7085],{},[11,7086,324,7087,119,7089,102,7091],{},[38,7088,327],{},[18,7090,4055],{"href":4054},[18,7092,7094],{"href":7093},"\u002Fblog\u002Fbest-ocr-api-for-messy-images-2026","The Best OCR API for Messy Images in 2026",[27,7096,7098],{"id":7097},"does-converting-to-markdown-actually-save-tokens","Does converting to Markdown actually save tokens?",[11,7100,7101],{},"Yes, and the size of the saving is the part people get wrong in both directions. Two separate builders on r\u002FLocalLLaMA and r\u002FLLMDevs shipped HTML-to-Markdown converters this year with the same headline claim, roughly two thirds fewer tokens than raw HTML. That number is believable for a content-heavy web page and misleading as a general rule.",[11,7103,7104],{},"The saving comes from deleting markup, not from compressing prose. So it is large for HTML, where tags and attributes can outweigh the text, and near zero for a DOCX whose content was already mostly words. If your corpus is web pages, the conversion pays for itself in embedding costs alone. If it is Office documents, convert for consistency rather than for tokens, and do not budget a saving that will not arrive.",[11,7106,7107],{},"The second-order effect is bigger than the token count anyway. Markdown keeps headings, lists and table structure as text, which means a chunker can split on semantic boundaries rather than on character counts. A chunk that starts at a heading retrieves better than a chunk that starts mid-sentence, and that improvement does not show up in a token comparison at all.",[27,7109,480],{"id":479},[482,7111,7112,7128],{},[485,7113,7114],{},[488,7115,7116,7118,7120,7122,7124,7126],{},[491,7117,496],{},[491,7119,6334],{},[491,7121,1443],{},[491,7123,1446],{},[491,7125,3531],{},[491,7127,1449],{},[504,7129,7130,7155,7177,7199,7222,7243,7264],{},[488,7131,7132,7138,7141,7144,7149,7152],{},[509,7133,7134],{},[18,7135,7136],{"href":1502},[47,7137,6890],{},[509,7139,7140],{},"Convert a file to Markdown, 60+ formats",[509,7142,7143],{},"File URL up to 25MB",[509,7145,7146,7147],{},"Markdown, plus ",[47,7148,7055],{},[509,7150,7151],{},"The main conversion step",[509,7153,7154],{},"Per call, higher only when OCR runs",[488,7156,7157,7163,7166,7169,7172,7175],{},[509,7158,7159],{},[18,7160,7161],{"href":1502},[47,7162,1484],{},[509,7164,7165],{},"Convert a live web page to Markdown",[509,7167,7168],{},"URL",[509,7170,7171],{},"Markdown",[509,7173,7174],{},"Pages, not files",[509,7176,542],{},[488,7178,7179,7185,7188,7191,7194,7197],{},[509,7180,7181],{},[18,7182,7183],{"href":1502},[47,7184,3133],{},[509,7186,7187],{},"Follow links across a site",[509,7189,7190],{},"Start URL",[509,7192,7193],{},"One Markdown document per page",[509,7195,7196],{},"Ingesting a whole site",[509,7198,542],{},[488,7200,7201,7208,7211,7214,7217,7220],{},[509,7202,7203],{},[18,7204,7205],{"href":1502},[47,7206,7207],{},"context.dev\u002Fweb\u002Fscrape\u002Fsitemap",[509,7209,7210],{},"Enumerate a site's URLs",[509,7212,7213],{},"Domain",[509,7215,7216],{},"URL list",[509,7218,7219],{},"Planning a crawl before running it",[509,7221,542],{},[488,7223,7224,7230,7233,7235,7238,7241],{},[509,7225,7226],{},[18,7227,7228],{"href":1502},[47,7229,1987],{},[509,7231,7232],{},"Clean Markdown from up to 20 URLs per call",[509,7234,7216],{},[509,7236,7237],{},"LLM-ready Markdown",[509,7239,7240],{},"Batches of known pages",[509,7242,3551],{},[488,7244,7245,7251,7254,7256,7259,7262],{},[509,7246,7247],{},[18,7248,7249],{"href":1502},[47,7250,1526],{},[509,7252,7253],{},"Full page text for up to 10 URLs",[509,7255,7216],{},[509,7257,7258],{},"Page text",[509,7260,7261],{},"Cheap bulk fetching",[509,7263,542],{},[488,7265,7266,7272,7275,7278,7281,7284],{},[509,7267,7268],{},[18,7269,7270],{"href":1502},[47,7271,7008],{},[509,7273,7274],{},"OCR a loose image",[509,7276,7277],{},"Image",[509,7279,7280],{},"Text with a confidence score",[509,7282,7283],{},"Screenshots and photos",[509,7285,542],{},[11,7287,1560,7288,7290],{},[47,7289,607],{}," on 2026-08-20. The billing column is the shape rather than a figure, because per call and per result change how you batch and a price does not stay true.",[27,7292,7294],{"id":7293},"what-does-an-ingestion-run-actually-cost","What does an ingestion run actually cost?",[11,7296,7297],{},"Less than the embeddings, in almost every case, which is why the conversion step deserves more attention than its budget line suggests.",[11,7299,7300],{},"A corpus of a few thousand mixed documents converts for single-digit dollars, because the main conversion endpoint bills per call rather than per page and most documents are one call. The number that moves is OCR, and only for the files that genuinely need it, since the higher rate settles only when OCR actually ran.",[11,7302,7303],{},"The comparison worth making is against the embedding bill rather than against doing it yourself. If a naive HTML extraction inflates a page from 689 characters to 74,552, you pay that inflation once in conversion and then again on every embedding and every retrieval that includes the diluted chunk. Cleaning at the door is the cheapest place in the pipeline to fix it.",[11,7305,7306,7307,260],{},"Discovery and inspection are free, so the whole format list, every switch and the exact billing behaviour are readable before spending anything. That is the property that makes a metered balance suit an ingestion job: access costs nothing until it is used, so a one-off corpus load does not need a plan. Prices at ",[18,7308,1233],{"href":5582,"rel":7309},[124,125],[421,7311,7313],{"category":6104,"title":7312},"Convert the corpus before you chunk it",[11,7314,7315],{},"Discover what handles which format, read the switches, and see current prices. Nothing bills until you run.",[27,7317,657],{"id":656},[11,7319,7320],{},"If the documents cannot leave your network, run it locally and accept the maintenance. Regulated corpora, client-confidential files and anything under a data residency commitment belong in a local pipeline, and the honest answer is that six format libraries and a native OCR build are the price of that constraint. No hosted endpoint solves a rule that says the bytes stay put.",[11,7322,7323],{},"If you have one format and one shape, use the library. A pipeline that only ever sees clean text-layer PDFs from one generator does not need a general conversion service. A well-chosen local parser will be faster and free.",[11,7325,7326],{},"If your volume is enormous and steady, the arithmetic changes. Per-call conversion is excellent for a corpus load and for a steady trickle of new documents, and it stops being the cheapest option somewhere above a sustained high rate where a self-hosted converter on your own compute wins on unit cost.",[11,7328,7329],{},"And if you need conversion accuracy guarantees for legal or medical documents, no general endpoint provides them. Specialist vendors sell validated extraction with an accuracy commitment attached, and that commitment, not the conversion, is what you would be buying.",[27,7331,696],{"id":695},[11,7333,7334],{},"The best practice for ingesting mixed document types is to treat conversion as its own step with its own tests, rather than as a preamble to chunking. Convert everything through one door, turn OCR on across the whole batch because it only bills when it runs, assert on character counts and structure before embedding anything, and chunk last.",[11,7336,7337],{},"What matters more than the tool choice: the failures in this pipeline do not raise exceptions. A scanned PDF returns an empty string, a two-column paper returns interleaved text, and an HTML page returns a navigation menu. All three embed successfully and retrieve badly, and none of them appear in a log. Three assertions between conversion and chunking catch all three, and they are the cheapest code in the whole system.",[11,7339,7340,7341,7344,7345,7348,7349,260],{},"The free next step costs nothing. Run ",[47,7342,7343],{},"monid discover -q \"parse pdf document to text\""," to see what exists, ",[47,7346,7347],{},"monid inspect -p context.dev -e \u002Fparse"," to read the full format list and the OCR billing behaviour, then one paid run on the ugliest ten documents in your corpus rather than the cleanest. Start at ",[18,7350,725],{"href":723,"rel":7351},[124,125],[27,7353,729],{"id":728},[731,7355,7357],{"q":7356},"How do I handle scanned PDFs that have no text layer?",[11,7358,7359,7360,7364,7365,7367],{},"Route them to OCR, and detect them by character count rather than by file inspection. A scanned page returns an empty or near-empty string from a text extractor, so a minimum-characters-per-page threshold identifies them reliably without you having to classify the batch in advance. With ",[18,7361,7362],{"href":1502},[47,7363,6890],{}," you can set ",[47,7366,7002],{}," across a mixed batch, because the OCR rate settles only on the files where OCR actually ran.",[731,7369,7371],{"q":7370},"How should I de-duplicate before embedding?",[11,7372,7373],{},"Hash the normalised text and compare strings, before anything reaches the embedding model. Vector-space near-duplicate detection is a real technique but it is the expensive way to catch the common case, which is the same document appearing twice under two filenames. Normalise whitespace, strip the Markdown, hash, and drop exact matches first, then use similarity only for the residue.",[731,7375,7377],{"q":7376},"Where should chunking happen, before or after conversion?",[11,7378,7379],{},"After, always. Chunking operates on text and conversion produces the text, so chunking first means chunking whatever raw bytes you had. The more useful version of the question is what to chunk on, and converting to Markdown first is what makes the good answer available: split on headings and list boundaries rather than on a character count, which is only possible once the structure survives as text.",[731,7381,7383],{"q":7382},"Can I keep documents out of a vendor's logs?",[11,7384,7385,7386,7389,7390,7392],{},"Sometimes, and it is a field rather than a conversation. The parse endpoint exposes a ",[47,7387,7388],{},"zdr"," switch that bypasses the vendor's shared caches and omits request and response content from its retained usage logs, though it requires zero data retention to be enabled on the vendor account first and fails explicitly if it is not. Read that field's behaviour with ",[47,7391,607],{}," before assuming it applies to your account.",[11,7394,7395],{},[758,7396,760],{},[762,7398,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":7400},[7401,7407,7414,7415,7416,7417,7418,7419],{"id":6691,"depth":166,"text":6692,"children":7402},[7403,7404,7405,7406],{"id":6698,"depth":187,"text":6699},{"id":6708,"depth":187,"text":6709},{"id":6718,"depth":187,"text":6719},{"id":6728,"depth":187,"text":6729},{"id":6813,"depth":166,"text":6814,"children":7408},[7409,7410,7411,7412,7413],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":6875,"depth":187,"text":6876},{"id":6983,"depth":187,"text":6984},{"id":7067,"depth":187,"text":7068},{"id":7097,"depth":166,"text":7098},{"id":479,"depth":166,"text":480},{"id":7293,"depth":166,"text":7294},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fingest-mixed-documents-llm-embedding.png","PDFs, Office files and HTML all become one clean format before chunking. Where the pipeline actually breaks, and which endpoint handles which format.","\u002Fimg\u002Fblog\u002Fingest-mixed-documents-llm-embedding-card.png",{},"\u002Fblog\u002Fguides\u002Fingest-mixed-documents-llm-embedding",{"title":6631,"description":7421},"blog\u002Fguides\u002Fingest-mixed-documents-llm-embedding",[4343,7428,7429,7430,2057],"embeddings","pdf","ocr","W22qxU6ECP1oyBynBCnIiPRpJWjd-6JuBk7ZJtpxkOs",{"id":7433,"title":7434,"author":6,"body":7435,"category":8203,"cover":8204,"description":8205,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":8206,"meta":8207,"navigation":790,"ogImage":787,"path":8208,"publishedAt":5712,"readTime":1681,"seo":8209,"stem":8210,"tags":8211,"toolCategory":8103,"updatedAt":5712,"__hash__":8215},"blogGuides\u002Fblog\u002Fguides\u002Finstagram-follower-engagement-api.md","Instagram Follower and Engagement Data: Which API in 2026?",{"type":8,"value":7436,"toc":8183},[7437,7440,7477,7483,7487,7490,7494,7497,7500,7504,7513,7516,7520,7523,7533,7603,7613,7617,7620,7622,7627,7632,7637,7639,7675,7679,7684,7699,7703,7752,7757,7760,7768,7772,7777,7793,7797,7829,7834,7839,7843,7848,7851,7854,7864,7868,7871,7874,7877,7883,7893,7899,7901,8075,8079,8083,8086,8089,8092,8101,8108,8110,8113,8116,8119,8122,8124,8127,8130,8141,8143,8153,8159,8165,8176,8180],[11,7438,7439],{"style":810},"Copy this line to your agent to pull a creator's public profile and engagement metrics.",[131,7441,7443],{"className":814,"code":7442,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use apify \u002Fapify\u002Finstagram-profile-scraper to get a creator's follower count and recent post engagement\n",[47,7444,7445],{"__ignoreMap":136},[140,7446,7447,7449,7451,7453,7455,7457,7459,7462,7464,7467,7469,7472,7474],{"class":142,"line":143},[140,7448,824],{"class":823},[140,7450,827],{"class":150},[140,7452,830],{"class":150},[140,7454,833],{"class":150},[140,7456,836],{"class":150},[140,7458,157],{"class":150},[140,7460,7461],{"class":150}," \u002Fapify\u002Finstagram-profile-scraper",[140,7463,845],{"class":150},[140,7465,7466],{"class":150}," get",[140,7468,851],{"class":150},[140,7470,7471],{"class":150}," creator",[140,7473,2045],{"class":193},[140,7475,7476],{"class":150},"s follower count and recent post engagement\n",[11,7478,7479,7480,7482],{},"Instagram follower counts are trivially available and almost always correct. Nearly everything a tracker builds on top of them, who unfollowed you, whether engagement is real, whether an account is worth a partnership, is inference layered on two numbers, and the layers are where the errors live. This piece is about which fields you can actually get from an API, which of them mean something, and which ones you are being sold as insight. Monid is ",[18,7481,21],{"href":20},": one key and one balance across many providers, so you can compare three Instagram endpoints before committing to one.",[27,7484,7486],{"id":7485},"are-instagram-follower-and-engagement-trackers-actually-accurate","Are Instagram follower and engagement trackers actually accurate?",[11,7488,7489],{},"Counts are accurate. Deltas are guesses. That distinction explains almost every complaint in the 45-comment r\u002Fsocialmedia thread asking exactly this question, and it is the single most useful thing to understand before buying or building anything here.",[232,7491,7493],{"id":7492},"why-a-follower-count-is-reliable-and-a-follower-list-is-not","Why a follower count is reliable and a follower list is not",[11,7495,7496],{},"A profile endpoint reads the number Instagram itself displays, so the count is as accurate as the platform's own page. A follower list is different: it is paginated, rate limited, and frequently truncated, so a tracker comparing yesterday's list to today's is comparing two partial samples and calling the difference an unfollow.",[11,7498,7499],{},"That is the mechanism behind the classic complaint that a tracker showed someone unfollowed you when they did not. Nothing lied. The second sample was shorter than the first. Any product built on list diffing inherits this, and the honest ones say so.",[232,7501,7503],{"id":7502},"the-fields-that-actually-tell-you-something","The fields that actually tell you something",[11,7505,7506,7507,7512],{},"Buried in the profile response are signals more useful than the follower count, and almost no consumer tracker surfaces them. Verified 2026-08-20, ",[18,7508,7509],{"href":5030},[47,7510,7511],{},"apify\u002Fapify\u002Finstagram-profile-scraper"," returns account join date, a username change count, verification status with its verification date, a recent-join flag, business versus private classification, business category, and related accounts, alongside the follower, following, post, video, highlight and IGTV counts.",[11,7514,7515],{},"Read those together and you get something a follower count cannot give you. An account that joined recently, has changed its username more than once, and has a follower count out of proportion to its post count is a different proposition from an account with the same follower count, a five year old join date and no username changes. That is the actual signal for partnership vetting, and it is three fields nobody puts on a dashboard.",[232,7517,7519],{"id":7518},"engagement-rate-is-a-computed-number-not-a-returned-one","Engagement rate is a computed number, not a returned one",[11,7521,7522],{},"No Instagram endpoint returns an engagement rate, because Instagram does not publish one. Every engagement rate you have seen is somebody's arithmetic over likes and comments divided by followers, and the divisor choice, the post window and the treatment of video views all vary by vendor. Two tools reporting different engagement rates for the same creator are usually both right about their own formula.",[11,7524,7525,7526,7532],{},"So compute it yourself from post-level data, and write down the formula. ",[18,7527,7529],{"href":7528},"\u002Ftools\u002Finstagram",[47,7530,7531],{},"apify\u002Fapify\u002Finstagram-post-scraper"," returns post-level metadata including engagement metrics, captions, hashtags, mentions and timestamps, which is what the arithmetic needs.",[482,7534,7535,7547],{},[485,7536,7537],{},[488,7538,7539,7541,7544],{},[491,7540,915],{},[491,7542,7543],{},"Consumer follower tracker",[491,7545,7546],{},"Profile and post endpoints",[504,7548,7549,7560,7571,7582,7593],{},[488,7550,7551,7554,7557],{},[509,7552,7553],{},"What it returns",[509,7555,7556],{},"Deltas and a computed score",[509,7558,7559],{},"Raw fields as the platform shows them",[488,7561,7562,7565,7568],{},[509,7563,7564],{},"Accuracy risk",[509,7566,7567],{},"Truncated list samples read as unfollows",[509,7569,7570],{},"Snapshot is exact, trend is yours to build",[488,7572,7573,7576,7579],{},[509,7574,7575],{},"Engagement rate",[509,7577,7578],{},"Vendor formula, usually undisclosed",[509,7580,7581],{},"You choose the divisor and the window",[488,7583,7584,7587,7590],{},[509,7585,7586],{},"Account quality signals",[509,7588,7589],{},"Rarely surfaced",[509,7591,7592],{},"Join date, username changes, verification date",[488,7594,7595,7597,7600],{},[509,7596,3531],{},[509,7598,7599],{},"A creator watching their own account",[509,7601,7602],{},"Vetting, monitoring or enriching at scale",[320,7604,7605],{},[11,7606,324,7607,119,7609],{},[38,7608,327],{},[18,7610,7612],{"href":7611},"\u002Fblog\u002Fwhat-an-instagram-profile-api-should-return","What an Instagram Profile API Should Actually Return",[27,7614,7616],{"id":7615},"how-do-i-get-instagram-follower-counts-and-engagement-metrics-through-an-api","How do I get Instagram follower counts and engagement metrics through an API?",[11,7618,7619],{},"Two calls, and they answer different questions. The profile call gives you the account. The posts call gives you the behaviour. Most people who ask this question need both and budget for one.",[232,7621,235],{"id":234},[11,7623,238,7624,244],{},[18,7625,243],{"href":241,"rel":7626},[124,125],[131,7628,7630],{"className":7629,"code":249,"language":97,"meta":136},[248],[47,7631,249],{"__ignoreMap":136},[11,7633,254,7634,260],{},[18,7635,259],{"href":257,"rel":7636},[124,125],[232,7638,264],{"id":263},[131,7640,7641],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,7642,7643,7653],{"__ignoreMap":136},[140,7644,7645,7647,7649,7651],{"class":142,"line":143},[140,7646,274],{"class":146},[140,7648,277],{"class":150},[140,7650,280],{"class":150},[140,7652,283],{"class":150},[140,7654,7655,7657,7659,7661,7663,7665,7667,7669,7671,7673],{"class":142,"line":166},[140,7656,147],{"class":146},[140,7658,290],{"class":150},[140,7660,293],{"class":150},[140,7662,296],{"class":150},[140,7664,299],{"class":193},[140,7666,302],{"class":150},[140,7668,305],{"class":183},[140,7670,308],{"class":193},[140,7672,311],{"class":150},[140,7674,314],{"class":150},[232,7676,7678],{"id":7677},"step-1-pull-the-profile","Step 1. Pull the profile",[11,7680,7681,7683],{},[38,7682,1131],{}," Takes usernames and returns full public profile metadata plus an overview of recent media, one record per username.",[11,7685,7686,119,7688,7692,7693,7698],{},[38,7687,1137],{},[18,7689,7690],{"href":5030},[47,7691,7511],{}," accepts usernames, IDs or URLs. ",[18,7694,7695],{"href":7528},[47,7696,7697],{},"tikhub\u002Fapi\u002Fv1\u002Finstagram\u002Fv2\u002Ffetch_user_followers"," is the different-shaped neighbour when you specifically need follower records rather than counts.",[11,7700,7701],{},[38,7702,1148],{},[131,7704,7706],{"className":133,"code":7705,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Fapify\u002Finstagram-profile-scraper\nmonid run -p apify -e \u002Fapify\u002Finstagram-profile-scraper \\\n  -i '{\"usernames\":[\"humansofny\"]}' -w\n",[47,7707,7708,7723,7739],{"__ignoreMap":136},[140,7709,7710,7712,7714,7716,7718,7720],{"class":142,"line":143},[140,7711,147],{"class":146},[140,7713,151],{"class":150},[140,7715,154],{"class":150},[140,7717,157],{"class":150},[140,7719,160],{"class":150},[140,7721,7722],{"class":150}," \u002Fapify\u002Finstagram-profile-scraper\n",[140,7724,7725,7727,7729,7731,7733,7735,7737],{"class":142,"line":166},[140,7726,147],{"class":146},[140,7728,171],{"class":150},[140,7730,154],{"class":150},[140,7732,157],{"class":150},[140,7734,160],{"class":150},[140,7736,7461],{"class":150},[140,7738,184],{"class":183},[140,7740,7741,7743,7745,7748,7750],{"class":142,"line":187},[140,7742,190],{"class":150},[140,7744,194],{"class":193},[140,7746,7747],{"class":150},"{\"usernames\":[\"humansofny\"]}",[140,7749,2045],{"class":193},[140,7751,1190],{"class":150},[11,7753,7754,7756],{},[38,7755,1195],{}," Display name, biography, profile picture, external links, follower and following counts, post, video, highlight and IGTV counts, business or private classification, business category, verification status and date, join date, username change count, recent-join flag, related accounts, and recent media with captions, hashtags, mentions, timestamps, dimensions and engagement metrics.",[11,7758,7759],{},"One input note that costs people money: there is no result limit parameter, because the result count equals the input count. Passing five hundred usernames returns five hundred records and bills for five hundred records. That is predictable, which is the point, but it is not capped.",[11,7761,7762,7764,7765,260],{},[38,7763,1229],{}," A fraction of a cent per profile, billed per result. Current figures at ",[18,7766,1233],{"href":5582,"rel":7767},[124,125],[232,7769,7771],{"id":7770},"step-2-pull-the-posts-then-do-your-own-arithmetic","Step 2. Pull the posts, then do your own arithmetic",[11,7773,7774,7776],{},[38,7775,1131],{}," Returns post-level metadata so you can compute engagement rather than accept somebody's.",[11,7778,7779,119,7781,7785,7786,7792],{},[38,7780,1137],{},[18,7782,7783],{"href":7528},[47,7784,7531],{}," bills per call rather than per result, which is a meaningful difference when a profile has hundreds of posts. ",[18,7787,7789],{"href":7788},"\u002Ftools\u002Ftikhub",[47,7790,7791],{},"tikhub\u002Fapi\u002Fv1\u002Finstagram\u002Fv1\u002Ffetch_user_posts_v2"," covers the same job, also per call.",[11,7794,7795],{},[38,7796,1148],{},[131,7798,7800],{"className":133,"code":7799,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Fapify\u002Finstagram-post-scraper -i '{...}' -w\n",[47,7801,7802],{"__ignoreMap":136},[140,7803,7804,7806,7808,7810,7812,7814,7817,7820,7822,7825,7827],{"class":142,"line":143},[140,7805,147],{"class":146},[140,7807,171],{"class":150},[140,7809,154],{"class":150},[140,7811,157],{"class":150},[140,7813,160],{"class":150},[140,7815,7816],{"class":150}," \u002Fapify\u002Finstagram-post-scraper",[140,7818,7819],{"class":150}," -i",[140,7821,194],{"class":193},[140,7823,7824],{"class":150},"{...}",[140,7826,2045],{"class":193},[140,7828,1190],{"class":150},[11,7830,7831,7833],{},[38,7832,1195],{}," Per post: caption, hashtags, mentions, timestamp, media URLs, dimensions and engagement metrics. Enough to compute a rate over whatever window you decide is fair.",[11,7835,7836,7838],{},[38,7837,1229],{}," Per call, so pulling a creator's recent posts costs the same whether you get twelve or forty. This is the billing shape you want for the posts half and the opposite of what you want for the profile half.",[232,7840,7842],{"id":7841},"step-3-store-the-snapshot-because-the-trend-is-the-product","Step 3. Store the snapshot, because the trend is the product",[11,7844,7845,7847],{},[38,7846,1131],{}," Nothing, technically. It is the step people skip and then regret.",[11,7849,7850],{},"A single pull tells you a creator has a certain follower count. Two pulls a week apart tell you whether it is growing, which is the thing that actually predicts whether a partnership is worth it. Neither endpoint stores history for you, so the first run of your pipeline should write a dated row, not overwrite one.",[316,7852],{"prompt":7853},"pull these five Instagram creators' profiles and recent posts, compute engagement rate as likes plus comments over followers across their last twelve posts, and show me the formula you used",[320,7855,7856],{},[11,7857,324,7858,119,7860],{},[38,7859,327],{},[18,7861,7863],{"href":7862},"\u002Fblog\u002Fship-an-instagram-profile-enricher","Ship an Instagram Profile Enricher This Afternoon",[27,7865,7867],{"id":7866},"what-is-the-most-reliable-way-to-get-instagram-profile-data-into-n8n","What is the most reliable way to get Instagram profile data into n8n?",[11,7869,7870],{},"Call an HTTP endpoint from an HTTP Request node and keep the credential out of the workflow. That is the boring answer and it is the reliable one, because the failure modes in this integration are almost never about n8n.",[11,7872,7873],{},"The r\u002Fn8n threads on this, including the one about struggling with the scraping layer for an Instagram and X assignment, converge on the same shape of problem: the workflow is fine and the data source is the fragile part. A node that wraps one vendor breaks when that vendor changes, and rebuilding it means editing the workflow rather than editing a parameter.",[11,7875,7876],{},"Three things make this integration hold up:",[11,7878,7879,7882],{},[38,7880,7881],{},"Put the provider and endpoint in workflow variables."," When an endpoint is deprecated, and in this category they are, you change two strings rather than rewire nodes.",[11,7884,7885,7888,7889,7892],{},[38,7886,7887],{},"Assert on a field you consume, not on the status code."," A truncated or partial Instagram response is still a 200. Check that ",[47,7890,7891],{},"followersCount"," is present and non-zero on a known-good account each run, and fail the workflow loudly when it is not. This is the single highest-value line in the whole integration.",[11,7894,7895,7898],{},[38,7896,7897],{},"Batch on the per-result endpoints and loop on the per-call ones."," The profile endpoint bills per result, so batching usernames into one call saves nothing but round trips. The post endpoint bills per call, so batching genuinely saves money. Getting these backwards is the most common cost surprise.",[27,7900,480],{"id":479},[482,7902,7903,7919],{},[485,7904,7905],{},[488,7906,7907,7909,7911,7913,7915,7917],{},[491,7908,496],{},[491,7910,6334],{},[491,7912,1443],{},[491,7914,1446],{},[491,7916,3531],{},[491,7918,1449],{},[504,7920,7921,7943,7965,7988,8010,8031,8053],{},[488,7922,7923,7929,7932,7935,7938,7941],{},[509,7924,7925],{},[18,7926,7927],{"href":5030},[47,7928,7511],{},[509,7930,7931],{},"Full public profile plus recent media overview",[509,7933,7934],{},"Usernames, IDs or URLs",[509,7936,7937],{},"Counts, bio, links, join date, verification date, username changes",[509,7939,7940],{},"Vetting and enrichment",[509,7942,3551],{},[488,7944,7945,7951,7954,7957,7960,7963],{},[509,7946,7947],{},[18,7948,7949],{"href":7528},[47,7950,7531],{},[509,7952,7953],{},"Post-level metadata",[509,7955,7956],{},"Profile or post URLs",[509,7958,7959],{},"Captions, hashtags, mentions, timestamps, engagement",[509,7961,7962],{},"Computing engagement yourself",[509,7964,542],{},[488,7966,7967,7974,7977,7980,7983,7986],{},[509,7968,7969],{},[18,7970,7971],{"href":7528},[47,7972,7973],{},"apify\u002Fapify\u002Finstagram-search-scraper",[509,7975,7976],{},"Search places, profiles and hashtags",[509,7978,7979],{},"Keyword",[509,7981,7982],{},"Matching entities",[509,7984,7985],{},"Creator discovery",[509,7987,3551],{},[488,7989,7990,7996,7999,8002,8005,8008],{},[509,7991,7992],{},[18,7993,7994],{"href":7528},[47,7995,7697],{},[509,7997,7998],{},"Follower records, not just the count",[509,8000,8001],{},"User identifier",[509,8003,8004],{},"Follower list pages",[509,8006,8007],{},"Audience analysis",[509,8009,542],{},[488,8011,8012,8018,8021,8023,8026,8029],{},[509,8013,8014],{},[18,8015,8016],{"href":7788},[47,8017,7791],{},[509,8019,8020],{},"User post list",[509,8022,8001],{},[509,8024,8025],{},"Posts",[509,8027,8028],{},"Cheap repeated polling",[509,8030,542],{},[488,8032,8033,8040,8043,8045,8048,8051],{},[509,8034,8035],{},[18,8036,8037],{"href":7788},[47,8038,8039],{},"tikhub\u002Fapi\u002Fv1\u002Finstagram\u002Fv1\u002Ffetch_related_profiles",[509,8041,8042],{},"Accounts Instagram associates with this one",[509,8044,8001],{},[509,8046,8047],{},"Related profiles",[509,8049,8050],{},"Niche mapping",[509,8052,542],{},[488,8054,8055,8062,8065,8067,8070,8073],{},[509,8056,8057],{},[18,8058,8059],{"href":7788},[47,8060,8061],{},"tikhub\u002Fapi\u002Fv1\u002Finstagram\u002Fv1\u002Ffetch_user_tagged_posts",[509,8063,8064],{},"Posts the account is tagged in",[509,8066,8001],{},[509,8068,8069],{},"Tagged posts",[509,8071,8072],{},"Brand mention monitoring",[509,8074,542],{},[11,8076,1560,8077,7290],{},[47,8078,607],{},[27,8080,8082],{"id":8081},"what-does-an-instagram-data-pull-actually-cost","What does an Instagram data pull actually cost?",[11,8084,8085],{},"Small enough that the interesting question is which half you are paying for.",[11,8087,8088],{},"Vetting a list of creators is the cheap case. Profile records bill per result at a fraction of a cent each, so a few hundred creators is well under a dollar and scales linearly with no plan underneath. Add the posts call for each and you are still in single-digit dollars for a serious vetting pass.",[11,8090,8091],{},"Monitoring is where it changes shape, because monitoring means repetition. The right move is to split the two halves by cadence: pull profiles daily, because a follower count is cheap and only meaningful as a series, and pull posts weekly, because a per-call endpoint charges the same whether you check often or rarely and the post history does not move that fast.",[11,8093,8094,8095,8098,8099,260],{},"Discovery and inspection stay free, so you can read every field list and every billing shape before spending anything. That is what makes a metered balance work here: access costs nothing until it is used. Prices are at ",[18,8096,1233],{"href":5582,"rel":8097},[124,125],", and where metered loses to a subscription is covered in ",[18,8100,6511],{"href":2325},[421,8102,8105],{"category":8103,"title":8104},"instagram","Read the field list before you pick a tracker",[11,8106,8107],{},"Discover what each Instagram endpoint returns, inspect the schema, and see current prices. Nothing bills until you run.",[27,8109,657],{"id":656},[11,8111,8112],{},"If you manage the account, use the official APIs. Instagram's Graph API and the Instagram Basic Display successor give an account owner their own insights, including reach and impressions, which no third-party endpoint can see because the platform does not publish them. Anyone analysing their own account and reaching for a scraper is choosing worse data.",[11,8114,8115],{},"If you need a creator marketplace rather than data, buy one. Products like the influencer platforms bundle vetting, outreach, contracts and payment. If what you want is to run campaigns rather than to build something, raw endpoints are the wrong altitude and you will rebuild half a product badly.",[11,8117,8118],{},"If your volume is steady and high, a committed contract with a single social data vendor will beat metered pricing. Metered wins on bursty work and on the long tail of endpoints you call rarely, which describes vetting and research well and describes a production monitoring fleet less well.",[11,8120,8121],{},"And if you need historical follower data going back before you started collecting, nobody can sell you that honestly. The endpoints return the present. Anyone offering you a creator's follower history is showing you their own archive, which is a real product, but it is a different one.",[27,8123,696],{"id":695},[11,8125,8126],{},"There is no best Instagram API, because \"Instagram data\" is at least three jobs. Profiles, post-level engagement and follower records have different billing shapes and different reliability, and the field lists differ more than the marketing does. Pick by which job you are doing, and the choice becomes easy and cheap.",[11,8128,8129],{},"What matters more than the endpoint: follower counts are the least interesting thing available, and they are what every tracker leads with. Join date, username change count and verification date tell you whether an account is what it claims to be, and they cost the same call. If you build one thing from this piece, build the vetting check that reads those three fields.",[11,8131,7340,8132,6547,8135,8137,8138,260],{},[47,8133,8134],{},"monid discover -q \"instagram profile posts engagement\"",[47,8136,607],{}," on the profile and post endpoints to compare their field lists and billing shapes, then one small paid run against five creators you already know well. Start at ",[18,8139,725],{"href":723,"rel":8140},[124,125],[27,8142,729],{"id":728},[731,8144,8146],{"q":8145},"What is the best Instagram API in 2026?",[11,8147,8148,8149,8152],{},"The one that returns the fields your job needs, which is usually the profile endpoint for vetting and the post endpoint for engagement. Ranking Instagram APIs against each other in the abstract does not work, because they differ mainly in field coverage and billing shape rather than in quality, and the two best options here bill in opposite directions. Compare the field lists at ",[18,8150,1233],{"href":5582,"rel":8151},[124,125]," before comparing vendors.",[731,8154,8156],{"q":8155},"How do I build an API that scrapes Instagram creator profiles?",[11,8157,8158],{},"Do not build the scraping layer, build the part above it. The hard, ongoing work in an Instagram scraper is blocking, layout changes and proxy rotation, and none of that is your product. Wrap an existing profile endpoint behind your own interface, keep the provider in configuration so you can swap it, and spend your engineering on the enrichment and scoring your users actually pay for.",[731,8160,8162],{"q":8161},"Instagram Follow\u002FUnfollow Bots, what still works in 2025?",[11,8163,8164],{},"That is a different category from data access and we do not help with it. Automating follows and unfollows acts on the platform on a user's behalf and risks the account it runs from, which is why the r\u002Finstagramautomations answers shift every few months. Reading public profile data is a separate activity with a separate risk profile, and this guide is only about the reading.",[731,8166,8168],{"q":8167},"How do I automate scraping public Instagram data without getting blocked?",[11,8169,8170,8171,8175],{},"Use an endpoint that handles blocking as its own problem rather than yours, and keep your request pattern boring. The specific choices, which Apify actor fits which job and where the rate limits actually bite, are worked through in ",[18,8172,8174],{"href":8173},"\u002Fblog\u002Fguides\u002Fapify-instagram-scraper","the Apify Instagram scraper guide",". The shortest version: blocking is the vendor's engineering problem, and paying somebody to own it is cheaper than owning it yourself.",[11,8177,8178],{},[758,8179,760],{},[762,8181,8182],{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":136,"searchDepth":166,"depth":166,"links":8184},[8185,8190,8197,8198,8199,8200,8201,8202],{"id":7485,"depth":166,"text":7486,"children":8186},[8187,8188,8189],{"id":7492,"depth":187,"text":7493},{"id":7502,"depth":187,"text":7503},{"id":7518,"depth":187,"text":7519},{"id":7615,"depth":166,"text":7616,"children":8191},[8192,8193,8194,8195,8196],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":7677,"depth":187,"text":7678},{"id":7770,"depth":187,"text":7771},{"id":7841,"depth":187,"text":7842},{"id":7866,"depth":166,"text":7867},{"id":479,"depth":166,"text":480},{"id":8081,"depth":166,"text":8082},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"Social data","\u002Fimg\u002Fblog\u002Finstagram-follower-engagement-api.png","Follower counts are accurate. What trackers build on top is inference. Which endpoints return which fields, and how to tell a real signal from a guess.","\u002Fimg\u002Fblog\u002Finstagram-follower-engagement-api-card.png",{},"\u002Fblog\u002Fguides\u002Finstagram-follower-engagement-api",{"title":7434,"description":8205},"blog\u002Fguides\u002Finstagram-follower-engagement-api",[8103,8212,6627,8213,8214],"social","creators","engagement","5dmEwmpTn7Weo7FXJ97Iv5HvQvL9EJSVcG8pxLS8Y0w",{"id":8217,"title":8218,"author":6,"body":8219,"category":1674,"cover":8976,"description":8977,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":8978,"meta":8979,"navigation":790,"ogImage":787,"path":8980,"publishedAt":5712,"readTime":1681,"seo":8981,"stem":8982,"tags":8983,"toolCategory":8934,"updatedAt":5712,"__hash__":8988},"blogGuides\u002Fblog\u002Fguides\u002Fllm-gateway-vs-mcp-gateway.md","LLM Gateway vs MCP Gateway: Four Families, One Word",{"type":8,"value":8220,"toc":8946},[8221,8224,8264,8267,8271,8274,8278,8281,8306,8310,8313,8316,8320,8323,8327,8336,8340,8343,8347,8350,8354,8357,8361,8442,8445,8449,8452,8456,8459,8467,8471,8474,8478,8481,8485,8488,8491,8495,8498,8508,8515,8517,8522,8527,8532,8534,8575,8583,8587,8592,8600,8604,8638,8654,8659,8663,8668,8685,8689,8728,8737,8745,8748,8756,8766,8768,8866,8871,8875,8878,8881,8884,8886,8889,8892,8903,8905,8911,8917,8923,8932,8939,8943],[11,8222,8223],{"style":810},"Copy this line to your agent to give it the tool half rather than another model.",[131,8225,8227],{"className":814,"code":8226,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use exa \u002Fsearch to research a company from the live web\n",[47,8228,8229],{"__ignoreMap":136},[140,8230,8231,8233,8235,8237,8239,8241,8244,8246,8248,8251,8253,8256,8258,8260,8262],{"class":142,"line":143},[140,8232,824],{"class":823},[140,8234,827],{"class":150},[140,8236,830],{"class":150},[140,8238,833],{"class":150},[140,8240,836],{"class":150},[140,8242,8243],{"class":150}," exa",[140,8245,5749],{"class":150},[140,8247,845],{"class":150},[140,8249,8250],{"class":150}," research",[140,8252,851],{"class":150},[140,8254,8255],{"class":150}," company",[140,8257,3367],{"class":150},[140,8259,3370],{"class":150},[140,8261,3373],{"class":150},[140,8263,3376],{"class":150},[11,8265,8266],{},"Four different products are called a gateway in agent infrastructure, and they are not variants of each other. An API gateway fronts your own services. An LLM gateway fronts model providers. An MCP gateway fronts tools. An agent gateway is whichever of those a given vendor decided to call it that week. This piece sorts them out and then argues that the two that matter for an agent are the model half and the tool half, only one of which most teams have wired.",[27,8268,8270],{"id":8269},"what-is-an-llm-gateway","What is an LLM gateway?",[11,8272,8273],{},"An LLM gateway is a single endpoint that accepts a prompt and routes it to one of many language models, handling keys, fallback, caching and cost accounting on the way. It exists because a team that uses more than one model provider otherwise ends up with a provider's SDK, a provider's key and a provider's failure modes repeated once per provider.",[232,8275,8277],{"id":8276},"what-it-does-for-you","What it does for you",[11,8279,8280],{},"Three things, in descending order of how much people care. It normalises the request format, so one client shape reaches many models. It fails over, so a provider outage or a rate limit does not become your outage. And it accounts, so somebody can answer what the month cost and which feature spent it. Caching and prompt logging usually come attached.",[11,8282,8283,8288,8289,8294,8295,102,8300,8305],{},[18,8284,8287],{"href":8285,"rel":8286},"https:\u002F\u002Fopenrouter.ai\u002F",[124,125],"OpenRouter"," is the best-known hosted example and routes across hundreds of models. ",[18,8290,8293],{"href":8291,"rel":8292},"https:\u002F\u002Fgithub.com\u002FBerriAI\u002Flitellm",[124,125],"LiteLLM"," is the best-known self-hosted one, which is why \"llm gateway vs litellm\" is a search people run. ",[18,8296,8299],{"href":8297,"rel":8298},"https:\u002F\u002Faws.amazon.com\u002Fbedrock\u002F",[124,125],"Amazon Bedrock",[18,8301,8304],{"href":8302,"rel":8303},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fai-gateway\u002F",[124,125],"Cloudflare AI Gateway"," are the platform-native versions.",[232,8307,8309],{"id":8308},"what-it-does-not-do","What it does not do",[11,8311,8312],{},"It does not give the model anything new to work with. A prompt routed perfectly to the best available model still cannot read a page published this morning, look up a company that is not in the training data, pull a comment thread or place a phone call. The gateway made the model reachable and interchangeable. It did not make it informed.",[11,8314,8315],{},"That gap is not a criticism of LLM gateways. It is a category boundary, and the reason a second gateway exists.",[27,8317,8319],{"id":8318},"how-does-an-llm-gateway-work","How does an LLM gateway work?",[11,8321,8322],{},"An LLM gateway works as a reverse proxy with a translation layer: your client speaks one dialect, usually the OpenAI chat completions shape, and the gateway rewrites each request into whatever the destination provider expects, then rewrites the response back.",[232,8324,8326],{"id":8325},"routing","Routing",[11,8328,8329,8330,8335],{},"The routing decision is the product, and it is why some vendors call themselves a model router rather than a gateway: router emphasises the per-request choice, gateway emphasises the control plane around it, and most products do both. A simple one routes by the model name you asked for. A better one routes by policy: cheapest model that passes a quality bar, fastest under load, or a fallback chain when the first choice errors. This is the part ",[18,8331,8334],{"href":8332,"rel":8333},"https:\u002F\u002Fstripe.com\u002Fnewsroom\u002Fnews\u002Fstripe-agrees-to-acquire-openrouter",[124,125],"Stripe reportedly paid billions for"," when it agreed to buy OpenRouter in August 2026, because deciding per request which model should serve it, and at what price, is a metering problem before it is an AI problem.",[232,8337,8339],{"id":8338},"keys-and-quota","Keys and quota",[11,8341,8342],{},"The gateway holds the provider credentials, and your application holds one credential for the gateway. That is the single biggest operational win, and it is the same trick a tool gateway plays one layer over: the thing that needs access does not hold the secrets for every backend.",[232,8344,8346],{"id":8345},"accounting","Accounting",[11,8348,8349],{},"Every request gets attributed and priced. Without this, multi-provider AI spend becomes unattributable within about a month, which is why the observability vendors and the gateway vendors keep converging on each other.",[27,8351,8353],{"id":8352},"llm-gateway-vs-mcp-gateway-what-is-the-difference","LLM gateway vs MCP gateway: what is the difference?",[11,8355,8356],{},"An LLM gateway routes prompts to models; an MCP gateway routes tool calls to vendors. They sit on different axes of the same agent and neither substitutes for the other.",[232,8358,8360],{"id":8359},"the-two-halves-side-by-side","The two halves, side by side",[482,8362,8363,8375],{},[485,8364,8365],{},[488,8366,8367,8369,8372],{},[491,8368,915],{},[491,8370,8371],{},"LLM gateway",[491,8373,8374],{},"MCP gateway",[504,8376,8377,8388,8399,8410,8420,8431],{},[488,8378,8379,8382,8385],{},[509,8380,8381],{},"What is routed",[509,8383,8384],{},"A prompt",[509,8386,8387],{},"A tool call",[488,8389,8390,8393,8396],{},[509,8391,8392],{},"Backends",[509,8394,8395],{},"Model providers",[509,8397,8398],{},"Tool and data vendors",[488,8400,8401,8404,8407],{},[509,8402,8403],{},"Protocol to the client",[509,8405,8406],{},"HTTP, usually OpenAI-shaped",[509,8408,8409],{},"Model Context Protocol",[488,8411,8412,8414,8417],{},[509,8413,4538],{},[509,8415,8416],{},"Your policy, before the call",[509,8418,8419],{},"The agent, at run time",[488,8421,8422,8425,8428],{},[509,8423,8424],{},"Failure looks like",[509,8426,8427],{},"A worse answer, or none",[509,8429,8430],{},"The agent cannot attempt the task",[488,8432,8433,8436,8439],{},[509,8434,8435],{},"Metering unit",[509,8437,8438],{},"Tokens",[509,8440,8441],{},"Calls or returned records",[11,8443,8444],{},"The row that matters most is who chooses. You choose the model, usually once, in config. The agent chooses the tool, per task, at run time, which means the tool layer has to be discoverable by something that is not a human reading documentation.",[232,8446,8448],{"id":8447},"why-the-failure-modes-differ","Why the failure modes differ",[11,8450,8451],{},"A missing model degrades quality. A missing tool removes a capability. If the model gateway is down your agent gives a worse answer; if the tool layer is missing your agent tells the user it cannot browse the web, and no amount of model quality fixes that. Teams tend to over-invest in the first and under-invest in the second because the first is the one with a dashboard.",[232,8453,8455],{"id":8454},"why-the-metering-differs","Why the metering differs",[11,8457,8458],{},"Token billing is continuous and roughly predictable from input length. Tool billing is lumpy: some endpoints charge per call regardless of what comes back, others charge per record returned, and a few charge per unit of output such as characters of speech or minutes of audio. That difference is architectural, not cosmetic. An endpoint that bills per result means the row count is the dial you have to control, and an agent that does not know this will happily ask for a thousand rows. The gateway's job is to make the price visible before the call, not after.",[320,8460,8461],{},[11,8462,324,8463,119,8465],{},[38,8464,327],{},[18,8466,1002],{"href":1001},[27,8468,8470],{"id":8469},"llm-gateway-vs-api-gateway-what-is-the-difference","LLM gateway vs API gateway: what is the difference?",[11,8472,8473],{},"An API gateway fronts services you own, for clients that already know the contract. Both AI gateways front services you do not own, for a client that has to learn the contract at run time. The operational machinery is shared; the assumptions are not.",[232,8475,8477],{"id":8476},"what-all-three-have-in-common","What all three have in common",[11,8479,8480],{},"Authentication, rate limiting, retries, timeouts, observability and request shaping. This is why the companies who built API gateways are shipping LLM and MCP gateways now: the hard-won parts transfer directly, and nobody should rebuild them.",[232,8482,8484],{"id":8483},"where-the-ai-ones-diverge","Where the AI ones diverge",[11,8486,8487],{},"Two places. First, self-description: an agent cannot be compiled against a schema, so the gateway has to advertise what it offers in a form a model can act on, and cheaply enough that the advertisement does not eat the context the task needs. Second, third-party billing: an API gateway fronts services you already pay for somehow, while an AI gateway is spending money with other companies on your behalf, every call, which makes price transparency a functional requirement rather than a reporting nicety.",[11,8489,8490],{},"An \"agent gateway\", where the term is used, is generally one of these three with agent-specific policy bolted on. Read the product page rather than the label.",[27,8492,8494],{"id":8493},"what-is-the-best-llm-gateway","What is the best LLM gateway?",[11,8496,8497],{},"The best LLM gateway is the one whose operational model matches yours, and the choice comes down to one question: do you want to run the proxy. Hosted options remove the operational surface and put a vendor in the request path. Self-hosted options do the reverse. Both are defensible and the comparison rarely turns on features.",[11,8499,8500,8501,8504,8505,8507],{},"The more useful question is the one people are starting to type instead: what is the equivalent for tools. That is what ",[18,8502,864],{"href":723,"rel":8503},[124,125]," is, ",[18,8506,21],{"href":20},". One key and one balance let an agent discover and call over a thousand tools across many providers, billed per call, with no separate signup per vendor. It ships as an MCP server, so the agent reaches it natively, and it routes tool calls only. It is never in the inference path, and there is no relationship with OpenRouter beyond borrowing the shape of their idea to explain ours.",[11,8509,8510,8511,8514],{},"If you want the full wiring walkthrough with both layers connected at once, that is ",[18,8512,8513],{"href":5687},"the two-integrations guide",". What follows is just the tool half.",[232,8516,235],{"id":234},[11,8518,238,8519,244],{},[18,8520,243],{"href":241,"rel":8521},[124,125],[131,8523,8525],{"className":8524,"code":249,"language":97,"meta":136},[248],[47,8526,249],{"__ignoreMap":136},[11,8528,254,8529,260],{},[18,8530,259],{"href":257,"rel":8531},[124,125],[232,8533,264],{"id":263},[131,8535,8537],{"className":133,"code":8536,"language":135,"meta":136,"style":136},"npm install -g @monid-ai\u002Fcli\nmonid keys add --label main --key \u003Cyour-api-key>\n",[47,8538,8539,8549],{"__ignoreMap":136},[140,8540,8541,8543,8545,8547],{"class":142,"line":143},[140,8542,274],{"class":146},[140,8544,277],{"class":150},[140,8546,280],{"class":150},[140,8548,283],{"class":150},[140,8550,8551,8553,8555,8557,8560,8563,8566,8568,8570,8572],{"class":142,"line":166},[140,8552,147],{"class":146},[140,8554,290],{"class":150},[140,8556,293],{"class":150},[140,8558,8559],{"class":150}," --label",[140,8561,8562],{"class":150}," main",[140,8564,8565],{"class":150}," --key",[140,8567,299],{"class":193},[140,8569,1114],{"class":150},[140,8571,305],{"class":183},[140,8573,8574],{"class":193},">\n",[11,8576,8577,8578,260],{},"More in the ",[18,8579,8582],{"href":8580,"rel":8581},"https:\u002F\u002Fmonid.ai\u002Fdocs\u002Fguide\u002Fquickstart-cli",[124,125],"CLI quickstart",[232,8584,8586],{"id":8585},"step-1-let-the-agent-find-the-tool-then-read-its-price","Step 1. Let the agent find the tool, then read its price",[11,8588,8589,8591],{},[38,8590,1131],{}," Searches the catalog by description and returns the schema and billing shape for whatever looks right, before anything bills.",[11,8593,8594,8596,8597,260],{},[38,8595,1137],{}," The catalog spans web search and extraction, company and people enrichment, social and platform data, browser automation, generative media and agent telephony. Browse it at ",[18,8598,1233],{"href":5582,"rel":8599},[124,125],[11,8601,8602],{},[38,8603,1148],{},[131,8605,8607],{"className":133,"code":8606,"language":135,"meta":136,"style":136},"monid discover -q \"research a company from recent web coverage\"\nmonid inspect -p exa -e \u002Fsearch\n",[47,8608,8609,8624],{"__ignoreMap":136},[140,8610,8611,8613,8615,8617,8619,8622],{"class":142,"line":143},[140,8612,147],{"class":146},[140,8614,2667],{"class":150},[140,8616,2670],{"class":150},[140,8618,2673],{"class":193},[140,8620,8621],{"class":150},"research a company from recent web coverage",[140,8623,2679],{"class":193},[140,8625,8626,8628,8630,8632,8634,8636],{"class":142,"line":166},[140,8627,147],{"class":146},[140,8629,151],{"class":150},[140,8631,154],{"class":150},[140,8633,8243],{"class":150},[140,8635,160],{"class":150},[140,8637,6077],{"class":150},[11,8639,8640,8642,8643,8645,8646,8649,8650,8653],{},[38,8641,1195],{}," Ranked endpoints with provider and billing shape, then for the chosen one its full body schema: ",[47,8644,3880],{},", search ",[47,8647,8648],{},"type"," from instant through deep-reasoning, a ",[47,8651,8652],{},"category"," filter for company, people, news, research paper or financial report, domain filters and inline content extraction.",[11,8655,8656,8658],{},[38,8657,1229],{}," Nothing. Both steps are free, which is the property that makes a large catalog safe to hand to an agent.",[232,8660,8662],{"id":8661},"step-2-run-it-and-pay-for-that-call-only","Step 2. Run it, and pay for that call only",[11,8664,8665,8667],{},[38,8666,1131],{}," Executes the endpoint and draws the shared balance at the price shown in step 1.",[11,8669,8670,119,8672,8678,8679,8684],{},[38,8671,1137],{},[18,8673,8676],{"href":8674,"rel":8675},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fsearch",[124,125],[47,8677,3721],{}," for neural retrieval with optional structured output across sources; ",[18,8680,8682],{"href":8674,"rel":8681},[124,125],[47,8683,1548],{}," when you would rather have search results with each page already converted to markdown.",[11,8686,8687],{},[38,8688,1148],{},[131,8690,8692],{"className":133,"code":8691,"language":135,"meta":136,"style":136},"monid run -p exa -e \u002Fsearch \\\n  -i '{\"query\": \"llm gateway adoption at enterprises\", \"category\": \"news\", \"numResults\": 10}' -w 120\n",[47,8693,8694,8710],{"__ignoreMap":136},[140,8695,8696,8698,8700,8702,8704,8706,8708],{"class":142,"line":143},[140,8697,147],{"class":146},[140,8699,171],{"class":150},[140,8701,154],{"class":150},[140,8703,8243],{"class":150},[140,8705,160],{"class":150},[140,8707,5749],{"class":150},[140,8709,184],{"class":183},[140,8711,8712,8714,8716,8719,8721,8724],{"class":142,"line":166},[140,8713,190],{"class":150},[140,8715,194],{"class":193},[140,8717,8718],{"class":150},"{\"query\": \"llm gateway adoption at enterprises\", \"category\": \"news\", \"numResults\": 10}",[140,8720,2045],{"class":193},[140,8722,8723],{"class":150}," -w",[140,8725,8727],{"class":8726},"sbssI"," 120\n",[11,8729,8730,8732,8733,8736],{},[38,8731,1195],{}," A result list with urls and optional extracted contents, highlights or summaries, and an ",[47,8734,8735],{},"outputSchema"," option that synthesises structured JSON across several sources rather than handing you ten pages to read.",[11,8738,8739,8741,8742,260],{},[38,8740,1229],{}," About a cent per call on the Exa endpoint, billed per call regardless of result count. The context.dev search endpoint bills per result instead, so there the count is the dial. Prices at ",[18,8743,1233],{"href":5582,"rel":8744},[124,125],[316,8746],{"prompt":8747},"find the last month of news coverage about a company and return a structured summary with sources",[320,8749,8750],{},[11,8751,324,8752,119,8754],{},[38,8753,327],{},[18,8755,3564],{"href":3563},[320,8757,8758],{},[11,8759,324,8760,119,8762],{},[38,8761,327],{},[18,8763,8765],{"href":8764},"\u002Fblog\u002Fguides\u002Fopenrouter-mcp-server-tool-layer","Is OpenRouter an MCP Server? What It Actually Exposes",[27,8767,480],{"id":479},[482,8769,8770,8784],{},[485,8771,8772],{},[488,8773,8774,8776,8778,8780,8782],{},[491,8775,493],{},[491,8777,496],{},[491,8779,1443],{},[491,8781,1446],{},[491,8783,1449],{},[504,8785,8786,8806,8826,8845],{},[488,8787,8788,8791,8798,8801,8804],{},[509,8789,8790],{},"Neural search, structured output",[509,8792,8793],{},[18,8794,8796],{"href":8674,"rel":8795},[124,125],[47,8797,3721],{},[509,8799,8800],{},"query, type, category, outputSchema",[509,8802,8803],{},"results with optional contents",[509,8805,1471],{},[488,8807,8808,8811,8818,8821,8824],{},[509,8809,8810],{},"Search plus page text in one hop",[509,8812,8813],{},[18,8814,8816],{"href":8674,"rel":8815},[124,125],[47,8817,1548],{},[509,8819,8820],{},"query, numResults, domain filters",[509,8822,8823],{},"ranked results with optional markdown",[509,8825,1557],{},[488,8827,8828,8831,8839,8841,8843],{},[509,8829,8830],{},"One URL to prompt-ready markdown",[509,8832,8833],{},[18,8834,8837],{"href":8835,"rel":8836},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fweb",[124,125],[47,8838,1484],{},[509,8840,4177],{},[509,8842,1490],{},[509,8844,1471],{},[488,8846,8847,8850,8858,8861,8864],{},[509,8848,8849],{},"Domain to company firmographics",[509,8851,8852],{},[18,8853,8855],{"href":569,"rel":8854},[124,125],[47,8856,8857],{},"pdl\u002Fv5\u002Fcompany\u002Fenrich",[509,8859,8860],{},"name, website, LinkedIn or ticker",[509,8862,8863],{},"firmographics, funding, headcount, tech stack",[509,8865,1471],{},[11,8867,1560,8868,8870],{},[47,8869,607],{}," on 20 August 2026. The table states the billing shape rather than a figure, because the shape decides how you architect and a number goes stale silently.",[27,8872,8874],{"id":8873},"when-is-a-tool-layer-the-wrong-thing-to-add","When is a tool layer the wrong thing to add?",[11,8876,8877],{},"When your problem is genuinely about models. If you are choosing between providers, chasing cost per token or building a fallback chain, that is an LLM gateway and Monid does not compete for it. We are not in the inference path.",[11,8879,8880],{},"It is also wrong when the tool count is one and will stay one. An agent that needs Slack and nothing else should get the Slack MCP server. Routing exists for the case where the vendor list is unknown when you write the code, and it is pure overhead when the list has one entry.",[11,8882,8883],{},"And if you need policy and audit over MCP servers your own team runs, buy the inward-facing kind of gateway. The API-gateway vendors moving into this space are building that properly. Monid is the outward-facing kind: right when the agent needs a capability nobody in the company has bought, wrong when the question is who may query the internal database.",[27,8885,696],{"id":695},[11,8887,8888],{},"LLM gateway and MCP gateway are not competing answers to one question, they are the two halves of the same one. The first makes a model reachable and interchangeable. The second makes it capable of anything outside its own weights. A team that has wired only the first has an agent that talks well and cannot look anything up, which is the most common shape of a disappointing agent demo.",[11,8890,8891],{},"The thing worth taking away is where the leverage sits. Model choice is a decision you make once and revisit quarterly. Tool access is a decision your agent makes every task, which means the tool layer's real job is to be discoverable and priced in the open, not to be clever. Free discovery plus a visible price per call is what lets an agent carry a thousand tools and only spend on the handful it needs.",[11,8893,1600,8894,8896,8897,8899,8900,260],{},[47,8895,603],{}," against something your agent cannot do today, then ",[47,8898,607],{}," the top result to see its schema and price. Neither costs anything. Start at ",[18,8901,725],{"href":723,"rel":8902},[124,125],[27,8904,729],{"id":728},[731,8906,8908],{"q":8907},"What is an LLM gateway key?",[11,8909,8910],{},"It is the single credential your application presents to the gateway, instead of holding one key per model provider. The gateway keeps the provider keys and your app keeps one, which is the same pattern a tool gateway uses: the caller holds one secret and the router holds the rest. Rotating a provider key becomes the gateway's problem rather than a deploy.",[731,8912,8914],{"q":8913},"Is an AI gateway the same as an LLM gateway?",[11,8915,8916],{},"Usually yes, and the terms are used interchangeably. Where a vendor distinguishes them, \"AI gateway\" tends to be the broader label covering models plus embeddings, images and sometimes tools, while \"LLM gateway\" means the model path specifically. Platform products like Amazon Bedrock or Cloudflare AI Gateway sit in the same slot regardless of which word they use for it.",[731,8918,8920],{"q":8919},"Should I self-host an LLM gateway or use a hosted one?",[11,8921,8922],{},"Self-host when the request path or the custody of provider keys matters enough to own the operations, which is usually a volume or a compliance answer rather than a cost one. Use hosted when you would rather not run the proxy, and accept a vendor in the path. LiteLLM is the usual self-hosted starting point and Portkey's gateway is also open source, so starting hosted and moving in-house is a real option.",[731,8924,8926],{"q":8925},"How is tool billing different from token billing?",[11,8927,8928,8929,260],{},"Token billing is continuous and scales with prompt and completion length. Tool billing comes in three shapes: per call, where the request is the unit; per result, where the returned row count is the unit; and per unit of output, such as characters of speech synthesised or minutes of audio transcribed. The shape decides which parameter controls your bill, which is why it belongs in an architecture conversation and not only in a finance one. Current shapes and prices are on ",[18,8930,1233],{"href":5582,"rel":8931},[124,125],[421,8933,8936],{"category":8934,"title":8935},"ai","Wire the half that is missing",[11,8937,8938],{},"Discover a tool, read its schema and per-call price, then run it. One key, one balance, no signup per vendor.",[11,8940,8941],{},[758,8942,760],{},[762,8944,8945],{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":136,"searchDepth":166,"depth":166,"links":8947},[8948,8952,8957,8962,8966,8972,8973,8974,8975],{"id":8269,"depth":166,"text":8270,"children":8949},[8950,8951],{"id":8276,"depth":187,"text":8277},{"id":8308,"depth":187,"text":8309},{"id":8318,"depth":166,"text":8319,"children":8953},[8954,8955,8956],{"id":8325,"depth":187,"text":8326},{"id":8338,"depth":187,"text":8339},{"id":8345,"depth":187,"text":8346},{"id":8352,"depth":166,"text":8353,"children":8958},[8959,8960,8961],{"id":8359,"depth":187,"text":8360},{"id":8447,"depth":187,"text":8448},{"id":8454,"depth":187,"text":8455},{"id":8469,"depth":166,"text":8470,"children":8963},[8964,8965],{"id":8476,"depth":187,"text":8477},{"id":8483,"depth":187,"text":8484},{"id":8493,"depth":166,"text":8494,"children":8967},[8968,8969,8970,8971],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":8585,"depth":187,"text":8586},{"id":8661,"depth":187,"text":8662},{"id":479,"depth":166,"text":480},{"id":8873,"depth":166,"text":8874},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fllm-gateway-vs-mcp-gateway.png","An LLM gateway routes prompts to models. An MCP gateway routes tool calls to vendors. Four gateway families, and which problem each one solves.","\u002Fimg\u002Fblog\u002Fllm-gateway-vs-mcp-gateway-card.png",{},"\u002Fblog\u002Fguides\u002Fllm-gateway-vs-mcp-gateway",{"title":8218,"description":8977},"blog\u002Fguides\u002Fllm-gateway-vs-mcp-gateway",[8984,8985,8986,8987,8325],"llm gateway","ai gateway","mcp","agent tools","Vf3znh_M1-PMasPkqfRWJXYkJen4i1KpKngV2VVH_eI",{"id":8990,"title":1058,"author":6,"body":8991,"category":1674,"cover":9726,"description":9727,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":9728,"meta":9729,"navigation":790,"ogImage":787,"path":1057,"publishedAt":5712,"readTime":1681,"seo":9730,"stem":9731,"tags":9732,"toolCategory":9734,"updatedAt":5712,"__hash__":9735},"blogGuides\u002Fblog\u002Fguides\u002Fmcp-vs-api-for-ai-agents.md",{"type":8,"value":8992,"toc":9695},[8993,8996,9038,9041,9045,9054,9058,9061,9065,9068,9072,9075,9155,9158,9167,9171,9174,9178,9181,9185,9188,9192,9195,9199,9202,9206,9209,9213,9216,9220,9229,9232,9234,9239,9244,9249,9251,9287,9292,9296,9301,9308,9312,9332,9340,9345,9349,9354,9364,9368,9388,9399,9404,9408,9413,9429,9433,9465,9470,9478,9481,9490,9494,9497,9501,9504,9508,9513,9517,9520,9530,9532,9619,9624,9628,9631,9634,9637,9639,9642,9645,9656,9658,9664,9670,9676,9682,9689,9693],[11,8994,8995],{"style":810},"Copy this line to your agent to call a paid API without signing up for it.",[131,8997,8999],{"className":814,"code":8998,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use pdl \u002Fv5\u002Fcompany\u002Fenrich to turn a domain into a company record\n",[47,9000,9001],{"__ignoreMap":136},[140,9002,9003,9005,9007,9009,9011,9013,9016,9019,9021,9024,9026,9029,9031,9033,9035],{"class":142,"line":143},[140,9004,824],{"class":823},[140,9006,827],{"class":150},[140,9008,830],{"class":150},[140,9010,833],{"class":150},[140,9012,836],{"class":150},[140,9014,9015],{"class":150}," pdl",[140,9017,9018],{"class":150}," \u002Fv5\u002Fcompany\u002Fenrich",[140,9020,845],{"class":150},[140,9022,9023],{"class":150}," turn",[140,9025,851],{"class":150},[140,9027,9028],{"class":150}," domain",[140,9030,1734],{"class":150},[140,9032,851],{"class":150},[140,9034,8255],{"class":150},[140,9036,9037],{"class":150}," record\n",[11,9039,9040],{},"MCP versus API is asked as though you have to pick one, and you do not. Almost every MCP server is a wrapper around an API, so the protocol is not competing with REST, it is sitting on top of it and adding the parts an agent needs. Which means the real decision is not MCP or API. It is who writes the wrapper, who holds the credential, and who pays the vendor. This post answers the comparison question properly and then answers that one.",[27,9042,9044],{"id":9043},"what-is-mcp-vs-api","What is MCP vs API?",[11,9046,9047,9048,9053],{},"An API is a contract for software that already knows what it wants. ",[18,9049,9052],{"href":9050,"rel":9051},"https:\u002F\u002Fmodelcontextprotocol.io\u002F",[124,125],"MCP"," is a protocol for describing tools to a model that does not, so it adds the self-description, discovery and session handling an agent needs on top of whatever the underlying API already does.",[232,9055,9057],{"id":9056},"what-an-api-assumes","What an API assumes",[11,9059,9060],{},"That a developer read the documentation. The client was written against a known contract, the auth scheme was configured once, the error codes were handled deliberately, and the schema lives in a repository rather than in the request path. None of that has to be discoverable at run time, because the discovery already happened, in a human's head, weeks ago.",[232,9062,9064],{"id":9063},"what-mcp-adds","What MCP adds",[11,9066,9067],{},"Three things an agent cannot do without. Tool listing, so the caller can ask what exists rather than being told. Machine-readable descriptions good enough for a model to choose correctly between similar tools. And a session, because a conversation with tool calls in it is stateful in a way a REST request is not.",[232,9069,9071],{"id":9070},"why-the-two-are-not-alternatives","Why the two are not alternatives",[11,9073,9074],{},"Because underneath, the MCP server is usually making the same HTTP call you would have made. The GitHub MCP server calls the GitHub API. A database MCP server runs SQL. When people report that \"MCP is just an API wrapper\", they are right, and the useful response is not to argue but to ask what the wrapper is worth. It is worth exactly the three things above, and it costs a layer in the path.",[482,9076,9077,9089],{},[485,9078,9079],{},[488,9080,9081,9083,9086],{},[491,9082,915],{},[491,9084,9085],{},"Direct API call",[491,9087,9088],{},"The same thing over MCP",[504,9090,9091,9100,9111,9122,9133,9144],{},[488,9092,9093,9096,9098],{},[509,9094,9095],{},"Who chose the endpoint",[509,9097,4544],{},[509,9099,8419],{},[488,9101,9102,9105,9108],{},[509,9103,9104],{},"Where the schema lives",[509,9106,9107],{},"Docs and your code",[509,9109,9110],{},"Advertised in the handshake",[488,9112,9113,9116,9119],{},[509,9114,9115],{},"Auth",[509,9117,9118],{},"Your app holds the key",[509,9120,9121],{},"The server holds it",[488,9123,9124,9127,9130],{},[509,9125,9126],{},"State",[509,9128,9129],{},"Stateless request",[509,9131,9132],{},"Session",[488,9134,9135,9138,9141],{},[509,9136,9137],{},"Cost of adding one",[509,9139,9140],{},"Write and deploy code",[509,9142,9143],{},"Nothing, if it is already in the catalog",[488,9145,9146,9149,9152],{},[509,9147,9148],{},"Cost of having many",[509,9150,9151],{},"Linear in integrations",[509,9153,9154],{},"Context, one description each",[11,9156,9157],{},"The pattern is that MCP moves the cost from code you write to context you spend.",[320,9159,9160],{},[11,9161,324,9162,119,9164],{},[38,9163,327],{},[18,9165,9166],{"href":4915},"MCP Server for Live Web Data: Which One?",[27,9168,9170],{"id":9169},"when-should-you-use-mcp-vs-an-api","When should you use MCP vs an API?",[11,9172,9173],{},"Use a direct API call when your code knows what it needs, and MCP when the agent decides. That single question predicts the right answer more reliably than any feature comparison, and it is worth applying per capability rather than per project.",[232,9175,9177],{"id":9176},"cases-where-the-direct-call-wins","Cases where the direct call wins",[11,9179,9180],{},"A scheduled job that enriches yesterday's signups. A webhook handler. Anything inside a deterministic pipeline. The endpoint is fixed, the schema is known, and wrapping it in a protocol so a model can discover it is pure overhead: you are paying context tokens to tell a model about a choice it does not get to make. Write the HTTP call.",[232,9182,9184],{"id":9183},"cases-where-mcp-wins","Cases where MCP wins",[11,9186,9187],{},"An agent that plans its own steps. A chat product where the next question is unknown. Anything where the set of tools needed depends on user input. Here the direct-call approach fails in a specific way: you cannot pre-wire the capability because you do not know which capability. The agent has to be able to ask.",[232,9189,9191],{"id":9190},"the-case-people-get-wrong","The case people get wrong",[11,9193,9194],{},"The middle. A team builds an agent, gives it four MCP servers because MCP is what agents use, and ends up with four tool descriptions burning context on every single turn for tools that only one code path ever calls. If a capability is only ever invoked from one place in your own code, that is an API call wearing a costume. Tool bloat is the standard name for the symptom, and over-wrapping is the standard cause.",[27,9196,9198],{"id":9197},"who-wraps-the-api-into-a-tool","Who wraps the API into a tool?",[11,9200,9201],{},"Somebody has to turn the HTTP endpoint into a described, discoverable, authenticated tool, and there are only three answers: you, the vendor, or a layer in between. This is the question the comparison posts skip, and it is the one that determines how much code you end up owning.",[232,9203,9205],{"id":9204},"you-write-it","You write it",[11,9207,9208],{},"Correct for anything specific to your product. Your own database, your internal service, your business logic. Nobody else can describe your domain, and an MCP server over your own API is a few hundred lines. The cost is that you now maintain it, including the tool descriptions, which are prompt engineering whether or not you call it that.",[232,9210,9212],{"id":9211},"the-vendor-ships-it","The vendor ships it",[11,9214,9215],{},"Increasingly common and usually the best option when it exists. The vendor knows their own API, and an official server is likelier to stay current than your wrapper. The cost is that you still sign up, hold a credential and, if the vendor charges, agree to their minimum before the first call. Thirty vendors means thirty of each.",[232,9217,9219],{"id":9218},"a-layer-does-it","A layer does it",[11,9221,9222,9223,8504,9226,9228],{},"One endpoint that already carries wrappers for many vendors, with the credentials and the billing behind it. This is what ",[18,9224,864],{"href":723,"rel":9225},[124,125],[18,9227,21],{"href":20},": one key and one balance let an agent discover and call over a thousand tools across many providers, billed per call, with no separate signup per vendor. It ships as an MCP server, and it routes tool calls only, never model prompts. There is no relationship with OpenRouter beyond borrowing the shape of their idea to explain ours.",[11,9230,9231],{},"The honest framing of the three is that they are not competitors. Most systems want all three: your own servers for your domain, official ones where they exist, and a catalog for the long tail nobody wants to individually procure.",[232,9233,235],{"id":234},[11,9235,238,9236,244],{},[18,9237,243],{"href":241,"rel":9238},[124,125],[131,9240,9242],{"className":9241,"code":249,"language":97,"meta":136},[248],[47,9243,249],{"__ignoreMap":136},[11,9245,254,9246,260],{},[18,9247,259],{"href":257,"rel":9248},[124,125],[232,9250,264],{"id":263},[131,9252,9253],{"className":133,"code":8536,"language":135,"meta":136,"style":136},[47,9254,9255,9265],{"__ignoreMap":136},[140,9256,9257,9259,9261,9263],{"class":142,"line":143},[140,9258,274],{"class":146},[140,9260,277],{"class":150},[140,9262,280],{"class":150},[140,9264,283],{"class":150},[140,9266,9267,9269,9271,9273,9275,9277,9279,9281,9283,9285],{"class":142,"line":166},[140,9268,147],{"class":146},[140,9270,290],{"class":150},[140,9272,293],{"class":150},[140,9274,8559],{"class":150},[140,9276,8562],{"class":150},[140,9278,8565],{"class":150},[140,9280,299],{"class":193},[140,9282,1114],{"class":150},[140,9284,305],{"class":183},[140,9286,8574],{"class":193},[11,9288,8577,9289,260],{},[18,9290,8582],{"href":8580,"rel":9291},[124,125],[232,9293,9295],{"id":9294},"step-1-find-the-wrapper-that-already-exists","Step 1. Find the wrapper that already exists",[11,9297,9298,9300],{},[38,9299,1131],{}," Searches the catalog by description, so the agent asks for a capability instead of naming a vendor whose existence it would have to already know.",[11,9302,9303,8596,9305,260],{},[38,9304,1137],{},[18,9306,1233],{"href":5582,"rel":9307},[124,125],[11,9309,9310],{},[38,9311,1148],{},[131,9313,9315],{"className":133,"code":9314,"language":135,"meta":136,"style":136},"monid discover -q \"company details from a domain name\"\n",[47,9316,9317],{"__ignoreMap":136},[140,9318,9319,9321,9323,9325,9327,9330],{"class":142,"line":143},[140,9320,147],{"class":146},[140,9322,2667],{"class":150},[140,9324,2670],{"class":150},[140,9326,2673],{"class":193},[140,9328,9329],{"class":150},"company details from a domain name",[140,9331,2679],{"class":193},[11,9333,9334,9336,9337,9339],{},[38,9335,1195],{}," Ranked endpoints with provider, description, billing shape and a ",[47,9338,5967],{}," tag where we have tested them.",[11,9341,9342,9344],{},[38,9343,1229],{}," Nothing, and this matters more than it sounds. Free discovery is what makes it rational for an agent to look before committing, which is exactly the behaviour a stack of per-vendor signups punishes.",[232,9346,9348],{"id":9347},"step-2-read-the-contract-since-the-agent-cannot-guess-it","Step 2. Read the contract, since the agent cannot guess it",[11,9350,9351,9353],{},[38,9352,1131],{}," Returns one endpoint's input schema, billing shape and provider docs link, which is the MCP self-description requirement satisfied without you writing it.",[11,9355,9356,119,9358,9363],{},[38,9357,1137],{},[18,9359,9361],{"href":569,"rel":9360},[124,125],[47,9362,8857],{}," matches a company from a name, website, LinkedIn URL or stock ticker against the People Data Labs company dataset.",[11,9365,9366],{},[38,9367,1148],{},[131,9369,9371],{"className":133,"code":9370,"language":135,"meta":136,"style":136},"monid inspect -p pdl -e \u002Fv5\u002Fcompany\u002Fenrich\n",[47,9372,9373],{"__ignoreMap":136},[140,9374,9375,9377,9379,9381,9383,9385],{"class":142,"line":143},[140,9376,147],{"class":146},[140,9378,151],{"class":150},[140,9380,154],{"class":150},[140,9382,9015],{"class":150},[140,9384,160],{"class":150},[140,9386,9387],{"class":150}," \u002Fv5\u002Fcompany\u002Fenrich\n",[11,9389,9390,9392,9393,9398],{},[38,9391,1195],{}," The accepted identifiers, the returned record shape (firmographics, funding, employee counts, tech stack, social profiles) and a match likelihood score, plus the billing shape and the ",[18,9394,9397],{"href":9395,"rel":9396},"https:\u002F\u002Fwww.peopledatalabs.com\u002F",[124,125],"People Data Labs"," docs URL.",[11,9400,9401,9403],{},[38,9402,1229],{}," Nothing. Verified live on 20 August 2026.",[232,9405,9407],{"id":9406},"step-3-call-it-without-ever-signing-up-for-the-vendor","Step 3. Call it without ever signing up for the vendor",[11,9409,9410,9412],{},[38,9411,1131],{}," Runs the endpoint and draws the shared balance at the price already shown. There is no account with the underlying provider, because the layer holds that relationship.",[11,9414,9415,119,9417,9422,9423,9428],{},[38,9416,1137],{},[18,9418,9420],{"href":569,"rel":9419},[124,125],[47,9421,8857],{}," for a one-to-one company match; ",[18,9424,9426],{"href":8674,"rel":9425},[124,125],[47,9427,1548],{}," when you need recent public coverage rather than a database record.",[11,9430,9431],{},[38,9432,1148],{},[131,9434,9436],{"className":133,"code":9435,"language":135,"meta":136,"style":136},"monid run -p pdl -e \u002Fv5\u002Fcompany\u002Fenrich -i '{\"website\": \"stripe.com\"}' -w 120\n",[47,9437,9438],{"__ignoreMap":136},[140,9439,9440,9442,9444,9446,9448,9450,9452,9454,9456,9459,9461,9463],{"class":142,"line":143},[140,9441,147],{"class":146},[140,9443,171],{"class":150},[140,9445,154],{"class":150},[140,9447,9015],{"class":150},[140,9449,160],{"class":150},[140,9451,9018],{"class":150},[140,9453,7819],{"class":150},[140,9455,194],{"class":193},[140,9457,9458],{"class":150},"{\"website\": \"stripe.com\"}",[140,9460,2045],{"class":193},[140,9462,8723],{"class":150},[140,9464,8727],{"class":8726},[11,9466,9467,9469],{},[38,9468,1195],{}," A single company record with a confidence score, which is the shape you want for enrichment: one input, one match, an explicit signal about whether to trust it.",[11,9471,9472,9474,9475,260],{},[38,9473,1229],{}," Cents per call, billed per call rather than per field, so an enrichment run costs the number of companies rather than the amount of data. Prices at ",[18,9476,1233],{"href":5582,"rel":9477},[124,125],[316,9479],{"prompt":9480},"take this list of company domains and return firmographics and funding for each, flagging any low-confidence matches",[320,9482,9483],{},[11,9484,324,9485,119,9487],{},[38,9486,327],{},[18,9488,9489],{"href":461},"Turn a Domain Into Full Company Firmographics in One Call",[27,9491,9493],{"id":9492},"what-does-mcp-cost-compared-to-calling-the-api-directly","What does MCP cost compared to calling the API directly?",[11,9495,9496],{},"MCP itself costs context, not money. The protocol adds tool descriptions to every turn, which is a token cost that scales with how many tools you advertise, and that is the entire overhead of MCP as a protocol. What costs money is the vendor underneath, and there the comparison depends on who holds the account.",[232,9498,9500],{"id":9499},"the-context-cost-which-is-the-real-one","The context cost, which is the real one",[11,9502,9503],{},"Every advertised tool has a name, a description and a schema, and all of it sits in the model's context on each turn. Advertise forty tools and a meaningful slice of the window is a menu. This is why a large catalog has to be reached through a search tool rather than a flat list: one discovery tool in context beats a thousand definitions, and the agent pulls the schema for the one it picks.",[232,9505,9507],{"id":9506},"the-money-cost-which-depends-on-the-account","The money cost, which depends on the account",[11,9509,9510,9511,260],{},"Calling a vendor's API directly means you have that vendor's contract, which for paid data usually means a plan with a monthly floor. Calling the same vendor through a layer means the layer has the contract, and you pay per call. For a capability you use constantly, the direct contract is usually cheaper at volume. For a capability you use occasionally, or might not use at all, per call is cheaper than a floor by the whole floor. There is a fuller treatment of that trade in ",[18,9512,2326],{"href":2325},[232,9514,9516],{"id":9515},"the-cost-nobody-prices","The cost nobody prices",[11,9518,9519],{},"The integration you did not build because procurement would have taken three weeks. That one does not show up in either column, and for an agent that is supposed to attempt unanticipated tasks it is the dominant term.",[320,9521,9522],{},[11,9523,324,9524,119,9526],{},[38,9525,327],{},[18,9527,9529],{"href":9528},"\u002Fblog\u002Fpdl-vs-akta-firmographics-cost","PDL vs Akta: the real per-record cost of firmographics",[27,9531,480],{"id":479},[482,9533,9534,9548],{},[485,9535,9536],{},[488,9537,9538,9540,9542,9544,9546],{},[491,9539,493],{},[491,9541,496],{},[491,9543,1443],{},[491,9545,1446],{},[491,9547,1449],{},[504,9549,9550,9568,9585,9602],{},[488,9551,9552,9555,9562,9564,9566],{},[509,9553,9554],{},"Domain to company record",[509,9556,9557],{},[18,9558,9560],{"href":569,"rel":9559},[124,125],[47,9561,8857],{},[509,9563,8860],{},[509,9565,8863],{},[509,9567,1471],{},[488,9569,9570,9572,9579,9581,9583],{},[509,9571,8810],{},[509,9573,9574],{},[18,9575,9577],{"href":8674,"rel":9576},[124,125],[47,9578,1548],{},[509,9580,8820],{},[509,9582,8823],{},[509,9584,1557],{},[488,9586,9587,9589,9596,9598,9600],{},[509,9588,8790],{},[509,9590,9591],{},[18,9592,9594],{"href":8674,"rel":9593},[124,125],[47,9595,3721],{},[509,9597,8800],{},[509,9599,8803],{},[509,9601,1471],{},[488,9603,9604,9606,9613,9615,9617],{},[509,9605,8830],{},[509,9607,9608],{},[18,9609,9611],{"href":8835,"rel":9610},[124,125],[47,9612,1484],{},[509,9614,4177],{},[509,9616,1490],{},[509,9618,1471],{},[11,9620,1560,9621,9623],{},[47,9622,607],{}," on 20 August 2026. The table gives the billing shape rather than a figure, because the shape is what changes your code and a number goes stale silently.",[27,9625,9627],{"id":9626},"when-is-a-direct-api-call-the-right-answer","When is a direct API call the right answer?",[11,9629,9630],{},"Whenever your code knows the endpoint. A cron job, a webhook, a deterministic pipeline: write the HTTP call, hold the key, skip the protocol. Wrapping a fixed call in MCP so a model can discover a choice it never makes is cost with no benefit, and it is the most common piece of over-engineering in agent codebases right now.",[11,9632,9633],{},"It is also right when you are at volume on one vendor. If a single capability dominates your usage, going direct on a committed plan will beat per-call pricing on that capability, and the honest recommendation is to do exactly that and keep the layer for everything else.",[11,9635,9636],{},"And if the vendor ships a good official MCP server and you only need that vendor, install it. Two servers configured once are simpler than any router, and a catalog earns its place when the vendor list is unknown at build time rather than when it is short.",[27,9638,696],{"id":695},[11,9640,9641],{},"MCP versus API is a malformed comparison, and noticing that is most of the answer. MCP wraps APIs; it does not replace them. So the choice in front of you is not a protocol choice, it is a question about ownership: for each capability, do you want to write the wrapper, install the vendor's, or reach one that already exists.",[11,9643,9644],{},"The rule that resolves it is who chooses the tool. If a developer chose, at build time, call the API directly and keep the context. If the agent chooses, at run time, it needs discovery, and discovery is the thing MCP exists to provide. Most systems have both kinds of capability and should stop trying to pick one pattern for all of them.",[11,9646,1600,9647,9649,9650,9652,9653,260],{},[47,9648,603],{}," for a capability you have been putting off integrating, then ",[47,9651,607],{}," the top result. Both are free, and you will know within a minute whether the wrapper already exists. Start at ",[18,9654,725],{"href":723,"rel":9655},[124,125],[27,9657,729],{"id":728},[731,9659,9661],{"q":9660},"What is an MCP server vs an API?",[11,9662,9663],{},"An MCP server is a program that exposes tools over the Model Context Protocol, and in most cases it is calling an API underneath. The server adds what an agent needs and a REST endpoint does not provide: a list of available tools, descriptions a model can choose between, and a session. So the comparison is layers rather than alternatives, and the practical question is who runs the server.",[731,9665,9667],{"q":9666},"What is the difference between MCP and a REST API?",[11,9668,9669],{},"REST is stateless and assumes the client was written against known documentation. MCP is stateful and assumes the client has to learn what exists at run time. That is why MCP has a handshake and a tool list where REST has neither, and why MCP costs context on every turn while REST costs nothing until you call it. Underneath, the MCP server is often making REST calls.",[731,9671,9673],{"q":9672},"MCP vs skills vs an SDK: how do they relate?",[11,9674,9675],{},"An SDK is a client library a developer imports, so the choice of what to call happens in code. MCP tools are advertised to a model, so the choice happens at run time. Skills sit between them: instructions that teach an agent a workflow, usually including which tools to call and in what order. They compose rather than compete, and a common shape is a skill that tells the agent how to use tools it reaches over MCP.",[731,9677,9679],{"q":9678},"Do I still need API keys if I use MCP?",[11,9680,9681],{},"Yes, but fewer, and this is one of the clearer wins. An MCP server holds the credentials for whatever it fronts, and your application holds one credential for the server. With per-vendor servers you still collect a key per vendor, just held one layer out. With a catalog layer you hold one key for the layer and it holds the vendor relationships, so adding a capability does not add a credential.",[421,9683,9686],{"category":9684,"title":9685},"company-enrichment","Skip the signup, keep the endpoint",[11,9687,9688],{},"Discover the wrapper, read its schema and per-call price for free, then run it. One key, one balance, no vendor contract.",[11,9690,9691],{},[758,9692,760],{},[762,9694,8945],{},{"title":136,"searchDepth":166,"depth":166,"links":9696},[9697,9702,9707,9717,9722,9723,9724,9725],{"id":9043,"depth":166,"text":9044,"children":9698},[9699,9700,9701],{"id":9056,"depth":187,"text":9057},{"id":9063,"depth":187,"text":9064},{"id":9070,"depth":187,"text":9071},{"id":9169,"depth":166,"text":9170,"children":9703},[9704,9705,9706],{"id":9176,"depth":187,"text":9177},{"id":9183,"depth":187,"text":9184},{"id":9190,"depth":187,"text":9191},{"id":9197,"depth":166,"text":9198,"children":9708},[9709,9710,9711,9712,9713,9714,9715,9716],{"id":9204,"depth":187,"text":9205},{"id":9211,"depth":187,"text":9212},{"id":9218,"depth":187,"text":9219},{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":9294,"depth":187,"text":9295},{"id":9347,"depth":187,"text":9348},{"id":9406,"depth":187,"text":9407},{"id":9492,"depth":166,"text":9493,"children":9718},[9719,9720,9721],{"id":9499,"depth":187,"text":9500},{"id":9506,"depth":187,"text":9507},{"id":9515,"depth":187,"text":9516},{"id":479,"depth":166,"text":480},{"id":9626,"depth":166,"text":9627},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fmcp-vs-api-for-ai-agents.png","MCP is not an alternative to APIs, it wraps them. The real question is who does the wrapping, and the answer decides how much code you write.","\u002Fimg\u002Fblog\u002Fmcp-vs-api-for-ai-agents-card.png",{},{"title":1058,"description":9727},"blog\u002Fguides\u002Fmcp-vs-api-for-ai-agents",[8986,6627,8987,1687,9733],"tool calling","data","5Tt38jbd0Q7VyoTiosYuOOGpc5yIZxDUn6EbF4Vet-w",{"id":9737,"title":9738,"author":6,"body":9739,"category":1674,"cover":10489,"description":10490,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":10491,"meta":10492,"navigation":790,"ogImage":787,"path":10493,"publishedAt":5712,"readTime":793,"seo":10494,"stem":10495,"tags":10496,"toolCategory":9734,"updatedAt":5712,"__hash__":10501},"blogGuides\u002Fblog\u002Fguides\u002Fn8n-data-layer-scraping-enrichment.md","The Data Layer for n8n: One Key Instead of a Node Per Vendor",{"type":8,"value":9740,"toc":10468},[9741,9744,9782,9788,9792,9795,9799,9805,9811,9817,9820,9824,9827,9830,9834,9902,9905,9914,9918,9921,9923,9928,9933,9938,9940,9976,9980,9985,9996,10000,10021,10026,10031,10035,10040,10057,10062,10067,10071,10076,10097,10102,10107,10111,10116,10119,10122,10134,10138,10141,10144,10150,10162,10168,10171,10173,10367,10372,10376,10379,10382,10385,10394,10400,10402,10405,10408,10411,10414,10416,10419,10422,10433,10435,10441,10447,10456,10462,10466],[11,9742,9743],{"style":810},"Copy this line to your agent to build the data step of an n8n workflow.",[131,9745,9747],{"className":814,"code":9746,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and find the endpoint that enriches a company domain into firmographics\n",[47,9748,9749],{"__ignoreMap":136},[140,9750,9751,9753,9755,9757,9759,9761,9763,9765,9768,9771,9773,9775,9777,9779],{"class":142,"line":143},[140,9752,824],{"class":823},[140,9754,827],{"class":150},[140,9756,830],{"class":150},[140,9758,833],{"class":150},[140,9760,4379],{"class":150},[140,9762,3370],{"class":150},[140,9764,4387],{"class":150},[140,9766,9767],{"class":150}," that",[140,9769,9770],{"class":150}," enriches",[140,9772,851],{"class":150},[140,9774,8255],{"class":150},[140,9776,9028],{"class":150},[140,9778,1734],{"class":150},[140,9780,9781],{"class":150}," firmographics\n",[11,9783,9784,9785,9787],{},"n8n is good at the part people worry about and bad at nothing in particular. The workflows hold up. What does not hold up is the layer underneath them, the place where a scraper, an enrichment vendor or a social endpoint supplies the rows, because that layer is somebody else's product and it changes without asking. Every long r\u002Fn8n thread about a broken automation is really a thread about that. Monid is ",[18,9786,21],{"href":20},": one key and one balance across many providers, which in an n8n context means the data step is an HTTP Request node whose provider is a variable.",[27,9789,9791],{"id":9790},"why-does-the-scraping-layer-break-an-n8n-workflow-more-often-than-the-workflow-does","Why does the scraping layer break an n8n workflow more often than the workflow does?",[11,9793,9794],{},"Because the workflow is yours and the data source is not. An n8n canvas changes when you change it. A scraping endpoint changes when a platform ships a layout, when a vendor deprecates an actor, or when an account gets rate limited, and none of those events reach your canvas as an error.",[232,9796,9798],{"id":9797},"the-three-failures-and-why-none-of-them-raise-an-exception","The three failures, and why none of them raise an exception",[11,9800,9801,9804],{},[38,9802,9803],{},"A restricted account returns a page."," Not a 403, a page. Often a login wall or an interstitial, rendered and served with a 200. Whatever parses it gets valid HTML and extracts nothing.",[11,9806,9807,9810],{},[38,9808,9809],{},"A truncated result is a short list."," Pagination that stops early, a rate limit that trims a response, a vendor silently capping results, all produce a shorter array rather than an error. The workflow iterates it happily.",[11,9812,9813,9816],{},[38,9814,9815],{},"A changed selector returns null."," The request succeeds, the shape is right, the field is empty. Downstream nodes write empty strings into a CRM, which is worse than writing nothing, because empty overwrites good data.",[11,9818,9819],{},"The r\u002Fn8n thread from someone struggling with the scraping layer for an Instagram and X assignment collects all three across ten comments. The build was never the problem.",[232,9821,9823],{"id":9822},"why-this-hits-automation-harder-than-it-hits-code","Why this hits automation harder than it hits code",[11,9825,9826],{},"A script that breaks gets run by a person who notices. A workflow that breaks runs on a schedule, at night, and reports success to nobody. The gap between failure and discovery is measured in days, and everything downstream keeps consuming the bad rows in the meantime.",[11,9828,9829],{},"That asymmetry is the whole argument for putting assertions in the data step specifically. It is the one node where a wrong answer looks exactly like a right one.",[232,9831,9833],{"id":9832},"one-node-per-vendor-versus-one-endpoint-with-a-variable","One node per vendor versus one endpoint with a variable",[482,9835,9836,9848],{},[485,9837,9838],{},[488,9839,9840,9842,9845],{},[491,9841,915],{},[491,9843,9844],{},"A community node per vendor",[491,9846,9847],{},"One HTTP node, provider in a variable",[504,9849,9850,9861,9871,9882,9892],{},[488,9851,9852,9855,9858],{},[509,9853,9854],{},"Adding a source",[509,9856,9857],{},"Install and configure another node",[509,9859,9860],{},"Change a string",[488,9862,9863,9866,9869],{},[509,9864,9865],{},"Vendor deprecates",[509,9867,9868],{},"Rewire the canvas",[509,9870,9860],{},[488,9872,9873,9876,9879],{},[509,9874,9875],{},"Credentials",[509,9877,9878],{},"One per vendor, each stored separately",[509,9880,9881],{},"One key, one balance",[488,9883,9884,9887,9890],{},[509,9885,9886],{},"Failure surface",[509,9888,9889],{},"Each node's own error shape",[509,9891,6788],{},[488,9893,9894,9896,9899],{},[509,9895,3531],{},[509,9897,9898],{},"One vendor you are committed to",[509,9900,9901],{},"Workflows that touch several sources",[11,9903,9904],{},"The trade is real: a dedicated node gives you typed parameters and a nicer editing experience. What it costs you is the ability to change your mind cheaply.",[320,9906,9907],{},[11,9908,324,9909,119,9911],{},[38,9910,327],{},[18,9912,9913],{"href":5687},"A Model Is Half an Agent: AIHubMix for Models, Monid for Tools",[27,9915,9917],{"id":9916},"how-do-i-build-a-lead-enrichment-workflow-in-n8n-to-find-social-media-profiles","How do I build a lead enrichment workflow in n8n to find social media profiles?",[11,9919,9920],{},"Four nodes, and only one of them is the interesting part. Trigger, resolve the company, find the people, enrich the profiles. The mistake almost everyone makes is doing these in the wrong order and paying person prices for company facts.",[232,9922,235],{"id":234},[11,9924,238,9925,244],{},[18,9926,243],{"href":241,"rel":9927},[124,125],[131,9929,9931],{"className":9930,"code":249,"language":97,"meta":136},[248],[47,9932,249],{"__ignoreMap":136},[11,9934,254,9935,260],{},[18,9936,259],{"href":257,"rel":9937},[124,125],[232,9939,264],{"id":263},[131,9941,9942],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,9943,9944,9954],{"__ignoreMap":136},[140,9945,9946,9948,9950,9952],{"class":142,"line":143},[140,9947,274],{"class":146},[140,9949,277],{"class":150},[140,9951,280],{"class":150},[140,9953,283],{"class":150},[140,9955,9956,9958,9960,9962,9964,9966,9968,9970,9972,9974],{"class":142,"line":166},[140,9957,147],{"class":146},[140,9959,290],{"class":150},[140,9961,293],{"class":150},[140,9963,296],{"class":150},[140,9965,299],{"class":193},[140,9967,302],{"class":150},[140,9969,305],{"class":183},[140,9971,308],{"class":193},[140,9973,311],{"class":150},[140,9975,314],{"class":150},[232,9977,9979],{"id":9978},"step-1-resolve-the-company-before-you-touch-a-person","Step 1. Resolve the company before you touch a person",[11,9981,9982,9984],{},[38,9983,1131],{}," Turns a domain, a name or a URL into firmographics, so the expensive person-level calls only run against accounts that qualify.",[11,9986,9987,119,9989,9995],{},[38,9988,1137],{},[18,9990,9992],{"href":9991},"\u002Ftools\u002Fcompany-enrichment",[47,9993,9994],{},"apollo\u002Forganizations\u002Fenrich"," takes a domain, LinkedIn URL, name or website and returns firmographics, funding and technology data in one call.",[11,9997,9998],{},[38,9999,1148],{},[131,10001,10003],{"className":133,"code":10002,"language":135,"meta":136,"style":136},"monid inspect -p apollo -e \u002Forganizations\u002Fenrich\n",[47,10004,10005],{"__ignoreMap":136},[140,10006,10007,10009,10011,10013,10016,10018],{"class":142,"line":143},[140,10008,147],{"class":146},[140,10010,151],{"class":150},[140,10012,154],{"class":150},[140,10014,10015],{"class":150}," apollo",[140,10017,160],{"class":150},[140,10019,10020],{"class":150}," \u002Forganizations\u002Fenrich\n",[11,10022,10023,10025],{},[38,10024,1195],{}," Enough to disqualify most rows before they cost anything. Headcount, industry and stack are usually what the filter was really about.",[11,10027,10028,10030],{},[38,10029,1229],{}," Per call, so it costs the same whatever comes back. Putting this node first is the single biggest cost lever in the whole workflow, because it removes rows before the per-result nodes see them.",[232,10032,10034],{"id":10033},"step-2-find-the-people-with-a-narrow-filter-and-a-hard-cap","Step 2. Find the people, with a narrow filter and a hard cap",[11,10036,10037,10039],{},[38,10038,1131],{}," Turns company criteria into a list of profiles.",[11,10041,10042,119,10044,10050,10051,10056],{},[38,10043,1137],{},[18,10045,10047],{"href":10046},"\u002Ftools\u002Flinkedin",[47,10048,10049],{},"apify\u002Fharvestapi\u002Flinkedin-profile-search"," filters by job title, company, school, location, industry, seniority and headcount. ",[18,10052,10053],{"href":10046},[47,10054,10055],{},"apify\u002Fharvestapi\u002Flinkedin-company-employees"," walks one company's staff directly, which is usually the right shape inside a lead workflow.",[11,10058,10059,10061],{},[38,10060,1195],{}," Search pages, then profile records at the depth you requested.",[11,10063,10064,10066],{},[38,10065,1229],{}," Per result, on more than one tier, which makes a wide filter the classic n8n cost accident. Cap the item count in the node itself, not just in the query, and look at one page before letting the schedule run it.",[232,10068,10070],{"id":10069},"step-3-enrich-the-profiles-that-survived","Step 3. Enrich the profiles that survived",[11,10072,10073,10075],{},[38,10074,1131],{}," Fills in the record you are actually going to use.",[11,10077,10078,119,10080,10085,10086,10090,10091,10096],{},[38,10079,1137],{},[18,10081,10082],{"href":5030},[47,10083,10084],{},"apify\u002Fdev_fusion\u002Flinkedin-profile-scraper"," for LinkedIn, ",[18,10087,10088],{"href":7528},[47,10089,7511],{}," when the social profile is the target, and ",[18,10092,10093],{"href":7788},[47,10094,10095],{},"tikhub"," endpoints where per-call billing suits a spot check better than per-result.",[11,10098,10099,10101],{},[38,10100,1195],{}," For LinkedIn, verified 2026-08-20: work history, education, skills, certifications and discovered contacts. For Instagram: follower and following counts, verification date, join date and recent media.",[11,10103,10104,10106],{},[38,10105,1229],{}," Per result, and this is where the money goes, which is why the two nodes above it exist.",[232,10108,10110],{"id":10109},"step-4-assert-before-you-write","Step 4. Assert before you write",[11,10112,10113,10115],{},[38,10114,1131],{}," Stops the silent failures from reaching your CRM.",[11,10117,10118],{},"One IF node, checking that a field you actually consume is populated on the record, and a Stop and Error branch when it is not. Not the status code, the field. This is four minutes of work and it is the difference between finding out tonight and finding out next quarter.",[316,10120],{"prompt":10121},"build me the data step: resolve this domain to firmographics, then find the heads of engineering, then enrich only the ones at companies over 200 people",[320,10123,10124],{},[11,10125,324,10126,119,10128,102,10132],{},[38,10127,327],{},[18,10129,10131],{"href":10130},"\u002Fblog\u002Flinkedin-profile-url-to-enriched-lead","Turn a LinkedIn Profile URL Into an Enriched Lead",[18,10133,7863],{"href":7862},[27,10135,10137],{"id":10136},"apify-got-barred-from-scraping-apollo-what-should-i-use-to-pull-fresh-leads-instead","Apify got barred from scraping Apollo. What should I use to pull fresh leads instead?",[11,10139,10140],{},"That is the question as it was asked on r\u002Fn8n, and the premise deserves separating from the answer. What is verifiable is that people building lead workflows keep discovering that a specific source stopped working for reasons outside their build. What that source was on any given month is less useful than what it implies, which is that the sourcing step is the least stable node in a lead workflow and should be designed as replaceable rather than as correct.",[11,10142,10143],{},"The practical answer is to stop thinking of it as one source. Fresh leads come from at least three different shapes of data, and a workflow that depends on one of them is a workflow with a single point of failure:",[11,10145,10146,10149],{},[38,10147,10148],{},"Directory-shaped sources"," give you a filtered list from criteria. Profile search endpoints do this, and they are what most people mean by lead sourcing.",[11,10151,10152,10155,10156,10161],{},[38,10153,10154],{},"Signal-shaped sources"," give you a reason to reach out now rather than a name. Post and activity endpoints like ",[18,10157,10158],{"href":10046},[47,10159,10160],{},"apify\u002Fharvestapi\u002Flinkedin-profile-posts"," return engagement and comments, and a workflow triggered by a signal converts differently from one triggered by a filter.",[11,10163,10164,10167],{},[38,10165,10166],{},"Company-shaped sources"," give you the account and let you find people afterwards. This is the cheapest route and the most durable, because company data is available from more places than person data and is far less contested.",[11,10169,10170],{},"If the sourcing step is a variable rather than a node, losing one of the three is a bad week rather than a rebuild. If it is a hard-wired integration, it is the rebuild the thread was about.",[27,10172,480],{"id":479},[482,10174,10175,10191],{},[485,10176,10177],{},[488,10178,10179,10181,10183,10185,10187,10189],{},[491,10180,496],{},[491,10182,6334],{},[491,10184,1443],{},[491,10186,1446],{},[491,10188,3531],{},[491,10190,1449],{},[504,10192,10193,10215,10238,10261,10283,10305,10327,10347],{},[488,10194,10195,10201,10204,10207,10210,10213],{},[509,10196,10197],{},[18,10198,10199],{"href":9991},[47,10200,9994],{},[509,10202,10203],{},"Company firmographics",[509,10205,10206],{},"Domain, name or LinkedIn URL",[509,10208,10209],{},"Firmographics, funding, tech stack",[509,10211,10212],{},"The qualifying node, first in the flow",[509,10214,542],{},[488,10216,10217,10223,10226,10229,10232,10235],{},[509,10218,10219],{},[18,10220,10221],{"href":10046},[47,10222,10049],{},[509,10224,10225],{},"Filtered profile search",[509,10227,10228],{},"Title, company, seniority, location",[509,10230,10231],{},"Search pages plus profiles",[509,10233,10234],{},"Building the list",[509,10236,10237],{},"Per result, tiered",[488,10239,10240,10246,10249,10252,10255,10258],{},[509,10241,10242],{},[18,10243,10244],{"href":10046},[47,10245,10055],{},[509,10247,10248],{},"One company's staff",[509,10250,10251],{},"Company plus filters",[509,10253,10254],{},"Employee profiles",[509,10256,10257],{},"Account-based workflows",[509,10259,10260],{},"Per result plus a flat fee",[488,10262,10263,10269,10272,10275,10278,10281],{},[509,10264,10265],{},[18,10266,10267],{"href":5030},[47,10268,10084],{},[509,10270,10271],{},"Full profile enrichment",[509,10273,10274],{},"Profile URLs",[509,10276,10277],{},"History, skills, discovered contacts",[509,10279,10280],{},"The enrichment node",[509,10282,3551],{},[488,10284,10285,10291,10294,10297,10300,10303],{},[509,10286,10287],{},[18,10288,10289],{"href":7528},[47,10290,7511],{},[509,10292,10293],{},"Public Instagram profile",[509,10295,10296],{},"Usernames",[509,10298,10299],{},"Counts, bio, links, join date",[509,10301,10302],{},"Social profile enrichment",[509,10304,3551],{},[488,10306,10307,10313,10316,10319,10322,10325],{},[509,10308,10309],{},[18,10310,10311],{"href":10046},[47,10312,10160],{},[509,10314,10315],{},"Posts with engagement",[509,10317,10318],{},"Profile or page",[509,10320,10321],{},"Posts and comments",[509,10323,10324],{},"Signal-triggered outreach",[509,10326,3551],{},[488,10328,10329,10335,10338,10340,10342,10345],{},[509,10330,10331],{},[18,10332,10333],{"href":1545},[47,10334,6015],{},[509,10336,10337],{},"Live web search",[509,10339,6358],{},[509,10341,6427],{},[509,10343,10344],{},"Filling gaps the enrichers miss",[509,10346,542],{},[488,10348,10349,10355,10358,10360,10362,10365],{},[509,10350,10351],{},[18,10352,10353],{"href":1502},[47,10354,1484],{},[509,10356,10357],{},"A page as clean Markdown",[509,10359,7168],{},[509,10361,7171],{},[509,10363,10364],{},"Reading a company site in-workflow",[509,10366,542],{},[11,10368,1560,10369,10371],{},[47,10370,607],{}," on 2026-08-20. The billing column is the shape rather than a figure, because per call and per result decide where in the flow a node belongs, and a price does not stay true.",[27,10373,10375],{"id":10374},"what-does-the-data-layer-actually-cost-in-a-running-workflow","What does the data layer actually cost in a running workflow?",[11,10377,10378],{},"The cost is set by node order, not by node choice, and that is the useful thing to know before optimising anything.",[11,10380,10381],{},"A lead workflow that qualifies on company data first and enriches second spends per-call money on every row and per-result money on the survivors. The same workflow with those two steps reversed spends per-result money on every row. Same endpoints, same output, and the second one can cost an order of magnitude more on a list with a low qualification rate.",[11,10383,10384],{},"A realistic sourcing and enrichment run over a few hundred qualified leads lands in single-digit dollars. The scenario that produces a surprising bill is almost never a repeated small workflow, it is one wide filter that matched far more people than intended and ran unattended overnight.",[11,10386,10387,10388,10390,10391,260],{},"Discovery and inspection stay free, so the billing shape of every node is readable before you wire it. That is what makes a metered balance suit automation: access costs nothing until it is used, so an idle workflow costs nothing at all, which a per-seat tool does not. Where metered loses is steady, high, predictable volume, covered in ",[18,10389,6511],{"href":2325},". Prices at ",[18,10392,1233],{"href":5582,"rel":10393},[124,125],[421,10395,10397],{"category":9734,"title":10396},"Wire the data step once",[11,10398,10399],{},"Discover the endpoint, read its schema and billing shape, and call it from an HTTP Request node. Nothing bills until you run.",[27,10401,657],{"id":656},[11,10403,10404],{},"If you use exactly one vendor and expect to keep using it, install its node. A dedicated community node gives you typed fields, inline documentation and a better editing experience than a generic HTTP call, and the flexibility you give up is flexibility you were not going to use.",[11,10406,10407],{},"If your workflow needs a native n8n trigger from a specific service, the integration has to be that service's. Nothing generic can replace a webhook that a vendor only fires into its own node, and dressing that up as a limitation of the vendor would be dishonest.",[11,10409,10410],{},"If you are inside a platform that already bundles the data, use what you have. Teams on a sales platform with enrichment credits included should spend those credits before adding a second bill, and the same goes for anyone whose CRM already ships the firmographics they were about to buy.",[11,10412,10413],{},"And if the workflow is a one-off you will run twice and delete, do the simplest thing. Any layer of indirection is a cost paid for future change, and some workflows have no future.",[27,10415,696],{"id":695},[11,10417,10418],{},"n8n workflows do not usually fail at the logic, they fail at the data, and the data layer fails quietly. Design that layer for replacement rather than for correctness: provider and endpoint in variables, one credential rather than one per vendor, and an assertion on a field you actually consume rather than on a status code.",[11,10420,10421],{},"What matters more than which endpoint you pick: node order sets the bill. Put the per-call qualifying step before the per-result enriching step and the same workflow costs a fraction of what it otherwise would, because the expensive nodes only see rows that survived a cheap one. That reordering takes ten minutes and outperforms any amount of vendor shopping.",[11,10423,7340,10424,10426,10427,10429,10430,260],{},[47,10425,603],{}," for the step you are about to wire, ",[47,10428,607],{}," to read its schema and billing shape, then one small paid run against ten rows before the schedule ever touches ten thousand. Start at ",[18,10431,725],{"href":723,"rel":10432},[124,125],[27,10434,729],{"id":728},[731,10436,10438],{"q":10437},"Do I need a community node, or is the HTTP Request node enough?",[11,10439,10440],{},"The HTTP Request node is enough, and it is the more durable choice when a workflow touches more than one data source. A community node buys you typed parameters and inline docs for one vendor; an HTTP node with the provider and endpoint held in workflow variables buys you the ability to swap that vendor without editing the canvas. Pick the node if you are committed to the vendor, and the variable if you are not.",[731,10442,10444],{"q":10443},"How do I stop a partial result from passing as a success?",[11,10445,10446],{},"Assert on a field you consume, not on the status code, because every quiet failure in this category returns a 200. Add an IF node after the data step that checks a specific field is present and non-empty on a known-good record, and route the false branch to Stop and Error. A truncated list, a login wall and a changed selector all fail that check and all pass a status check.",[731,10448,10450],{"q":10449},"Should the agent pick the endpoint, or should the workflow?",[11,10451,10452,10453,10455],{},"The workflow, for anything on a schedule; the agent, for anything exploratory. A scheduled workflow wants a fixed, cheap, predictable call, and letting a model choose the endpoint each run makes the bill and the output shape both variable. An agent doing research benefits from the opposite property, which is why ",[47,10454,4274],{}," exists as a runtime call rather than only as a design-time one.",[731,10457,10459],{"q":10458},"What breaks first when I scale a workflow from ten rows to ten thousand?",[11,10460,10461],{},"The per-result nodes and the rate limits, in that order, and both show up as cost before they show up as errors. The thread from someone pulling a thousand LinkedIn leads a day collected ninety-three comments and the recurring advice is the same: cap the item count at the node, batch where billing is per call and loop where it is per result, and add the assertion before you add the volume.",[11,10463,10464],{},[758,10465,760],{},[762,10467,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":10469},[10470,10475,10483,10484,10485,10486,10487,10488],{"id":9790,"depth":166,"text":9791,"children":10471},[10472,10473,10474],{"id":9797,"depth":187,"text":9798},{"id":9822,"depth":187,"text":9823},{"id":9832,"depth":187,"text":9833},{"id":9916,"depth":166,"text":9917,"children":10476},[10477,10478,10479,10480,10481,10482],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":9978,"depth":187,"text":9979},{"id":10033,"depth":187,"text":10034},{"id":10069,"depth":187,"text":10070},{"id":10109,"depth":187,"text":10110},{"id":10136,"depth":166,"text":10137},{"id":479,"depth":166,"text":480},{"id":10374,"depth":166,"text":10375},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fn8n-data-layer-scraping-enrichment.png","n8n workflows rarely break at the logic. They break at the data source. Build the scraping and enrichment layer so a dead provider is a config change.","\u002Fimg\u002Fblog\u002Fn8n-data-layer-scraping-enrichment-card.png",{},"\u002Fblog\u002Fguides\u002Fn8n-data-layer-scraping-enrichment",{"title":9738,"description":10490},"blog\u002Fguides\u002Fn8n-data-layer-scraping-enrichment",[10497,10498,10499,10500,1638],"n8n","automation","enrichment","scraping","uu0DudJGZuWm1pPYD7cUj-eeSXgvGtQLEeQGxrImXN0",{"id":10503,"title":10504,"author":6,"body":10505,"category":1674,"cover":11192,"description":11193,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":11194,"meta":11195,"navigation":790,"ogImage":787,"path":11196,"publishedAt":5712,"readTime":1681,"seo":11197,"stem":11198,"tags":11199,"toolCategory":8934,"updatedAt":5712,"__hash__":11201},"blogGuides\u002Fblog\u002Fguides\u002Fopenrouter-alternatives-after-stripe.md","OpenRouter Alternatives in 2026: Models, and Then Tools",{"type":8,"value":10506,"toc":11164},[10507,10510,10546,10554,10558,10561,10565,10591,10594,10598,10610,10613,10617,10620,10628,10632,10640,10644,10653,10656,10660,10663,10666,10670,10673,10676,10680,10683,10687,10690,10694,10697,10701,10708,10712,10722,10725,10727,10732,10737,10742,10744,10780,10785,10789,10794,10803,10807,10827,10835,10843,10847,10852,10862,10866,10886,10897,10901,10905,10910,10926,10930,10966,10971,10982,10985,10995,10997,11086,11091,11095,11098,11101,11104,11106,11109,11112,11123,11125,11131,11137,11146,11152,11158,11162],[11,10508,10509],{"style":810},"Copy this line to your agent to give it live tools rather than another model.",[131,10511,10512],{"className":814,"code":3335,"language":816,"meta":136,"style":136},[47,10513,10514],{"__ignoreMap":136},[140,10515,10516,10518,10520,10522,10524,10526,10528,10530,10532,10534,10536,10538,10540,10542,10544],{"class":142,"line":143},[140,10517,824],{"class":823},[140,10519,827],{"class":150},[140,10521,830],{"class":150},[140,10523,833],{"class":150},[140,10525,836],{"class":150},[140,10527,1718],{"class":150},[140,10529,3354],{"class":150},[140,10531,845],{"class":150},[140,10533,3359],{"class":150},[140,10535,851],{"class":150},[140,10537,3364],{"class":150},[140,10539,3367],{"class":150},[140,10541,3370],{"class":150},[140,10543,3373],{"class":150},[140,10545,3376],{"class":150},[11,10547,10548,10549,10553],{},"On 16 August 2026, Bloomberg reported that Stripe had agreed to acquire OpenRouter for more than seven billion dollars, and ",[18,10550,10552],{"href":8332,"rel":10551},[124,125],"Stripe confirmed the deal in its own newsroom",". Three months earlier OpenRouter had raised a Series B at a reported 1.3 billion dollar valuation. So the honest reading of \"what are the OpenRouter alternatives\" changed twice this year: once when the category got funded, and once when it got bought. This post answers the question on the model side with real options, then makes a second argument: routing has two halves, and only one of them just sold.",[27,10555,10557],{"id":10556},"what-are-openrouter-alternatives","What are OpenRouter alternatives?",[11,10559,10560],{},"The direct alternatives to OpenRouter are other model gateways, and the useful way to sort them is by who runs the process. OpenRouter itself sits in front of hundreds of models from dozens of providers and gives you one key, one balance and one request format for all of them. Anything that claims to replace it has to do that same job.",[232,10562,10564],{"id":10563},"hosted-gateways","Hosted gateways",[11,10566,10567,98,10572,102,10577,10582,10583,10586,10587,10590],{},[18,10568,10571],{"href":10569,"rel":10570},"https:\u002F\u002Fportkey.ai\u002F",[124,125],"Portkey",[18,10573,10576],{"href":10574,"rel":10575},"https:\u002F\u002Fwww.requesty.ai\u002F",[124,125],"Requesty",[18,10578,10581],{"href":10579,"rel":10580},"https:\u002F\u002Fwww.helicone.ai\u002F",[124,125],"Helicone"," all sit in the same shape: you point your client at their OpenAI-compatible endpoint instead of a provider's, and they handle key management, fallback and observability across models. Requesty is the closest structural match to OpenRouter of the three, being a managed router across hundreds of models with no self-hosting, and it publishes an EU-resident endpoint, which is the deciding factor for some teams before any feature comparison starts. ",[18,10584,8304],{"href":8302,"rel":10585},[124,125]," does the routing and caching layer without being a model marketplace, which suits teams already on Cloudflare. ",[18,10588,8299],{"href":8297,"rel":10589},[124,125]," is the cloud-native version of the idea: one API across a curated model set, with the billing already inside an AWS account.",[11,10592,10593],{},"The trade in this group is the usual hosted trade. You get the aggregation without running anything, and you accept a hop in the request path and a vendor between you and the model.",[232,10595,10597],{"id":10596},"self-hosted-proxies","Self-hosted proxies",[11,10599,10600,10603,10604,10609],{},[18,10601,8293],{"href":8291,"rel":10602},[124,125]," is the answer most often given when someone asks for a self-hosted OpenRouter, and the comparison is common enough that \"openrouter vs litellm\" is its own search with an AI Overview attached. It normalises many provider APIs behind one OpenAI-compatible interface and you run it yourself. ",[18,10605,10608],{"href":10606,"rel":10607},"https:\u002F\u002Fgithub.com\u002FPortkey-AI\u002Fgateway",[124,125],"Portkey's gateway is also open source",", which makes it one of the few options you can start hosted and move in-house.",[11,10611,10612],{},"Self-hosting removes the vendor from the path and hands you the operational work instead. Nobody else rotates your keys or watches your fallback logic.",[232,10614,10616],{"id":10615},"what-none-of-them-replace","What none of them replace",[11,10618,10619],{},"Every option above routes prompts to models. None of them gives an agent a tool it did not already have. That distinction is not pedantic, and the rest of this post is about it, but it is worth stating plainly here because the search results conflate the two constantly: a model gateway makes your agent articulate, and a tool layer makes it useful.",[320,10621,10622],{},[11,10623,324,10624,119,10626],{},[38,10625,327],{},[18,10627,9913],{"href":5687},[27,10629,10631],{"id":10630},"why-did-stripe-buy-openrouter","Why did Stripe buy OpenRouter?",[11,10633,10634,10635,10639],{},"Stripe bought a metering and routing business, which is the same business Stripe is already in. OpenRouter's product decides, per request, which model should serve it and at what price, then bills for it. Strip out the word \"model\" and that is a payments company's description of itself. ",[18,10636,10638],{"href":8332,"rel":10637},[124,125],"Stripe's own announcement"," frames it as helping companies manage both sides of AI profitability: revenue on one side, inference cost on the other.",[232,10641,10643],{"id":10642},"what-that-says-about-the-category","What that says about the category",[11,10645,10646,10647,10652],{},"It says the routing layer is worth more than the routers thought. OpenRouter's Series B reportedly valued it at 1.3 billion dollars in May 2026; the acquisition price reported by Bloomberg and ",[18,10648,10651],{"href":10649,"rel":10650},"https:\u002F\u002Ffortune.com\u002F2026\u002F08\u002F16\u002Fstripe-7-billion-deal-ai-firm-openrouter-acquisition\u002F",[124,125],"Fortune"," in August was over seven billion. Whatever the exact figure turns out to be at close, the direction is one way: a company whose entire product is \"one key, one balance, many providers, billed per call\" was revalued several times over inside a single quarter.",[11,10654,10655],{},"That is the part worth carrying forward. The shape got validated, not just the company.",[232,10657,10659],{"id":10658},"what-it-means-if-you-are-already-on-openrouter","What it means if you are already on OpenRouter",[11,10661,10662],{},"This is the real reason \"alternatives\" spikes after an acquisition, and it deserves a straight answer rather than reassurance. An acquisition changes who sets the roadmap, and the honest position is that nobody outside the two companies knows yet what changes. What you can do is reduce how much a change would cost you.",[11,10664,10665],{},"The practical hedge is cheap and worth doing regardless: keep your calls in the OpenAI-compatible shape most gateways speak, keep the base URL in configuration rather than in code, and know which self-hosted option you would move to. If those three are true, switching gateway is a config change and a test run rather than a project. If they are not true, they are worth making true this quarter, and that is good advice under any owner.",[232,10667,10669],{"id":10668},"what-it-does-not-say","What it does not say",[11,10671,10672],{},"It does not say the tool half is solved. OpenRouter routes to models. An agent that has picked the perfect model still cannot read a page that is not in its training data, look up a company, pull a comment thread or place a call. Those are tool calls, they hit a different set of vendors, and each of those vendors still wants its own signup, its own key and usually its own monthly minimum.",[11,10674,10675],{},"So the routing layer has two halves, one of which just sold for billions and the other of which is still a pile of separate invoices.",[27,10677,10679],{"id":10678},"are-there-open-source-openrouter-alternatives","Are there open source OpenRouter alternatives?",[11,10681,10682],{},"Yes, and LiteLLM is the usual first stop, with Portkey's gateway as the other well-known one. Both are genuinely self-hostable and both normalise many provider APIs behind a single interface, which is the part people actually want when they ask this question.",[232,10684,10686],{"id":10685},"what-self-hosting-gets-you","What self-hosting gets you",[11,10688,10689],{},"Control over the request path, no third party holding your provider keys, and no per-request markup from an aggregator. If you are running enough volume that a routing hop matters, or you are in a regulatory position where a vendor in the path is a problem, this is the reason.",[232,10691,10693],{"id":10692},"what-it-costs-you","What it costs you",[11,10695,10696],{},"The operational surface. Model APIs change, rate limits move, a provider degrades and your fallback needs to notice. Hosted gateways absorb that and self-hosted ones hand it to you. Neither answer is wrong; they are priced differently in different currencies.",[232,10698,10700],{"id":10699},"the-same-question-one-layer-up","The same question, one layer up",[11,10702,10703,10704,10707],{},"The interesting version of this question is the one nobody asks yet: is there an open-source router for tools? Mostly what exists is per-vendor MCP servers, which is a thousand small integrations rather than one router. That is the shape of the problem ",[18,10705,10706],{"href":1001},"we wrote about in the MCP gateway guide",", and it is why the tool half still feels like 2023.",[27,10709,10711],{"id":10710},"is-there-an-openrouter-for-tools-instead-of-models","Is there an OpenRouter for tools instead of models?",[11,10713,10714,10715,10718,10719,10721],{},"That is what ",[18,10716,864],{"href":723,"rel":10717},[124,125]," is: ",[18,10720,21],{"href":20},". One key and one balance let an agent discover and call over a thousand tools across many providers, billed per call, with no separate signup or subscription per vendor. The agent picks the tool itself at run time, and it ships as an MCP server so the agent reaches it natively.",[11,10723,10724],{},"This is an analogy about shape, not a claim about category. Monid routes tool calls, never model prompts, and there is no relationship with OpenRouter beyond borrowing their shape to explain ours.",[232,10726,235],{"id":234},[11,10728,238,10729,244],{},[18,10730,243],{"href":241,"rel":10731},[124,125],[131,10733,10735],{"className":10734,"code":249,"language":97,"meta":136},[248],[47,10736,249],{"__ignoreMap":136},[11,10738,254,10739,260],{},[18,10740,259],{"href":257,"rel":10741},[124,125],[232,10743,264],{"id":263},[131,10745,10746],{"className":133,"code":8536,"language":135,"meta":136,"style":136},[47,10747,10748,10758],{"__ignoreMap":136},[140,10749,10750,10752,10754,10756],{"class":142,"line":143},[140,10751,274],{"class":146},[140,10753,277],{"class":150},[140,10755,280],{"class":150},[140,10757,283],{"class":150},[140,10759,10760,10762,10764,10766,10768,10770,10772,10774,10776,10778],{"class":142,"line":166},[140,10761,147],{"class":146},[140,10763,290],{"class":150},[140,10765,293],{"class":150},[140,10767,8559],{"class":150},[140,10769,8562],{"class":150},[140,10771,8565],{"class":150},[140,10773,299],{"class":193},[140,10775,1114],{"class":150},[140,10777,305],{"class":183},[140,10779,8574],{"class":193},[11,10781,8577,10782,260],{},[18,10783,8582],{"href":8580,"rel":10784},[124,125],[232,10786,10788],{"id":10787},"step-1-find-a-tool-without-knowing-the-vendor","Step 1. Find a tool without knowing the vendor",[11,10790,10791,10793],{},[38,10792,1131],{}," Searches the catalog semantically, so the agent describes the job rather than naming a provider it would have to already know about.",[11,10795,10796,10798,10799,10802],{},[38,10797,1137],{}," Discovery covers the whole catalog at ",[18,10800,1233],{"href":5582,"rel":10801},[124,125],", across web search, scraping, company and people data, social platforms, browser automation, generative media and agent telephony.",[11,10804,10805],{},[38,10806,1148],{},[131,10808,10810],{"className":133,"code":10809,"language":135,"meta":136,"style":136},"monid discover -q \"search the live web and return clean markdown\"\n",[47,10811,10812],{"__ignoreMap":136},[140,10813,10814,10816,10818,10820,10822,10825],{"class":142,"line":143},[140,10815,147],{"class":146},[140,10817,2667],{"class":150},[140,10819,2670],{"class":150},[140,10821,2673],{"class":193},[140,10823,10824],{"class":150},"search the live web and return clean markdown",[140,10826,2679],{"class":193},[11,10828,10829,10831,10832,10834],{},[38,10830,1195],{}," Ranked endpoints, each with its provider, a description, its billing shape and a ",[47,10833,5967],{}," tag where we have tested it.",[11,10836,10837,10839,10840,260],{},[38,10838,1229],{}," Nothing. Discovery and inspection are both free, which is what lets an agent carry the whole catalog and still only pay for the calls it makes. Current prices sit on ",[18,10841,1233],{"href":5582,"rel":10842},[124,125],[232,10844,10846],{"id":10845},"step-2-read-the-schema-before-spending-anything","Step 2. Read the schema before spending anything",[11,10848,10849,10851],{},[38,10850,1131],{}," Returns the exact input schema, the billing shape and the docs link, so the first paid call is not a guess.",[11,10853,10854,119,10856,10861],{},[38,10855,1137],{},[18,10857,10859],{"href":8674,"rel":10858},[124,125],[47,10860,1548],{}," runs a search and can scrape every result to markdown in the same round trip.",[11,10863,10864],{},[38,10865,1148],{},[131,10867,10869],{"className":133,"code":10868,"language":135,"meta":136,"style":136},"monid inspect -p context.dev -e \u002Fweb\u002Fsearch\n",[47,10870,10871],{"__ignoreMap":136},[140,10872,10873,10875,10877,10879,10881,10883],{"class":142,"line":143},[140,10874,147],{"class":146},[140,10876,151],{"class":150},[140,10878,154],{"class":150},[140,10880,1718],{"class":150},[140,10882,160],{"class":150},[140,10884,10885],{"class":150}," \u002Fweb\u002Fsearch\n",[11,10887,10888,10890,10891,98,10893,10896],{},[38,10889,1195],{}," The body schema (",[47,10892,3880],{},[47,10894,10895],{},"numResults",", domain allow and block lists, freshness window, markdown options), the billing shape and the provider's own documentation URL.",[11,10898,10899,9403],{},[38,10900,1229],{},[232,10902,10904],{"id":10903},"step-3-make-the-call","Step 3. Make the call",[11,10906,10907,10909],{},[38,10908,1131],{}," Runs the endpoint and bills the shared balance at the price already shown in step 2.",[11,10911,10912,119,10914,10919,10920,10925],{},[38,10913,1137],{},[18,10915,10917],{"href":8674,"rel":10916},[124,125],[47,10918,1548],{}," for search plus inline markdown; ",[18,10921,10923],{"href":8674,"rel":10922},[124,125],[47,10924,3721],{}," when you want neural retrieval and structured output over multiple sources instead.",[11,10927,10928],{},[38,10929,1148],{},[131,10931,10933],{"className":133,"code":10932,"language":135,"meta":136,"style":136},"monid run -p context.dev -e \u002Fweb\u002Fsearch \\\n  -i '{\"query\": \"stripe openrouter acquisition\", \"numResults\": 10}' -w 120\n",[47,10934,10935,10951],{"__ignoreMap":136},[140,10936,10937,10939,10941,10943,10945,10947,10949],{"class":142,"line":143},[140,10938,147],{"class":146},[140,10940,171],{"class":150},[140,10942,154],{"class":150},[140,10944,1718],{"class":150},[140,10946,160],{"class":150},[140,10948,3354],{"class":150},[140,10950,184],{"class":183},[140,10952,10953,10955,10957,10960,10962,10964],{"class":142,"line":166},[140,10954,190],{"class":150},[140,10956,194],{"class":193},[140,10958,10959],{"class":150},"{\"query\": \"stripe openrouter acquisition\", \"numResults\": 10}",[140,10961,2045],{"class":193},[140,10963,8723],{"class":150},[140,10965,8727],{"class":8726},[11,10967,10968,10970],{},[38,10969,1195],{}," Ranked results with url, title and relevance, plus the markdown body of each page when you ask for it, which is the difference between an agent that has links and an agent that has answers.",[11,10972,10973,10975,10976,10978,10979,260],{},[38,10974,1229],{}," A fraction of a cent per result on the search endpoint, and the charge tracks results rather than calls, so ",[47,10977,10895],{}," is the dial that moves the bill. The Exa endpoint bills per call instead. Prices at ",[18,10980,1233],{"href":5582,"rel":10981},[124,125],[316,10983],{"prompt":10984},"search the live web for the last week of coverage on a company and return clean markdown for each result",[320,10986,10987],{},[11,10988,324,10989,119,10991],{},[38,10990,327],{},[18,10992,10994],{"href":10993},"\u002Fblog\u002Flive-web-search-your-agent-can-call","Live Web Search Your Agent Can Actually Call",[27,10996,480],{"id":479},[482,10998,10999,11013],{},[485,11000,11001],{},[488,11002,11003,11005,11007,11009,11011],{},[491,11004,493],{},[491,11006,496],{},[491,11008,1443],{},[491,11010,1446],{},[491,11012,1449],{},[504,11014,11015,11032,11052,11069],{},[488,11016,11017,11019,11026,11028,11030],{},[509,11018,8810],{},[509,11020,11021],{},[18,11022,11024],{"href":8674,"rel":11023},[124,125],[47,11025,1548],{},[509,11027,8820],{},[509,11029,8823],{},[509,11031,1557],{},[488,11033,11034,11037,11044,11047,11050],{},[509,11035,11036],{},"Neural search with structured output",[509,11038,11039],{},[18,11040,11042],{"href":8674,"rel":11041},[124,125],[47,11043,3721],{},[509,11045,11046],{},"query, type, category",[509,11048,11049],{},"result list with optional contents",[509,11051,1471],{},[488,11053,11054,11056,11063,11065,11067],{},[509,11055,4168],{},[509,11057,11058],{},[18,11059,11061],{"href":8835,"rel":11060},[124,125],[47,11062,1484],{},[509,11064,2063],{},[509,11066,1490],{},[509,11068,1471],{},[488,11070,11071,11073,11080,11082,11084],{},[509,11072,8849],{},[509,11074,11075],{},[18,11076,11078],{"href":569,"rel":11077},[124,125],[47,11079,8857],{},[509,11081,8860],{},[509,11083,8863],{},[509,11085,1471],{},[11,11087,1560,11088,11090],{},[47,11089,607],{}," on 20 August 2026. The table states the billing shape rather than a figure, because the shape is what changes how you architect and it does not go stale. Per result means the row count is the dial; per call means the request is.",[27,11092,11094],{"id":11093},"when-is-monid-the-wrong-answer","When is Monid the wrong answer?",[11,11096,11097],{},"When you need a model gateway, use a model gateway. If your problem is \"I want to try Claude and GPT and Gemini behind one key and compare cost per token\", that is OpenRouter, LiteLLM, Portkey or Bedrock, and Monid does not compete for it. We are not in the inference path at all.",[11,11099,11100],{},"It is also the wrong answer when you have exactly one integration and it is going to stay that way. If your agent needs Slack and nothing else, install the Slack MCP server and stop reading. A router earns its place when the count of vendors is unknown at build time, which is the normal case for an agent that decides its own next step, and an unnecessary abstraction when the count is one.",[11,11102,11103],{},"And if the vendor you need has a free tier that covers your whole use case, take the free tier. A per-call layer is cheaper than a stack of subscriptions, not cheaper than zero.",[27,11105,696],{"id":695},[11,11107,11108],{},"The honest answer to \"what are the OpenRouter alternatives\" is that there are several good ones on the model side, and the choice mostly turns on whether you want to run the proxy yourself. Hosted if you want the aggregation without the operations, self-hosted if the request path or the keys matter enough to own.",[11,11110,11111],{},"The thing that matters more than the choice is that this whole conversation covers one half of the problem. Stripe paid a reported seven billion dollars for the half that routes prompts to models. The half that routes tool calls to vendors is still a folder of API keys and a stack of monthly minimums, and it is the half that decides whether your agent can actually do the job once it has finished talking about it.",[11,11113,1600,11114,11116,11117,11119,11120,260],{},[47,11115,603],{}," against a job your agent currently cannot do, then ",[47,11118,607],{}," on whatever comes back. Both are free and neither needs a decision. Start at ",[18,11121,725],{"href":723,"rel":11122},[124,125],[27,11124,729],{"id":728},[731,11126,11128],{"q":11127},"Is there a cheaper alternative to OpenRouter?",[11,11129,11130],{},"On the model side, self-hosting LiteLLM removes the aggregator's cut and leaves you paying providers directly, which is the cheapest structure if you already run infrastructure. Hosted gateways trade a small routing cost for not having to operate anything. On the tool side the comparison is different: a pay-per-call layer replaces several vendor subscriptions, so the saving comes from not paying monthly floors on tools you use occasionally.",[731,11132,11134],{"q":11133},"Are there OpenRouter alternatives with free models?",[11,11135,11136],{},"Several gateways expose free or free-tier model endpoints, and OpenRouter itself is the most commonly cited for this. Monid is not one of them, because we route tool calls rather than model prompts. New Monid accounts do get free starting credit, which covers real tool calls rather than tokens.",[731,11138,11140],{"q":11139},"Is OpenRouter an MCP server?",[11,11141,11142,11143,260],{},"No. OpenRouter is a model gateway: it accepts a prompt and routes it to one of many language models. MCP is the protocol an agent uses to call tools, and a model gateway does not expose tools over it. Monid does ship as an MCP server, which is why the two sit next to each other rather than replacing each other. There is a longer answer in ",[18,11144,11145],{"href":8764},"the OpenRouter and MCP guide",[731,11147,11149],{"q":11148},"Is there an OpenRouter alternative API I can point my existing code at?",[11,11150,11151],{},"For models, LiteLLM and Portkey both expose OpenAI-compatible endpoints, so existing clients usually work after a base URL change. For tools there is no drop-in equivalent, because there is no single tool API to be compatible with. That is the gap a tool router fills: one key and one schema across many providers, reached either through the CLI or as an MCP server.",[421,11153,11155],{"category":8934,"title":11154},"Give the agent the other half",[11,11156,11157],{},"Discover the tool, read its schema and its per-call price, then run it. One key, one balance, no seat and no monthly floor.",[11,11159,11160],{},[758,11161,760],{},[762,11163,8945],{},{"title":136,"searchDepth":166,"depth":166,"links":11165},[11166,11171,11176,11181,11188,11189,11190,11191],{"id":10556,"depth":166,"text":10557,"children":11167},[11168,11169,11170],{"id":10563,"depth":187,"text":10564},{"id":10596,"depth":187,"text":10597},{"id":10615,"depth":187,"text":10616},{"id":10630,"depth":166,"text":10631,"children":11172},[11173,11174,11175],{"id":10642,"depth":187,"text":10643},{"id":10658,"depth":187,"text":10659},{"id":10668,"depth":187,"text":10669},{"id":10678,"depth":166,"text":10679,"children":11177},[11178,11179,11180],{"id":10685,"depth":187,"text":10686},{"id":10692,"depth":187,"text":10693},{"id":10699,"depth":187,"text":10700},{"id":10710,"depth":166,"text":10711,"children":11182},[11183,11184,11185,11186,11187],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":10787,"depth":187,"text":10788},{"id":10845,"depth":187,"text":10846},{"id":10903,"depth":187,"text":10904},{"id":479,"depth":166,"text":480},{"id":11093,"depth":166,"text":11094},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fopenrouter-alternatives-after-stripe.png","Stripe agreed to buy OpenRouter for over $7 billion. The real alternatives on the model side, and the routing layer nobody is selling yet.","\u002Fimg\u002Fblog\u002Fopenrouter-alternatives-after-stripe-card.png",{},"\u002Fblog\u002Fguides\u002Fopenrouter-alternatives-after-stripe",{"title":10504,"description":11193},"blog\u002Fguides\u002Fopenrouter-alternatives-after-stripe",[11200,8984,8987,8986,8325],"openrouter","OMOCBky2KrC8v7Lj2mZONrVwImPGryZObkaF8oIMRnk",{"id":11203,"title":8765,"author":6,"body":11204,"category":1674,"cover":12070,"description":12071,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":12072,"meta":12073,"navigation":790,"ogImage":787,"path":8764,"publishedAt":5712,"readTime":1681,"seo":12074,"stem":12075,"tags":12076,"toolCategory":8934,"updatedAt":5712,"__hash__":12078},"blogGuides\u002Fblog\u002Fguides\u002Fopenrouter-mcp-server-tool-layer.md",{"type":8,"value":11205,"toc":12040},[11206,11209,11245,11248,11251,11260,11264,11271,11274,11278,11281,11292,11300,11304,11307,11311,11314,11318,11327,11331,11334,11403,11406,11410,11413,11417,11420,11424,11427,11430,11434,11437,11441,11450,11454,11457,11461,11466,11472,11507,11517,11559,11575,11580,11585,11589,11599,11602,11604,11609,11614,11619,11621,11657,11662,11666,11671,11679,11683,11703,11710,11715,11719,11724,11734,11738,11756,11767,11771,11775,11780,11796,11800,11836,11841,11851,11854,11862,11864,11950,11955,11959,11962,11965,11968,11970,11973,11976,11987,11989,11995,12007,12017,12027,12033,12037],[11,11207,11208],{"style":810},"Copy this line to your agent to give it tools it did not have to install.",[131,11210,11211],{"className":814,"code":3335,"language":816,"meta":136,"style":136},[47,11212,11213],{"__ignoreMap":136},[140,11214,11215,11217,11219,11221,11223,11225,11227,11229,11231,11233,11235,11237,11239,11241,11243],{"class":142,"line":143},[140,11216,824],{"class":823},[140,11218,827],{"class":150},[140,11220,830],{"class":150},[140,11222,833],{"class":150},[140,11224,836],{"class":150},[140,11226,1718],{"class":150},[140,11228,3354],{"class":150},[140,11230,845],{"class":150},[140,11232,3359],{"class":150},[140,11234,851],{"class":150},[140,11236,3364],{"class":150},[140,11238,3367],{"class":150},[140,11240,3370],{"class":150},[140,11242,3373],{"class":150},[140,11244,3376],{"class":150},[11,11246,11247],{},"The short answer is yes, and it probably does not do what you are hoping. OpenRouter publishes an official MCP server, and what it exposes is OpenRouter: its model catalog, its pricing, its docs, your credit balance. It is a management surface, not a tool catalog. Separately, OpenRouter documents how to use somebody else's MCP servers with its API, and in that arrangement you supply, run and pay for the tools yourself. This guide covers both accurately, then shows what fills the remaining gap.",[27,11249,11139],{"id":11250},"is-openrouter-an-mcp-server",[11,11252,11253,11254,11259],{},"Yes. ",[18,11255,11258],{"href":11256,"rel":11257},"https:\u002F\u002Fopenrouter.ai\u002Fblog\u002Fannouncements\u002Fopenrouter-mcp-server\u002F",[124,125],"OpenRouter ships an official MCP server",", and it exposes eleven tools, all of which are about OpenRouter itself rather than about the world. An agent connected to it can list and inspect models, read per-provider pricing and performance, pull benchmark scores and usage rankings, search OpenRouter's documentation, check your credit balance, and send a test inference call.",[232,11261,11263],{"id":11262},"what-that-is-genuinely-good-for","What that is genuinely good for",[11,11265,11266,11267,11270],{},"Model selection, by the agent, at run time. If you are building something that should pick its own model based on current price or current benchmark position, this is the correct tool and there is no substitute for it. ",[47,11268,11269],{},"search-docs"," is also quietly useful: an agent that can look up the exact tool-calling format in the provider's own docs makes fewer format mistakes than one working from memory.",[11,11272,11273],{},"Every tool except the inference one is read-only, which makes it safe to hand to an agent without much thought.",[232,11275,11277],{"id":11276},"what-it-is-not","What it is not",[11,11279,11280],{},"It is not a way for an agent to reach anything outside OpenRouter. There is no tool in that list that reads a web page, enriches a company, pulls a comment thread, transcribes audio or places a call. That is not an oversight; it is what the product is for. The MCP server makes OpenRouter itself agent-addressable, in the same way a Stripe MCP server makes Stripe agent-addressable.",[11,11282,11283,11284,11287,11288,11291],{},"So the answer to the question depends on which noun you stressed. Is OpenRouter ",[758,11285,11286],{},"an"," MCP server: yes. Is OpenRouter ",[758,11289,11290],{},"the"," MCP server that gives your agent tools: no, and it does not claim to be.",[320,11293,11294],{},[11,11295,324,11296,119,11298],{},[38,11297,327],{},[18,11299,1002],{"href":1001},[27,11301,11303],{"id":11302},"does-openrouter-have-mcp","Does OpenRouter have MCP?",[11,11305,11306],{},"OpenRouter has MCP in two distinct senses, and mixing them up is the source of most confusion on this topic. It publishes an MCP server, which is the one above. And it documents how to consume MCP servers you run yourself, which is a different thing entirely.",[232,11308,11310],{"id":11309},"direction-one-openrouter-as-the-server","Direction one: OpenRouter as the server",[11,11312,11313],{},"An agent connects to OpenRouter over MCP and calls tools about models. OpenRouter is the thing being described. Nothing about your data or your product is reachable this way.",[232,11315,11317],{"id":11316},"direction-two-openrouter-as-the-model-behind-your-tools","Direction two: OpenRouter as the model behind your tools",[11,11319,11320,11321,11326],{},"Your application holds the tools, and OpenRouter provides the model that decides when to call them. ",[18,11322,11325],{"href":11323,"rel":11324},"https:\u002F\u002Fopenrouter.ai\u002Fdocs\u002Fguides\u002Fguides\u002Fcoding-agents\u002Fmcp-servers",[124,125],"OpenRouter's own guide"," describes the mechanism plainly: you convert MCP tool definitions into OpenAI-compatible tool definitions, pass those in the request, and when the model returns a tool call your code executes it against your MCP server and feeds the result back. The documentation is candid that this is more work than calling a REST endpoint, because MCP is stateful and somebody has to manage the session.",[232,11328,11330],{"id":11329},"why-the-second-direction-is-where-the-work-actually-is","Why the second direction is where the work actually is",[11,11332,11333],{},"Because the tool definitions have to come from somewhere. The conversion step is a small amount of code. Running the servers is not. Each one is an install, a credential, an update path and, if it fronts a paid vendor, a signup and usually a monthly minimum. The bridge OpenRouter documents is real and it works; it just starts from the assumption that you already have the tools, which is the assumption most teams cannot satisfy.",[482,11335,11336,11348],{},[485,11337,11338],{},[488,11339,11340,11342,11345],{},[491,11341,915],{},[491,11343,11344],{},"OpenRouter MCP server",[491,11346,11347],{},"Third-party MCP servers via OpenRouter",[504,11349,11350,11360,11370,11381,11392],{},[488,11351,11352,11355,11357],{},[509,11353,11354],{},"Who is described",[509,11356,8287],{},[509,11358,11359],{},"Your systems and vendors",[488,11361,11362,11365,11367],{},[509,11363,11364],{},"Who runs it",[509,11366,8287],{},[509,11368,11369],{},"You",[488,11371,11372,11375,11378],{},[509,11373,11374],{},"Who holds credentials",[509,11376,11377],{},"OAuth to your account",[509,11379,11380],{},"You, per vendor",[488,11382,11383,11386,11389],{},[509,11384,11385],{},"What the agent can reach",[509,11387,11388],{},"Models, pricing, docs, balance",[509,11390,11391],{},"Exactly what you installed",[488,11393,11394,11397,11400],{},[509,11395,11396],{},"What is still missing",[509,11398,11399],{},"Everything outside OpenRouter",[509,11401,11402],{},"Any tool you have not signed up for",[11,11404,11405],{},"The pattern is that both directions leave the same hole: tools you do not already have.",[27,11407,11409],{"id":11408},"how-do-you-use-mcp-with-openrouter","How do you use MCP with OpenRouter?",[11,11411,11412],{},"You run the MCP servers, convert their tool definitions to the OpenAI shape, and pass them to OpenRouter's chat completions call, then execute any tool the model asks for and return the result. That is the documented path and it is straightforward code. The part worth planning is where the tools come from.",[232,11414,11416],{"id":11415},"the-three-ways-teams-fill-the-tool-list","The three ways teams fill the tool list",[11,11418,11419],{},"Write them yourself, which is right for anything specific to your product. Install per-vendor MCP servers, which is right when the vendor list is short and known. Or point at a layer that already has a catalog, which is right when the list is long or unknown at build time. Most real systems end up with all three, and the mistake is using the second approach for a list that keeps growing.",[232,11421,11423],{"id":11422},"the-part-the-docs-warn-you-about","The part the docs warn you about",[11,11425,11426],{},"OpenRouter's guide is explicit that this is harder than calling a REST endpoint, and the reason is state. An MCP connection is a session: you open it, you list tools, you keep it alive across turns, and something has to own its lifecycle inside a request path that is otherwise stateless. Multiply that by every server you front and you are running a small connection manager you did not plan to write.",[11,11428,11429],{},"This is worth knowing before you choose the per-vendor route, because it is the cost that scales worst. Converting tool definitions is a fixed amount of code no matter how many servers you have. Keeping sessions healthy across a dozen local processes, each with its own failure mode and restart behaviour, is not, and it is the part that turns up in production rather than in the prototype.",[232,11431,11433],{"id":11432},"why-the-third-option-changes-the-code-shape","Why the third option changes the code shape",[11,11435,11436],{},"With per-vendor servers, adding a capability is a deploy: somebody installs a server, adds a credential, updates config. With a catalog behind one endpoint, adding a capability is a search the agent runs itself. The tool definitions your bridge converts stop being a fixed list and become a query result, which is the difference between an agent that can attempt an unanticipated task and one that cannot.",[232,11438,11440],{"id":11439},"what-monid-is-in-this-picture","What Monid is in this picture",[11,11442,11443,11446,11447,11449],{},[18,11444,864],{"href":723,"rel":11445},[124,125]," is ",[18,11448,21],{"href":20},": one key and one balance let an agent discover and call over a thousand tools across many providers, billed per call, with no separate signup per vendor. It ships as an MCP server, so it slots into exactly the arrangement above, and it routes tool calls only. It is never in the inference path, and there is no relationship with OpenRouter beyond borrowing the shape of their idea to describe ours. In practice the two compose: OpenRouter picks the model, Monid supplies the tools.",[27,11451,11453],{"id":11452},"how-do-you-wire-openrouter-and-a-tool-layer-in-one-config","How do you wire OpenRouter and a tool layer in one config?",[11,11455,11456],{},"You set two independent things: a base URL and key for the model side, and an MCP server entry for the tool side. They never reference each other, which is the whole point, and it means either half can be swapped without touching the other.",[232,11458,11460],{"id":11459},"step-0-both-halves-in-one-client-config","Step 0. Both halves, in one client config",[11,11462,11463,11465],{},[38,11464,1131],{}," Points the model path at OpenRouter and the tool path at a catalog, in the same client.",[11,11467,11468,11471],{},[38,11469,11470],{},"The model side."," OpenRouter exposes an OpenAI-compatible endpoint, so for most clients this is a base URL and a key in configuration, not code:",[131,11473,11475],{"className":133,"code":11474,"language":135,"meta":136,"style":136},"export OPENAI_BASE_URL=https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\nexport OPENAI_API_KEY=\u003Cyour-openrouter-key>\n",[47,11476,11477,11492],{"__ignoreMap":136},[140,11478,11479,11483,11486,11489],{"class":142,"line":143},[140,11480,11482],{"class":11481},"spNyl","export",[140,11484,11485],{"class":183}," OPENAI_BASE_URL",[140,11487,11488],{"class":193},"=",[140,11490,11491],{"class":183},"https:\u002F\u002Fopenrouter.ai\u002Fapi\u002Fv1\n",[140,11493,11494,11496,11499,11502,11505],{"class":142,"line":166},[140,11495,11482],{"class":11481},[140,11497,11498],{"class":183}," OPENAI_API_KEY",[140,11500,11501],{"class":193},"=\u003C",[140,11503,11504],{"class":183},"your-openrouter-key",[140,11506,8574],{"class":193},[11,11508,11509,11512,11513,11516],{},[38,11510,11511],{},"The tool side."," Monid is streamable HTTP with no install, at ",[47,11514,11515],{},"https:\u002F\u002Fmcp.monid.ai\u002Fv1",". The terminal clients are one line each:",[131,11518,11520],{"className":133,"code":11519,"language":135,"meta":136,"style":136},"claude mcp add --transport http monid https:\u002F\u002Fmcp.monid.ai\u002Fv1\ncodex mcp add monid --url https:\u002F\u002Fmcp.monid.ai\u002Fv1\n",[47,11521,11522,11543],{"__ignoreMap":136},[140,11523,11524,11527,11530,11532,11535,11538,11540],{"class":142,"line":143},[140,11525,11526],{"class":146},"claude",[140,11528,11529],{"class":150}," mcp",[140,11531,293],{"class":150},[140,11533,11534],{"class":150}," --transport",[140,11536,11537],{"class":150}," http",[140,11539,4372],{"class":150},[140,11541,11542],{"class":150}," https:\u002F\u002Fmcp.monid.ai\u002Fv1\n",[140,11544,11545,11548,11550,11552,11554,11557],{"class":142,"line":166},[140,11546,11547],{"class":146},"codex",[140,11549,11529],{"class":150},[140,11551,293],{"class":150},[140,11553,4372],{"class":150},[140,11555,11556],{"class":150}," --url",[140,11558,11542],{"class":150},[11,11560,11561,11562,11565,11566,11569,11570,260],{},"In Claude.ai it is Settings, Connectors, Add custom connector, then Connect and authorise. OpenCode takes a block in ",[47,11563,11564],{},"opencode.json"," followed by ",[47,11567,11568],{},"opencode mcp auth monid",". Per-client steps are in the ",[18,11571,11574],{"href":11572,"rel":11573},"https:\u002F\u002Fmonid.ai\u002Fdocs\u002Fguide\u002Fquickstart-mcp",[124,125],"MCP quickstart",[11,11576,11577,11579],{},[38,11578,1195],{}," An agent whose model is chosen by OpenRouter's routing and whose tools are found by searching a catalog. Neither config block mentions the other, so changing model provider does not touch tools and adding a capability does not touch the model path.",[11,11581,11582,11584],{},[38,11583,1229],{}," Nothing to connect. The tool side bills only when a call runs, and the model side bills tokens the way it already did.",[232,11586,11588],{"id":11587},"which-model-gateway-should-sit-on-the-other-side","Which model gateway should sit on the other side?",[11,11590,11591,11594,11595,11598],{},[38,11592,11593],{},"Whichever one you would have picked anyway, and the tool layer does not care."," The usual comparison is OpenRouter against LiteLLM, and it is a hosted-versus-self-hosted question rather than a feature one: ",[18,11596,8293],{"href":8291,"rel":11597},[124,125]," is the open-source proxy you run, normalising many provider APIs behind one OpenAI-compatible interface, while OpenRouter is the managed marketplace you point at. Portkey's gateway is open source too, which makes starting hosted and moving in-house a real path.",[11,11600,11601],{},"The reason this matters here is substitution. Because the model side is a base URL, swapping OpenRouter for a self-hosted LiteLLM is an environment variable and a test run. The MCP entry above is untouched, and the agent keeps every tool it had. Both halves being independently replaceable is the property worth designing for, whichever vendors you start with.",[232,11603,235],{"id":234},[11,11605,238,11606,244],{},[18,11607,243],{"href":241,"rel":11608},[124,125],[131,11610,11612],{"className":11611,"code":249,"language":97,"meta":136},[248],[47,11613,249],{"__ignoreMap":136},[11,11615,254,11616,260],{},[18,11617,259],{"href":257,"rel":11618},[124,125],[232,11620,264],{"id":263},[131,11622,11623],{"className":133,"code":8536,"language":135,"meta":136,"style":136},[47,11624,11625,11635],{"__ignoreMap":136},[140,11626,11627,11629,11631,11633],{"class":142,"line":143},[140,11628,274],{"class":146},[140,11630,277],{"class":150},[140,11632,280],{"class":150},[140,11634,283],{"class":150},[140,11636,11637,11639,11641,11643,11645,11647,11649,11651,11653,11655],{"class":142,"line":166},[140,11638,147],{"class":146},[140,11640,290],{"class":150},[140,11642,293],{"class":150},[140,11644,8559],{"class":150},[140,11646,8562],{"class":150},[140,11648,8565],{"class":150},[140,11650,299],{"class":193},[140,11652,1114],{"class":150},[140,11654,305],{"class":183},[140,11656,8574],{"class":193},[11,11658,8577,11659,260],{},[18,11660,8582],{"href":8580,"rel":11661},[124,125],[232,11663,11665],{"id":11664},"step-1-search-for-a-capability-not-a-vendor","Step 1. Search for a capability, not a vendor",[11,11667,11668,11670],{},[38,11669,1131],{}," Finds endpoints by description, so the agent can ask for what it needs rather than naming a company it would have to already know about.",[11,11672,11673,11675,11676,260],{},[38,11674,1137],{}," The catalog covers web search and extraction, company and people enrichment, social and platform data, browser automation, generative media and agent telephony. Browse it at ",[18,11677,1233],{"href":5582,"rel":11678},[124,125],[11,11680,11681],{},[38,11682,1148],{},[131,11684,11686],{"className":133,"code":11685,"language":135,"meta":136,"style":136},"monid discover -q \"search the live web and return the page text\"\n",[47,11687,11688],{"__ignoreMap":136},[140,11689,11690,11692,11694,11696,11698,11701],{"class":142,"line":143},[140,11691,147],{"class":146},[140,11693,2667],{"class":150},[140,11695,2670],{"class":150},[140,11697,2673],{"class":193},[140,11699,11700],{"class":150},"search the live web and return the page text",[140,11702,2679],{"class":193},[11,11704,11705,11707,11708,10834],{},[38,11706,1195],{}," Ranked endpoints, each with provider, description, billing shape and a ",[47,11709,5967],{},[11,11711,11712,11714],{},[38,11713,1229],{}," Nothing. Discovery is free, which is what makes it reasonable for an agent to look before it has decided anything.",[232,11716,11718],{"id":11717},"step-2-read-the-schema-and-the-price-before-spending","Step 2. Read the schema and the price before spending",[11,11720,11721,11723],{},[38,11722,1131],{}," Returns one endpoint's full input schema, its billing shape and the provider's documentation link.",[11,11725,11726,119,11728,11733],{},[38,11727,1137],{},[18,11729,11731],{"href":8674,"rel":11730},[124,125],[47,11732,1548],{}," runs a search and can scrape every result to markdown in the same round trip, which is one call where the naive version is eleven.",[11,11735,11736],{},[38,11737,1148],{},[131,11739,11740],{"className":133,"code":10868,"language":135,"meta":136,"style":136},[47,11741,11742],{"__ignoreMap":136},[140,11743,11744,11746,11748,11750,11752,11754],{"class":142,"line":143},[140,11745,147],{"class":146},[140,11747,151],{"class":150},[140,11749,154],{"class":150},[140,11751,1718],{"class":150},[140,11753,160],{"class":150},[140,11755,10885],{"class":150},[11,11757,11758,11760,11761,11763,11764,11766],{},[38,11759,1195],{}," The body schema: ",[47,11762,3880],{}," with Google-style operators, ",[47,11765,10895],{}," from ten to a hundred, domain allow and block lists, a freshness window, country localisation and the markdown options. Plus the billing shape and the docs URL.",[11,11768,11769,9403],{},[38,11770,1229],{},[232,11772,11774],{"id":11773},"step-3-run-it-and-that-is-the-only-billable-step","Step 3. Run it, and that is the only billable step",[11,11776,11777,11779],{},[38,11778,1131],{}," Executes the endpoint and draws down the shared balance at the price already shown.",[11,11781,11782,119,11784,11789,11790,11795],{},[38,11783,1137],{},[18,11785,11787],{"href":8674,"rel":11786},[124,125],[47,11788,1548],{}," for search plus page text; ",[18,11791,11793],{"href":8674,"rel":11792},[124,125],[47,11794,3721],{}," when you want neural retrieval and structured output synthesised across sources.",[11,11797,11798],{},[38,11799,1148],{},[131,11801,11803],{"className":133,"code":11802,"language":135,"meta":136,"style":136},"monid run -p context.dev -e \u002Fweb\u002Fsearch \\\n  -i '{\"query\": \"mcp tool calling format site:openrouter.ai\", \"numResults\": 10}' -w 120\n",[47,11804,11805,11821],{"__ignoreMap":136},[140,11806,11807,11809,11811,11813,11815,11817,11819],{"class":142,"line":143},[140,11808,147],{"class":146},[140,11810,171],{"class":150},[140,11812,154],{"class":150},[140,11814,1718],{"class":150},[140,11816,160],{"class":150},[140,11818,3354],{"class":150},[140,11820,184],{"class":183},[140,11822,11823,11825,11827,11830,11832,11834],{"class":142,"line":166},[140,11824,190],{"class":150},[140,11826,194],{"class":193},[140,11828,11829],{"class":150},"{\"query\": \"mcp tool calling format site:openrouter.ai\", \"numResults\": 10}",[140,11831,2045],{"class":193},[140,11833,8723],{"class":150},[140,11835,8727],{"class":8726},[11,11837,11838,11840],{},[38,11839,1195],{}," Ranked results with url, title and relevance, and the markdown body of each page when you ask for it. That last part is the difference between handing the model a list of links and handing it the answer.",[11,11842,11843,11845,11846,10978,11848,260],{},[38,11844,1229],{}," A fraction of a cent per result, and the charge tracks results rather than calls, so ",[47,11847,10895],{},[18,11849,1233],{"href":5582,"rel":11850},[124,125],[316,11852],{"prompt":11853},"search the official docs for a provider and quote the exact tool calling format it specifies",[320,11855,11856],{},[11,11857,324,11858,119,11860],{},[38,11859,327],{},[18,11861,10994],{"href":10993},[27,11863,480],{"id":479},[482,11865,11866,11880],{},[485,11867,11868],{},[488,11869,11870,11872,11874,11876,11878],{},[491,11871,493],{},[491,11873,496],{},[491,11875,1443],{},[491,11877,1446],{},[491,11879,1449],{},[504,11881,11882,11899,11916,11933],{},[488,11883,11884,11886,11893,11895,11897],{},[509,11885,8810],{},[509,11887,11888],{},[18,11889,11891],{"href":8674,"rel":11890},[124,125],[47,11892,1548],{},[509,11894,8820],{},[509,11896,8823],{},[509,11898,1557],{},[488,11900,11901,11903,11910,11912,11914],{},[509,11902,8790],{},[509,11904,11905],{},[18,11906,11908],{"href":8674,"rel":11907},[124,125],[47,11909,3721],{},[509,11911,8800],{},[509,11913,8803],{},[509,11915,1471],{},[488,11917,11918,11920,11927,11929,11931],{},[509,11919,8830],{},[509,11921,11922],{},[18,11923,11925],{"href":8835,"rel":11924},[124,125],[47,11926,1484],{},[509,11928,4177],{},[509,11930,1490],{},[509,11932,1471],{},[488,11934,11935,11937,11944,11946,11948],{},[509,11936,8849],{},[509,11938,11939],{},[18,11940,11942],{"href":569,"rel":11941},[124,125],[47,11943,8857],{},[509,11945,8860],{},[509,11947,8863],{},[509,11949,1471],{},[11,11951,1560,11952,11954],{},[47,11953,607],{}," on 20 August 2026. The table states the billing shape rather than a figure: per call versus per result is what changes how you write the code, and it does not go stale.",[27,11956,11958],{"id":11957},"when-should-you-not-add-a-tool-layer","When should you not add a tool layer?",[11,11960,11961],{},"When the thing you actually need is model routing. If your problem is comparing providers, controlling cost per token or building a fallback chain, that is OpenRouter's job and Monid does not compete for it. We are not in the inference path at all, and a post that pretended otherwise would be wasting your time.",[11,11963,11964],{},"When your tool list is short and fixed. If the agent needs your database and one vendor, install two MCP servers and skip the router. A catalog earns its place when the vendor list is unknown when you write the code.",[11,11966,11967],{},"And when the vendor you need has a free tier that covers your usage, take the free tier. Per-call pricing beats a stack of subscriptions, not zero.",[27,11969,696],{"id":695},[11,11971,11972],{},"OpenRouter is an MCP server, and the tools it exposes are about OpenRouter. That is the accurate answer, and it is not a criticism: making your own platform agent-addressable is a good idea and the model-selection tools are genuinely useful. It just means the question people are really asking, which is whether connecting OpenRouter gives their agent capabilities, has the answer no.",[11,11974,11975],{},"The thing worth carrying away is where the two directions leave you. Both the official server and the documented bridge assume the tools already exist, and for most teams that assumption is the entire problem. The model half of agent infrastructure has been consolidated to the point where a single acquisition covered it. The tool half is still a folder of API keys, and it is the half that decides whether the agent can do the job.",[11,11977,1600,11978,11980,11981,11983,11984,260],{},[47,11979,603],{}," for something your agent currently refuses to attempt, then ",[47,11982,607],{}," the top result to read its schema and price. Neither spends anything. Start at ",[18,11985,725],{"href":723,"rel":11986},[124,125],[27,11988,729],{"id":728},[731,11990,11992],{"q":11991},"OpenRouter vs MCP: are they the same kind of thing?",[11,11993,11994],{},"No, they are on different axes. OpenRouter is a product that routes prompts to language models. MCP is a protocol an agent uses to call tools. You can use both at once and most agent stacks do: the model comes through a gateway, the tools come over MCP. The confusion comes from OpenRouter also publishing an MCP server, which makes OpenRouter itself callable as a tool without making it a tool catalog.",[731,11996,11998],{"q":11997},"Does OpenRouter have a built-in web search tool?",[11,11999,12000,12001,12003,12004,12006],{},"OpenRouter offers web search as a feature on its own platform, which is different from your agent having a search tool it can call with its own parameters. If you want the agent to control the query, the domain filters, the freshness window and whether it also gets the page text, that is a tool call and it needs a tool. ",[47,12002,1548],{}," covers search plus inline markdown in a single round trip, and ",[47,12005,3721],{}," covers neural retrieval with structured output.",[731,12008,12010],{"q":12009},"How do I add a tool layer to Claude Code or Cursor if I am using OpenRouter for models?",[11,12011,12012,12013,12016],{},"The two are configured separately, which is the useful part. The model gateway is a base URL and a key in your client config. The tool layer is an MCP server entry. Neither knows about the other, so you can change model provider without touching tools and add tools without touching the model path. For Monid the fastest route is to hand your agent ",[47,12014,12015],{},"https:\u002F\u002Fmonid.ai\u002FSKILL.md"," and the key and let it configure itself.",[731,12018,12020],{"q":12019},"Is there an open source OpenRouter MCP server?",[11,12021,12022,12023,12026],{},"Community MCP servers wrapping the OpenRouter API exist alongside the official one, and they generally expose a similar surface: model listings, completions, cost data. They have the same boundary as the official server, which is that the tools describe OpenRouter. If what you need is a catalog of third-party capabilities rather than another way to reach models, that is a different kind of product, and ",[18,12024,12025],{"href":8980},"the gateway taxonomy guide"," sorts out which is which.",[421,12028,12030],{"category":8934,"title":12029},"OpenRouter picks the model. This picks the tools.",[11,12031,12032],{},"Discover an endpoint, read its schema and per-call price for free, then run it. One key, one balance, no signup per vendor.",[11,12034,12035],{},[758,12036,760],{},[762,12038,12039],{},"html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":136,"searchDepth":166,"depth":166,"links":12041},[12042,12046,12051,12057,12066,12067,12068,12069],{"id":11250,"depth":166,"text":11139,"children":12043},[12044,12045],{"id":11262,"depth":187,"text":11263},{"id":11276,"depth":187,"text":11277},{"id":11302,"depth":166,"text":11303,"children":12047},[12048,12049,12050],{"id":11309,"depth":187,"text":11310},{"id":11316,"depth":187,"text":11317},{"id":11329,"depth":187,"text":11330},{"id":11408,"depth":166,"text":11409,"children":12052},[12053,12054,12055,12056],{"id":11415,"depth":187,"text":11416},{"id":11422,"depth":187,"text":11423},{"id":11432,"depth":187,"text":11433},{"id":11439,"depth":187,"text":11440},{"id":11452,"depth":166,"text":11453,"children":12058},[12059,12060,12061,12062,12063,12064,12065],{"id":11459,"depth":187,"text":11460},{"id":11587,"depth":187,"text":11588},{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":11664,"depth":187,"text":11665},{"id":11717,"depth":187,"text":11718},{"id":11773,"depth":187,"text":11774},{"id":479,"depth":166,"text":480},{"id":11957,"depth":166,"text":11958},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fopenrouter-mcp-server-tool-layer.png","Yes, OpenRouter has an MCP server, and it exposes OpenRouter. Here is what it does, what it does not, and how to give the same agent real tools.","\u002Fimg\u002Fblog\u002Fopenrouter-mcp-server-tool-layer-card.png",{},{"title":8765,"description":12071},"blog\u002Fguides\u002Fopenrouter-mcp-server-tool-layer",[11200,8986,8987,12077,9733],"claude code","aCeURy3Lj7CNTWzVoRqEEj2o0YlEe0CuEPS-TVlfN0k",{"id":12080,"title":12081,"author":6,"body":12082,"category":782,"cover":12747,"description":12748,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":12749,"meta":12750,"navigation":790,"ogImage":787,"path":12751,"publishedAt":5712,"readTime":1681,"seo":12752,"stem":12753,"tags":12754,"toolCategory":12584,"updatedAt":5712,"__hash__":12758},"blogGuides\u002Fblog\u002Fguides\u002Fprompt-instead-of-filters-people-search.md","A Wrong Enum Returns Zero: Ploid and Prompt-Shaped APIs",{"type":8,"value":12083,"toc":12734},[12084,12087,12093,12096,12105,12108,12112,12115,12126,12170,12188,12199,12205,12208,12251,12254,12260,12271,12275,12278,12287,12293,12312,12315,12317,12322,12335,12341,12343,12379,12385,12388,12392,12395,12426,12442,12451,12454,12462,12466,12469,12550,12561,12576,12582,12589,12593,12596,12599,12602,12612,12620,12624,12627,12633,12639,12645,12656,12659,12661,12664,12673,12675,12685,12691,12705,12727,12731],[11,12085,12086],{},"Here are three searches for the same people. Same job title, same intent, one field different each time.",[131,12088,12091],{"className":12089,"code":12090,"language":97,"meta":136},[248],"seniority \"vp\",             size \"51,200\"  ->  28,417 people\nseniority \"vice_president\", size \"51,200\"  ->       0 people\nseniority \"vp\",             size \"51-200\"  ->  160,884 people\n",[47,12092,12090],{"__ignoreMap":136},[11,12094,12095],{},"None of the three returned an error. The middle one is a wrong enum value, and it comes back as a clean empty result set that looks exactly like \"nobody matches.\" The third one is a wrong range format, and rather than failing it silently drops the company size filter entirely, handing back six times the rows with no indication that a constraint went missing.",[11,12097,12098,12099,12104],{},"That is the shape of a filter API, and it is the reason a different shape is appearing. ",[18,12100,12103],{"href":12101,"rel":12102},"https:\u002F\u002Fploid.com",[124,125],"Ploid"," is one of the clearer examples: instead of a filter object it takes a sentence and a spending cap.",[11,12106,12107],{},"Fair disclosure. You are on the Monid blog, Monid sells access to the filter-shaped APIs described below, and Ploid is a content partner of ours. Ploid is not in the Monid catalogue. The section near the end argues for the shape we sell, because on most days it is still the right one.",[27,12109,12111],{"id":12110},"why-did-my-search-return-zero-when-the-filter-looked-right","Why did my search return zero when the filter looked right?",[11,12113,12114],{},"Because the filter was not validated against anything. It was accepted, applied, and matched nothing.",[11,12116,12117,12118,12121,12122,12125],{},"The runs above use ",[47,12119,12120],{},"apollo \u002Fmixed_people\u002Fapi_search",", which is free to search and therefore easy to probe. The query is otherwise identical: ",[47,12123,12124],{},"person_titles[]"," of \"VP of Sales\", a company size band, five results per page.",[131,12127,12129],{"className":133,"code":12128,"language":135,"meta":136,"style":136},"monid run -p apollo -e \u002Fmixed_people\u002Fapi_search \\\n  --query '{\"person_titles[]\":[\"VP of Sales\"],\"person_seniorities[]\":[\"vp\"],\"organization_num_employees_ranges[]\":[\"51,200\"],\"per_page\":5}' \\\n  -w -o people.json\n",[47,12130,12131,12148,12161],{"__ignoreMap":136},[140,12132,12133,12135,12137,12139,12141,12143,12146],{"class":142,"line":143},[140,12134,147],{"class":146},[140,12136,171],{"class":150},[140,12138,154],{"class":150},[140,12140,10015],{"class":150},[140,12142,160],{"class":150},[140,12144,12145],{"class":150}," \u002Fmixed_people\u002Fapi_search",[140,12147,184],{"class":183},[140,12149,12150,12152,12154,12157,12159],{"class":142,"line":166},[140,12151,2037],{"class":150},[140,12153,194],{"class":193},[140,12155,12156],{"class":150},"{\"person_titles[]\":[\"VP of Sales\"],\"person_seniorities[]\":[\"vp\"],\"organization_num_employees_ranges[]\":[\"51,200\"],\"per_page\":5}",[140,12158,2045],{"class":193},[140,12160,184],{"class":183},[140,12162,12163,12165,12167],{"class":142,"line":187},[140,12164,5302],{"class":150},[140,12166,5305],{"class":150},[140,12168,12169],{"class":150}," people.json\n",[11,12171,12172,12173,12176,12177,102,12180,12183,12184,12187],{},"Swap ",[47,12174,12175],{},"vp"," for ",[47,12178,12179],{},"vice_president",[47,12181,12182],{},"total_entries"," goes to zero. Both strings are reasonable English for the same idea. Only one is in the enum, which runs ",[47,12185,12186],{},"owner, founder, c_suite, partner, vp, head, director, manager, senior, entry, intern",". You can read that list in the schema, and you have to, because the API will not tell you.",[11,12189,12190,12191,12194,12195,12198],{},"The size format is worse. ",[47,12192,12193],{},"51,200"," is the documented form and returns 28,417. ",[47,12196,12197],{},"51-200"," is what most people would write first, and it returns 160,884: every VP of Sales regardless of company size. The filter did not fail, it evaporated.",[11,12200,12201,12204],{},[38,12202,12203],{},"This is the failure mode that matters."," A crash you notice. A zero you investigate. A plausible number that quietly answers a different question than the one you asked is the one that reaches a spreadsheet, then a campaign, then a quarterly number.",[11,12206,12207],{},"It is worth proving rather than assuming. Run the same query with the size filter removed entirely:",[131,12209,12211],{"className":133,"code":12210,"language":135,"meta":136,"style":136},"monid run -p apollo -e \u002Fmixed_people\u002Fapi_search \\\n  --query '{\"person_titles[]\":[\"VP of Sales\"],\"person_seniorities[]\":[\"vp\"],\"per_page\":5}' \\\n  -w -o nosize.json\n",[47,12212,12213,12229,12242],{"__ignoreMap":136},[140,12214,12215,12217,12219,12221,12223,12225,12227],{"class":142,"line":143},[140,12216,147],{"class":146},[140,12218,171],{"class":150},[140,12220,154],{"class":150},[140,12222,10015],{"class":150},[140,12224,160],{"class":150},[140,12226,12145],{"class":150},[140,12228,184],{"class":183},[140,12230,12231,12233,12235,12238,12240],{"class":142,"line":166},[140,12232,2037],{"class":150},[140,12234,194],{"class":193},[140,12236,12237],{"class":150},"{\"person_titles[]\":[\"VP of Sales\"],\"person_seniorities[]\":[\"vp\"],\"per_page\":5}",[140,12239,2045],{"class":193},[140,12241,184],{"class":183},[140,12243,12244,12246,12248],{"class":142,"line":187},[140,12245,5302],{"class":150},[140,12247,5305],{"class":150},[140,12249,12250],{"class":150}," nosize.json\n",[11,12252,12253],{},"That returns 160,884, matching the hyphenated run exactly. The filter was not loosened or reinterpreted. It was discarded, and the API answered a question with one fewer constraint than the one asked.",[11,12255,12256],{},[5252,12257],{"alt":12258,"src":12259},"The same query three times, one field different, three very different answers and no error on any of them.","\u002Fimg\u002Fblog\u002Fprompt-instead-of-filters-people-search-fig-three-runs.png",[11,12261,12262,12263,102,12266,12270],{},"The cost of using a filter API correctly is knowing its taxonomy: which enums exist, which are case sensitive, which formats are accepted, which combinations are mutually exclusive. That knowledge is real work, it is per vendor, and it does not transfer. We wrote up ",[18,12264,12265],{"href":474},"the practical version for PDL",[18,12267,12269],{"href":12268},"\u002Fblog\u002Fguides\u002Fapollo-scraper","the Apollo specifics"," separately, and the reason those posts exist at all is that this knowledge has to be written down somewhere.",[232,12272,12274],{"id":12273},"how-do-you-catch-this-before-it-reaches-a-campaign","How do you catch this before it reaches a campaign?",[11,12276,12277],{},"Three habits, all cheap, all derived from the runs above.",[11,12279,12280,12283,12284,12286],{},[38,12281,12282],{},"Predict the magnitude first."," Before reading a single row, say out loud roughly how many people you expect. Tens of thousands of VPs of Sales at mid sized companies is plausible. A hundred and sixty thousand is not, and neither is zero. ",[47,12285,12182],{}," is the cheapest assertion available and most integrations never look at it.",[11,12288,12289,12292],{},[38,12290,12291],{},"Probe by removal."," When a number surprises you, delete one field and re-run. If the count does not move, that field was doing nothing, which is exactly what the hyphen case looks like. On an endpoint where search is free this costs nothing but a minute.",[11,12294,12295,119,12298,12301,12302,12305,12306,12308,12309,12311],{},[38,12296,12297],{},"Read the enums from the schema, not from the docs page.",[47,12299,12300],{},"monid inspect -p apollo -e \u002Fmixed_people\u002Fapi_search"," prints the accepted values inline, including that ",[47,12303,12304],{},"person_seniorities[]"," runs ",[47,12307,12186],{}," and nothing else. Inspecting is free, and it is the step that would have caught ",[47,12310,12179],{}," before it cost anybody an afternoon.",[11,12313,12314],{},"The general shape of that last habit is why the discover and inspect steps exist at all: a schema you can read at run time turns a taxonomy problem into a lookup. That is the same benefit prompt-shaped APIs are chasing, reached from the other direction.",[232,12316,235],{"id":234},[11,12318,238,12319,244],{},[18,12320,243],{"href":241,"rel":12321},[124,125],[131,12323,12324],{"className":814,"code":249,"language":816,"meta":136,"style":136},[47,12325,12326],{"__ignoreMap":136},[140,12327,12328,12330,12332],{"class":142,"line":143},[140,12329,824],{"class":823},[140,12331,827],{"class":150},[140,12333,12334],{"class":150}," https:\u002F\u002Fmonid.ai\u002FSKILL.md\n",[11,12336,12337,12338,260],{},"It learns the discover, inspect and run workflow itself. More detail in the ",[18,12339,259],{"href":257,"rel":12340},[124,125],[232,12342,264],{"id":263},[131,12344,12345],{"className":814,"code":8536,"language":816,"meta":136,"style":136},[47,12346,12347,12357],{"__ignoreMap":136},[140,12348,12349,12351,12353,12355],{"class":142,"line":143},[140,12350,274],{"class":146},[140,12352,277],{"class":150},[140,12354,280],{"class":150},[140,12356,283],{"class":150},[140,12358,12359,12361,12363,12365,12367,12369,12371,12373,12375,12377],{"class":142,"line":166},[140,12360,147],{"class":146},[140,12362,290],{"class":150},[140,12364,293],{"class":150},[140,12366,8559],{"class":150},[140,12368,8562],{"class":150},[140,12370,8565],{"class":150},[140,12372,299],{"class":193},[140,12374,1114],{"class":150},[140,12376,305],{"class":183},[140,12378,8574],{"class":193},[11,12380,12381,12382,260],{},"More detail in the ",[18,12383,8582],{"href":8580,"rel":12384},[124,125],[316,12386],{"prompt":12387},"find VPs of Sales at companies with 51 to 200 employees, and tell me which filter values you used",[27,12389,12391],{"id":12390},"what-does-an-api-look-like-when-you-send-a-prompt-instead","What does an API look like when you send a prompt instead?",[11,12393,12394],{},"It takes the sentence and a budget, and decides the query itself.",[11,12396,12397,12398,12403,12404,12407,12408,6097,12411,12414,12415,12418,12419,12422,12423,260],{},"Everything in this section is read from ",[18,12399,12402],{"href":12400,"rel":12401},"https:\u002F\u002Fploid.com\u002Fdocumentation",[124,125],"Ploid's public documentation"," rather than measured, because Ploid is not in our catalogue and we have not run it. Their ",[47,12405,12406],{},"POST \u002Fv1\u002Fagent"," takes a natural language ",[47,12409,12410],{},"prompt",[47,12412,12413],{},"max_acu"," cap, a ",[47,12416,12417],{},"response_format",", and an optional ",[47,12420,12421],{},"output_schema"," for structured output. Auth is a bearer token, base URL ",[47,12424,12425],{},"https:\u002F\u002Fapi.ploid.com\u002Fv1",[11,12427,12428,12429,12431,12432,98,12435,102,12438,12441],{},"The interesting field is ",[47,12430,12413],{},". Their own docs describe it as \"an Agent admission and billing limit,\" not a compute ceiling, and the error surface includes ",[47,12433,12434],{},"insufficient_acu",[47,12436,12437],{},"daily_budget_exceeded",[47,12439,12440],{},"monthly_budget_exceeded",". That is a lot of budget machinery for one endpoint.",[11,12443,12444,12447,12448,12450],{},[38,12445,12446],{},"It is there because it has to be."," Once the service decides how many searches to run, you no longer know what a request costs before you send it. A filter API is priced by arithmetic: results requested times price per result. A prompt-shaped API has no such arithmetic, so the cap has to move into the request. ",[47,12449,12413],{}," is not a convenience feature, it is the thing that makes the shape usable at all.",[11,12452,12453],{},"They also expose narrower surfaces alongside it: a Search API for synchronous retrieval of up to 100 results, an Enrichment API for resolving known identities, and People Sets for durable lists. That layering is the honest design. The agent endpoint is the top of a stack, not a replacement for it.",[11,12455,12456,12457,12461],{},"The pitch behind all of it is what they call the Living Index, a people index that refreshes as roles change. Freshness is a real axis and we have argued elsewhere that ",[18,12458,12460],{"href":12459},"\u002Fblog\u002Fguides\u002Fpeople-data-labs-apollo-zoominfo-alternatives","recency beats coverage"," for anything you act on, so we are not going to pretend that claim is novel. What is novel here is the request shape.",[27,12463,12465],{"id":12464},"who-should-own-the-query-planning","Who should own the query planning?",[11,12467,12468],{},"That is the whole question, and both answers are defensible.",[482,12470,12471,12483],{},[485,12472,12473],{},[488,12474,12475,12477,12480],{},[491,12476],{},[491,12478,12479],{},"Filter API",[491,12481,12482],{},"Prompt-shaped API",[504,12484,12485,12496,12506,12517,12528,12539],{},[488,12486,12487,12490,12493],{},[509,12488,12489],{},"Who writes the query",[509,12491,12492],{},"You, against a taxonomy",[509,12494,12495],{},"The service, from a sentence",[488,12497,12498,12500,12503],{},[509,12499,5864],{},[509,12501,12502],{},"Silent zero, or a silently dropped filter",[509,12504,12505],{},"Plausible answer to a misread intent",[488,12507,12508,12511,12514],{},[509,12509,12510],{},"Cost before you send",[509,12512,12513],{},"Known by arithmetic",[509,12515,12516],{},"Bounded by a cap, not known",[488,12518,12519,12522,12525],{},[509,12520,12521],{},"Same input twice",[509,12523,12524],{},"Same rows",[509,12526,12527],{},"Not guaranteed",[488,12529,12530,12533,12536],{},[509,12531,12532],{},"Debugging",[509,12534,12535],{},"Read the filter",[509,12537,12538],{},"Read whatever it tells you it did",[488,12540,12541,12544,12547],{},[509,12542,12543],{},"Onboarding",[509,12545,12546],{},"Learn the enums",[509,12548,12549],{},"Write a sentence",[11,12551,12552,12553,12556,12557,12560],{},"Notice the failure modes are not the same defect in different clothes. A filter API fails at the ",[758,12554,12555],{},"edge",", where your vocabulary meets its taxonomy. A prompt-shaped API fails in the ",[758,12558,12559],{},"middle",", where its interpretation of your sentence meets its own index. The first is discoverable by reading a schema. The second is discoverable only by checking the output, which is why every serious implementation returns some account of what it actually did.",[11,12562,12563,12564,12566,12567,12569,12570,102,12573,260],{},"This is also the argument Monid is built on, one layer up. An agent says what it needs in plain language, ",[47,12565,603],{}," returns candidate endpoints with prices, ",[47,12568,607],{}," returns the schema, and the agent picks. The planning moves to the caller, but the taxonomy lookup does not stay manual. That middle position is deliberate, and we have written about ",[18,12571,12572],{"href":5673},"why the marketplace shape suits agents",[18,12574,12575],{"href":1057},"where MCP fits against a plain API",[11,12577,12578],{},[5252,12579],{"alt":12580,"src":12581},"Where each shape breaks: a filter API fails at your vocabulary, a prompt-shaped API fails at its own interpretation.","\u002Fimg\u002Fblog\u002Fprompt-instead-of-filters-people-search-fig-two-shapes.png",[421,12583,12586],{"category":12584,"title":12585},"people-enrichment","Read the schema before you write the filter",[11,12587,12588],{},"Inspect any people endpoint free, see its enums and its billing shape, then run one query before a thousand.",[27,12590,12592],{"id":12591},"what-does-each-shape-cost-you","What does each shape cost you?",[11,12594,12595],{},"Not the price. The predictability.",[11,12597,12598],{},"A per result filter API gives you an exact number before you send: rows requested times the per row price, and Apollo's search step happens to be free entirely, with the charge arriving when you take contact data. That predictability is why finance teams tolerate usage billing at all.",[11,12600,12601],{},"A prompt-shaped API cannot offer that, so it offers a ceiling instead. You know the worst case and not the actual. For a nightly job that is fine. For a per user feature in your product, a ceiling is a different risk than a price, and it wants a different kind of monitoring.",[11,12603,12604,12605,12607,12608,12611],{},"The broader argument for ",[18,12606,5596],{"href":2325}," applies to both shapes and is written up separately. Current magnitudes for anything in our catalogue live on ",[18,12609,1233],{"href":5582,"rel":12610},[124,125],", because a number written into an article goes stale quietly.",[11,12613,12614,12615,12619],{},"One point in the prompt-shaped column that is easy to miss: the taxonomy work disappears from your side of the boundary. Whether that is a saving depends entirely on how many vendors you are integrating. For one vendor, learning the enums once is cheap. For six, it is most of the project, and ",[18,12616,12618],{"href":12617},"\u002Fblog\u002Fan-email-in-a-full-person-profile-out","enriching across several sources"," is where that cost actually shows up.",[27,12621,12623],{"id":12622},"when-is-a-filter-api-still-the-right-answer","When is a filter API still the right answer?",[11,12625,12626],{},"Most of the time, and the reasons are concrete.",[11,12628,12629,12632],{},[38,12630,12631],{},"When you need the same rows twice."," A filter is a specification. Run it Monday and Thursday and you get the same population plus whatever changed in the world. A prompt is an instruction, and nothing guarantees the same decomposition twice. Anything feeding a report or a diff wants the filter.",[11,12634,12635,12638],{},[38,12636,12637],{},"When the query is already precise."," \"Everyone at these 40 domains with a verified email\" is not a sentence that benefits from interpretation. You know exactly what you want, the taxonomy expresses it exactly, and a natural language layer can only add a chance of being misread.",[11,12640,12641,12644],{},[38,12642,12643],{},"When you have to defend the list."," Filters audit. Someone asks why a person is in the campaign and the answer is a query you can show them. \"The agent decided\" is a worse answer in a compliance conversation.",[11,12646,12647,12650,12651,12655],{},[38,12648,12649],{},"When the taxonomy is small."," The whole argument above collapses if learning the enums takes ten minutes. Read the schema, write it down, move on. The ",[18,12652,12654],{"href":12653},"\u002Fblog\u002Fguides\u002Fbest-linkedin-scraper-api-2026","LinkedIn scraper comparison"," is a case where the field lists are the entire decision.",[11,12657,12658],{},"We sell the filter-shaped ones, so treat that list with the suspicion it deserves. The honest summary is that prompt-shaped APIs are earlier, less predictable and better at exploration, and that exploration is a real job which filters serve badly. The two are not competing for the same request.",[27,12660,696],{"id":695},[11,12662,12663],{},"The best interface is the one whose failure mode you can live with. Filters fail loudly at the edges and silently in the middle of a range format, and the fix is reading the schema. Prompt-shaped APIs like Ploid's fail by answering a slightly different question well, and the fix is reading the output.",[11,12665,5642,12666,12669,12670,12672],{},[38,12667,12668],{},"if you cannot state the query as a filter, a prompt-shaped API is doing real work for you. If you can, it is adding a layer of interpretation between you and a result you already knew how to ask for."," Start every integration by finding out which of those two you are in, and check ",[47,12671,12182],{}," against a number you expect before you trust a single row.",[27,12674,729],{"id":728},[731,12676,12677],{"q":10137},[11,12678,12679,12680,102,12683,260],{},"Use Apollo's own search endpoint rather than a scraper pointed at it, which is what the call in this article does, and reach for a different provider when you need fields Apollo does not expose. The full comparison of what replaced the scraping route is in ",[18,12681,12682],{"href":3066},"the Apify alternatives guide",[18,12684,12269],{"href":12268},[731,12686,12688],{"q":12687},"Will a prompt-shaped API give me the same results twice?",[11,12689,12690],{},"Not guaranteed, and you should design as if it will not. The service chooses how to decompose your sentence and how many passes to run, and both can change with the index, the model behind it, or your budget cap. If you need a stable population, express it as a filter and store the filter, not the results.",[731,12692,12694],{"q":12693},"Does Monid carry Ploid?",[11,12695,12696,12697,102,12701,260],{},"No. Ploid is not in the Monid catalogue at the time of writing, and everything in this article about their API is read from their public documentation rather than measured. The people endpoints we do carry sit under ",[18,12698,12700],{"href":12699},"\u002Ftools\u002Fpeople-enrichment","people enrichment",[18,12702,12704],{"href":12703},"\u002Ftools\u002Fapollo","Apollo",[731,12706,12708],{"q":12707},"Which shape should I hand an MCP agent?",[11,12709,12710,12711,12713,12714,12717,12718,12721,12722,12726],{},"Give it the filter API plus the ability to read the schema. An agent that can call ",[47,12712,3936],{}," before it calls ",[47,12715,12716],{},"run"," gets the discoverability that makes prompt-shaped APIs attractive, while keeping a query it can show you afterwards. That combination is the point of the ",[18,12719,12720],{"href":5673},"marketplace shape",", and it is why ",[18,12723,12725],{"href":12724},"\u002Fblog\u002Fturned-cold-emails-into-real-people","turning a raw list into real people"," works the same way whichever vendor answers.",[11,12728,12729],{},[758,12730,760],{},[762,12732,12733],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":136,"searchDepth":166,"depth":166,"links":12735},[12736,12741,12742,12743,12744,12745,12746],{"id":12110,"depth":166,"text":12111,"children":12737},[12738,12739,12740],{"id":12273,"depth":187,"text":12274},{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":12390,"depth":166,"text":12391},{"id":12464,"depth":166,"text":12465},{"id":12591,"depth":166,"text":12592},{"id":12622,"depth":166,"text":12623},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fprompt-instead-of-filters-people-search.png","A wrong enum returned 0 rows. A wrong range format returned 160,884. Neither raised an error. Why prompt-shaped APIs like Ploid exist, and what they cost.","\u002Fimg\u002Fblog\u002Fprompt-instead-of-filters-people-search-card.png",{},"\u002Fblog\u002Fguides\u002Fprompt-instead-of-filters-people-search",{"title":12081,"description":12748},"blog\u002Fguides\u002Fprompt-instead-of-filters-people-search",[12755,12756,12757,1687],"people search api","agentic api","prospecting","ElxO8ECJyKwa4Wqh3M9l9ByJjVWNhzMXMftFnmCwpJ0",{"id":12760,"title":12761,"author":6,"body":12762,"category":782,"cover":13509,"description":13510,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":13511,"meta":13512,"navigation":790,"ogImage":787,"path":13513,"publishedAt":5712,"readTime":1681,"seo":13514,"stem":13515,"tags":13516,"toolCategory":13419,"updatedAt":5712,"__hash__":13519},"blogGuides\u002Fblog\u002Fguides\u002Fproxycurl-shutdown-linkedin-data-alternatives.md","Proxycurl Shut Down: Where LinkedIn Data Goes Now",{"type":8,"value":12763,"toc":13489},[12764,12767,12808,12814,12818,12827,12831,12834,12837,12841,12844,12847,12851,12917,12920,12928,12932,12935,12937,12942,12947,12952,12954,12990,12994,12999,13008,13012,13061,13066,13069,13077,13081,13086,13105,13109,13144,13149,13154,13158,13163,13178,13183,13188,13191,13204,13208,13211,13214,13217,13220,13222,13390,13395,13399,13402,13405,13408,13417,13424,13426,13429,13432,13435,13437,13440,13443,13454,13456,13465,13471,13477,13483,13487],[11,12765,12766],{"style":810},"Copy this line to your agent to rebuild a LinkedIn enrichment step.",[131,12768,12770],{"className":814,"code":12769,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use apify \u002Fdev_fusion\u002Flinkedin-profile-scraper to enrich a list of profile URLs\n",[47,12771,12772],{"__ignoreMap":136},[140,12773,12774,12776,12778,12780,12782,12784,12786,12789,12791,12794,12796,12799,12802,12805],{"class":142,"line":143},[140,12775,824],{"class":823},[140,12777,827],{"class":150},[140,12779,830],{"class":150},[140,12781,833],{"class":150},[140,12783,836],{"class":150},[140,12785,157],{"class":150},[140,12787,12788],{"class":150}," \u002Fdev_fusion\u002Flinkedin-profile-scraper",[140,12790,845],{"class":150},[140,12792,12793],{"class":150}," enrich",[140,12795,851],{"class":150},[140,12797,12798],{"class":150}," list",[140,12800,12801],{"class":150}," of",[140,12803,12804],{"class":150}," profile",[140,12806,12807],{"class":150}," URLs\n",[11,12809,12810,12811,12813],{},"Proxycurl was the default LinkedIn data API for a lot of teams, and on 4 July 2025 it announced it was shutting down to comply with a legal settlement with LinkedIn. That is a different kind of vendor loss from a price rise or an acquisition, because the reason it closed is a fact about the category rather than a fact about the company. Any replacement you pick inherits the same question. Monid is ",[18,12812,21],{"href":20},": one key and one balance across many providers, which is useful here mainly because it lets you switch the provider behind a step without switching the step.",[27,12815,12817],{"id":12816},"why-did-proxycurl-shut-down-and-what-does-it-mean-for-my-pipeline","Why did Proxycurl shut down, and what does it mean for my pipeline?",[11,12819,12820,12821,12826],{},"Proxycurl shut down to settle a lawsuit, not because the business failed. Founder Steven Goh wrote in the company's ",[18,12822,12825],{"href":12823,"rel":12824},"https:\u002F\u002Fnubela.co\u002Fblog\u002Fgoodbye-proxycurl\u002F",[124,125],"closing post"," that LinkedIn filed suit in January 2025 and that the company was closing \"to comply with the legal settlement with LinkedIn\", having grown to roughly a ten million dollar revenue business first. The API stopped being a going concern while it was profitable.",[232,12828,12830],{"id":12829},"the-reason-it-did-not-fight-is-the-reason-to-read-this-carefully","The reason it did not fight is the reason to read this carefully",[11,12832,12833],{},"Goh's stated calculation was not that the case was unwinnable. It was that winning was unaffordable. He points at the American Rule, that even a winning defendant generally cannot recover its legal fees, and at the fact that LinkedIn is owned by Microsoft and has, in his words, an effectively unlimited war chest.",[11,12835,12836],{},"That reasoning is worth sitting with, because it applies to every vendor in this category rather than to one of them. A LinkedIn data provider's survival depends less on the quality of its engineering than on whether it draws attention and can absorb the cost of the resulting fight. When you pick a replacement, you are picking a risk profile, not only a feature set.",[232,12838,12840],{"id":12839},"what-actually-broke-in-the-order-you-will-notice-it","What actually broke, in the order you will notice it",[11,12842,12843],{},"A profile enrichment endpoint sits in the middle of things, so its removal surfaces in stages. First the enrichment step errors. Then the CRM fields it wrote go stale rather than empty, which is worse, because nothing looks broken. Then, weeks later, somebody notices that job titles in the pipeline are from whenever the last successful run was.",[11,12845,12846],{},"The r\u002Fbigdata thread comparing Proxycurl and People Data Labs on global company profiles is a good snapshot of how teams were choosing here before the shutdown: coverage first, freshness second, price third. The shutdown reorders that list and puts a fourth item at the top.",[232,12848,12850],{"id":12849},"bulk-dataset-versus-per-profile-call-what-actually-differs","Bulk dataset versus per-profile call: what actually differs",[482,12852,12853,12865],{},[485,12854,12855],{},[488,12856,12857,12859,12862],{},[491,12858,915],{},[491,12860,12861],{},"Bulk dataset licence",[491,12863,12864],{},"Per-profile endpoint",[504,12866,12867,12877,12887,12896,12907],{},[488,12868,12869,12871,12874],{},[509,12870,5831],{},[509,12872,12873],{},"Buy a snapshot, query locally",[509,12875,12876],{},"Call when you need one record",[488,12878,12879,12881,12884],{},[509,12880,5842],{},[509,12882,12883],{},"As of the snapshot date",[509,12885,12886],{},"As of the call",[488,12888,12889,12891,12894],{},[509,12890,5853],{},[509,12892,12893],{},"Ingest, index, refresh quarterly",[509,12895,5859],{},[488,12897,12898,12901,12904],{},[509,12899,12900],{},"Cost driver",[509,12902,12903],{},"Size of the dataset",[509,12905,12906],{},"Number of records you actually touch",[488,12908,12909,12911,12914],{},[509,12910,3531],{},[509,12912,12913],{},"Analysis over a whole market",[509,12915,12916],{},"Enriching the rows you work on",[11,12918,12919],{},"Most teams that used Proxycurl were doing the second thing while paying for something shaped like the first. The shutdown is a reasonable moment to check which one you actually need.",[320,12921,12922],{},[11,12923,324,12924,119,12926],{},[38,12925,327],{},[18,12927,10131],{"href":10130},[27,12929,12931],{"id":12930},"how-do-you-move-a-linkedin-enrichment-pipeline-off-proxycurl","How do you move a LinkedIn enrichment pipeline off Proxycurl?",[11,12933,12934],{},"The migration is easier than it looks because Proxycurl's core shape, one profile URL in and one structured record out, is the most common shape in the category. Match that shape first and worry about field parity second.",[232,12936,235],{"id":234},[11,12938,238,12939,244],{},[18,12940,243],{"href":241,"rel":12941},[124,125],[131,12943,12945],{"className":12944,"code":249,"language":97,"meta":136},[248],[47,12946,249],{"__ignoreMap":136},[11,12948,254,12949,260],{},[18,12950,259],{"href":257,"rel":12951},[124,125],[232,12953,264],{"id":263},[131,12955,12956],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,12957,12958,12968],{"__ignoreMap":136},[140,12959,12960,12962,12964,12966],{"class":142,"line":143},[140,12961,274],{"class":146},[140,12963,277],{"class":150},[140,12965,280],{"class":150},[140,12967,283],{"class":150},[140,12969,12970,12972,12974,12976,12978,12980,12982,12984,12986,12988],{"class":142,"line":166},[140,12971,147],{"class":146},[140,12973,290],{"class":150},[140,12975,293],{"class":150},[140,12977,296],{"class":150},[140,12979,299],{"class":193},[140,12981,302],{"class":150},[140,12983,305],{"class":183},[140,12985,308],{"class":193},[140,12987,311],{"class":150},[140,12989,314],{"class":150},[232,12991,12993],{"id":12992},"step-1-replace-the-person-profile-call","Step 1. Replace the Person Profile call",[11,12995,12996,12998],{},[38,12997,1131],{}," Takes LinkedIn profile URLs and returns normalised structured records, which is the direct analogue of what Proxycurl's person endpoint did.",[11,13000,13001,119,13003,13007],{},[38,13002,1137],{},[18,13004,13005],{"href":5030},[47,13006,10084],{}," accepts an array of profile URLs and returns one record each, with no result limit parameter, because the result count equals the input count.",[11,13009,13010],{},[38,13011,1148],{},[131,13013,13015],{"className":133,"code":13014,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Fdev_fusion\u002Flinkedin-profile-scraper\nmonid run -p apify -e \u002Fdev_fusion\u002Flinkedin-profile-scraper \\\n  -i '{\"profileUrls\":[\"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fwilliamhgates\"]}' -w\n",[47,13016,13017,13032,13048],{"__ignoreMap":136},[140,13018,13019,13021,13023,13025,13027,13029],{"class":142,"line":143},[140,13020,147],{"class":146},[140,13022,151],{"class":150},[140,13024,154],{"class":150},[140,13026,157],{"class":150},[140,13028,160],{"class":150},[140,13030,13031],{"class":150}," \u002Fdev_fusion\u002Flinkedin-profile-scraper\n",[140,13033,13034,13036,13038,13040,13042,13044,13046],{"class":142,"line":166},[140,13035,147],{"class":146},[140,13037,171],{"class":150},[140,13039,154],{"class":150},[140,13041,157],{"class":150},[140,13043,160],{"class":150},[140,13045,12788],{"class":150},[140,13047,184],{"class":183},[140,13049,13050,13052,13054,13057,13059],{"class":142,"line":187},[140,13051,190],{"class":150},[140,13053,194],{"class":193},[140,13055,13056],{"class":150},"{\"profileUrls\":[\"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fwilliamhgates\"]}",[140,13058,2045],{"class":193},[140,13060,1190],{"class":150},[11,13062,13063,13065],{},[38,13064,1195],{}," Verified 2026-08-20: name, headline, summary, profile images and location, then arrays for work history, education, skills and endorsements, languages, certifications, publications, patents, volunteer experience and recommendations. Company metadata rides along inside the work history, including industry, website, size range, founded year and company identifiers. Contact enrichment adds discovered email and mobile where available.",[11,13067,13068],{},"That last clause is the one to test rather than trust. Email discovery is probabilistic in every product in this category, and the honest way to evaluate it is to run twenty profiles you already know the answers for.",[11,13070,13071,13073,13074,260],{},[38,13072,1229],{}," Per result, at cents per profile, so a hundred profiles costs a hundred profiles rather than a plan. Current figures at ",[18,13075,1233],{"href":5582,"rel":13076},[124,125],[232,13078,13080],{"id":13079},"step-2-replace-the-search-half-which-is-the-harder-half","Step 2. Replace the search half, which is the harder half",[11,13082,13083,13085],{},[38,13084,1131],{}," Finds the profiles in the first place, by filter rather than by URL. This is the part teams forget to budget for, because Proxycurl's search and its enrichment were one signup.",[11,13087,13088,119,13090,10050,13094,13099,13100,13104],{},[38,13089,1137],{},[18,13091,13092],{"href":10046},[47,13093,10049],{},[18,13095,13096],{"href":10046},[47,13097,13098],{},"apify\u002Fharvestapi\u002Flinkedin-profile-search-by-name"," handles the narrower case where you have a name and need the right person. ",[18,13101,13102],{"href":10046},[47,13103,10055],{}," walks a company's staff with title, seniority and location filters.",[11,13106,13107],{},[38,13108,1148],{},[131,13110,13112],{"className":133,"code":13111,"language":135,"meta":136,"style":136},"monid discover -q \"linkedin profile enrichment\"\nmonid inspect -p apify -e \u002Fharvestapi\u002Flinkedin-profile-search\n",[47,13113,13114,13129],{"__ignoreMap":136},[140,13115,13116,13118,13120,13122,13124,13127],{"class":142,"line":143},[140,13117,147],{"class":146},[140,13119,2667],{"class":150},[140,13121,2670],{"class":150},[140,13123,2673],{"class":193},[140,13125,13126],{"class":150},"linkedin profile enrichment",[140,13128,2679],{"class":193},[140,13130,13131,13133,13135,13137,13139,13141],{"class":142,"line":166},[140,13132,147],{"class":146},[140,13134,151],{"class":150},[140,13136,154],{"class":150},[140,13138,157],{"class":150},[140,13140,160],{"class":150},[140,13142,13143],{"class":150}," \u002Fharvestapi\u002Flinkedin-profile-search\n",[11,13145,13146,13148],{},[38,13147,1195],{}," Search pages, then profile detail records at the depth you asked for. The billing is tiered rather than flat, and the tiers are worth reading before you run: search pages, profile details, and profile details with email search are three separate lines.",[11,13150,13151,13153],{},[38,13152,1229],{}," Per result on every tier, which means a broad filter is the expensive mistake here. Narrow the filter, then widen it once you have seen what a page of results looks like.",[232,13155,13157],{"id":13156},"step-3-decide-which-company-records-you-need-live","Step 3. Decide which company records you need live",[11,13159,13160,13162],{},[38,13161,1131],{}," Fills in firmographics without paying profile prices for them.",[11,13164,13165,119,13167,13172,13173,13177],{},[38,13166,1137],{},[18,13168,13169],{"href":10046},[47,13170,13171],{},"tikhub\u002Fapi\u002Fv1\u002Flinkedin\u002Fweb_v2\u002Fget_company_profile"," bills per call rather than per result, which suits spot checks. ",[18,13174,13175],{"href":9991},[47,13176,9994],{}," resolves a company from a domain, LinkedIn URL, name or website and returns firmographics, funding and technology data in one call.",[11,13179,13180,13182],{},[38,13181,1195],{}," Enough that the LinkedIn company page is often not the thing you needed. If your enrichment is really about company size, funding and stack, a company endpoint answers it without touching a person record at all.",[11,13184,13185,13187],{},[38,13186,1229],{}," Per call for both, which is the shape you want for a step that runs once per account rather than once per lead.",[316,13189],{"prompt":13190},"enrich these LinkedIn profile URLs and tell me which fields came back empty",[320,13192,13193],{},[11,13194,324,13195,119,13197,102,13201],{},[38,13196,327],{},[18,13198,13200],{"href":13199},"\u002Fblog\u002Fwhich-linkedin-scraper-returns-emails","Which LinkedIn Scraper Actually Returns Emails",[18,13202,13203],{"href":466},"Automate LinkedIn Company Data Pulls Into a Table",[27,13205,13207],{"id":13206},"is-scraping-linkedin-with-no-paid-apis-actually-a-plan","Is scraping LinkedIn with no paid APIs actually a plan?",[11,13209,13210],{},"It is a plan that works until it is the only thing holding your pipeline up. The r\u002Fn8n post describing a workflow that pulls a thousand targeted LinkedIn leads a day with no paid APIs drew ninety-three comments, and the comments are the useful part: the build works, and the failure modes people report are account restrictions, silent partial results, and selector breakage after a layout change.",[11,13212,13213],{},"Those three failures have a shape in common. None of them raises an error. A restricted account returns a page, a partial scrape returns a shorter list, and a changed selector returns nulls. So the pipeline reports success and the data quietly degrades, which is the same failure pattern as a dead enrichment endpoint but harder to detect because there is no status code to alert on.",[11,13215,13216],{},"The trade is real and it is not free either way. Running it yourself costs engineering time and account risk, and the risk lands on an account that belongs to a person. Paying per call moves the operational burden to the provider and the legal exposure with it. Neither option makes the underlying question go away, which is why the honest framing is not build versus buy but who carries the risk when it goes wrong.",[11,13218,13219],{},"If you do run your own, the one thing worth adding is an assertion rather than a try\u002Fcatch: check that the field you actually consume is populated on a known-good record every run, and fail loudly when it is not.",[27,13221,480],{"id":479},[482,13223,13224,13240],{},[485,13225,13226],{},[488,13227,13228,13230,13232,13234,13236,13238],{},[491,13229,496],{},[491,13231,6334],{},[491,13233,1443],{},[491,13235,1446],{},[491,13237,3531],{},[491,13239,1449],{},[504,13241,13242,13263,13284,13306,13327,13348,13371],{},[488,13243,13244,13250,13253,13255,13258,13261],{},[509,13245,13246],{},[18,13247,13248],{"href":5030},[47,13249,10084],{},[509,13251,13252],{},"Full profile enrichment from URLs",[509,13254,10274],{},[509,13256,13257],{},"Work history, education, skills, discovered contacts",[509,13259,13260],{},"The direct Proxycurl person replacement",[509,13262,3551],{},[488,13264,13265,13271,13273,13276,13279,13282],{},[509,13266,13267],{},[18,13268,13269],{"href":10046},[47,13270,10049],{},[509,13272,10225],{},[509,13274,13275],{},"Title, company, school, location, seniority",[509,13277,13278],{},"Search pages plus profile details",[509,13280,13281],{},"Building a list from criteria",[509,13283,10237],{},[488,13285,13286,13292,13295,13298,13301,13304],{},[509,13287,13288],{},[18,13289,13290],{"href":10046},[47,13291,13098],{},[509,13293,13294],{},"Disambiguate a known name",[509,13296,13297],{},"First and last name, filters",[509,13299,13300],{},"Matching profiles",[509,13302,13303],{},"Resolving a name to a person",[509,13305,3551],{},[488,13307,13308,13314,13317,13320,13322,13325],{},[509,13309,13310],{},[18,13311,13312],{"href":10046},[47,13313,10055],{},[509,13315,13316],{},"Walk a company's staff",[509,13318,13319],{},"Company, title, seniority filters",[509,13321,10254],{},[509,13323,13324],{},"Account-based prospecting",[509,13326,10260],{},[488,13328,13329,13335,13338,13340,13343,13346],{},[509,13330,13331],{},[18,13332,13333],{"href":10046},[47,13334,10160],{},[509,13336,13337],{},"Profile and company page posts",[509,13339,10318],{},[509,13341,13342],{},"Posts with engagement and comments",[509,13344,13345],{},"Signal and timing, not identity",[509,13347,3551],{},[488,13349,13350,13357,13360,13363,13366,13369],{},[509,13351,13352],{},[18,13353,13354],{"href":10046},[47,13355,13356],{},"tikhub\u002Fapi\u002Fv1\u002Flinkedin\u002Fweb_v2\u002Fget_user_profile",[509,13358,13359],{},"Single profile lookup",[509,13361,13362],{},"Profile identifier",[509,13364,13365],{},"Profile record",[509,13367,13368],{},"Spot checks and low volume",[509,13370,542],{},[488,13372,13373,13379,13381,13383,13385,13388],{},[509,13374,13375],{},[18,13376,13377],{"href":9991},[47,13378,9994],{},[509,13380,10203],{},[509,13382,10206],{},[509,13384,10209],{},[509,13386,13387],{},"Company data without person data",[509,13389,542],{},[11,13391,1560,13392,13394],{},[47,13393,607],{}," on 2026-08-20. The billing column is the shape rather than a figure, because per call and per result change how you architect and a price does not stay true.",[27,13396,13398],{"id":13397},"what-does-replacing-proxycurl-actually-cost","What does replacing Proxycurl actually cost?",[11,13400,13401],{},"It depends almost entirely on whether you were using the search half, and most Proxycurl bills were mostly search.",[11,13403,13404],{},"Enrichment alone is cheap and predictable. A few hundred profile URLs enriched once is single-digit dollars, and it scales linearly because the billing is per result with no plan underneath it. If your pipeline enriches the leads a human is about to work rather than every row in a database, this is the whole bill.",[11,13406,13407],{},"Search is where the number moves. Filtered search bills per result across more than one tier, so a filter that matches ten thousand people costs ten thousand people even if you only wanted the first fifty. The fix is not a cheaper endpoint, it is a narrower filter and a hard cap, checked against one page of output before the real run.",[11,13409,13410,13411,13413,13414,260],{},"Discovery and inspection stay free throughout, so you can read every tier of the pricing before committing to a run. That is the property that makes a metered balance work for this job: access costs nothing until it is used. Where metered loses is steady high volume, and we worked that crossover through in ",[18,13412,6511],{"href":2325},". Prices are at ",[18,13415,1233],{"href":5582,"rel":13416},[124,125],[421,13418,13421],{"category":13419,"title":13420},"linkedin","Rebuild the enrichment step, not the whole stack",[11,13422,13423],{},"Discover what covers each half of what Proxycurl did, read the schemas, and see current prices. Nothing bills until you run.",[27,13425,657],{"id":656},[11,13427,13428],{},"If you need a licensed dataset with contractual coverage guarantees, buy one. People Data Labs, Apollo and the other data companies sell a different product from an endpoint: a defined universe, a refresh commitment and someone to call when coverage drops. A per-call endpoint gives you none of that, and for a team building a market map rather than a workflow, that is the wrong shape entirely.",[11,13430,13431],{},"If your use case is served by LinkedIn's official APIs, use them. Marketing, advertising and Talent Solutions APIs exist, they are supported, and they carry no ambiguity at all. The limitation is scope rather than quality: they serve your own company's data and your own advertising, not arbitrary third-party profiles, which is exactly why this category exists.",[11,13433,13434],{},"If your legal position needs to be unambiguous, no endpoint in this category gives you that, ours included. The honest statement is that this is contested ground, LinkedIn litigates on it, and the outcome of the Proxycurl case is that a profitable company chose to close rather than test it. Route your decision through counsel rather than through a comparison table.",[27,13436,696],{"id":695},[11,13438,13439],{},"Proxycurl did not lose to a competitor, it settled with the platform, and that means the replacement question is not \"who else does this\" but \"which half of this do I actually need and who should carry the risk\". Teams that used Proxycurl for URL-to-record enrichment have a clean, cheap, per-result substitute available today. Teams that used it for filtered search have a real migration, because search bills differently and needs its filters re-tuned.",[11,13441,13442],{},"The thing that matters more than the endpoint choice: this category's vendors do not fail gracefully, and none of them warn you. Keep the provider in configuration, assert on a known-good record every run, and make sure a stale field alerts as loudly as an empty one. Stale is the failure mode that costs money, because nobody notices it.",[11,13444,7340,13445,6547,13448,13450,13451,260],{},[47,13446,13447],{},"monid discover -q \"linkedin profile enrichment\"",[47,13449,607],{}," on the two that match your two halves to read their schemas and current prices, then one small paid run against twenty profiles whose answers you already know. Start at ",[18,13452,725],{"href":723,"rel":13453},[124,125],[27,13455,729],{"id":728},[731,13457,13459],{"q":13458},"What is the best LinkedIn scraper API?",[11,13460,13461,13462,260],{},"There is no single best one, because LinkedIn data splits into three jobs and different endpoints win each. Enrichment from a URL, filtered search from criteria, and post or activity monitoring have different billing shapes and different failure modes, and picking one endpoint for all three is how bills get surprising. We worked through which endpoint fits which job in ",[18,13463,13464],{"href":12653},"the best LinkedIn scraper API in 2026",[731,13466,13468],{"q":13467},"Is the data I already pulled from Proxycurl still usable?",[11,13469,13470],{},"That is a question for your counsel, not for a blog post, and we are not going to pretend otherwise. What is public is that Proxycurl closed to comply with a settlement with LinkedIn and that the settlement involved compliance obligations. Anyone holding a large historical export should get an actual legal read rather than an inference from a shutdown notice.",[731,13472,13474],{"q":13473},"Does the official LinkedIn API cover any of this?",[11,13475,13476],{},"Partly, and only for data you already have a relationship with. LinkedIn's official APIs cover your own company page, your own advertising and, under Talent Solutions, your own recruiting workflows. They do not provide arbitrary third-party profile lookup, which is the specific capability every product in this category exists to supply.",[731,13478,13480],{"q":13479},"What happened to the Proxycurl team?",[11,13481,13482],{},"They kept operating at the same domain under a different product. The closing post is still at nubela.co, and the team's current work is a company intelligence product rather than a LinkedIn scraper, which is a meaningful distinction rather than a rebrand: the new product's identifiers are company websites, not LinkedIn URLs.",[11,13484,13485],{},[758,13486,760],{},[762,13488,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":13490},[13491,13496,13503,13504,13505,13506,13507,13508],{"id":12816,"depth":166,"text":12817,"children":13492},[13493,13494,13495],{"id":12829,"depth":187,"text":12830},{"id":12839,"depth":187,"text":12840},{"id":12849,"depth":187,"text":12850},{"id":12930,"depth":166,"text":12931,"children":13497},[13498,13499,13500,13501,13502],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":12992,"depth":187,"text":12993},{"id":13079,"depth":187,"text":13080},{"id":13156,"depth":187,"text":13157},{"id":13206,"depth":166,"text":13207},{"id":479,"depth":166,"text":480},{"id":13397,"depth":166,"text":13398},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fproxycurl-shutdown-linkedin-data-alternatives.png","Proxycurl closed in July 2025 to settle with LinkedIn. What a replacement has to return, which endpoints cover which half, and the risk to read first.","\u002Fimg\u002Fblog\u002Fproxycurl-shutdown-linkedin-data-alternatives-card.png",{},"\u002Fblog\u002Fguides\u002Fproxycurl-shutdown-linkedin-data-alternatives",{"title":12761,"description":13510},"blog\u002Fguides\u002Fproxycurl-shutdown-linkedin-data-alternatives",[13419,10499,6627,13517,13518],"sales","leads","RZDtSgoUAcPqHFGv6j5A1tCy9-8T0_Po0OGh0zuoyyc",{"id":13521,"title":13522,"author":6,"body":13523,"category":8203,"cover":14161,"description":14162,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":14163,"meta":14164,"navigation":790,"ogImage":787,"path":14165,"publishedAt":5712,"readTime":1681,"seo":14166,"stem":14167,"tags":14168,"toolCategory":13897,"updatedAt":5712,"__hash__":14173},"blogGuides\u002Fblog\u002Fguides\u002Ftiktok-data-behind-an-ai-video-ad.md","Oumomo Generates the Ad. TikTok Data Decides Which One.",{"type":8,"value":13524,"toc":14144},[13525,13534,13537,13540,13544,13547,13550,13553,13556,13562,13566,13569,13582,13586,13606,13609,13611,13616,13628,13633,13635,13671,13676,13680,13683,13733,13741,13745,13756,13804,13807,13811,13814,13883,13895,13902,13906,13909,13915,13921,13927,13933,13948,13951,13975,13978,13982,13989,13995,14001,14007,14010,14019,14031,14035,14038,14041,14052,14055,14059,14062,14068,14074,14085,14088,14090,14093,14096,14098,14104,14114,14125,14138,14142],[11,13526,13527,13528,13533],{},"An AI video tool will make whatever you ask it for. That is the useful part and it is also the trap. ",[18,13529,13532],{"href":13530,"rel":13531},"https:\u002F\u002Fwww.oumomo.ai",[124,125],"Oumomo"," turns a product link, a reference format or a short brief into a finished TikTok video, and it will do that just as cheerfully for a bad idea as for a good one. The generator is not the constraint any more. The brief is.",[11,13535,13536],{},"Somebody on r\u002FClaudeAI posted their first day on TikTok: four hundred likes and ninety saves on video one, built with Claude, the TikHub API and n8n. Read the stack rather than the result. Half of it is a video tool. The other half is a data call that told them what the video should be.",[11,13538,13539],{},"Fair disclosure before anything else. You are on the Monid blog, Monid is the data half described below, and Oumomo is a content partner of ours. Oumomo is not in the Monid catalogue and this article is not selling you a bundle. The two products sit on opposite sides of the same job, which is why the split is worth writing down.",[27,13541,13543],{"id":13542},"why-does-a-good-ai-video-generator-still-produce-ads-nobody-watches","Why does a good AI video generator still produce ads nobody watches?",[11,13545,13546],{},"Because generation and research fail in opposite directions, and only one of them is visibly broken.",[11,13548,13549],{},"A weak generator produces something you can see is wrong: a warped label, six fingers, a product that changes shape between shots. You catch it in review and regenerate. A weak brief produces something that looks completely fine. Correct product, clean lighting, readable text, sensible pacing. It just answers a question nobody was asking, and you find that out four days after publishing, from a flat view count that tells you nothing about which part to change.",[11,13551,13552],{},"The usual advice for this is right as far as it goes: no tool can promise a video will go viral, so make a small batch of controlled versions and change one variable at a time. Follow it and you immediately hit the gap. Controlled versions need a control. Something has to say which hook, which length, which use case is worth the first test, or version A and version B are both guesses and the comparison between them measures nothing.",[11,13554,13555],{},"That something is public and it is already on the platform. Every product category on TikTok has a few hundred videos that have already run the experiment.",[11,13557,13558],{},[5252,13559],{"alt":13560,"src":13561},"One keyword goes out, one search call comes back, and four decisions fall out of the same response before any video is generated.","\u002Fimg\u002Fblog\u002Ftiktok-data-behind-an-ai-video-ad-fig-loop.png",[27,13563,13565],{"id":13564},"what-is-the-best-api-for-tiktok-data","What is the best API for TikTok data?",[11,13567,13568],{},"There is no official one for this job, which is the first thing to know. The TikTok Research API is gated to accredited academic use, and the Display API only reaches accounts that have authorised your app. Neither reads a keyword's public search results, which is the exact thing a creative brief needs.",[11,13570,13571,13572,13577,13578,13581],{},"So every answer here is a third party reading public pages, and the honest question is which one, at what billing shape, returning which fields. ",[18,13573,13576],{"href":13574,"rel":13575},"https:\u002F\u002Ftikhub.io",[124,125],"TikHub"," is the one used below, reachable through ",[18,13579,13580],{"href":7788},"TikHub on Monid"," without a separate account or key.",[232,13583,13585],{"id":13584},"which-endpoint-does-the-job","Which endpoint does the job",[11,13587,13588,13591,13592,13595,13596,13599,13600,3933,13603,260],{},[47,13589,13590],{},"tikhub \u002Fapi\u002Fv1\u002Ftiktok\u002Fapp\u002Fv3\u002Ffetch_video_search_result"," takes a keyword and returns ranked video results with full statistics attached. The parameters that matter for creative research are ",[47,13593,13594],{},"sort_type"," (relevance or most likes), ",[47,13597,13598],{},"publish_time"," (a rolling window in days), ",[47,13601,13602],{},"region",[47,13604,13605],{},"count",[11,13607,13608],{},"The v3 app endpoint is the one to use. There is an older web search endpoint in the same catalogue at the same price; it is thinner, and the app version is what returns the statistics block this whole exercise depends on.",[232,13610,235],{"id":234},[11,13612,238,13613,244],{},[18,13614,243],{"href":241,"rel":13615},[124,125],[131,13617,13618],{"className":814,"code":249,"language":816,"meta":136,"style":136},[47,13619,13620],{"__ignoreMap":136},[140,13621,13622,13624,13626],{"class":142,"line":143},[140,13623,824],{"class":823},[140,13625,827],{"class":150},[140,13627,12334],{"class":150},[11,13629,12337,13630,260],{},[18,13631,259],{"href":257,"rel":13632},[124,125],[232,13634,264],{"id":263},[131,13636,13637],{"className":814,"code":8536,"language":816,"meta":136,"style":136},[47,13638,13639,13649],{"__ignoreMap":136},[140,13640,13641,13643,13645,13647],{"class":142,"line":143},[140,13642,274],{"class":146},[140,13644,277],{"class":150},[140,13646,280],{"class":150},[140,13648,283],{"class":150},[140,13650,13651,13653,13655,13657,13659,13661,13663,13665,13667,13669],{"class":142,"line":166},[140,13652,147],{"class":146},[140,13654,290],{"class":150},[140,13656,293],{"class":150},[140,13658,8559],{"class":150},[140,13660,8562],{"class":150},[140,13662,8565],{"class":150},[140,13664,299],{"class":193},[140,13666,1114],{"class":150},[140,13668,305],{"class":183},[140,13670,8574],{"class":193},[11,13672,12381,13673,260],{},[18,13674,8582],{"href":8580,"rel":13675},[124,125],[232,13677,13679],{"id":13678},"the-call","The call",[11,13681,13682],{},"One keyword, one call, top twenty by likes, last thirty days:",[131,13684,13686],{"className":133,"code":13685,"language":135,"meta":136,"style":136},"monid run -p tikhub \\\n  -e \u002Fapi\u002Fv1\u002Ftiktok\u002Fapp\u002Fv3\u002Ffetch_video_search_result \\\n  --query '{\"keyword\":\"portable blender\",\"count\":20,\"sort_type\":1,\"publish_time\":30,\"region\":\"US\"}' \\\n  -w -o tt.json\n",[47,13687,13688,13701,13711,13724],{"__ignoreMap":136},[140,13689,13690,13692,13694,13696,13699],{"class":142,"line":143},[140,13691,147],{"class":146},[140,13693,171],{"class":150},[140,13695,154],{"class":150},[140,13697,13698],{"class":150}," tikhub",[140,13700,184],{"class":183},[140,13702,13703,13706,13709],{"class":142,"line":166},[140,13704,13705],{"class":150},"  -e",[140,13707,13708],{"class":150}," \u002Fapi\u002Fv1\u002Ftiktok\u002Fapp\u002Fv3\u002Ffetch_video_search_result",[140,13710,184],{"class":183},[140,13712,13713,13715,13717,13720,13722],{"class":142,"line":187},[140,13714,2037],{"class":150},[140,13716,194],{"class":193},[140,13718,13719],{"class":150},"{\"keyword\":\"portable blender\",\"count\":20,\"sort_type\":1,\"publish_time\":30,\"region\":\"US\"}",[140,13721,2045],{"class":193},[140,13723,184],{"class":183},[140,13725,13726,13728,13730],{"class":142,"line":1279},[140,13727,5302],{"class":150},[140,13729,5305],{"class":150},[140,13731,13732],{"class":150}," tt.json\n",[11,13734,13735,13737,13738,13740],{},[47,13736,6213],{}," rather than ",[47,13739,6217],{},", because this endpoint takes query parameters and not a body. Getting that backwards returns a schema error rather than a bill, which is the good failure mode.",[232,13742,13744],{"id":13743},"what-comes-back","What comes back",[11,13746,13747,13748,13751,13752,13755],{},"The videos arrive under ",[47,13749,13750],{},"search_item_list",", each wrapped as ",[47,13753,13754],{},"aweme_info",", with roughly a hundred and fifty fields per video. Four of them carry the brief:",[5222,13757,13758,13780,13786,13796],{},[5225,13759,13760,13763,13764,98,13767,98,13770,98,13773,102,13776,13779],{},[47,13761,13762],{},"statistics"," holds ",[47,13765,13766],{},"digg_count",[47,13768,13769],{},"play_count",[47,13771,13772],{},"comment_count",[47,13774,13775],{},"collect_count",[47,13777,13778],{},"share_count"," separately, so saves and shares can be read against likes rather than folded into one engagement number.",[5225,13781,13782,13785],{},[47,13783,13784],{},"video.duration"," is in milliseconds, and it is the field most people forget to look at.",[5225,13787,13788,13791,13792,13795],{},[47,13789,13790],{},"text_extra"," carries the hashtags as structured entries, and ",[47,13793,13794],{},"desc"," carries the caption the creator actually wrote.",[5225,13797,13798,102,13800,13803],{},[47,13799,13602],{},[47,13801,13802],{},"desc_language"," sit on each video, which turns out to matter more than expected.",[11,13805,13806],{},"Nine of the twenty results carried commerce metadata, marking them as shoppable rather than organic. That flag is worth reading before you copy a format: an organic video and a shop video are optimised against different things.",[232,13808,13810],{"id":13809},"tiktok-tools-compared-which-one-should-you-use","TikTok tools compared: which one should you use?",[11,13812,13813],{},"The comparison that decides your bill is not feature lists, it is billing shape.",[482,13815,13816,13828],{},[485,13817,13818],{},[488,13819,13820,13823,13825],{},[491,13821,13822],{},"Axis",[491,13824,13576],{},[491,13826,13827],{},"Apify TikTok actors",[504,13829,13830,13839,13850,13861,13872],{},[488,13831,13832,13834,13837],{},[509,13833,502],{},[509,13835,13836],{},"Per call, flat, whatever the result count",[509,13838,3551],{},[488,13840,13841,13844,13847],{},[509,13842,13843],{},"One keyword sweep",[509,13845,13846],{},"One charge for twenty videos",[509,13848,13849],{},"Twenty charges for twenty videos",[488,13851,13852,13855,13858],{},[509,13853,13854],{},"Deep history on one account",[509,13856,13857],{},"Weaker",[509,13859,13860],{},"Stronger",[488,13862,13863,13866,13869],{},[509,13864,13865],{},"Field depth per video",[509,13867,13868],{},"High, statistics fully broken out",[509,13870,13871],{},"High, shaped differently",[488,13873,13874,13877,13880],{},[509,13875,13876],{},"Best fit here",[509,13878,13879],{},"Wide, repeated, shallow reads",[509,13881,13882],{},"Deep pulls on a known account",[11,13884,13885,13886,13890,13891,260],{},"Creative research is wide and shallow and repeated, which is the per call quadrant. Auditing one competitor account's entire back catalogue is deep and one off, which is the per result quadrant. We ",[18,13887,13889],{"href":13888},"\u002Fblog\u002Fapify-vs-tikhub-tiktok-scraping","priced the two against each other"," in more detail, and the cross-platform version of the same question lives in ",[18,13892,13894],{"href":13893},"\u002Fblog\u002Fguides\u002Fbest-social-media-scraping-api-2026","the social scraping guide",[421,13896,13899],{"category":13897,"title":13898},"tiktok","Read one keyword before you generate twenty videos",[11,13900,13901],{},"Inspect the endpoint free, see the billing shape, run a single search before you commit a batch.",[27,13903,13905],{"id":13904},"what-does-the-data-actually-tell-you-to-put-in-the-brief","What does the data actually tell you to put in the brief?",[11,13907,13908],{},"Four things fell out of that one response, and three of them contradict what a default brief would have said.",[11,13910,13911],{},[5252,13912],{"alt":13913,"src":13914},"One search call, four independent signals, each of which changes a different line of the brief.","\u002Fimg\u002Fblog\u002Ftiktok-data-behind-an-ai-video-ad-fig-signals.png",[11,13916,13917,13920],{},[38,13918,13919],{},"The spread tells you whether the category is winnable."," Median likes across the twenty were 362. The top video had 5,550. That is a fifteenfold gap inside a single keyword's top results over thirty days, which means format is doing the work, not luck and not budget. A category where the top and the median sit close together is one where creative barely moves the outcome, and that is worth knowing before you commission a batch.",[11,13922,13923,13926],{},[38,13924,13925],{},"The duration contradicts the house style."," Durations ran from fourteen seconds to a hundred and sixty eight. The default brief for a product video is fifteen seconds, and the two best performers in this sample were a hundred and sixty eight seconds and eighty nine seconds. The winner was an ASMR piece, \"Foods Vs Portable Blender\", not an ad. If you brief a fifteen second demo here because fifteen seconds is what short form means, you have ruled out the format that won, before writing a word.",[11,13928,13929,13932],{},[38,13930,13931],{},"Follower count is not the gate, and the data says so bluntly."," One video in the sample pulled 196,496 plays from an account with seventy two followers. Another account with 217,396 followers managed 23,612 plays on its video. Whatever is being ranked, it is not audience size. That is the single most useful thing to tell a team that has been told to build a following first.",[11,13934,13935,13938,13939,13942,13943,102,13945,13947],{},[38,13936,13937],{},"The region parameter is not the market filter you think it is."," The call asked for ",[47,13940,13941],{},"region: US",". The twenty results came back tagged PK, GB, US, ID, BR and NG, and the top performer was uploaded from Pakistan. Two of the twenty captions were in Spanish. The parameter shapes which feed the search runs against; it does not hand you a list of local creators. If you are localising for one market, as you should be, read ",[47,13944,13602],{},[47,13946,13802],{}," on each result rather than trusting the request.",[11,13949,13950],{},"That is one keyword and twenty videos, and it is a sample, not a law. Run it on your own category before believing any of the specific numbers. The method survives; the figures are yours to re-measure.",[11,13952,13953,13954,4812,13958,13962,13963,13967,13968,102,13971,13974],{},"From here the same catalogue answers the adjacent questions with the same key. Take the account behind the outlier and ",[18,13955,13957],{"href":13956},"\u002Fblog\u002Fscrape-tiktok-profiles-and-videos-one-endpoint","pull its full profile and video history",[18,13959,13961],{"href":13960},"\u002Fblog\u002Ftiktok-handle-to-dataset-in-one-script","go one step further into a full dataset",". ",[18,13964,13966],{"href":13965},"\u002Fblog\u002Fautomate-tiktok-comment-collection","Read the comments on the winning video"," to find the objection the video did not answer, which is usually the next video. Then, if the product sells on a marketplace too, ",[18,13969,13970],{"href":5548},"what buyers complain about in reviews",[18,13972,13973],{"href":5411},"which keyword the listing actually competes on"," fill in the parts TikTok cannot see.",[316,13976],{"prompt":13977},"search TikTok for my product keyword, sorted by likes over the last 30 days, and tell me the duration, hashtags and region of the top five results",[27,13979,13981],{"id":13980},"how-do-you-hand-that-brief-to-oumomo","How do you hand that brief to Oumomo?",[11,13983,13984,13985,13988],{},"This is where the split gets clean, because ",[18,13986,13532],{"href":13530,"rel":13987},[124,125]," is built around exactly the three inputs the research produces.",[11,13990,13991,13994],{},[38,13992,13993],{},"Viral Remake takes the reference."," Oumomo's own framing is the right one: the reference should guide pacing and story order, not supply another creator's footage or wording. The research half tells you which reference to hand it. Without the search call, picking the reference is scrolling, and scrolling selects for what you happened to see rather than what actually outperformed.",[11,13996,13997,14000],{},[38,13998,13999],{},"Link to Video takes the product."," Point it at a listing and the accurate product information comes across without rebuilding scenes by hand. What research adds here is the choice the tool cannot make for you: whether this video opens on the problem, the result, or the surprising use case.",[11,14002,14003,14006],{},[38,14004,14005],{},"The Viral Script Generator takes the angle."," The measured findings above are script constraints. Length between eighty and a hundred and seventy seconds rather than fifteen. Test the ASMR format alongside the demo. Do not assume a US framing just because the search said US.",[11,14008,14009],{},"Oumomo also handles scheduling and publishing through TikTok's official API, which closes the loop back to where this started: publish, wait, then re-run the same search and see whether the format that won last month still wins. That loop is the actual product, and neither half of it works alone.",[11,14011,14012,14013,14018],{},"Localisation is the part this article has only touched, and it is where the generation side has more to say than the data side. A translated caption is not a localised video, because the setting, the casting, the units and the offer usually have to move with it. Their ",[18,14014,14017],{"href":14015,"rel":14016},"https:\u002F\u002Fwww.oumomo.ai\u002Fblog\u002F",[124,125],"blog"," covers that half.",[11,14020,14021,14022,102,14026,14030],{},"For the record on where the generation itself happens: Oumomo runs Seedance, Kling, Veo and Sora under the hood. Monid carries some of the same video models for teams that want to call them directly, and we have written up ",[18,14023,14025],{"href":14024},"\u002Fblog\u002Fminimax-vs-seedance-for-ai-video","the difference between the video models",[18,14027,14029],{"href":14028},"\u002Fblog\u002Fautomate-short-form-ai-video-generation","generating a clip straight from a prompt",". If you want a workflow around the generation rather than an API call, that is Oumomo's job and not ours.",[27,14032,14034],{"id":14033},"what-does-the-research-half-cost-to-run","What does the research half cost to run?",[11,14036,14037],{},"Cheap enough that the cost is not the decision, which is the honest answer and the one the comparison threads never give.",[11,14039,14040],{},"The search endpoint bills per call, flat, at a small fraction of a cent, regardless of how many videos come back. Twenty results or two hundred, the charge is the same. Sweeping thirty keywords across a catalogue lands in small change, and running the same sweep weekly for a year still does not reach the price of one month of a creative research subscription.",[11,14042,14043,14044,14047,14048,14051],{},"That is the shape that matters, not the figure. Per call billing means the cost scales with how often you ask, not with how much comes back, so a wide sweep is cheap and a deep crawl of one account is where you should switch tools. Current numbers live on ",[18,14045,1233],{"href":5582,"rel":14046},[124,125],", because a number in an article goes stale silently. The broader argument for ",[18,14049,14050],{"href":2325},"per call against a subscription"," is written up separately.",[11,14053,14054],{},"The real cost is the generation, not the research, which is the point. Research is the cheap half that decides how the expensive half gets spent.",[27,14056,14058],{"id":14057},"when-is-this-the-wrong-approach","When is this the wrong approach?",[11,14060,14061],{},"Three cases, and none of them is a token paragraph.",[11,14063,14064,14067],{},[38,14065,14066],{},"When you already know the format works."," If you have run fifty videos in this category and the winning structure is settled, more search data is confirmation, not information. Spend the time on production quality instead.",[11,14069,14070,14073],{},[38,14071,14072],{},"When the product is genuinely new."," Search results tell you what worked for products that already exist. For a category with no comparable, there is nothing to read and the first videos are honest exploration. Data helps on round two.",[11,14075,14076,14079,14080,14084],{},[38,14077,14078],{},"When you need one deep account audit rather than a wide read."," Per call billing stops being the advantage the moment you want every video a single competitor has posted for two years. That is a per result job, and an Apify actor does it better. The companion piece walks through ",[18,14081,14083],{"href":14082},"\u002Fblog\u002Fguides\u002Ftiktok-scraper-catalogue-audit","auditing a whole catalogue that way",", on a real seller account. We resell both routes, so this is not a concession that costs us anything, which is exactly why you should weigh it lightly.",[11,14086,14087],{},"There is also a limit on the whole method. Search results are a ranked view, not a census. You are reading what the platform chose to surface for that query at that moment, which is closer to what a buyer would encounter than to a complete picture. Treat it as a strong sample and re-run it rather than as ground truth.",[27,14089,696],{"id":695},[11,14091,14092],{},"The best AI video workflow is the one where the generator is never the thing making the creative decision. Oumomo is good at turning a decided brief into a finished, publishable video. A single search call is good at deciding the brief, and it is good at it because the experiment has already been run in public by a few hundred people who did not know they were running it.",[11,14094,14095],{},"The rule worth keeping: before you generate a batch, read one keyword. If the spread between the top and the median is wide, format is winnable and the research pays for itself many times over. If it is narrow, save the money and go work on the product page instead.",[27,14097,729],{"id":728},[731,14099,14101],{"q":14100},"Is there an official TikTok API for this?",[11,14102,14103],{},"Not for keyword search results. The Research API is restricted to accredited academic and non profit researchers with an approved application, and the Display API only reaches accounts that have authorised your app. Neither reads what a public keyword search returns, so every product doing this reads public pages, whatever it calls itself.",[731,14105,14107],{"q":14106},"Can I connect this to Claude or another assistant directly?",[11,14108,14109,14110,14113],{},"Yes, and that is the intended shape. Monid ships as an MCP server, so an agent discovers the endpoint, reads its schema and calls it inside a conversation. The prompt block above is a working example. The same setup covers the marketplace side if you also want ",[18,14111,14112],{"href":5411},"Amazon keyword and competitor data"," in the same session.",[731,14115,14117],{"q":14116},"Does the region parameter give me results from one country?",[11,14118,14119,14120,102,14122,14124],{},"Not in the way the name suggests. It shapes which regional feed the search runs against, and the sample above returned videos tagged to six different countries under a single US request. Read the per video ",[47,14121,13602],{},[47,14123,13802],{}," fields and filter on those if the market matters, which for a localised campaign it does.",[731,14126,14128],{"q":14127},"How often should I re run the search?",[11,14129,14130,14131,14133,14134,260],{},"Monthly for a stable category, weekly while a format is actively shifting. The endpoint takes a ",[47,14132,13598],{}," window, so a repeat run with a thirty day window naturally shows you what changed rather than the same back catalogue. Wiring it as a scheduled job is written up in ",[18,14135,14137],{"href":14136},"\u002Fblog\u002Fwire-up-tiktok-trend-tracking","tracking TikTok trends on a schedule",[11,14139,14140],{},[758,14141,760],{},[762,14143,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":14145},[14146,14147,14155,14156,14157,14158,14159,14160],{"id":13542,"depth":166,"text":13543},{"id":13564,"depth":166,"text":13565,"children":14148},[14149,14150,14151,14152,14153,14154],{"id":13584,"depth":187,"text":13585},{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":13678,"depth":187,"text":13679},{"id":13743,"depth":187,"text":13744},{"id":13809,"depth":187,"text":13810},{"id":13904,"depth":166,"text":13905},{"id":13980,"depth":166,"text":13981},{"id":14033,"depth":166,"text":14034},{"id":14057,"depth":166,"text":14058},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Ftiktok-data-behind-an-ai-video-ad.png","An AI video tool makes whatever you ask. One TikTok search call returned twenty videos with a fifteenfold spread in likes, and that spread is the brief.","\u002Fimg\u002Fblog\u002Ftiktok-data-behind-an-ai-video-ad-card.png",{},"\u002Fblog\u002Fguides\u002Ftiktok-data-behind-an-ai-video-ad",{"title":13522,"description":14162},"blog\u002Fguides\u002Ftiktok-data-behind-an-ai-video-ad",[14169,14170,14171,14172],"tiktok data api","ai video ads","tiktok shop","creative research","ZKwR0sVb6LzKS2LCc3R9BVKXabzRuUpiAAIkUAVtUCM",{"id":14175,"title":14176,"author":6,"body":14177,"category":8203,"cover":14768,"description":14769,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":14770,"meta":14771,"navigation":790,"ogImage":787,"path":14082,"publishedAt":5712,"readTime":1681,"seo":14772,"stem":14773,"tags":14774,"toolCategory":13897,"updatedAt":5712,"__hash__":14777},"blogGuides\u002Fblog\u002Fguides\u002Ftiktok-scraper-catalogue-audit.md","Oumomo Remakes the Winner. A TikTok Scraper Tells You Which.",{"type":8,"value":14178,"toc":14753},[14179,14182,14188,14191,14194,14198,14201,14204,14207,14210,14216,14220,14231,14309,14315,14335,14337,14342,14354,14359,14361,14397,14402,14404,14407,14451,14463,14473,14475,14506,14514,14518,14525,14528,14538,14544,14550,14556,14562,14565,14588,14591,14595,14598,14604,14610,14621,14627,14634,14640,14644,14647,14655,14664,14667,14669,14675,14681,14687,14697,14700,14702,14705,14708,14710,14722,14728,14738,14747,14751],[11,14180,14181],{},"There is a version of the content question that sounds practical and is a trap: which tool best enhances this old clip. Upscalers are real and they work, and picking one is a decision you can make in an afternoon. It is also the second question. The first one is which clip deserves the afternoon, and no amount of resolution answers it.",[11,14183,14184,14187],{},[18,14185,13532],{"href":13530,"rel":14186},[124,125]," frames this correctly in its own workflow: audit the asset library, enhance only the clips worth preserving, then decide what the library does not cover. Three sensible steps, and the audit is the one nobody actually does, because doing it means putting every video you have published into one table, and nothing on the platform gives you that table.",[11,14189,14190],{},"One call does. This article runs that call on a real TikTok Shop account, shows what fell out, and hands the result to the tool that makes the next video.",[11,14192,14193],{},"Fair disclosure. You are on the Monid blog, Monid is the data layer used below, and Oumomo is a content partner. Oumomo is not in the Monid catalogue. The section near the end names where this whole approach is the wrong one.",[27,14195,14197],{"id":14196},"should-you-enhance-the-old-clip-or-make-a-new-one","Should you enhance the old clip or make a new one?",[11,14199,14200],{},"The rule Oumomo states is the right one: enhance when the story and the product proof are already strong and only the technical quality is weak, generate new when you need a different hook, audience or setting.",[11,14202,14203],{},"The rule is sound and it is unusable as written, because \"the story is already strong\" is not a property of the file. You cannot watch a clip and know it. The clip that felt strongest in review is routinely the one that did nothing, and the throwaway you nearly deleted is the one that ran.",[11,14205,14206],{},"Somebody on r\u002FInstagramMarketing posted a bot that scrapes and reposts content every hour, automatically. Twenty eight comments about scheduling, none about selection. That is the shape of the problem: the volume half is fully automated and the choosing half is still a feeling.",[11,14208,14209],{},"Strength is a fact about what happened when the video ran, and that fact is sitting in public on your own profile page, one video at a time, in a layout designed to stop you comparing them.",[11,14211,14212],{},[5252,14213],{"alt":14214,"src":14215},"Fourteen videos go in as a list, one call turns them into a table, and the table is what the enhance or replace decision is actually made from.","\u002Fimg\u002Fblog\u002Ftiktok-scraper-catalogue-audit-fig-audit.png",[27,14217,14219],{"id":14218},"what-is-clockworkstiktok-scraper-and-which-one-should-you-use","What is clockworks\u002Ftiktok-scraper, and which one should you use?",[11,14221,14222,14223,14226,14227,14230],{},"Start with the honest answer, because this is the term people search and the answer has a catch. ",[47,14224,14225],{},"clockworks\u002Ftiktok-scraper"," is a well known Apify actor. It is not the one in the Monid catalogue. What is reachable through ",[18,14228,14229],{"href":5030},"Apify on Monid"," is a related set, and for this job one of them is clearly right:",[482,14232,14233,14247],{},[485,14234,14235],{},[488,14236,14237,14240,14243,14245],{},[491,14238,14239],{},"Actor",[491,14241,14242],{},"What it takes",[491,14244,7553],{},[491,14246,1449],{},[504,14248,14249,14264,14279,14294],{},[488,14250,14251,14256,14259,14262],{},[509,14252,14253],{},[47,14254,14255],{},"apidojo\u002Ftiktok-profile-scraper",[509,14257,14258],{},"Usernames or profile URLs",[509,14260,14261],{},"Full post history per account, with engagement",[509,14263,3551],{},[488,14265,14266,14271,14274,14277],{},[509,14267,14268],{},[47,14269,14270],{},"apidojo\u002Ftiktok-scraper",[509,14272,14273],{},"Posts, profiles, hashtags",[509,14275,14276],{},"Broader, shallower sweep",[509,14278,3551],{},[488,14280,14281,14286,14289,14292],{},[509,14282,14283],{},[47,14284,14285],{},"clockworks\u002Ftiktok-video-scraper",[509,14287,14288],{},"Specific video URLs",[509,14290,14291],{},"Metadata and metrics for videos you already have",[509,14293,3551],{},[488,14295,14296,14301,14304,14307],{},[509,14297,14298],{},[47,14299,14300],{},"scraptik\u002Ftiktok-comments-scraper-api",[509,14302,14303],{},"A video",[509,14305,14306],{},"Comment streams and threaded replies",[509,14308,542],{},[11,14310,14311,14312,14314],{},"For a catalogue audit you want the first one. You are not looking up videos you already chose, you are asking for everything an account has posted so the choosing can happen afterwards. ",[47,14313,14285],{}," inverts that: it needs the URLs first, which means you have already made the decision this exercise exists to inform.",[11,14316,14317,14318,14321,14322,14325,14326,14329,14330,14334],{},"If you are weighing the providers rather than the actors, we have written up ",[18,14319,14320],{"href":13888},"Apify against TikHub on price and depth",", the ",[18,14323,14324],{"href":3066},"wider set of alternatives",", and the ",[18,14327,14328],{"href":13893},"cross platform version of the question"," separately. All of them are reachable from ",[18,14331,14333],{"href":14332},"\u002Ftools\u002Ftiktok","the TikTok tool page"," on one key.",[232,14336,235],{"id":234},[11,14338,238,14339,244],{},[18,14340,243],{"href":241,"rel":14341},[124,125],[131,14343,14344],{"className":814,"code":249,"language":816,"meta":136,"style":136},[47,14345,14346],{"__ignoreMap":136},[140,14347,14348,14350,14352],{"class":142,"line":143},[140,14349,824],{"class":823},[140,14351,827],{"class":150},[140,14353,12334],{"class":150},[11,14355,12337,14356,260],{},[18,14357,259],{"href":257,"rel":14358},[124,125],[232,14360,264],{"id":263},[131,14362,14363],{"className":814,"code":8536,"language":816,"meta":136,"style":136},[47,14364,14365,14375],{"__ignoreMap":136},[140,14366,14367,14369,14371,14373],{"class":142,"line":143},[140,14368,274],{"class":146},[140,14370,277],{"class":150},[140,14372,280],{"class":150},[140,14374,283],{"class":150},[140,14376,14377,14379,14381,14383,14385,14387,14389,14391,14393,14395],{"class":142,"line":166},[140,14378,147],{"class":146},[140,14380,290],{"class":150},[140,14382,293],{"class":150},[140,14384,8559],{"class":150},[140,14386,8562],{"class":150},[140,14388,8565],{"class":150},[140,14390,299],{"class":193},[140,14392,1114],{"class":150},[140,14394,305],{"class":183},[140,14396,8574],{"class":193},[11,14398,12381,14399,260],{},[18,14400,8582],{"href":8580,"rel":14401},[124,125],[232,14403,13679],{"id":13678},[11,14405,14406],{},"One account, whole catalogue:",[131,14408,14410],{"className":133,"code":14409,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Fapidojo\u002Ftiktok-profile-scraper \\\n  -i '{\"usernames\":[\"getjuicygo\"],\"maxItems\":60}' \\\n  -w -o profile.json\n",[47,14411,14412,14429,14442],{"__ignoreMap":136},[140,14413,14414,14416,14418,14420,14422,14424,14427],{"class":142,"line":143},[140,14415,147],{"class":146},[140,14417,171],{"class":150},[140,14419,154],{"class":150},[140,14421,157],{"class":150},[140,14423,160],{"class":150},[140,14425,14426],{"class":150}," \u002Fapidojo\u002Ftiktok-profile-scraper",[140,14428,184],{"class":183},[140,14430,14431,14433,14435,14438,14440],{"class":142,"line":166},[140,14432,190],{"class":150},[140,14434,194],{"class":193},[140,14436,14437],{"class":150},"{\"usernames\":[\"getjuicygo\"],\"maxItems\":60}",[140,14439,2045],{"class":193},[140,14441,184],{"class":183},[140,14443,14444,14446,14448],{"class":142,"line":187},[140,14445,5302],{"class":150},[140,14447,5305],{"class":150},[140,14449,14450],{"class":150}," profile.json\n",[11,14452,14453,14455,14456,14458,14459,14462],{},[47,14454,6217],{}," and not ",[47,14457,6213],{},", because this actor takes a body. ",[47,14460,14461],{},"maxItems"," is the cap that matters: this endpoint bills per result, so the number you put there is the number you agree to pay for. Set it low on the first run and raise it once you have seen the shape.",[11,14464,14465,14466,102,14469,14472],{},"There are ",[47,14467,14468],{},"since",[47,14470,14471],{},"until"," parameters for date windows. Leave them off for a first audit. You want the whole history, because the thing you are looking for is a pattern across it.",[232,14474,13744],{"id":13743},[11,14476,14477,14478,98,14481,98,14484,98,14487,98,14490,98,14493,98,14496,98,14498,98,14501,102,14503,260],{},"A flat array, one object per post, which is the useful part: no unwrapping, straight into a table. The fields that carry the audit are ",[47,14479,14480],{},"views",[47,14482,14483],{},"likes",[47,14485,14486],{},"comments",[47,14488,14489],{},"shares",[47,14491,14492],{},"bookmarks",[47,14494,14495],{},"hashtags",[47,14497,13784],{},[47,14499,14500],{},"uploadedAtFormatted",[47,14502,2077],{},[47,14504,14505],{},"song",[11,14507,14508,14509,102,14511,14513],{},"Note that ",[47,14510,14486],{},[47,14512,14492],{}," arrive as separate counts rather than folded into one engagement figure. That split does most of the work below.",[27,14515,14517],{"id":14516},"what-does-one-sellers-catalogue-actually-say","What does one seller's catalogue actually say?",[11,14519,14520,14521,14524],{},"I ran it on a public TikTok Shop account selling portable blenders: ",[47,14522,14523],{},"@getjuicygo",", verified, 431 followers, fourteen posts covering twenty one days. Small enough to be a real seller rather than a case study, and small enough that the whole catalogue fits in one table.",[11,14526,14527],{},"Four things fell out, and the fourth is the one worth the call.",[11,14529,14530,14533,14534,14537],{},[38,14531,14532],{},"One video is the account."," 150,020 total views across fourteen posts. The top video alone is 98,102 of them, which is ",[38,14535,14536],{},"65 percent of everything the account has ever earned",". The top three are 74.5 percent. The spread between the top video and the median is twenty one times.",[11,14539,14540,14543],{},[38,14541,14542],{},"Nothing was being tested."," Every one of the fourteen videos runs between 25 and 34 seconds. Not one is shorter, not one is longer. The account has been varying the fruit and holding the format fixed, which means twenty one days of posting produced no information about the format at all.",[11,14545,14546,14549],{},[38,14547,14548],{},"Twelve of the fourteen have zero comments."," The two that carry comments are the same two videos that open with a question rather than a product. A comment count of zero across a catalogue is not a small problem, it is the audience declining to engage, and it is the clearest possible signal that the videos are not raising anything anyone wants to answer.",[11,14551,14552,14555],{},[38,14553,14554],{},"They found the format and then stopped using it."," Twelve captions are product first: \"Watermelon\", \"Grape Grape\", \"What should we mix next?\". Two are problem first: \"I bet it leaves chunky strawberry bits in the bottom\" on 2 August, and \"Does anyone else hate chunky fruit bits in smoothies?\" on 4 August. The second of those is the 98,102 view video. Every post after 4 August reverted to product first, and not one of the seven has broken 6,200 views.",[11,14557,14558],{},[5252,14559],{"alt":14560,"src":14561},"The pattern the table exposes: two problem first captions, one enormous result, then seven product first posts in a row after it.","\u002Fimg\u002Fblog\u002Ftiktok-scraper-catalogue-audit-fig-pattern.png",[11,14563,14564],{},"Say the obvious caveat plainly, because it matters. Fourteen videos is a small sample and one outlier can be luck. This is a hypothesis, not a proof. But it is a hypothesis with a named variable and a cheap test, which is exactly what a controlled batch is for, and it is infinitely better than the alternative the account is currently running, which is no hypothesis at all.",[11,14566,14567,14568,14571,14572,14575,14576,14579,14580,14584,14585,260],{},"The adjacent calls sharpen it further. ",[18,14569,14570],{"href":13965},"Read the comments on the two videos that got any"," and you have the objection to answer next. Pull ",[18,14573,14574],{"href":13956},"the same catalogue for three competitors"," and you can see whether problem first wins for everyone in this category or only here, or go ",[18,14577,14578],{"href":13960},"wider across a handle list in one script",", which scales to ",[18,14581,14583],{"href":14582},"\u002Fblog\u002Fpulled-10k-tiktok-profiles-no-scraper","thousands of profiles without building a scraper",". At the point where you want the category rather than the account, that is the ",[18,14586,14587],{"href":14165},"keyword search side of the job",[316,14589],{"prompt":14590},"pull every post from this TikTok account, put views, duration, comments and the first six words of each caption in one table, and sort by views",[27,14592,14594],{"id":14593},"which-clips-are-worth-keeping-and-which-need-replacing","Which clips are worth keeping, and which need replacing?",[11,14596,14597],{},"Now Oumomo's rule becomes usable, because every term in it is a number.",[11,14599,14600,14603],{},[38,14601,14602],{},"Keep and enhance"," the clips in the top decile of views whose engagement rate holds up. In this catalogue that is exactly one video. It has proven the story and the product proof, so its weaknesses are technical, and technical is what enhancement fixes. This is the narrow case where an upscaler earns its afternoon.",[11,14605,14606,14609],{},[38,14607,14608],{},"Remake the format, not the file,"," where a clip performed well and the format is repeatable. Oumomo's Viral Remake exists for this: hand it the structure of the 4 August video, keep pacing and story order, build a new one around a different fruit or a different objection. The reference is your own winner, which sidesteps the awkward part of remaking somebody else's video entirely.",[11,14611,14612,14615,14616,14620],{},[38,14613,14614],{},"Replace outright"," the twelve product first posts. Nothing there is worth preserving. They are not badly made, they answer a question nobody asked, and higher resolution on a question nobody asked is still a question nobody asked. This is where ",[18,14617,14619],{"href":13530,"rel":14618},[124,125],"Link to Video"," earns its place, generating fresh variations from the product page rather than restoring files.",[11,14622,14623,14626],{},[38,14624,14625],{},"Test the axis nobody touched."," Every video is around thirty seconds. That is not a finding, it is an untested assumption, and it is free to test in a generated batch in a way it is not free to test with a camera.",[11,14628,14629,14630,14633],{},"The loop closes on itself: publish the batch, wait, re-run the same one call, and the table tells you whether the hypothesis survived. Putting that re-run ",[18,14631,14632],{"href":14136},"on a schedule"," is the difference between an audit and a habit. That is the part worth building, and it is the part that only works because pulling the catalogue is cheap enough to do every month.",[421,14635,14637],{"category":13897,"title":14636},"Put your whole catalogue in one table before you remake anything",[11,14638,14639],{},"Inspect the actor free, see the per result billing, cap the first run low and look at the shape.",[27,14641,14643],{"id":14642},"what-does-an-audit-cost-to-run","What does an audit cost to run?",[11,14645,14646],{},"A rounding error, and the shape is what matters rather than the figure.",[11,14648,14649,14651,14652,5584],{},[47,14650,14255],{}," bills per result, so a fourteen post account costs fourteen units and a two thousand post account costs two thousand. Auditing one small seller account lands in small change. Auditing yourself plus five competitors, monthly, for a year, is still not a line item anybody notices. Current numbers are on ",[18,14653,1233],{"href":5582,"rel":14654},[124,125],[11,14656,14657,14658,14660,14661,14663],{},"The thing to actually watch is ",[47,14659,14461],{},", since per result billing means the cap is the budget. This is the opposite of the keyword search side, which bills a flat rate per call whatever comes back, and the two shapes want opposite habits: cap hard here, sweep freely there. The general argument for ",[18,14662,14050],{"href":2325}," covers when each shape wins.",[11,14665,14666],{},"Set against the alternative, the comparison is not close. The expensive resource here was never the data, it was the month of posting that produced no information because nothing was being varied.",[27,14668,14058],{"id":14057},[11,14670,14671,14674],{},[38,14672,14673],{},"When the catalogue is too small to hold a pattern."," Fourteen videos was enough to see something because the outlier was extreme. Five videos is not enough to see anything, and reading a pattern into five is worse than admitting you have none. Post first, audit later.",[11,14676,14677,14680],{},[38,14678,14679],{},"When views are not the outcome you sell on."," This entire method ranks by public engagement, and public engagement is a proxy. If your videos drive a checkout you can attribute, your own commerce data beats anything scraped from the outside, and you should use it. The audit is for the case where the outside numbers are all you have.",[11,14682,14683,14686],{},[38,14684,14685],{},"When you need something official."," This reads public profile pages through a third party. If you need a licensed, supported, contractual feed, TikTok's own business and research APIs exist and this is not a substitute for them. It is a substitute for having no data at all, which is the actual comparison for most sellers.",[11,14688,14689,14692,14693,14696],{},[38,14690,14691],{},"When the account is not yours and the history is deep."," Per result billing is a gift on a fourteen post account and a bill on a competitor with four years of posting. Cap it, or use the ",[18,14694,14695],{"href":14165},"keyword search route"," instead, which bills flat per call. We resell both, so pointing you at the cheaper one costs us nothing, which is worth remembering when you weigh the recommendation.",[11,14698,14699],{},"One more limit on the method itself. View counts accumulate, so an old video has had longer to gather them and comparing a post from three weeks ago against one from yesterday is not a fair fight. Read the dates alongside the numbers, and treat anything under about a week as unfinished.",[27,14701,696],{"id":695},[11,14703,14704],{},"The best answer to \"should I enhance this or make a new one\" is that the question cannot be answered about a clip, only about a catalogue. One call, one table, and the decision usually makes itself: a small number of videos carry everything, most of the rest are not worth restoring, and the interesting question is what they all have in common that the winners do not.",[11,14706,14707],{},"The rule worth keeping: before you enhance anything, sort your own posts by views and read the top three captions next to the bottom three. If you cannot tell them apart, the format is not the problem. If you can, you have just found the brief for the next batch, and that is what Oumomo is for.",[27,14709,729],{"id":728},[731,14711,14713],{"q":14712},"Which actor should I use for which TikTok job?",[11,14714,14715,14716,14718,14719,14721],{},"Use ",[47,14717,14255],{}," when you want everything an account has posted, ",[47,14720,14285],{}," when you already have specific video URLs and want their metrics, and the comments actor when you want the replies on one video. The mistake to avoid is reaching for the video scraper during an audit, because it needs you to have already picked the videos.",[731,14723,14725],{"q":14724},"Does this reach private or deleted posts?",[11,14726,14727],{},"No. It reads what a public profile page shows, so private accounts return nothing and deleted posts are gone. That is a real limit on an audit: a video you took down because it underperformed will not appear, which biases the catalogue you are reading toward what you chose to keep.",[731,14729,14731],{"q":14730},"Can I get the comments as well as the posts?",[11,14732,14733,14734,260],{},"Not from this actor. Comment text comes from a separate endpoint, billed per call rather than per result, and the workflow is to audit first and then pull comments only on the two or three videos worth understanding. Both routes are compared in ",[18,14735,14737],{"href":14736},"\u002Fblog\u002Fbuy-vs-build-tiktok-comment-scraper","buy versus build for a comment scraper",[731,14739,14741],{"q":14740},"Are view counts comparable across a catalogue?",[11,14742,14743,14744,14746],{},"Only roughly, and the reason is age. Views keep accruing, so a post from six weeks ago has had six weeks to collect them and yesterday's has had a day. Sort by views to find candidates, then check ",[47,14745,14500],{}," before concluding anything, and discard the most recent week from any comparison.",[11,14748,14749],{},[758,14750,760],{},[762,14752,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":14754},[14755,14756,14762,14763,14764,14765,14766,14767],{"id":14196,"depth":166,"text":14197},{"id":14218,"depth":166,"text":14219,"children":14757},[14758,14759,14760,14761],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":13678,"depth":187,"text":13679},{"id":13743,"depth":187,"text":13744},{"id":14516,"depth":166,"text":14517},{"id":14593,"depth":166,"text":14594},{"id":14642,"depth":166,"text":14643},{"id":14057,"depth":166,"text":14058},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Ftiktok-scraper-catalogue-audit.png","Fourteen videos, twenty one days, and one was 65 percent of the account. You cannot see that in the clips. One call puts the catalogue in a table.","\u002Fimg\u002Fblog\u002Ftiktok-scraper-catalogue-audit-card.png",{},{"title":14176,"description":14769},"blog\u002Fguides\u002Ftiktok-scraper-catalogue-audit",[14775,14776,14171,14170],"tiktok scraper","content audit","-rkE0ZzjMuyORqHjuKunk5N2z9uE_R9RiZu0CXw3bxI",{"id":14779,"title":1002,"author":6,"body":14780,"category":1674,"cover":15526,"description":15527,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":15528,"meta":15529,"navigation":790,"ogImage":787,"path":1001,"publishedAt":5712,"readTime":15530,"seo":15531,"stem":15532,"tags":15533,"toolCategory":8934,"updatedAt":5712,"__hash__":15535},"blogGuides\u002Fblog\u002Fguides\u002Fwhat-is-an-mcp-gateway.md",{"type":8,"value":14781,"toc":15494},[14782,14785,14823,14826,14830,14837,14841,14855,14859,14862,14866,14869,14939,14942,14951,14955,14958,14962,14965,14968,14972,14975,14979,14982,14986,14989,14993,14996,15000,15003,15007,15010,15014,15017,15021,15024,15028,15031,15034,15043,15047,15050,15052,15057,15062,15067,15069,15105,15110,15114,15119,15128,15132,15152,15158,15163,15167,15172,15182,15186,15204,15212,15216,15220,15225,15241,15245,15281,15286,15294,15297,15305,15307,15398,15403,15407,15410,15413,15416,15418,15421,15424,15430,15441,15443,15449,15455,15461,15467,15482,15488,15492],[11,14783,14784],{"style":810},"Copy this line to your agent to reach a thousand tools through one MCP endpoint.",[131,14786,14788],{"className":814,"code":14787,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use context.dev \u002Fweb\u002Fsearch to research a topic from the live web\n",[47,14789,14790],{"__ignoreMap":136},[140,14791,14792,14794,14796,14798,14800,14802,14804,14806,14808,14810,14812,14815,14817,14819,14821],{"class":142,"line":143},[140,14793,824],{"class":823},[140,14795,827],{"class":150},[140,14797,830],{"class":150},[140,14799,833],{"class":150},[140,14801,836],{"class":150},[140,14803,1718],{"class":150},[140,14805,3354],{"class":150},[140,14807,845],{"class":150},[140,14809,8250],{"class":150},[140,14811,851],{"class":150},[140,14813,14814],{"class":150}," topic",[140,14816,3367],{"class":150},[140,14818,3370],{"class":150},[140,14820,3373],{"class":150},[140,14822,3376],{"class":150},[11,14824,14825],{},"Search for \"MCP gateway\" and you get two products wearing the same label. One is a control plane you put in front of MCP servers you already run, so that an enterprise can audit and authenticate them. The other is a single endpoint that gives an agent access to tools it never installed. Both are real, both are called a gateway, and confusing them is why the term feels vague. This guide separates them, then shows how the second kind works.",[27,14827,14829],{"id":14828},"what-is-an-mcp-gateway","What is an MCP gateway?",[11,14831,14832,14833,14836],{},"An MCP gateway is a single ",[18,14834,8409],{"href":9050,"rel":14835},[124,125]," endpoint that sits between an agent and many tools, so the agent connects once instead of once per tool. That is the whole definition. What splits the market is which problem the gateway is pointed at.",[232,14838,14840],{"id":14839},"the-governance-gateway","The governance gateway",[11,14842,14843,14844,102,14849,14854],{},"This one faces inward. You already run several MCP servers, one for your database, one for your ticketing system, one for an internal service, and now security wants to know who called what. A governance gateway aggregates those servers behind one address and adds authentication, authorisation, audit logging, rate limits and policy. ",[18,14845,14848],{"href":14846,"rel":14847},"https:\u002F\u002Fdocs.docker.com\u002Fai\u002Fmcp-catalog-and-toolkit\u002Fmcp-gateway\u002F",[124,125],"Docker's MCP Gateway",[18,14850,14853],{"href":14851,"rel":14852},"https:\u002F\u002Fkonghq.com\u002Fblog\u002Flearning-center\u002Fwhat-is-a-mcp-gateway",[124,125],"Kong's"," are in this group, and so is most of what currently ranks for the term. The tools already existed; the gateway is there to control them.",[232,14856,14858],{"id":14857},"the-access-gateway","The access gateway",[11,14860,14861],{},"This one faces outward. Your agent needs to read a page behind bot protection, enrich a company from a domain, pull a comment thread, transcribe a call. Those tools do not exist in your stack at all, and each vendor that has one wants a signup, a key and usually a monthly minimum before you can make the first call. An access gateway carries a catalog and lets the agent call any of it through one key and one balance. Nothing is installed per tool, and the agent chooses at run time.",[232,14863,14865],{"id":14864},"why-the-distinction-matters-more-than-the-label","Why the distinction matters more than the label",[11,14867,14868],{},"Because the two answer opposite questions. A governance gateway answers \"how do I keep control of the tools we run\", and its success metric is policy coverage. An access gateway answers \"how does my agent get a tool it does not have\", and its success metric is catalog breadth and how little friction sits before the first call. Buy the wrong one and you have solved a problem you did not have.",[482,14870,14871,14883],{},[485,14872,14873],{},[488,14874,14875,14877,14880],{},[491,14876,915],{},[491,14878,14879],{},"Governance gateway",[491,14881,14882],{},"Access gateway",[504,14884,14885,14896,14907,14918,14929],{},[488,14886,14887,14890,14893],{},[509,14888,14889],{},"Faces",[509,14891,14892],{},"Inward, at servers you run",[509,14894,14895],{},"Outward, at vendors you do not",[488,14897,14898,14901,14904],{},[509,14899,14900],{},"Tools come from",[509,14902,14903],{},"Your own team",[509,14905,14906],{},"A shared catalog",[488,14908,14909,14912,14915],{},[509,14910,14911],{},"Main job",[509,14913,14914],{},"Auth, audit, policy, rate limits",[509,14916,14917],{},"Discovery, one key, one balance",[488,14919,14920,14923,14926],{},[509,14921,14922],{},"Added when",[509,14924,14925],{},"Server count and compliance grow",[509,14927,14928],{},"The agent needs a capability it lacks",[488,14930,14931,14933,14936],{},[509,14932,2520],{},[509,14934,14935],{},"An audit finds an untracked call",[509,14937,14938],{},"The agent cannot do the job at all",[11,14940,14941],{},"The pattern is that governance is about tools you have too many of, and access is about tools you have none of.",[320,14943,14944],{},[11,14945,324,14946,119,14948],{},[38,14947,327],{},[18,14949,14950],{"href":5673},"The Best API Marketplace for AI Agents in 2026",[27,14952,14954],{"id":14953},"how-does-an-mcp-gateway-work","How does an MCP gateway work?",[11,14956,14957],{},"An MCP gateway works by advertising a tool list to the agent, then translating each tool call the agent makes into whatever the real backend needs. The agent only ever speaks MCP. Everything vendor-specific happens on the far side of the gateway.",[232,14959,14961],{"id":14960},"the-handshake","The handshake",[11,14963,14964],{},"When an agent connects, it asks the gateway what tools exist. A governance gateway answers with the union of the tool lists from the servers it fronts. An access gateway answers with a way into its catalog, which for a large catalog means a search tool rather than a flat list, because a list of a thousand tool definitions would fill the agent's context before it did any work.",[11,14966,14967],{},"That detail is the reason \"MCP tool bloat\" is a phrase people use. Every tool definition you advertise costs context on every turn, so a gateway that dumps its whole catalog into the handshake makes the agent worse at everything else.",[232,14969,14971],{"id":14970},"the-translation","The translation",[11,14973,14974],{},"The agent calls a tool by name with a JSON payload. The gateway maps that to a real request: an HTTP call to a vendor, a query against a database, a job submitted to an async worker. Return values come back as tool results. Auth is the gateway's problem, not the agent's, which is the single biggest practical difference from letting an agent hold API keys directly.",[232,14976,14978],{"id":14977},"the-metering","The metering",[11,14980,14981],{},"Somebody has to pay. A governance gateway usually does not meter, because the underlying services are already yours. An access gateway must, because it is calling vendors on your behalf, so the useful design is one balance drawn down per call, with the price visible before the call happens. That is what makes it safe to hand an agent a large catalog: nothing bills until something runs.",[27,14983,14985],{"id":14984},"what-is-the-difference-between-an-mcp-gateway-and-an-mcp-server","What is the difference between an MCP gateway and an MCP server?",[11,14987,14988],{},"An MCP server exposes one set of tools; an MCP gateway exposes many, usually by fronting other servers or a catalog. The protocol does not distinguish them, and that is the source of the confusion: a gateway is an MCP server, in the same way that a reverse proxy is an HTTP server.",[232,14990,14992],{"id":14991},"what-an-mcp-server-is","What an MCP server is",[11,14994,14995],{},"A single integration, published as tools. The Slack MCP server exposes Slack. A Postgres MCP server exposes queries against a database. One vendor, one scope, and you install it and configure its credentials yourself. Most of what appears in an MCP registry is this.",[232,14997,14999],{"id":14998},"what-changes-at-gateway-scale","What changes at gateway scale",[11,15001,15002],{},"The failure mode changes. With three servers, installing and configuring each one is fine. With thirty, you are maintaining thirty sets of credentials, thirty update paths and thirty tool lists competing for the agent's context window, and the agent still cannot reach anything outside those thirty. The gateway exists because per-server management stops scaling before agent ambition does.",[232,15004,15006],{"id":15005},"the-practical-test","The practical test",[11,15008,15009],{},"Ask what happens when the agent needs a tool nobody installed. With MCP servers, a human adds one. With a governance gateway, a human still adds one, and now also updates policy. With an access gateway, the agent searches the catalog and calls it. If your agents pick their own next step, that difference is the whole ballgame.",[27,15011,15013],{"id":15012},"what-is-the-difference-between-an-mcp-gateway-and-an-api-gateway","What is the difference between an MCP gateway and an API gateway?",[11,15015,15016],{},"An API gateway routes requests from software that already knows exactly what it wants; an MCP gateway serves an agent that does not. That is a difference in the caller, not in the plumbing, and it changes what the gateway has to provide.",[232,15018,15020],{"id":15019},"what-carries-over","What carries over",[11,15022,15023],{},"Most of the operational surface. Authentication, rate limiting, retries, observability, request and response shaping: an MCP gateway needs all of it, and the teams who ship API gateways are shipping MCP gateways for exactly that reason. This is not a new discipline.",[232,15025,15027],{"id":15026},"what-does-not-carry-over","What does not carry over",[11,15029,15030],{},"Discovery and self-description. An API gateway assumes the client was compiled against a known contract, so a schema lives in a repository and a human read it. An agent has to learn the contract at run time, from the gateway, in tokens it also needs for the actual task. So an MCP gateway is judged on things an API gateway never thought about: whether a tool description is good enough for a model to pick correctly, whether the schema is small enough to be worth loading, and whether the agent can find a tool it did not know existed.",[11,15032,15033],{},"The other thing that does not carry over is billing. An API gateway fronts services you pay for some other way. A gateway that fronts other people's paid APIs has to price each call and show that price before it runs, or the agent is spending money blind.",[320,15035,15036],{},[11,15037,324,15038,119,15040],{},[38,15039,327],{},[18,15041,15042],{"href":2325},"Pay-Per-Call Data APIs vs Subscriptions",[27,15044,15046],{"id":15045},"how-do-you-build-an-mcp-gateway","How do you build an MCP gateway?",[11,15048,15049],{},"You can build one, and for a governance gateway that is often right, because the servers being fronted are yours and the policy is specific to you. Several open-source projects exist for it. For an access gateway the build is much harder, because the work is not the protocol, it is the catalog: every vendor contract, every schema, every price and every auth flow behind it. What follows is how that side works when it is already built.",[232,15051,235],{"id":234},[11,15053,238,15054,244],{},[18,15055,243],{"href":241,"rel":15056},[124,125],[131,15058,15060],{"className":15059,"code":249,"language":97,"meta":136},[248],[47,15061,249],{"__ignoreMap":136},[11,15063,254,15064,260],{},[18,15065,259],{"href":257,"rel":15066},[124,125],[232,15068,264],{"id":263},[131,15070,15071],{"className":133,"code":8536,"language":135,"meta":136,"style":136},[47,15072,15073,15083],{"__ignoreMap":136},[140,15074,15075,15077,15079,15081],{"class":142,"line":143},[140,15076,274],{"class":146},[140,15078,277],{"class":150},[140,15080,280],{"class":150},[140,15082,283],{"class":150},[140,15084,15085,15087,15089,15091,15093,15095,15097,15099,15101,15103],{"class":142,"line":166},[140,15086,147],{"class":146},[140,15088,290],{"class":150},[140,15090,293],{"class":150},[140,15092,8559],{"class":150},[140,15094,8562],{"class":150},[140,15096,8565],{"class":150},[140,15098,299],{"class":193},[140,15100,1114],{"class":150},[140,15102,305],{"class":183},[140,15104,8574],{"class":193},[11,15106,8577,15107,260],{},[18,15108,8582],{"href":8580,"rel":15109},[124,125],[232,15111,15113],{"id":15112},"step-1-discover-so-the-agent-does-not-need-to-know-the-vendor","Step 1. Discover, so the agent does not need to know the vendor",[11,15115,15116,15118],{},[38,15117,1131],{}," Searches the catalog by description rather than by name, which is what lets an agent find a tool nobody told it about.",[11,15120,15121,15123,15124,15127],{},[38,15122,1137],{}," The whole catalog is at ",[18,15125,1233],{"href":5582,"rel":15126},[124,125],": web search and scraping, company and people enrichment, social and platform data, browser automation, generative media and agent telephony.",[11,15129,15130],{},[38,15131,1148],{},[131,15133,15135],{"className":133,"code":15134,"language":135,"meta":136,"style":136},"monid discover -q \"turn a url into clean markdown for a prompt\"\n",[47,15136,15137],{"__ignoreMap":136},[140,15138,15139,15141,15143,15145,15147,15150],{"class":142,"line":143},[140,15140,147],{"class":146},[140,15142,2667],{"class":150},[140,15144,2670],{"class":150},[140,15146,2673],{"class":193},[140,15148,15149],{"class":150},"turn a url into clean markdown for a prompt",[140,15151,2679],{"class":193},[11,15153,15154,9336,15156,9339],{},[38,15155,1195],{},[47,15157,5967],{},[11,15159,15160,15162],{},[38,15161,1229],{}," Nothing. Discovery is free, which is the property that keeps a large catalog from being expensive to carry.",[232,15164,15166],{"id":15165},"step-2-inspect-so-the-first-call-is-not-a-guess","Step 2. Inspect, so the first call is not a guess",[11,15168,15169,15171],{},[38,15170,1131],{}," Returns the input schema, the billing shape and the provider's docs for one endpoint.",[11,15173,15174,119,15176,15181],{},[38,15175,1137],{},[18,15177,15179],{"href":8835,"rel":15178},[124,125],[47,15180,1484],{}," fetches one URL and returns markdown plus page metadata, with JavaScript rendering and proxying handled server-side.",[11,15183,15184],{},[38,15185,1148],{},[131,15187,15188],{"className":133,"code":4768,"language":135,"meta":136,"style":136},[47,15189,15190],{"__ignoreMap":136},[140,15191,15192,15194,15196,15198,15200,15202],{"class":142,"line":143},[140,15193,147],{"class":146},[140,15195,151],{"class":150},[140,15197,154],{"class":150},[140,15199,1718],{"class":150},[140,15201,160],{"class":150},[140,15203,2012],{"class":150},[11,15205,15206,15208,15209,15211],{},[38,15207,1195],{}," The query parameters (",[47,15210,2063],{},", link and image preservation, main-content-only extraction, cache reuse, proxy country), the billing shape, and the docs URL.",[11,15213,15214,9403],{},[38,15215,1229],{},[232,15217,15219],{"id":15218},"step-3-run-and-pay-only-for-that","Step 3. Run, and pay only for that",[11,15221,15222,15224],{},[38,15223,1131],{}," Executes the call and draws the shared balance at the price shown in step 2.",[11,15226,15227,119,15229,15234,15235,15240],{},[38,15228,1137],{},[18,15230,15232],{"href":8835,"rel":15231},[124,125],[47,15233,1484],{}," for one page; ",[18,15236,15238],{"href":8674,"rel":15237},[124,125],[47,15239,1548],{}," when you want search results and their page text in a single round trip.",[11,15242,15243],{},[38,15244,1148],{},[131,15246,15248],{"className":133,"code":15247,"language":135,"meta":136,"style":136},"monid run -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown \\\n  --query '{\"url\": \"https:\u002F\u002Fmodelcontextprotocol.io\u002F\", \"mainContentOnly\": true}' -w 120\n",[47,15249,15250,15266],{"__ignoreMap":136},[140,15251,15252,15254,15256,15258,15260,15262,15264],{"class":142,"line":143},[140,15253,147],{"class":146},[140,15255,171],{"class":150},[140,15257,154],{"class":150},[140,15259,1718],{"class":150},[140,15261,160],{"class":150},[140,15263,1721],{"class":150},[140,15265,184],{"class":183},[140,15267,15268,15270,15272,15275,15277,15279],{"class":142,"line":166},[140,15269,2037],{"class":150},[140,15271,194],{"class":193},[140,15273,15274],{"class":150},"{\"url\": \"https:\u002F\u002Fmodelcontextprotocol.io\u002F\", \"mainContentOnly\": true}",[140,15276,2045],{"class":193},[140,15278,8723],{"class":150},[140,15280,8727],{"class":8726},[11,15282,15283,15285],{},[38,15284,1195],{}," Clean markdown plus title, language, canonical URL, author, site name and the structured metadata blocks, which is what you want in a prompt rather than raw HTML.",[11,15287,15288,15290,15291,260],{},[38,15289,1229],{}," A small fraction of a cent per page, billed per call. The search endpoint bills per result instead, so its result count is the dial. Prices at ",[18,15292,1233],{"href":5582,"rel":15293},[124,125],[316,15295],{"prompt":15296},"read this documentation page and summarise the parts that describe the tool handshake",[320,15298,15299],{},[11,15300,324,15301,119,15303],{},[38,15302,327],{},[18,15304,6810],{"href":2986},[27,15306,480],{"id":479},[482,15308,15309,15323],{},[485,15310,15311],{},[488,15312,15313,15315,15317,15319,15321],{},[491,15314,493],{},[491,15316,496],{},[491,15318,1443],{},[491,15320,1446],{},[491,15322,1449],{},[504,15324,15325,15345,15363,15381],{},[488,15326,15327,15330,15337,15340,15343],{},[509,15328,15329],{},"One page to prompt-ready text",[509,15331,15332],{},[18,15333,15335],{"href":8835,"rel":15334},[124,125],[47,15336,1484],{},[509,15338,15339],{},"url plus extraction options",[509,15341,15342],{},"markdown, title, canonical, metadata",[509,15344,1471],{},[488,15346,15347,15350,15357,15359,15361],{},[509,15348,15349],{},"Search and read in one hop",[509,15351,15352],{},[18,15353,15355],{"href":8674,"rel":15354},[124,125],[47,15356,1548],{},[509,15358,8820],{},[509,15360,8823],{},[509,15362,1557],{},[488,15364,15365,15368,15375,15377,15379],{},[509,15366,15367],{},"Neural search with structure",[509,15369,15370],{},[18,15371,15373],{"href":8674,"rel":15372},[124,125],[47,15374,3721],{},[509,15376,11046],{},[509,15378,11049],{},[509,15380,1471],{},[488,15382,15383,15385,15392,15394,15396],{},[509,15384,9554],{},[509,15386,15387],{},[18,15388,15390],{"href":569,"rel":15389},[124,125],[47,15391,8857],{},[509,15393,8860],{},[509,15395,8863],{},[509,15397,1471],{},[11,15399,1560,15400,15402],{},[47,15401,607],{}," on 20 August 2026. The table gives the billing shape, not a figure: per call versus per result is the thing that changes how you architect, and it does not go stale the way a number does.",[27,15404,15406],{"id":15405},"when-do-you-not-need-an-mcp-gateway","When do you not need an MCP gateway?",[11,15408,15409],{},"You do not need one when the tool count is small and stable. Two or three MCP servers, installed and configured once, are simpler than any gateway and have one less thing in the path. Adding a router to front two servers is architecture for its own sake.",[11,15411,15412],{},"You do not need an access gateway when the vendor you need has a free tier that covers you. Per-call pricing beats a pile of subscriptions; it does not beat zero, and pretending otherwise would be dishonest.",[11,15414,15415],{},"And if your requirement is genuinely audit and policy over servers your own team runs, the products currently ranking for this term are built for that and we are not. Kong, Docker and the API-gateway vendors moving into MCP are solving the inward problem properly. Monid is an access gateway: it is the right answer when the agent needs a capability nobody in your organisation has bought yet, and the wrong answer when the question is who is allowed to call the internal database.",[27,15417,696],{"id":695},[11,15419,15420],{},"There is no single thing called an MCP gateway, and that is the answer rather than a dodge. There are two products with one name: a control plane for tools you already run, and an access layer for tools you do not. Ask which of those you need before comparing vendors, because the comparison tables for the two groups do not share a single row.",[11,15422,15423],{},"What matters more than the choice is the property that makes either kind worth having: the agent connects once and stops caring where a tool lives. On the governance side that buys you a place to put policy. On the access side it buys something stranger and more useful, which is an agent that can attempt a job nobody anticipated when the code was written, because discovery is free and only the call costs anything.",[11,15425,15426,15427,15429],{},"That access-layer shape is the one we build. Monid is ",[18,15428,21],{"href":20},": the same routing an LLM gateway gives you across models, applied one layer down to the tool calls an agent makes after it has picked one.",[11,15431,1600,15432,15434,15435,15437,15438,260],{},[47,15433,603],{}," for a capability your agent does not have today, then ",[47,15436,607],{}," on the top result. Neither spends anything. Start at ",[18,15439,725],{"href":723,"rel":15440},[124,125],[27,15442,729],{"id":728},[731,15444,15446],{"q":15445},"What is Docker MCP Gateway?",[11,15447,15448],{},"Docker's MCP Gateway is a governance gateway: it aggregates MCP servers you run, in Docker's case largely containers from its own catalog, behind one endpoint with credential handling and policy. It is the inward-facing kind described above, so it manages tools you have rather than supplying tools you lack. Cloud vendors ship comparable products for their own platforms.",[731,15450,15452],{"q":15451},"What is the difference between an MCP gateway and an MCP registry?",[11,15453,15454],{},"A registry is a directory you read, and a gateway is an endpoint you call. A registry tells a human that a Slack MCP server exists and where to get it; installing and authenticating it is still your job. A gateway is in the request path at run time, which means it can also handle auth, metering and translation. The two are complementary, and a large access gateway effectively contains a registry as its discovery surface.",[731,15456,15458],{"q":15457},"What is an MCP router?",[11,15459,15460],{},"MCP router and MCP gateway are used interchangeably, with router slightly favoured when the emphasis is on choosing a backend per call and gateway when the emphasis is on control and policy. Neither term is standardised. The distinction that actually predicts what a product does is the inward versus outward one: whether it fronts servers you run or vendors you do not.",[731,15462,15464],{"q":15463},"What is the difference between an MCP gateway and an MCP proxy?",[11,15465,15466],{},"Proxy is the narrower word: it implies passing calls through to a backend with little added beyond transport, auth and logging. Gateway implies the proxy plus a policy or catalog layer, so a gateway usually decides something and a proxy usually just forwards. In practice vendors use whichever word sounds right for their positioning, and the same product gets both labels. Read what it does to the tool list: if it changes what the agent can see, it is doing gateway work regardless of the name.",[731,15468,15470],{"q":15469},"Which MCP server gives an AI agent access to live web data?",[11,15471,15472,15473,15475,15476,15478,15479,260],{},"An access gateway is the general answer, because live web data means several different tools: search, single-page extraction, crawling and platform-specific feeds, usually from different vendors. Through Monid an agent reaches all of those under one key, with ",[47,15474,1548],{}," for search plus page text and ",[47,15477,3721],{}," for neural retrieval. There is a fuller comparison in ",[18,15480,15481],{"href":4915},"the live web data guide",[421,15483,15485],{"category":8934,"title":15484},"One endpoint, a thousand tools",[11,15486,15487],{},"Search the catalog, read a schema and its per-call price, then run it. No signup per vendor, no monthly floor, no seat.",[11,15489,15490],{},[758,15491,760],{},[762,15493,8945],{},{"title":136,"searchDepth":166,"depth":166,"links":15495},[15496,15501,15506,15511,15515,15522,15523,15524,15525],{"id":14828,"depth":166,"text":14829,"children":15497},[15498,15499,15500],{"id":14839,"depth":187,"text":14840},{"id":14857,"depth":187,"text":14858},{"id":14864,"depth":187,"text":14865},{"id":14953,"depth":166,"text":14954,"children":15502},[15503,15504,15505],{"id":14960,"depth":187,"text":14961},{"id":14970,"depth":187,"text":14971},{"id":14977,"depth":187,"text":14978},{"id":14984,"depth":166,"text":14985,"children":15507},[15508,15509,15510],{"id":14991,"depth":187,"text":14992},{"id":14998,"depth":187,"text":14999},{"id":15005,"depth":187,"text":15006},{"id":15012,"depth":166,"text":15013,"children":15512},[15513,15514],{"id":15019,"depth":187,"text":15020},{"id":15026,"depth":187,"text":15027},{"id":15045,"depth":166,"text":15046,"children":15516},[15517,15518,15519,15520,15521],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":15112,"depth":187,"text":15113},{"id":15165,"depth":187,"text":15166},{"id":15218,"depth":187,"text":15219},{"id":479,"depth":166,"text":480},{"id":15405,"depth":166,"text":15406},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fwhat-is-an-mcp-gateway.png","An MCP gateway is one endpoint that fronts many tools. Two very different products share the name, and the difference decides which one you need.","\u002Fimg\u002Fblog\u002Fwhat-is-an-mcp-gateway-card.png",{},"13 min",{"title":1002,"description":15527},"blog\u002Fguides\u002Fwhat-is-an-mcp-gateway",[8986,15534,8987,1687,8325],"mcp gateway","k2dPOpQRi-_4MSqe7fUuP9YBFT-7g7HmwzTMoU7WAv4",{"id":15537,"title":15538,"author":6,"body":15539,"category":8203,"cover":16195,"description":16196,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":16197,"meta":16198,"navigation":790,"ogImage":787,"path":16199,"publishedAt":5712,"readTime":1681,"seo":16200,"stem":16201,"tags":16202,"toolCategory":16051,"updatedAt":5712,"__hash__":16207},"blogGuides\u002Fblog\u002Fguides\u002Fx-intent-search-social-selling.md","Monid Finds the Tweet. Volumn Tells You Who Sent It.",{"type":8,"value":15540,"toc":16180},[15541,15544,15547,15553,15560,15569,15573,15576,15579,15585,15588,15591,15598,15604,15607,15613,15619,15625,15629,15651,15653,15658,15670,15675,15677,15713,15718,15720,15764,15781,15783,15809,15832,15837,15841,15844,15851,15854,15860,15869,15875,15884,15887,15902,15921,15924,15928,15931,15934,15937,15953,15977,15980,16049,16056,16060,16063,16074,16084,16087,16091,16097,16103,16109,16115,16118,16120,16123,16129,16131,16140,16157,16163,16174,16178],[11,15542,15543],{},"I ran the same X search three ways to find people asking for a scraping tool. The naive phrasing returned twenty results, twelve of which were about the topic and most of which were viral content that happened to share a word. Tightening it with search operators pushed that to nineteen of twenty.",[11,15545,15546],{},"Then I read all twenty by hand, and the number that mattered was different:",[131,15548,15551],{"className":15549,"code":15550,"language":97,"meta":136},[248],"20 results\n19 mention the topic\n 5 are the same two tweets posted repeatedly\n 2 are a human being asking for a recommendation\n",[47,15552,15550],{"__ignoreMap":136},[11,15554,15555,15556,15559],{},"Nineteen out of twenty on keywords. Two out of twenty on intent. ",[38,15557,15558],{},"That gap is the entire job",", and no amount of query tuning closes it, because the thing you are filtering for is not in the text.",[11,15561,15562,15563,15568],{},"Fair disclosure. You are on the Monid blog, Monid sells the X search endpoint used below by the call, and ",[18,15564,15567],{"href":15565,"rel":15566},"https:\u002F\u002Fwww.volumn.ai\u002F",[124,125],"Volumn.ai"," is a content partner whose product sits on the judgment side of that gap. Volumn is not in the Monid catalogue. The section near the end says where X is the wrong place to be looking at all.",[27,15570,15572],{"id":15571},"why-does-a-twitter-scraper-hand-you-noise-instead-of-buyers","Why does a twitter scraper hand you noise instead of buyers?",[11,15574,15575],{},"Because search ranks text, and buying intent is a property of the person, not the sentence.",[11,15577,15578],{},"Here is what came back from the tightened query, which is the good one. Two examples out of the twenty:",[131,15580,15583],{"className":15581,"code":15582,"language":97,"meta":136},[248],"@mfranz_on      15,747 followers\n  \"I am looking for a web scraper library in Python. Any suggestion?\"\n\n@DBurzynski18488     13 followers\n  \"Has anyone used Leads Sniper, especially the Google Maps Scraper. Is it...\"\n",[47,15584,15582],{"__ignoreMap":136},[11,15586,15587],{},"Both are real. Someone is in market and asking. That is what you came for.",[11,15589,15590],{},"Now the other eighteen. Five are content marketing threads of the \"10 GitHub repos that replace tools costing $30,000 a year\" variety. Three are the identical promo tweet from one account, posted three times inside a single page of results. Two more are another account's tweet, twice. One is Y Combinator promoting a portfolio company. Four are builders describing what they are making, which reads like interest and is the opposite of it: they are building the thing you sell. One is a bare link with no text.",[11,15592,15593,15594,15597],{},"Every one of those matched the keywords. Most matched them ",[758,15595,15596],{},"better"," than the two that mattered, because marketing copy is written to contain the words.",[11,15599,15600],{},[5252,15601],{"alt":15602,"src":15603},"Twenty results in, nineteen match the words, five are duplicates, two are a person actually asking.","\u002Fimg\u002Fblog\u002Fx-intent-search-social-selling-fig-funnel.png",[11,15605,15606],{},"Three structural problems fall out, and it is worth naming them separately because they need different fixes.",[11,15608,15609,15612],{},[38,15610,15611],{},"Duplicates are a quarter of the page."," Five of twenty were repeats of two tweets. Accounts repost promos on a schedule and the search returns each instance. Dedupe on normalised text, not on tweet ID, because the IDs differ.",[11,15614,15615,15618],{},[38,15616,15617],{},"Follower counts span five orders of magnitude."," From 13 to 1,641,319 inside one result set. The 13 follower account was one of the two genuine buyers. Whether that is your best lead or your worst depends entirely on what you sell, and the search will not decide it for you.",[11,15620,15621,15624],{},[38,15622,15623],{},"Builders read like buyers."," The single hardest class to filter. \"I'm building a web scraper agent where you can...\" matches every keyword a scraping vendor would target and represents zero pipeline.",[27,15626,15628],{"id":15627},"which-endpoint-actually-searches-x-and-what-does-it-return","Which endpoint actually searches X, and what does it return?",[11,15630,15631,15634,15635,15639,15640,6097,15643,15646,15647,15650],{},[47,15632,15633],{},"tikhub \u002Fapi\u002Fv1\u002Ftwitter\u002Fweb\u002Ffetch_search_timeline",", reachable through ",[18,15636,15638],{"href":15637},"\u002Ftools\u002Ftwitter","X on Monid",". It takes a ",[47,15641,15642],{},"keyword",[47,15644,15645],{},"search_type"," of Top, Latest, Media, People or Lists, and a ",[47,15648,15649],{},"cursor"," for paging. It bills a flat rate per call regardless of how many results come back, which matters more than it sounds and is the subject of a section below.",[232,15652,235],{"id":234},[11,15654,238,15655,244],{},[18,15656,243],{"href":241,"rel":15657},[124,125],[131,15659,15660],{"className":814,"code":249,"language":816,"meta":136,"style":136},[47,15661,15662],{"__ignoreMap":136},[140,15663,15664,15666,15668],{"class":142,"line":143},[140,15665,824],{"class":823},[140,15667,827],{"class":150},[140,15669,12334],{"class":150},[11,15671,12337,15672,260],{},[18,15673,259],{"href":257,"rel":15674},[124,125],[232,15676,264],{"id":263},[131,15678,15679],{"className":814,"code":8536,"language":816,"meta":136,"style":136},[47,15680,15681,15691],{"__ignoreMap":136},[140,15682,15683,15685,15687,15689],{"class":142,"line":143},[140,15684,274],{"class":146},[140,15686,277],{"class":150},[140,15688,280],{"class":150},[140,15690,283],{"class":150},[140,15692,15693,15695,15697,15699,15701,15703,15705,15707,15709,15711],{"class":142,"line":166},[140,15694,147],{"class":146},[140,15696,290],{"class":150},[140,15698,293],{"class":150},[140,15700,8559],{"class":150},[140,15702,8562],{"class":150},[140,15704,8565],{"class":150},[140,15706,299],{"class":193},[140,15708,1114],{"class":150},[140,15710,305],{"class":183},[140,15712,8574],{"class":193},[11,15714,12381,15715,260],{},[18,15716,8582],{"href":8580,"rel":15717},[124,125],[232,15719,13679],{"id":13678},[131,15721,15723],{"className":133,"code":15722,"language":135,"meta":136,"style":136},"monid run -p tikhub -e \u002Fapi\u002Fv1\u002Ftwitter\u002Fweb\u002Ffetch_search_timeline \\\n  --query '{\"keyword\":\"\\\"looking for\\\" (scraper OR \\\"scraping api\\\") -filter:retweets\",\"search_type\":\"Latest\"}' \\\n  -w -o x.json\n",[47,15724,15725,15742,15755],{"__ignoreMap":136},[140,15726,15727,15729,15731,15733,15735,15737,15740],{"class":142,"line":143},[140,15728,147],{"class":146},[140,15730,171],{"class":150},[140,15732,154],{"class":150},[140,15734,13698],{"class":150},[140,15736,160],{"class":150},[140,15738,15739],{"class":150}," \u002Fapi\u002Fv1\u002Ftwitter\u002Fweb\u002Ffetch_search_timeline",[140,15741,184],{"class":183},[140,15743,15744,15746,15748,15751,15753],{"class":142,"line":166},[140,15745,2037],{"class":150},[140,15747,194],{"class":193},[140,15749,15750],{"class":150},"{\"keyword\":\"\\\"looking for\\\" (scraper OR \\\"scraping api\\\") -filter:retweets\",\"search_type\":\"Latest\"}",[140,15752,2045],{"class":193},[140,15754,184],{"class":183},[140,15756,15757,15759,15761],{"class":142,"line":187},[140,15758,5302],{"class":150},[140,15760,5305],{"class":150},[140,15762,15763],{"class":150}," x.json\n",[11,15765,15766,14455,15768,15770,15771,13737,15774,15777,15778,15780],{},[47,15767,6213],{},[47,15769,6217],{},", because this endpoint takes query parameters. Use ",[47,15772,15773],{},"Latest",[47,15775,15776],{},"Top"," for intent work: ",[47,15779,15776],{}," is ranked by engagement, which is precisely the ranking that surfaces marketing threads over a quiet question from someone with thirteen followers.",[232,15782,13744],{"id":13743},[11,15784,15785,15786,15789,15790,98,15792,98,15795,98,15797,98,15800,98,15803,3933,15806,260],{},"Results arrive under ",[47,15787,15788],{},"timeline",", twenty per page, with twenty fields each. The ones that carry the work are ",[47,15791,97],{},[47,15793,15794],{},"favorites",[47,15796,14480],{},[47,15798,15799],{},"replies",[47,15801,15802],{},"created_at",[47,15804,15805],{},"conversation_id",[47,15807,15808],{},"user_info",[11,15810,15811,15816,15817,98,15820,98,15823,98,15825,98,15827,102,15829,15831],{},[38,15812,15813,15815],{},[47,15814,15808],{}," is the field people miss."," It arrives nested on every tweet and carries ",[47,15818,15819],{},"followers_count",[47,15821,15822],{},"friends_count",[47,15824,3919],{},[47,15826,6114],{},[47,15828,5967],{},[47,15830,15802],{}," for the author. That means you can filter by account size, bio text and account age without a second call and without a second charge, which is the difference between one flat call and a per profile bill on top.",[11,15833,15834,15836],{},[47,15835,15805],{}," is the other one worth reading. It groups a tweet with the thread it belongs to, which is how you tell a standalone question from the fourth reply in an argument.",[27,15838,15840],{"id":15839},"how-do-you-write-a-query-that-finds-intent","How do you write a query that finds intent?",[11,15842,15843],{},"Operators, and then knowing when to stop.",[11,15845,15846,15847,15850],{},"The naive version, ",[47,15848,15849],{},"looking for a tool to scrape twitter"," as a plain phrase, returned twenty results of which twelve were on topic and the top hits were a Milwaukee police chief and a rescue dog. X treats a long conversational string as a bag of words.",[11,15852,15853],{},"The tightened version does three things:",[131,15855,15858],{"className":15856,"code":15857,"language":97,"meta":136},[248],"\"looking for\" (scraper OR \"scraping api\") -filter:retweets\n",[47,15859,15857],{"__ignoreMap":136},[11,15861,15862,119,15865,15868],{},[38,15863,15864],{},"Quote the intent phrase.",[47,15866,15867],{},"\"looking for\""," as an exact phrase, not as two words that may appear anywhere. This is what pins the grammar of asking.",[11,15870,15871,15874],{},[38,15872,15873],{},"Group the subject with OR."," People do not use your product category name. Give the query the two or three phrasings they actually type.",[11,15876,15877,119,15880,15883],{},[38,15878,15879],{},"Exclude retweets.",[47,15881,15882],{},"-filter:retweets"," removes amplification, which is pure noise for this job since a retweet is not the retweeter asking.",[11,15885,15886],{},"That took keyword relevance from twelve of twenty to nineteen of twenty. It also cost nothing extra to find out, because the endpoint bills per call rather than per result: three query variations is three charges whatever comes back, so iterating on the query is close to free and there is no reason to guess.",[11,15888,15889,15890,15893,15894,15897,15898,15901],{},"Then the third variation, ",[47,15891,15892],{},"\"any recommendations for\" \"data api\" -filter:retweets",", returned ",[38,15895,15896],{},"zero results",". Two exact phrases both matching is rare, and X returns an empty timeline rather than relaxing the query for you. ",[38,15899,15900],{},"An empty result set is a query problem, not a market signal",", and the fix is to loosen one clause and re-run rather than to conclude nobody is asking.",[11,15903,15904,15905,98,15909,3933,15913,15917,15918,260],{},"Widening this into a scheduled job is a different piece of work, and we have written it up: ",[18,15906,15908],{"href":15907},"\u002Fblog\u002Fkeyword-to-tweets-scraper-tutorial","a keyword-to-tweets scraper you can build in an afternoon",[18,15910,15912],{"href":15911},"\u002Fblog\u002F50k-tweets-no-x-api-tier-one-afternoon","running it at volume",[18,15914,15916],{"href":15915},"\u002Fblog\u002Fship-an-x-trending-topics-tracker","tracking what rises and falls over time",". The n8n version of the same shape, for people who want the whole enrichment chain, is in ",[18,15919,15920],{"href":10493},"the n8n data layer guide",[316,15922],{"prompt":15923},"search X for people asking for a recommendation in my category over the last day, drop retweets and duplicates, and show me the author's follower count next to each one",[27,15925,15927],{"id":15926},"how-do-you-tell-a-buyer-from-a-marketer","How do you tell a buyer from a marketer?",[11,15929,15930],{},"By reading the account, which is a second question the search does not answer.",[11,15932,15933],{},"The two genuine buyers in my twenty had 15,747 and 13 followers. Nothing in the tweet text distinguished them from the promotional posts, and both would have failed a naive follower threshold in one direction or the other.",[11,15935,15936],{},"What actually separates them is account level: does this person post like a practitioner or like a channel, are they consistent or dormant, is the bio a job or a pitch, and does their engagement look earned. Those are all readable from public data, and none of them are in the tweet.",[11,15938,15939,15940,15942,15943,15947,15948,15952],{},"This is the point where the honest answer is that you are now building a product rather than running a query. You can do it: the ",[47,15941,15808],{}," block gives you follower count, bio, account age and verification for free in the same response, and a couple of thresholds on those will remove most of the obvious noise. Beyond that, ",[18,15944,15946],{"href":15945},"\u002Fblog\u002Ftweets-and-search-without-the-x-api-tier","pulling an account's history"," tells you about consistency, and ",[18,15949,15951],{"href":15950},"\u002Fblog\u002Fcheapest-way-to-scrape-x-at-scale-2026","comparing accounts at scale"," tells you about relative quality.",[11,15954,15955,15956,15959,15960,15965,15966,102,15971,15976],{},"Or you can use something built for it. ",[18,15957,15567],{"href":15565,"rel":15958},[124,125]," is an AI growth platform for X that packages this judgment layer: their ",[18,15961,15964],{"href":15962,"rel":15963},"https:\u002F\u002Fwww.volumn.ai\u002Fx-profile-audit",[124,125],"X profile audit"," scores a public account with engagement diagnostics and growth recommendations, and their use case flows for ",[18,15967,15970],{"href":15968,"rel":15969},"https:\u002F\u002Fwww.volumn.ai\u002Fuse-cases\u002Fb2b-social-selling",[124,125],"B2B social selling on X",[18,15972,15975],{"href":15973,"rel":15974},"https:\u002F\u002Fwww.volumn.ai\u002Fuse-cases\u002Ffounder-lead-gen",[124,125],"founder lead generation on X"," wrap the whole loop from finding the conversation to engaging it. They also run creator discovery and posting consistency tools on the same data.",[11,15978,15979],{},"The division is clean, which is why the partnership makes sense to write about. Monid sells the raw search by the call, one key, no seat. Volumn sells the judgment and the workflow on top. If you are building the loop yourself you want the first. If you want the loop to exist by Thursday you want the second.",[482,15981,15982,15994],{},[485,15983,15984],{},[488,15985,15986,15988,15991],{},[491,15987],{},[491,15989,15990],{},"Raw endpoint",[491,15992,15993],{},"Finished workflow",[504,15995,15996,16007,16018,16029,16038],{},[488,15997,15998,16001,16004],{},[509,15999,16000],{},"What you get",[509,16002,16003],{},"Twenty tweets and twenty fields",[509,16005,16006],{},"Scored accounts and a next action",[488,16008,16009,16012,16015],{},[509,16010,16011],{},"What you build",[509,16013,16014],{},"Dedupe, filters, scheduling, scoring",[509,16016,16017],{},"Nothing",[488,16019,16020,16023,16026],{},[509,16021,16022],{},"What you control",[509,16024,16025],{},"Every threshold",[509,16027,16028],{},"The settings exposed",[488,16030,16031,16033,16035],{},[509,16032,502],{},[509,16034,542],{},[509,16036,16037],{},"Per product",[488,16039,16040,16043,16046],{},[509,16041,16042],{},"Best when",[509,16044,16045],{},"The scoring rules are your edge",[509,16047,16048],{},"The scoring rules are not your edge",[421,16050,16053],{"category":16051,"title":16052},"twitter","Run one X search before you build a pipeline around it",[11,16054,16055],{},"Inspect the endpoint free, see the flat per call price, and read twenty results by hand before automating anything.",[27,16057,16059],{"id":16058},"what-does-running-this-continuously-cost","What does running this continuously cost?",[11,16061,16062],{},"Less than the reading, which is the real constraint.",[11,16064,16065,16066,16069,16070,16073],{},"The endpoint bills per call at a flat rate, whatever comes back. That shape has a specific consequence for this job: ",[38,16067,16068],{},"the cost scales with how often you ask, not with how much you find."," Checking six query variations every hour, all day, is a rounding error, and the same sweep across ten competitor keywords barely moves it. Magnitudes for anything in the catalogue live on ",[18,16071,1233],{"href":5582,"rel":16072},[124,125],", because a number in an article goes stale quietly.",[11,16075,16076,16077,16080,16081,260],{},"Compare that with a per result endpoint, where a wide sweep is exactly what you pay for. Both shapes exist in our catalogue and the difference decides your architecture rather than your invoice, which is the argument in ",[18,16078,16079],{"href":2325},"pay per call against a subscription"," and the ",[18,16082,16083],{"href":13893},"cross platform comparison",[11,16085,16086],{},"The cost that does bite is human. Twenty results with two worth acting on means somebody reads eighteen dead ends, and at ten searches a day that is the whole job. Every dollar of value here is in narrowing what reaches a person.",[27,16088,16090],{"id":16089},"when-is-x-the-wrong-place-to-look","When is X the wrong place to look?",[11,16092,16093,16096],{},[38,16094,16095],{},"When your buyers are not there."," X skews heavily toward software, crypto, media and marketing. If you sell to dentists or plant managers, a beautifully tuned intent query will return an empty timeline and it will be telling you the truth.",[11,16098,16099,16102],{},[38,16100,16101],{},"When the purchase is not discussed publicly."," Nobody tweets \"looking for a payroll provider.\" Categories with real switching costs get researched quietly. Intent search works where people crowdsource opinions in the open, and that is a narrower band than it looks.",[11,16104,16105,16108],{},[38,16106,16107],{},"When you need coverage rather than a sample."," Search returns a ranked page, not a census. For anything that has to be complete, this is the wrong instrument.",[11,16110,16111,16114],{},[38,16112,16113],{},"When two of twenty is not worth the reading."," Be honest about the arithmetic. If your deal size cannot fund somebody reading eighteen irrelevant tweets to find two conversations, then either the filtering has to get much better or the channel is not for you.",[11,16116,16117],{},"We sell the endpoint, so weigh that list accordingly. The strongest version of the case against us is that most teams should not build this: they should run one manual search first, read twenty results, count how many are real, and only then decide whether to automate anything.",[27,16119,696],{"id":695},[11,16121,16122],{},"A twitter scraper is a solved problem and it is not the problem. Getting the tweets takes one call and one flag; getting from twenty tweets to two conversations takes dedupe, an account level read, and a judgment about who is worth a reply.",[11,16124,5642,16125,16128],{},[38,16126,16127],{},"before you automate an intent search, run it once and read every result by hand."," Count how many are genuine. If it is two in twenty, as it was here, you now know exactly what your filtering has to accomplish, and you know it before you have built anything.",[27,16130,729],{"id":728},[731,16132,16134],{"q":16133},"Can I do this with the official X API instead?",[11,16135,16136,16137,260],{},"You can, at the tier that permits search, and the pricing is the reason most small teams do not. A managed endpoint reads the same public results from the provider's infrastructure and bills per call with no floor, which is what makes running six query variations to find the right one reasonable. The tradeoff is that you are on someone else's terms rather than X's own, and ",[18,16138,16139],{"href":15945},"the options are compared here",[731,16141,16143],{"q":16142},"How do I run this on a schedule instead of by hand?",[11,16144,16145,16146,16148,16149,16152,16153,16156],{},"Store the tweet IDs you have already seen, run the same query on a timer, and act only on what is new. The ",[47,16147,15649],{}," field pages backwards through history for a first backfill, then a recent window is enough. The ",[18,16150,16151],{"href":15915},"trending topics tracker"," is the same loop written out, and the ",[18,16154,16155],{"href":10493},"n8n version"," covers the no-code path.",[731,16158,16160],{"q":16159},"Why do the same tweets keep appearing in my results?",[11,16161,16162],{},"Because accounts repost promotional tweets on a schedule and each instance is a separate tweet with its own ID. In the run above, five of twenty results were repeats of two underlying tweets. Deduplicate on normalised text with URLs stripped rather than on tweet ID, or a quarter of every page will be noise you have already read.",[731,16164,16166],{"q":16165},"Should I DM the people I find?",[11,16167,16168,16169,16173],{},"Reply in public first, and treat the DM as the second step. A useful reply to a public question is visible to everyone reading the thread and costs the recipient nothing to ignore, which is the opposite of a cold DM. Volumn's ",[18,16170,16172],{"href":15968,"rel":16171},[124,125],"B2B social selling"," flow is built around that ordering, and the ordering is the part worth copying whether or not you use a tool for it.",[11,16175,16176],{},[758,16177,760],{},[762,16179,1649],{},{"title":136,"searchDepth":166,"depth":166,"links":16181},[16182,16183,16189,16190,16191,16192,16193,16194],{"id":15571,"depth":166,"text":15572},{"id":15627,"depth":166,"text":15628,"children":16184},[16185,16186,16187,16188],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":13678,"depth":187,"text":13679},{"id":13743,"depth":187,"text":13744},{"id":15839,"depth":166,"text":15840},{"id":15926,"depth":166,"text":15927},{"id":16058,"depth":166,"text":16059},{"id":16089,"depth":166,"text":16090},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fx-intent-search-social-selling.png","A tightened X search returned 19 of 20 keyword-relevant tweets. Only 2 were someone actually asking. Keyword match is not intent, and that gap is the work.","\u002Fimg\u002Fblog\u002Fx-intent-search-social-selling-card.png",{},"\u002Fblog\u002Fguides\u002Fx-intent-search-social-selling",{"title":15538,"description":16196},"blog\u002Fguides\u002Fx-intent-search-social-selling",[16203,16204,16205,16206],"twitter scraper","x api","social selling","lead generation","dWotu1iPXP2ytHEz1X1wTS0k1tDAbJbRjycg2jhhPRc",{"id":16209,"title":3067,"author":6,"body":16210,"category":2378,"cover":16802,"description":16803,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":16804,"meta":16805,"navigation":790,"ogImage":787,"path":3066,"publishedAt":16806,"readTime":793,"seo":16807,"stem":16808,"tags":16809,"toolCategory":5174,"updatedAt":16806,"__hash__":16813},"blogGuides\u002Fblog\u002Fguides\u002Fapify-alternatives.md",{"type":8,"value":16211,"toc":16787},[16212,16215,16221,16225,16228,16231,16237,16243,16249,16255,16262,16268,16272,16275,16278,16313,16319,16325,16339,16345,16349,16352,16358,16368,16374,16378,16381,16387,16393,16399,16405,16408,16410,16415,16420,16425,16427,16463,16465,16469,16472,16478,16484,16491,16496,16507,16511,16514,16517,16520,16529,16535,16544,16551,16554,16556,16682,16690,16693,16695,16701,16707,16713,16719,16727,16729,16732,16743,16749,16751,16760,16766,16772,16781,16785],[11,16213,16214],{},"Search for Apify alternatives and read what comes back carefully, because the answers give the game away. Ask an AI for the best alternatives to Apify and the list it returns names Apify. Ask for a free alternative and Apify is in that answer too.",[11,16216,16217,16218,16220],{},"That is not a broken model. It is the honest answer to a question people are asking slightly wrong, and unpicking it is what this guide does. Monid is ",[18,16219,21],{"href":20},", and Apify is one of the providers in our catalogue, which we are going to be plain about because it shapes everything below: we resell their actors, so the section naming when to go straight to Apify is not a courtesy.",[27,16222,16224],{"id":16223},"what-are-the-best-alternatives-to-apify","What are the best alternatives to Apify?",[11,16226,16227],{},"Bright Data, Firecrawl, ScrapingBee and Octoparse, and for most people none of them is the answer, because the complaint is rarely about the actors.",[11,16229,16230],{},"Read what people actually write when they ask this. The threads behind these questions are about the account, the plan and the platform rather than the scrapers:",[11,16232,16233,16236],{},[38,16234,16235],{},"\"I need one scrape a month and I am paying monthly.\""," A plan sized for continuous use, bought for bursty use. The actor is fine.",[11,16238,16239,16242],{},[38,16240,16241],{},"\"I do not want another vendor account.\""," A team already holding six credentials, asked to add a seventh for one job. The actor is fine.",[11,16244,16245,16248],{},[38,16246,16247],{},"\"The actor I depended on disappeared.\""," A real event with a real cost, and switching platforms does not prevent it happening on the next one.",[11,16250,16251,16254],{},[38,16252,16253],{},"\"I want my agent to pick the tool, not me.\""," Nothing to do with any vendor's quality.",[11,16256,16257,16258,16261],{},"Only the last of those is a capability question and none of them is answered by swapping Apify for a competitor with the same shape. ",[38,16259,16260],{},"The thing people want an alternative to is usually the purchasing model, not the technology",", and that distinction is why the AI keeps recommending Apify inside its own alternatives list. It knows the actors are good.",[16263,16264,16265],"pull-quote",{},[11,16266,16267],{},"When the answer to \"what should I use instead of X\" keeps naming X, the question is about how you buy it, not about what it does.",[27,16269,16271],{"id":16270},"can-i-run-an-apify-actor-without-an-apify-account","Can I run an Apify actor without an Apify account?",[11,16273,16274],{},"Yes, and it is worth showing rather than asserting, because it is the whole point of the post.",[11,16276,16277],{},"We ran one on 2026-08-19 with no Apify account, no Apify plan and no Apify key, from a Monid balance:",[131,16279,16281],{"className":133,"code":16280,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Fcompass\u002Fgoogle-maps-reviews-scraper \\\n  -i '{\"startUrls\":[{\"url\":\"https:\u002F\u002Fwww.google.com\u002Fmaps\u002Fplace\u002F?q=place_id:ChIJN1t_tDeuEmsRUsoyG83frY4\"}],\"maxReviews\":3}' -w\n",[47,16282,16283,16300],{"__ignoreMap":136},[140,16284,16285,16287,16289,16291,16293,16295,16298],{"class":142,"line":143},[140,16286,147],{"class":146},[140,16288,171],{"class":150},[140,16290,154],{"class":150},[140,16292,157],{"class":150},[140,16294,160],{"class":150},[140,16296,16297],{"class":150}," \u002Fcompass\u002Fgoogle-maps-reviews-scraper",[140,16299,184],{"class":183},[140,16301,16302,16304,16306,16309,16311],{"class":142,"line":166},[140,16303,190],{"class":150},[140,16305,194],{"class":193},[140,16307,16308],{"class":150},"{\"startUrls\":[{\"url\":\"https:\u002F\u002Fwww.google.com\u002Fmaps\u002Fplace\u002F?q=place_id:ChIJN1t_tDeuEmsRUsoyG83frY4\"}],\"maxReviews\":3}",[140,16310,2045],{"class":193},[140,16312,1190],{"class":150},[11,16314,16315,16318],{},[38,16316,16317],{},"Provider response: 200."," Real reviews came back, from the actor its own authors publish, with roughly fifty fields per record:",[131,16320,16323],{"className":16321,"code":16322,"language":97,"meta":136},[248],"identity      placeId, cid, fid, kgmid, businessProfileId\nplace         title, address, street, city, state, postalCode, countryCode,\n              neighborhood, lat, lng, categories, price, hotelStars\nstatus        permanentlyClosed, temporarilyClosed, reviewsCount, totalScore\nreview        reviewId, text, textTranslated, stars, publishedAtDate,\n              likesCount, reviewImageUrls, reviewDetailedRating, visitedIn\nreviewer      reviewerId, reviewerUrl, reviewerNumberOfReviews, isLocalGuide\nowner         responseFromOwnerText, responseFromOwnerDate\n",[47,16324,16322],{"__ignoreMap":136},[11,16326,16327,16328,102,16331,16334,16335,16338],{},"Two fields in there are worth more than they look. ",[47,16329,16330],{},"permanentlyClosed",[47,16332,16333],{},"temporarilyClosed"," turn a review pull into a liveness check on the business, and ",[47,16336,16337],{},"responseFromOwnerText"," tells you whether anyone is minding the listing, which for a lead list is a stronger qualifier than the star rating.",[11,16340,16341,16344],{},[38,16342,16343],{},"Nothing about the actor changed."," Same author, same code, same output. What changed is that there was no signup, no plan and no second invoice.",[232,16346,16348],{"id":16347},"what-a-failed-call-costs","What a failed call costs",[11,16350,16351],{},"Worth knowing before a batch, because it changes how freely you can experiment. Our first attempt used the wrong payload:",[131,16353,16356],{"className":16354,"code":16355,"language":97,"meta":136},[248],"Provider Response: 400\nCost:     nothing\nOutput:   Input is not valid: Field input.query is required\n",[47,16357,16355],{"__ignoreMap":136},[11,16359,16360,16363,16364,16367],{},[38,16361,16362],{},"A rejected call billed nothing",", and the error named the missing field rather than failing vaguely. A second run against a different Google Maps actor returned ",[47,16365,16366],{},"200"," with an empty array and also billed nothing, because that actor bills per result and there were no results.",[11,16369,16370,16371,16373],{},"That combination, free failures and free empty results on per-result endpoints, is what makes ",[47,16372,3936],{}," then a small run the correct first move on anything unfamiliar. The expensive mistake is a large batch with an unverified payload, not a handful of probing calls.",[232,16375,16377],{"id":16376},"how-to-test-an-unfamiliar-actor-in-four-calls","How to test an unfamiliar actor in four calls",[11,16379,16380],{},"The sequence that costs almost nothing and answers the questions that decide a batch:",[11,16382,16383,16386],{},[38,16384,16385],{},"Discover, to see what else exists."," Search the job rather than the actor name. If two or three endpoints come back from different providers, you have a fallback for the day one of them disappears, and you know it before you need it.",[11,16388,16389,16392],{},[38,16390,16391],{},"Inspect, to get the schema this catalogue exposes."," Not the actor's own documentation page. Our first call in this post failed precisely because those two disagreed, and pasting from the more authoritative-looking source is the natural mistake.",[11,16394,16395,16398],{},[38,16396,16397],{},"Run once with the smallest possible input."," One place, one profile, one page. Read the whole response body rather than checking the status, because a 200 with an empty array and a 200 with real data are the same status code and very different outcomes.",[11,16400,16401,16404],{},[38,16402,16403],{},"Read the charge on that run."," It reports what it actually billed, which is the only figure that predicts a batch. A per-result endpoint that returned three records tells you the real unit cost of your query shape; a per-call endpoint tells you the flat cost and that the limit parameter will not change it.",[11,16406,16407],{},"Four calls, and the two that fail or come back empty are free. What you learn is whether the fields you need exist, what the payload has to look like, and what a thousand of them will cost, which is everything you needed before committing.",[232,16409,235],{"id":234},[11,16411,238,16412,244],{},[18,16413,243],{"href":241,"rel":16414},[124,125],[131,16416,16418],{"className":16417,"code":249,"language":97,"meta":136},[248],[47,16419,249],{"__ignoreMap":136},[11,16421,254,16422,260],{},[18,16423,259],{"href":257,"rel":16424},[124,125],[232,16426,264],{"id":263},[131,16428,16429],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,16430,16431,16441],{"__ignoreMap":136},[140,16432,16433,16435,16437,16439],{"class":142,"line":143},[140,16434,274],{"class":146},[140,16436,277],{"class":150},[140,16438,280],{"class":150},[140,16440,283],{"class":150},[140,16442,16443,16445,16447,16449,16451,16453,16455,16457,16459,16461],{"class":142,"line":166},[140,16444,147],{"class":146},[140,16446,290],{"class":150},[140,16448,293],{"class":150},[140,16450,296],{"class":150},[140,16452,299],{"class":193},[140,16454,302],{"class":150},[140,16456,305],{"class":183},[140,16458,308],{"class":193},[140,16460,311],{"class":150},[140,16462,314],{"class":150},[316,16464],{"category":5174},[27,16466,16468],{"id":16467},"is-there-a-free-alternative-to-apify","Is there a free alternative to Apify?",[11,16470,16471],{},"Free tiers exist across the category and they solve a different problem from the one most people have.",[11,16473,16474,16477],{},[38,16475,16476],{},"What a free tier is good for."," Evaluating whether an actor returns the fields you need. Every vendor offers some version of this and you should use it, because the only real test of a scraper is your own target and your own field list.",[11,16479,16480,16483],{},[38,16481,16482],{},"What it is not good for."," Anything ongoing. Free tiers reset monthly, cap concurrency, and are the first thing to change when a vendor's economics do. Building a dependency on one is building on a promise nobody made.",[11,16485,16486,16487,16490],{},"The question underneath \"is there a free alternative\" is usually ",[38,16488,16489],{},"\"how do I stop paying for scraping I am not doing\"",", and that has a cleaner answer than a free tier: pay per call, so idle costs nothing. Discovery and schema inspection are free on our side, the run is the only billed step, and a month with no runs bills nothing. That is not a free tier, it is the absence of a floor, and it is the shape that fits bursty work.",[11,16492,16493,16494,260],{},"If your usage is genuinely continuous and heavy, none of this applies and a plan priced for that volume will beat per-call pricing. We laid the arithmetic out in ",[18,16495,6511],{"href":2325},[320,16497,16498],{},[11,16499,324,16500,119,16502,16506],{},[38,16501,327],{},[18,16503,16505],{"href":16504},"\u002Fblog\u002Fwhy-one-google-maps-scraper-is-not-enough","why one Google Maps scraper is not enough",", which compares actors on the same target rather than comparing platforms.",[27,16508,16510],{"id":16509},"what-happens-when-an-actor-gets-removed","What happens when an actor gets removed?",[11,16512,16513],{},"You lose the pipeline, and this is the one complaint in the set that a different purchasing model genuinely helps with.",[11,16515,16516],{},"It is a real event rather than a hypothetical. One of the open questions in our registry exists because an Apollo actor was removed from Apify and the people depending on it needed something the same week. Actors are published by independent authors, and a target changing its terms can take one out with no notice to you.",[11,16518,16519],{},"Three things reduce the damage, and only the third is about who you buy from:",[11,16521,16522,16525,16526,260],{},[38,16523,16524],{},"Depend on the job, not the actor."," Record what you need as a capability, get the current best endpoint for it at run time, and the removal becomes a search rather than a rebuild. This is the pattern we walked through in ",[18,16527,16528],{"href":2560},"the web scraping API for AI agents",[11,16530,16531,16534],{},[38,16532,16533],{},"Check that a replacement exists before you need one."," For any endpoint you depend on, run discovery for its job once and see whether a second option comes back. If nothing does, you have a single point of failure and now you know.",[11,16536,16537,16540,16541,260],{},[38,16538,16539],{},"Prefer official channels for the targets that matter."," Where a platform has a licensed API, that route survives policy changes that kill scrapers. We made the same argument about ",[18,16542,16543],{"href":3271},"Reddit after the API lockdown",[11,16545,16546,16547,16550],{},"The honest limit: ",[38,16548,16549],{},"no purchasing model prevents removal."," If a target forces an actor off a platform, it is gone wherever you bought it. What changes is whether replacing it is a search or a procurement cycle.",[421,16552],{"category":5174,"title":16553},"Browse the Apify actors, with live pricing",[27,16555,480],{"id":479},[482,16557,16558,16570],{},[485,16559,16560],{},[488,16561,16562,16564,16566,16568],{},[491,16563,493],{},[491,16565,496],{},[491,16567,499],{},[491,16569,502],{},[504,16571,16572,16591,16609,16627,16645,16663],{},[488,16573,16574,16577,16586,16589],{},[509,16575,16576],{},"Google Maps reviews and place data",[509,16578,16579],{},[18,16580,16583],{"href":16581,"rel":16582},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fapify",[124,125],[47,16584,16585],{},"apify \u002Fcompass\u002Fgoogle-maps-reviews-scraper",[509,16587,16588],{},"Place URL or ID",[509,16590,3551],{},[488,16592,16593,16596,16604,16607],{},[509,16594,16595],{},"Local business listings",[509,16597,16598],{},[18,16599,16601],{"href":16581,"rel":16600},[124,125],[47,16602,16603],{},"apify \u002Fdamilo\u002Fgoogle-maps-scraper",[509,16605,16606],{},"Query plus location",[509,16608,3551],{},[488,16610,16611,16614,16622,16625],{},[509,16612,16613],{},"Reddit, official OAuth",[509,16615,16616],{},[18,16617,16619],{"href":16581,"rel":16618},[124,125],[47,16620,16621],{},"apify \u002Fpracticaltools\u002Fapify-reddit-api",[509,16623,16624],{},"Subreddit or query",[509,16626,3551],{},[488,16628,16629,16632,16640,16643],{},[509,16630,16631],{},"LinkedIn profiles with contact data",[509,16633,16634],{},[18,16635,16637],{"href":16581,"rel":16636},[124,125],[47,16638,16639],{},"apify \u002Fdev_fusion\u002Flinkedin-profile-scraper",[509,16641,16642],{},"Profile URL",[509,16644,3551],{},[488,16646,16647,16650,16659,16661],{},[509,16648,16649],{},"Any page to clean markdown, no actor",[509,16651,16652],{},[18,16653,16656],{"href":16654,"rel":16655},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fweb-extraction",[124,125],[47,16657,16658],{},"context.dev \u002Fweb\u002Fscrape\u002Fmarkdown",[509,16660,7168],{},[509,16662,542],{},[488,16664,16665,16668,16677,16680],{},[509,16666,16667],{},"Trustpilot company reviews",[509,16669,16670],{},[18,16671,16674],{"href":16672,"rel":16673},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Freviews",[124,125],[47,16675,16676],{},"trustpilot \u002Fget_company_reviews",[509,16678,16679],{},"Company domain",[509,16681,542],{},[11,16683,16684,16685,604,16687,16689],{},"Verified present on 2026-08-19 with ",[47,16686,603],{},[47,16688,607],{}," prints the current figure for free.",[11,16691,16692],{},"The last two rows are the part that a platform-versus-platform comparison misses. Some jobs have a non-Apify endpoint that fits better, and the only way to notice is to be able to see both at once.",[27,16694,657],{"id":656},[11,16696,16697,16700],{},[38,16698,16699],{},"You use Apify heavily and deeply."," Buy Apify. At continuous volume a plan beats per-call pricing, and you get the parts of the product a catalogue entry does not carry.",[11,16702,16703,16706],{},[38,16704,16705],{},"You need the Apify console."," Scheduling, monitoring, run history, storage, the actor editor, webhooks. That is their product and it is good. We expose the endpoint, not the platform around it.",[11,16708,16709,16712],{},[38,16710,16711],{},"You are building or publishing actors."," That is Apify's developer surface and there is no version of it here.",[11,16714,16715,16718],{},[38,16716,16717],{},"You need actor-specific configuration we do not surface."," Proxy group selection, memory allocation, custom build tags. If your run depends on those, go direct.",[11,16720,16721,16723,16724,16726],{},[38,16722,686],{}," Our first call in this post returned a 400 because the payload we copied did not match the schema this catalogue exposes, which is not always identical to the actor's own documented input. Run ",[47,16725,607],{}," rather than pasting from the actor page, including when the actor page is the more authoritative-looking source.",[27,16728,696],{"id":695},[11,16730,16731],{},"The best alternative to Apify is usually Apify, bought differently. The complaints behind the question are about the account, the monthly floor and the vendor sprawl, and none of those is fixed by moving to a platform with the same shape.",[11,16733,16734,16735,16738,16739,16742],{},"Two things matter more than which vendor you land on. ",[38,16736,16737],{},"The actors are not the problem",", which is why the AI answers keep naming Apify inside their own alternatives lists, and why the useful question is how you get at them rather than what to replace them with. And ",[38,16740,16741],{},"actor removal is a real failure mode that no purchasing model prevents",": depend on the job rather than the actor, and check today whether a second endpoint exists for anything you would miss.",[11,16744,16745,16746,260],{},"Start with the free part: discovery and inspection cost nothing, and our measurements showed a rejected call and an empty result both billing nothing, so probing an unfamiliar actor is close to free. Run the one you depend on and read its schema. Begin at ",[18,16747,725],{"href":723,"rel":16748},[124,125],[27,16750,729],{"id":728},[731,16752,16754],{"q":16753},"Is this just a reseller with a markup?",[11,16755,16756,16757,16759],{},"We resell provider endpoints and the price you see before a run is the price you pay, shown by ",[47,16758,3936],{}," for free. What you are buying is the absence of a per-vendor account and plan, plus the ability to reach endpoints from several providers on one balance. If you use one provider heavily, going direct is cheaper and we say so in the caveat section rather than burying it.",[731,16761,16763],{"q":16762},"Do I get the same actor version?",[11,16764,16765],{},"You get the actor its author publishes, and our measured run returned the same field set the actor documents. What differs is the input schema this catalogue exposes, which is not always identical to the actor's own. That is why the first call in this post returned a 400: we pasted the actor's documented payload rather than inspecting first.",[731,16767,16769],{"q":16768},"What if I already have an Apify account?",[11,16770,16771],{},"Keep it. If your work is mostly Apify and mostly steady, that account is the right way to buy it and adding a layer helps nothing. The case for a catalogue is a job that reaches past one vendor, or usage bursty enough that a plan idles most of the month.",[731,16773,16775],{"q":16774},"Does an empty result still cost money?",[11,16776,16777,16778,16780],{},"On a per-result endpoint, no. We measured a run that returned 200 with an empty array and billed nothing, because there were no records to bill for. On a per-call endpoint the request is the billable unit, so an empty result costs the same as a full one. The billing shape is in ",[47,16779,3936],{}," and it is worth reading before a batch of speculative queries.",[11,16782,16783],{},[758,16784,760],{},[762,16786,764],{},{"title":136,"searchDepth":166,"depth":166,"links":16788},[16789,16790,16796,16797,16798,16799,16800,16801],{"id":16223,"depth":166,"text":16224},{"id":16270,"depth":166,"text":16271,"children":16791},[16792,16793,16794,16795],{"id":16347,"depth":187,"text":16348},{"id":16376,"depth":187,"text":16377},{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":16467,"depth":166,"text":16468},{"id":16509,"depth":166,"text":16510},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fapify-alternatives.png","Every AI answer to this question names Apify. We ran an Apify actor without an Apify account to show what the real alternative is.","\u002Fimg\u002Fblog\u002Fapify-alternatives-card.png",{},"2026-08-19",{"title":3067,"description":16803},"blog\u002Fguides\u002Fapify-alternatives",[16810,2389,16811,16812],"apify alternatives","actors","pay per call","KBXCK6uA9DW_ddIp1kdaTARyL8BmJSzwVSO-X_rclJM",{"id":16815,"title":16816,"author":6,"body":16817,"category":5706,"cover":17184,"description":17185,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":17186,"meta":17187,"navigation":790,"ogImage":787,"path":5411,"publishedAt":16806,"readTime":793,"seo":17188,"stem":17189,"tags":17190,"toolCategory":17111,"updatedAt":16806,"__hash__":17193},"blogGuides\u002Fblog\u002Fguides\u002Fconnect-claude-to-amazon-search-data.md","Connect Claude to Amazon Search Data: OpenWeb Ninja and Monid",{"type":8,"value":16818,"toc":17172},[16819,16822,16829,16832,16835,16839,16842,16848,16850,16855,16860,16866,16868,16873,16878,16881,16885,16888,16891,16942,16948,16975,16978,16984,16992,16999,17005,17008,17011,17014,17025,17029,17032,17038,17053,17060,17066,17069,17072,17078,17082,17085,17088,17102,17109,17116,17118,17121,17124,17127,17130,17133,17135,17141,17147,17160,17166,17170],[11,16820,16821],{},"An Amazon seller asked a question on r\u002FAmazonSellingSoftware that has no clean answer: how do you connect Claude to Amazon keyword and competitor sales data. It sounds like it should be a solved problem. It is not, and the reason is worth stating before any code.",[11,16823,16824,16825,16828],{},"Amazon publishes no keyword API for sellers. Seller Central shows you your own performance, the Product Advertising API ",[18,16826,16827],{"href":690},"retired in May 2026"," and never returned competitor data anyway, and the Selling Partner API is scoped to your own account. Everything about what your competitors rank for, what a category looks like today, and which listings own a keyword comes from reading the search results page.",[11,16830,16831],{},"So the real question is not which official API to use. It is which search endpoint to call, what it gives back, and how to put that in front of an agent.",[11,16833,16834],{},"Fair disclosure: you are on the Monid blog, one of the routes below is ours, and the other belongs to a company that replied to a partnership email. Both are described as they are, including the part where the second one is not in our catalogue.",[27,16836,16838],{"id":16837},"how-do-i-connect-claude-to-amazon-keyword-and-competitor-sales-data","How do I connect Claude to Amazon keyword and competitor sales data?",[11,16840,16841],{},"Point the agent at a search endpoint and let it call one per keyword.",[11,16843,16844,16845,16847],{},"The connection itself is the easy half now. Monid is ",[18,16846,21],{"href":20},", so it ships as a remote MCP server and an agent reaches the whole catalogue through one key:",[232,16849,235],{"id":234},[11,16851,238,16852,244],{},[18,16853,243],{"href":241,"rel":16854},[124,125],[131,16856,16858],{"className":16857,"code":249,"language":97},[248],[47,16859,249],{"__ignoreMap":136},[11,16861,16862,16863,260],{},"It learns discover, inspect and run by itself. More detail in the ",[18,16864,259],{"href":16865},"\u002Fdocs\u002Fguide\u002Fquickstart-skill",[232,16867,264],{"id":263},[131,16869,16871],{"className":16870,"code":8536,"language":97},[248],[47,16872,8536],{"__ignoreMap":136},[11,16874,8577,16875,260],{},[18,16876,8582],{"href":16877},"\u002Fdocs\u002Fguide\u002Fquickstart-cli",[11,16879,16880],{},"The harder half is knowing what to ask for. \"Competitor sales data\" does not exist as a field anywhere, because Amazon does not publish unit sales. What exists is a set of proxies a search result carries: rank position for a keyword, review count, rating, price, and whether a listing holds a badge. Those move with sales, which is why sellers read them. An agent that understands it is reading proxies rather than sales figures will give you better answers than one that thinks it found revenue.",[27,16882,16884],{"id":16883},"what-actually-comes-back-from-one-keyword-search","What actually comes back from one keyword search?",[11,16886,16887],{},"More than most people expect, and the extra fields are the useful part.",[11,16889,16890],{},"We ran the Amazon search endpoint on 2026-08-19 against a single keyword, one page:",[131,16892,16894],{"className":133,"code":16893,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Faxesso_data\u002Famazon-search-scraper\n\nmonid run -p apify -e \u002Faxesso_data\u002Famazon-search-scraper \\\n  -i '{\"input\":[{\"domainCode\":\"com\",\"keyword\":\"standing desk\",\"numPages\":1,\"sortBy\":\"relevanceblender\"}]}'\n",[47,16895,16896,16911,16915,16931],{"__ignoreMap":136},[140,16897,16898,16900,16902,16904,16906,16908],{"class":142,"line":143},[140,16899,147],{"class":146},[140,16901,151],{"class":150},[140,16903,154],{"class":150},[140,16905,157],{"class":150},[140,16907,160],{"class":150},[140,16909,16910],{"class":150}," \u002Faxesso_data\u002Famazon-search-scraper\n",[140,16912,16913],{"class":142,"line":166},[140,16914,1173],{"emptyLinePlaceholder":790},[140,16916,16917,16919,16921,16923,16925,16927,16929],{"class":142,"line":187},[140,16918,147],{"class":146},[140,16920,171],{"class":150},[140,16922,154],{"class":150},[140,16924,157],{"class":150},[140,16926,160],{"class":150},[140,16928,5282],{"class":150},[140,16930,184],{"class":183},[140,16932,16933,16935,16937,16940],{"class":142,"line":1279},[140,16934,190],{"class":150},[140,16936,194],{"class":193},[140,16938,16939],{"class":150},"{\"input\":[{\"domainCode\":\"com\",\"keyword\":\"standing desk\",\"numPages\":1,\"sortBy\":\"relevanceblender\"}]}",[140,16941,200],{"class":193},[11,16943,16944,16947],{},[38,16945,16946],{},"One page returned 48 product records."," Each carries the ASIN, the title, price, rating, review count and position in the result set. That much is expected. Three fields alongside them are what make this useful for the question above:",[5222,16949,16950,16957,16968],{},[5225,16951,16952,16956],{},[38,16953,16954,260],{},[47,16955,5369],{}," Amazon's own related-term suggestions for the query, returned with the results. This is the closest public thing to a keyword tool, and it comes free with a search you were making anyway.",[5225,16958,16959,16967],{},[38,16960,16961,102,16964,260],{},[47,16962,16963],{},"browseNode",[47,16965,16966],{},"nodeHierarchy"," The category path Amazon filed the results under, so an agent can tell whether a keyword sits in the category you think it does.",[5225,16969,16970,16974],{},[38,16971,16972,260],{},[47,16973,5359],{}," How many listings compete for the term in total, which is the difference between a keyword worth chasing and one already saturated.",[11,16976,16977],{},"Read those three together and you have the shape of a keyword: what it is adjacent to, where it lives, and how crowded it is. Read the 48 rows and you have who currently owns it.",[11,16979,16980,16981,16983],{},"One caution on ",[47,16982,5359],{},", because it is the field most likely to be misread. Amazon's reported total is an estimate and it moves between queries for reasons that have nothing to do with the market. Treat it as an order of magnitude, not a metric: the difference between four hundred results and forty thousand is real and worth acting on, the difference between twelve thousand and thirteen thousand is noise. The same caution applies to reading rank position on a single pull, since results are personalised and regionalised. One snapshot tells you the shape of a category. Only repeated snapshots tell you a direction.",[11,16985,16986,16987,16991],{},"What an agent does with that is the part worth designing. The useful loop is not \"search and summarise\", it is search, then decide what deserves a second call. Rank position plus review count tells you which listings are established and which are new and climbing; the climbing ones are usually where a category is actually moving. An agent can flag those, pull ",[18,16988,16990],{"href":16989},"\u002Fblog\u002Fautomate-amazon-product-detail-lookups","full product details for just those ASINs",", and leave the other forty alone. That two-stage shape, cheap wide read then narrow deep read, is what keeps a keyword sweep from turning into a bill.",[11,16993,16994,16995,16998],{},"If rank position over time is the thing you care about rather than a snapshot, ",[18,16996,16997],{"href":5416},"wiring up Amazon search rank tracking"," is the scheduled version of the same call.",[11,17000,17001],{},[5252,17002],{"alt":17003,"src":17004},"One keyword search returns the listings plus three fields most people miss: Amazon's own similar keywords, the category path, and the total number of competing results","\u002Fimg\u002Fblog\u002Fconnect-claude-to-amazon-search-data-fig-fields.png",[27,17006,3250],{"id":17007},"possible-to-scrape-amazon-for-just-price-stock-and-availability-daily",[11,17009,17010],{},"Yes, and the mistake is doing it with a search call.",[11,17012,17013],{},"A search endpoint is the right tool for discovery, when you do not yet know which ASINs matter. Once you have the list, searching again every day is the expensive way to ask a cheap question. Switch to a product-details call keyed by ASIN, which returns the fields you are watching without paying for 47 listings you already decided to ignore.",[11,17015,17016,17017,3933,17020,17024],{},"The daily pipeline half of this, including how to diff snapshots so you only alert on change, is worked through in ",[18,17018,17019],{"href":690},"the PA-API migration guide",[18,17021,17023],{"href":17022},"\u002Fblog\u002Fbuy-vs-build-amazon-product-detail-feeds","buying versus building an ASIN feed"," covers the case where you are weighing a managed endpoint against your own infrastructure. What matters here is the agent-shaped version: discovery is a search call, monitoring is a details call, and an agent that reaches for the same endpoint for both jobs will quietly overspend.",[27,17026,17028],{"id":17027},"catalogue-or-specialist-which-route-fits","Catalogue or specialist: which route fits?",[11,17030,17031],{},"Two different shapes, and the honest answer is that it depends on whether Amazon is your whole product.",[11,17033,17034,17037],{},[38,17035,17036],{},"Through a catalogue."," The route above. One key reaches Amazon search, reviews, product details and seller data, alongside every non-Amazon tool the same agent needs. Discovery and schema inspection are free, calls are billed per result from one balance, and no separate signup exists per vendor. This wins when Amazon is one of several things your agent does, and when you cannot list in advance everything it will need.",[11,17039,17040,119,17043,17048,17049,17052],{},[38,17041,17042],{},"Through a specialist.",[18,17044,17047],{"href":17045,"rel":17046},"https:\u002F\u002Fwww.openwebninja.com\u002Fapi\u002Freal-time-amazon-data",[124,125],"OpenWeb Ninja"," is the shape on the other side: an API that does Amazon and does it deeply. Product details, offers, reviews, search, best sellers, deals, seller profiles, and influencer endpoints that most Amazon APIs do not carry at all. It covers 24 marketplaces through a ",[47,17050,17051],{},"country"," parameter, from US and GB through to JP, IN, BR and ZA, which matters if you sell in more than one region and want the same call shape for each.",[11,17054,17055,17056,17059],{},"Their docs are also worth reading as an example of the thing to look for. They state outright that Amazon now requires a logged-in session to load reviews past the first page, so the public endpoint returns the eight reviews Amazon shows without one, and deeper pulls take a ",[47,17057,17058],{},"cookie"," parameter. A vendor that writes its own ceiling into the reference is easier to build against than one that implies there is none, because you find out at design time rather than when a batch comes back short.",[11,17061,17062,17065],{},[38,17063,17064],{},"To be clear about our own position: OpenWeb Ninja is not in the Monid catalogue."," We are describing a route you would take directly with them, not something you can reach through us today. If Amazon is the core of what you are building, going direct to a specialist and holding that one relationship is a perfectly good answer, and often the better one.",[11,17067,17068],{},"There is a second axis people miss, which is who absorbs breakage. Amazon changes its result markup regularly, and when it does, something has to be fixed. With either route that maintenance is the provider's, not yours, which is the actual argument for both of them over a scraper you own. The difference is only how many such relationships you hold: one deep one, or one that fans out. Neither removes the work, they relocate it.",[11,17070,17071],{},"The split in one line: a catalogue is for an agent that cannot predict what it will need, a specialist is for a product that already knows.",[11,17073,17074],{},[5252,17075],{"alt":17076,"src":17077},"Two routes to the same data: one key reaching many tools including Amazon, versus one deep relationship with an Amazon specialist","\u002Fimg\u002Fblog\u002Fconnect-claude-to-amazon-search-data-fig-routes.png",[27,17079,17081],{"id":17080},"what-does-a-keyword-sweep-cost","What does a keyword sweep cost?",[11,17083,17084],{},"Per result, which is the number that surprises people.",[11,17086,17087],{},"The measured run above billed 48 units for one page, because the endpoint charges per record returned rather than per query. That is the right mental model for sizing a job: a hundred keywords at one page each is not a hundred calls, it is roughly forty-eight hundred results. Still small in absolute terms, and the whole sweep lands in single-digit dollars, but it is not the flat per-query price the word \"search\" suggests.",[11,17089,17090,17091,17094,17095,17097,17098,17101],{},"Two habits follow from that. Bound ",[47,17092,17093],{},"numPages"," deliberately rather than leaving it at a default, and run one keyword before you run a hundred. Free ",[47,17096,3936],{}," shows the billing shape before you spend anything, and current prices are on ",[18,17099,1233],{"href":17100},"\u002Ftools"," rather than in this sentence, where they would go stale.",[11,17103,17104,17105,17108],{},"The same per-result mechanic caught us out once already on the reviews endpoint, and we ",[18,17106,17107],{"href":5548},"corrected it in public"," rather than leave an under-quote standing.",[421,17110,17113],{"category":17111,"title":17112},"amazon","Point an agent at Amazon search and let it read the keyword",[11,17114,17115],{},"Inspect the endpoint free, see the per result price, run one keyword before a hundred.",[27,17117,14058],{"id":14057},[11,17119,17120],{},"When you need numbers Amazon does not publish.",[11,17122,17123],{},"It is also worth being blunt about a category of tool this article does not replace. Dedicated seller-intelligence products model estimated sales from the same public signals and add their own historical panels on top; if you want that modelling done for you and are willing to pay a subscription for it, buy one. What this route gives you is the raw signal, priced per call, in a form an agent can act on without a seat licence. Those are different products and it is worth knowing which one your question actually needs.",[11,17125,17126],{},"Nothing here returns unit sales, revenue, or conversion rate, and any tool claiming to sell you those is modelling them from the same public signals you can read yourself. If your decision needs actual sales figures, the honest answer is that they are only available for your own account, through Seller Central and the Selling Partner API.",[11,17128,17129],{},"It is also the wrong approach if you need one ASIN watched continuously rather than a category surveyed. Polling a search endpoint for a listing you already know is paying discovery prices for a monitoring job.",[11,17131,17132],{},"And if Amazon is genuinely all you do, the catalogue argument gets weaker. One deep integration with a specialist beats a general layer you use for a single vendor, which is why the routes section above says so plainly rather than pretending otherwise.",[27,17134,729],{"id":728},[731,17136,17138],{"q":17137},"Does Amazon have an official keyword API for sellers?",[11,17139,17140],{},"No. Seller Central reports on your own listings, and the Selling Partner API is scoped to your own account. There is no official endpoint that tells you what competitors rank for. Every tool offering that reads it from public search results, including the ones that dress it up as proprietary data.",[731,17142,17144],{"q":17143},"Is scraping Amazon search results allowed?",[11,17145,17146],{},"Search result pages are public and readable without a login, which is different from a licence to do anything with what you collect. Amazon's terms, your jurisdiction, and how you store and use the data all still apply. A managed endpoint reads the public page from the provider's own infrastructure rather than from your address, which removes the account-level risk but not the compliance question.",[731,17148,17150],{"q":17149},"Can I get results from Amazon marketplaces outside the US?",[11,17151,17152,17153,17156,17157,17159],{},"Yes. The endpoint used above takes a ",[47,17154,17155],{},"domainCode",", and specialists like OpenWeb Ninja expose the same idea as a ",[47,17158,17051],{}," parameter across two dozen marketplaces. If you sell in several regions, confirm the parameter name and the coverage list before you build, because they differ by provider and a missing market is usually discovered late.",[731,17161,17163],{"q":17162},"How do I read Best Sellers Rank from a listing?",[11,17164,17165],{},"It arrives inside the product information block on a details call rather than as a top-level field, and it is absent when Amazon does not display it for that product. Treat it as present-or-not rather than as a guaranteed column, and read the category it names, since a rank of one in a narrow subcategory and a rank of one overall are very different claims.",[11,17167,17168],{},[758,17169,760],{},[762,17171,764],{},{"title":136,"searchDepth":166,"depth":166,"links":17173},[17174,17178,17179,17180,17181,17182,17183],{"id":16837,"depth":166,"text":16838,"children":17175},[17176,17177],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":16883,"depth":166,"text":16884},{"id":17007,"depth":166,"text":3250},{"id":17027,"depth":166,"text":17028},{"id":17080,"depth":166,"text":17081},{"id":14057,"depth":166,"text":14058},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fconnect-claude-to-amazon-search-data.png","Amazon has no keyword API for sellers. Here is what a search endpoint actually returns, how to hand it to an agent, and which route fits which job.","\u002Fimg\u002Fblog\u002Fconnect-claude-to-amazon-search-data-card.png",{},{"title":16816,"description":17185},"blog\u002Fguides\u002Fconnect-claude-to-amazon-search-data",[17191,17192,5565,1687],"amazon search api","amazon keyword data","B_Q2m2HiQktYFE9RMj_F2sT3wL00LuxD-ftaJc-gcko",{"id":17195,"title":17196,"author":6,"body":17197,"category":782,"cover":17814,"description":17815,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":17816,"meta":17817,"navigation":790,"ogImage":787,"path":17818,"publishedAt":16806,"readTime":793,"seo":17819,"stem":17820,"tags":17821,"toolCategory":12584,"updatedAt":16806,"__hash__":17826},"blogGuides\u002Fblog\u002Fguides\u002Fenrich-a-list-from-email-addresses.md","Enriching a List When All You Have Is Email Addresses",{"type":8,"value":17198,"toc":17799},[17199,17202,17208,17211,17215,17218,17229,17260,17266,17272,17278,17281,17286,17290,17293,17305,17314,17321,17324,17356,17362,17373,17375,17380,17385,17390,17392,17428,17430,17434,17437,17440,17446,17449,17464,17474,17482,17491,17505,17509,17512,17518,17524,17534,17540,17546,17550,17553,17559,17565,17571,17578,17581,17583,17701,17707,17710,17712,17718,17724,17730,17736,17741,17743,17746,17757,17763,17765,17771,17780,17786,17792,17796],[11,17200,17201],{},"You have a spreadsheet of email addresses and nothing else. Maybe they came from a form, maybe from an event, maybe from a list somebody handed you. What you need is a name, a company and a title, and the question is whether an address alone is enough to get there.",[11,17203,17204,17205,17207],{},"The short answer is sometimes, and the useful answer is how often. Monid is ",[18,17206,21],{"href":20},", so rather than describing the endpoint we can run it and report what came back.",[11,17209,17210],{},"Fair disclosure: you are on the Monid blog. Three of our four test addresses returned nothing, and that number is the most useful thing in this guide.",[27,17212,17214],{"id":17213},"can-you-get-a-person-from-an-email-address-alone","Can you get a person from an email address alone?",[11,17216,17217],{},"Sometimes, and the rate matters more than the capability.",[11,17219,17220,17221,17228],{},"We ran four real email addresses through ",[18,17222,17225],{"href":17223,"rel":17224},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fpeople-enrichment",[124,125],[47,17226,17227],{},"pdl \u002Fv5\u002Fperson\u002Fenrich"," on 2026-08-19:",[131,17230,17232],{"className":133,"code":17231,"language":135,"meta":136,"style":136},"monid run -p pdl -e \u002Fv5\u002Fperson\u002Fenrich -i '{\"email\":\"\u003Caddress>\"}' -w\n",[47,17233,17234],{"__ignoreMap":136},[140,17235,17236,17238,17240,17242,17244,17246,17249,17251,17253,17256,17258],{"class":142,"line":143},[140,17237,147],{"class":146},[140,17239,171],{"class":150},[140,17241,154],{"class":150},[140,17243,9015],{"class":150},[140,17245,160],{"class":150},[140,17247,17248],{"class":150}," \u002Fv5\u002Fperson\u002Fenrich",[140,17250,7819],{"class":150},[140,17252,194],{"class":193},[140,17254,17255],{"class":150},"{\"email\":\"\u003Caddress>\"}",[140,17257,2045],{"class":193},[140,17259,1190],{"class":150},[131,17261,17264],{"className":17262,"code":17263,"language":97,"meta":136},[248],"sundar@google.com      200, a full person record\npatrick@stripe.com     404\ninfo@apify.com         404\nsupport@tikhub.io      404\n",[47,17265,17263],{"__ignoreMap":136},[11,17267,17268,17271],{},[38,17269,17270],{},"One of four."," Not a benchmark, not a coverage claim, and not a number to plan a quarter around, but it is a real result on real addresses and it is the right order of magnitude to expect from a cold list.",[11,17273,17274,17275],{},"The second finding matters as much as the first. We checked the balance before and after the four calls, and it fell by exactly one call's worth. ",[38,17276,17277],{},"The three misses billed nothing.",[11,17279,17280],{},"That changes the arithmetic completely. On a per-attempt model, a list with a low hit rate is expensive to discover and the discovery is wasted. Here, you pay for the people you find, which means running the whole list is the cheapest way to learn how much of it is usable. There is no reason to sample first.",[16263,17282,17283],{},[11,17284,17285],{},"When misses are free, the correct batch size is the whole list. Sampling to estimate coverage costs the same as just doing it.",[27,17287,17289],{"id":17288},"what-did-the-addresses-that-failed-have-in-common","What did the addresses that failed have in common?",[11,17291,17292],{},"Two of the three were role addresses, and the third is the interesting one.",[11,17294,17295,17304],{},[38,17296,17297,102,17300,17303],{},[47,17298,17299],{},"info@apify.com",[47,17301,17302],{},"support@tikhub.io"," are not people."," A shared inbox has no person behind it, so a person lookup correctly returns nothing. These should never have been in the batch, and filtering them out beforehand is free: role prefixes are a fixed, short list, and anything matching one can be dropped before it reaches an endpoint.",[11,17306,17307,17313],{},[38,17308,17309,17312],{},[47,17310,17311],{},"patrick@stripe.com"," is the one worth thinking about."," It is a personal-format address at a large, well-documented company, and it still returned 404. A dataset built from public professional profiles has no reliable way to connect a specific mailbox to a specific person unless that pairing was published somewhere. Guessable format plus real person does not equal resolvable.",[11,17315,17316,17317,17320],{},"The rule underneath both: ",[38,17318,17319],{},"an email resolves when the pairing has been observed, not when it is plausible."," No provider derives the person from the address; they look it up in what they have collected. That is why role addresses fail by definition and personal addresses fail by luck.",[11,17322,17323],{},"Three practical filters before any batch:",[11,17325,17326,119,17329,98,17332,98,17335,98,17337,98,17340,98,17343,98,17346,98,17349,98,17352,17355],{},[38,17327,17328],{},"Drop role prefixes.",[47,17330,17331],{},"info",[47,17333,17334],{},"support",[47,17336,13517],{},[47,17338,17339],{},"hello",[47,17341,17342],{},"admin",[47,17344,17345],{},"contact",[47,17347,17348],{},"billing",[47,17350,17351],{},"careers",[47,17353,17354],{},"press",". Free to apply and it removes rows nothing will ever resolve.",[11,17357,17358,17361],{},[38,17359,17360],{},"Separate free-mail from corporate."," A gmail address carries no company signal and resolves at a different rate from a corporate one. They are two populations and averaging them hides which half is working.",[11,17363,17364,17367,17368,17372],{},[38,17365,17366],{},"Check the domain is live first."," An address at a dead domain cannot resolve to a current job, and domain checks cost far less than person lookups. ",[18,17369,17371],{"href":17370},"\u002Fblog\u002Fverify-an-email-before-it-hits-your-list","Verifying an email before it hits your list"," covers the mechanics.",[232,17374,235],{"id":234},[11,17376,238,17377,244],{},[18,17378,243],{"href":241,"rel":17379},[124,125],[131,17381,17383],{"className":17382,"code":249,"language":97,"meta":136},[248],[47,17384,249],{"__ignoreMap":136},[11,17386,254,17387,260],{},[18,17388,259],{"href":257,"rel":17389},[124,125],[232,17391,264],{"id":263},[131,17393,17394],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,17395,17396,17406],{"__ignoreMap":136},[140,17397,17398,17400,17402,17404],{"class":142,"line":143},[140,17399,274],{"class":146},[140,17401,277],{"class":150},[140,17403,280],{"class":150},[140,17405,283],{"class":150},[140,17407,17408,17410,17412,17414,17416,17418,17420,17422,17424,17426],{"class":142,"line":166},[140,17409,147],{"class":146},[140,17411,290],{"class":150},[140,17413,293],{"class":150},[140,17415,296],{"class":150},[140,17417,299],{"class":193},[140,17419,302],{"class":150},[140,17421,305],{"class":183},[140,17423,308],{"class":193},[140,17425,311],{"class":150},[140,17427,314],{"class":150},[316,17429],{"category":12584},[27,17431,17433],{"id":17432},"what-does-a-hit-actually-return","What does a hit actually return?",[11,17435,17436],{},"Considerably more than a name, and the company half is the part people underestimate.",[11,17438,17439],{},"The single successful record carried well over a hundred fields. Grouped by what they are for:",[131,17441,17444],{"className":17442,"code":17443,"language":97,"meta":136},[248],"person       full_name, first_name, last_name, birth_year, gender, id\nlocation     country, continent, countries, geo, address, region, locality\nwork         job_title, job_title_role, job_title_levels, job_company_name,\n             job_start_date, experience (the full history)\ncompany      job_company_id, job_company_industry, job_company_founded,\n             job_company_size, job_company_linkedin_url,\n             job_company_location_country, job_company_location_metro\nsocial       linkedin_url, github_url, github_username, facebook_url,\n             twitter_url, profiles\ncontact      emails, is_primary, phone_numbers, mobile_phone\neducation    education, degrees, gpa, end_date\nsignals      interests, skills, industry, activity_score\n",[47,17445,17443],{"__ignoreMap":136},[11,17447,17448],{},"Three of those change what you can build:",[11,17450,17451,17456,17457,3244,17460,17463],{},[38,17452,17453],{},[47,17454,17455],{},"job_title_levels"," is normalised seniority as an array, so routing branches on ",[47,17458,17459],{},"cxo",[47,17461,17462],{},"director"," in code without parsing free text. This is the field that makes automated lead routing possible rather than approximate.",[11,17465,17466,17473],{},[38,17467,17468,17469,17472],{},"The ",[47,17470,17471],{},"job_company_*"," block"," means one person lookup also returns the firmographics. If your next step was a separate company enrichment call, check this block first: you may already have what you were about to pay for again.",[11,17475,17476,17481],{},[38,17477,17478],{},[47,17479,17480],{},"experience"," is the full history, not just the current role. Useful for a genuine reason: someone who joined four months ago buys differently from someone in year six, and the start date is right there.",[11,17483,17484,17485,17490],{},"The field that flatters: ",[38,17486,17487],{},[47,17488,17489],{},"activity_score",". It describes how much profile activity the provider has observed, not how engaged the person is with anything of yours. Reading it as intent is a mistake the field name invites.",[320,17492,17493],{},[11,17494,324,17495,119,17497,17500,17501,17504],{},[38,17496,327],{},[18,17498,17499],{"href":12617},"an email in, a full person profile out"," for the step-by-step version of this call, and ",[18,17502,17503],{"href":12459},"the provider comparison"," for how the datasets differ.",[27,17506,17508],{"id":17507},"how-do-you-plan-a-batch-around-a-partial-hit-rate","How do you plan a batch around a partial hit rate?",[11,17510,17511],{},"By designing for the misses, because they are the majority and they are not failures.",[11,17513,17514,17517],{},[38,17515,17516],{},"Run the whole list."," Misses cost nothing, so sampling to estimate coverage costs the same as doing the work. Run everything, then count.",[11,17519,17520,17523],{},[38,17521,17522],{},"Record why each miss missed."," A 404 on a role address is expected and permanent. A 404 on a personal corporate address is a coverage gap that a second provider might fill. Storing the reason turns a list of failures into a routing decision.",[11,17525,17526,17529,17530,260],{},[38,17527,17528],{},"Send the personal-address misses down a second path."," If you have a name and a company from somewhere else, name-plus-company enrichment is a different query with different coverage, and it frequently resolves what an address alone could not. We walked that route in ",[18,17531,17533],{"href":17532},"\u002Fblog\u002Fautomate-email-to-profile-enrichment","automating email to profile enrichment",[11,17535,17536,17539],{},[38,17537,17538],{},"Never fill a gap with a guess."," A record with an inferred title is worse than an empty one, because everything downstream treats it as known. Leave it null and let the segmentation logic see the null.",[11,17541,17542,17545],{},[38,17543,17544],{},"Re-run rather than re-buy."," Coverage improves as datasets grow. The misses from this quarter are worth retrying next quarter, and because misses are free, retrying costs only what newly resolves.",[232,17547,17549],{"id":17548},"what-a-partial-list-is-still-good-for","What a partial list is still good for",[11,17551,17552],{},"The instinct on a 25% hit rate is that the list failed. It usually has not, and three things are worth doing with what came back before writing the rest off.",[11,17554,17555,17558],{},[38,17556,17557],{},"Segment on what resolved, then infer nothing about the rest."," The people you found tell you what kind of list this is: seniority mix, company sizes, industries. That is a real description of the resolvable quarter and it is silent about the other three quarters, which is exactly how it should be read. Treating the found segment as representative is the mistake that turns a partial list into a wrong strategy.",[11,17560,17561,17564],{},[38,17562,17563],{},"Use the company block to rescue rows the person lookup lost."," Every hit carried its employer's firmographics, and the domains from the misses are still domains. A company enrichment on those costs a different call and answers a different question, and for account-based work knowing the company is often enough to act.",[11,17566,17567,17570],{},[38,17568,17569],{},"Route the misses by why they missed, not as one bucket."," Role addresses go to a different acquisition motion entirely, because no enrichment fixes a shared inbox. Personal-address misses go to the name-plus-company retry. Dead domains get dropped. Three fates, three costs, and only one of them is worth another lookup.",[11,17572,17573,17574,17577],{},"The framing that keeps this honest: ",[38,17575,17576],{},"a hit rate measures your list against a dataset, not the quality of either."," A list of enterprise decision-makers and a list of newsletter signups resolve at completely different rates against the same provider, and the number tells you which one you have.",[421,17579],{"category":12584,"title":17580},"Browse the people endpoints, with live pricing",[27,17582,480],{"id":479},[482,17584,17585,17597],{},[485,17586,17587],{},[488,17588,17589,17591,17593,17595],{},[491,17590,493],{},[491,17592,496],{},[491,17594,499],{},[491,17596,502],{},[504,17598,17599,17617,17634,17651,17667,17683],{},[488,17600,17601,17604,17611,17614],{},[509,17602,17603],{},"Person from an email address",[509,17605,17606],{},[18,17607,17609],{"href":17223,"rel":17608},[124,125],[47,17610,17227],{},[509,17612,17613],{},"Email",[509,17615,17616],{},"Per call, misses free",[488,17618,17619,17622,17629,17632],{},[509,17620,17621],{},"Person from name plus company",[509,17623,17624],{},[18,17625,17627],{"href":17223,"rel":17626},[124,125],[47,17628,17227],{},[509,17630,17631],{},"Name and company",[509,17633,542],{},[488,17635,17636,17639,17647,17649],{},[509,17637,17638],{},"Find people matching a profile",[509,17640,17641],{},[18,17642,17644],{"href":17223,"rel":17643},[124,125],[47,17645,17646],{},"pdl \u002Fv5\u002Fperson\u002Fsearch",[509,17648,6380],{},[509,17650,3551],{},[488,17652,17653,17656,17663,17665],{},[509,17654,17655],{},"Company behind the domain",[509,17657,17658],{},[18,17659,17661],{"href":569,"rel":17660},[124,125],[47,17662,592],{},[509,17664,595],{},[509,17666,542],{},[488,17668,17669,17672,17679,17681],{},[509,17670,17671],{},"Resolve the domain first, free",[509,17673,17674],{},[18,17675,17677],{"href":569,"rel":17676},[124,125],[47,17678,573],{},[509,17680,576],{},[509,17682,579],{},[488,17684,17685,17688,17697,17699],{},[509,17686,17687],{},"Check the address is deliverable",[509,17689,17690],{},[18,17691,17694],{"href":17692,"rel":17693},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Femail-validation",[124,125],[47,17695,17696],{},"strale \u002Fx402\u002Femail-validate",[509,17698,17613],{},[509,17700,542],{},[11,17702,16684,17703,604,17705,16689],{},[47,17704,603],{},[47,17706,607],{},[11,17708,17709],{},"The first two rows are the same endpoint with different inputs and materially different coverage, which is the single most useful thing to know here. An address that returns 404 may resolve immediately from a name and a company, so the two are a sequence rather than alternatives.",[27,17711,657],{"id":656},[11,17713,17714,17717],{},[38,17715,17716],{},"Your list is mostly role addresses."," Then enrichment is not the problem and no provider will help. You need a different acquisition path, because shared inboxes have no person to find.",[11,17719,17720,17723],{},[38,17721,17722],{},"You need guaranteed coverage."," Nobody sells that on email-to-person, and a vendor quoting a coverage percentage is quoting it against their sample rather than your list. Run yours.",[11,17725,17726,17729],{},[38,17727,17728],{},"You need a compliance-grade identity link."," This is commercial data assembled from public profiles, not identity verification. For anything with a legal consequence, that distinction matters.",[11,17731,17732,17735],{},[38,17733,17734],{},"You want a UI and a saved-search workflow."," ZoomInfo and its peers sell a product a person opens. We ship an endpoint, a CLI and an MCP server.",[11,17737,17738,17740],{},[38,17739,686],{}," Our measured hit rate was one in four. That is one small sample on one day and your list will differ, but it is the right expectation to carry into planning, and it is a long way from the impression a coverage page gives. Run a hundred of your own before you build anything on the output.",[27,17742,696],{"id":695},[11,17744,17745],{},"An email address alone resolves to a person sometimes, and planning around sometimes is the whole skill. Our four test addresses produced one hit, and the three misses split cleanly into two role addresses that could never have worked and one personal address at a large company that simply was not in the dataset.",[11,17747,17748,17749,17752,17753,17756],{},"Two things matter more than which provider you pick. ",[38,17750,17751],{},"Misses billing nothing inverts the usual advice",": there is no reason to sample, because running the full list is the cheapest way to learn its coverage, and the number you get is about your list rather than somebody's benchmark. And ",[38,17754,17755],{},"an address resolves when the pairing was observed, not when it is plausible",", which is why a guessable corporate address at a famous company can fail while a less obvious one succeeds.",[11,17758,17759,17760,260],{},"Start with the free part: filter the role addresses out at no cost, check the domains resolve, and only then run the enrichment across everything that survives. Begin at ",[18,17761,725],{"href":723,"rel":17762},[124,125],[27,17764,729],{"id":728},[731,17766,17768],{"q":17767},"Why did a real person's email return nothing?",[11,17769,17770],{},"Because the provider looks the pairing up rather than deriving it. A dataset assembled from public professional profiles knows an address only if that address appeared alongside the person somewhere it collected. A perfectly real, perfectly formatted corporate address that was never published stays invisible, which is what happened to one of our four.",[731,17772,17774],{"q":17773},"Do I pay for lookups that find nothing?",[11,17775,17776,17777,17779],{},"On the endpoint we measured, no. We ran four addresses, one resolved, and the balance moved by one call's worth. That is worth verifying for your endpoint with ",[47,17778,3936],{}," and a small run rather than assuming, because the billing shape varies across the catalogue and it is the difference between a cheap experiment and an expensive one.",[731,17781,17783],{"q":17782},"Is a name plus company better than an email?",[11,17784,17785],{},"Frequently, and it is the right retry rather than the right first attempt. The same endpoint accepts either, and the two inputs have different coverage because they resolve against different parts of the record. Try the address first because it is the identifier you already hold, then send the misses down the name-plus-company path.",[731,17787,17789],{"q":17788},"Can I enrich personal gmail addresses?",[11,17790,17791],{},"At a much lower rate, and the reason is structural: a free-mail address carries no company signal, so there is far less published context linking it to a professional identity. Split free-mail from corporate before you measure anything, or the blended number will hide which half of your list is actually working.",[11,17793,17794],{},[758,17795,760],{},[762,17797,17798],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":136,"searchDepth":166,"depth":166,"links":17800},[17801,17802,17806,17807,17810,17811,17812,17813],{"id":17213,"depth":166,"text":17214},{"id":17288,"depth":166,"text":17289,"children":17803},[17804,17805],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":17432,"depth":166,"text":17433},{"id":17507,"depth":166,"text":17508,"children":17808},[17809],{"id":17548,"depth":187,"text":17549},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fenrich-a-list-from-email-addresses.png","We enriched four real email addresses and one returned a person. The misses billed nothing. What that changes about how you plan a batch.","\u002Fimg\u002Fblog\u002Fenrich-a-list-from-email-addresses-card.png",{},"\u002Fblog\u002Fguides\u002Fenrich-a-list-from-email-addresses",{"title":17196,"description":17815},"blog\u002Fguides\u002Fenrich-a-list-from-email-addresses",[17822,17823,17824,17825],"email enrichment","people data labs","zoominfo alternatives","lead data","kIVh6CKsvcZRKCJh2gFgMx6pXO-UYaLNn5cnmNkqpP4",{"id":17828,"title":17829,"author":6,"body":17830,"category":2378,"cover":18420,"description":18421,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":18422,"meta":18423,"navigation":790,"ogImage":787,"path":4054,"publishedAt":16806,"readTime":793,"seo":18424,"stem":18425,"tags":18426,"toolCategory":18043,"updatedAt":16806,"__hash__":18430},"blogGuides\u002Fblog\u002Fguides\u002Ffree-api-extract-page-content-rag.md","A Free API to Extract Page Content for RAG: Read This First",{"type":8,"value":17831,"toc":18405},[17832,17835,17841,17844,17848,17851,17854,17859,17872,17878,17883,17917,17923,17929,17936,17941,17945,17948,17951,17954,17960,17966,17972,17978,17986,17988,17993,17998,18003,18005,18041,18044,18048,18051,18054,18060,18066,18072,18078,18085,18095,18110,18114,18117,18130,18136,18142,18148,18155,18159,18162,18168,18174,18180,18186,18189,18192,18194,18307,18313,18316,18318,18324,18330,18336,18342,18347,18349,18352,18363,18372,18374,18380,18386,18392,18398,18402],[11,17833,17834],{},"Somebody building a local RAG setup wants page content in, embeddings out, and asks the reasonable question: is there a free API for this. The answers they get name scraping vendors, which is a fine answer to a slightly different question.",[11,17836,17837,17838,17840],{},"This guide starts with the answer that is not ours, because for the case that generated the question it is the right one. Monid is ",[18,17839,21],{"href":20},", and the extraction endpoints below are in our catalogue, so the comparison is measured rather than asserted.",[11,17842,17843],{},"Fair disclosure: you are on the Monid blog, and the first recommendation in this post is to not use us.",[27,17845,17847],{"id":17846},"is-there-a-free-api-to-extract-page-content-for-rag","Is there a free API to extract page content for RAG?",[11,17849,17850],{},"For the source most people are asking about, yes, and it is published by the source itself.",[11,17852,17853],{},"The thread behind this question was about wiki content. Wikipedia runs a free REST API, no key, no rate plan. We ran both routes against the same page on 2026-08-19.",[11,17855,17856],{},[38,17857,17858],{},"The official API:",[131,17860,17862],{"className":133,"code":17861,"language":135,"meta":136,"style":136},"curl https:\u002F\u002Fen.wikipedia.org\u002Fapi\u002Frest_v1\u002Fpage\u002Fsummary\u002FRetrieval-augmented_generation\n",[47,17863,17864],{"__ignoreMap":136},[140,17865,17866,17869],{"class":142,"line":143},[140,17867,17868],{"class":146},"curl",[140,17870,17871],{"class":150}," https:\u002F\u002Fen.wikipedia.org\u002Fapi\u002Frest_v1\u002Fpage\u002Fsummary\u002FRetrieval-augmented_generation\n",[131,17873,17876],{"className":17874,"code":17875,"language":97,"meta":136},[248],"extract      689 characters of clean prose\ntitle        the canonical title\npageid       a stable identifier\nrevision     the exact revision this text came from\ntimestamp    when that revision was made\nlang, dir    language and text direction\n",[47,17877,17875],{"__ignoreMap":136},[11,17879,17880],{},[38,17881,17882],{},"The same page, scraped:",[131,17884,17886],{"className":133,"code":17885,"language":135,"meta":136,"style":136},"monid run -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown \\\n  --query '{\"url\":\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation\"}' -w\n",[47,17887,17888,17904],{"__ignoreMap":136},[140,17889,17890,17892,17894,17896,17898,17900,17902],{"class":142,"line":143},[140,17891,147],{"class":146},[140,17893,171],{"class":150},[140,17895,154],{"class":150},[140,17897,1718],{"class":150},[140,17899,160],{"class":150},[140,17901,1721],{"class":150},[140,17903,184],{"class":183},[140,17905,17906,17908,17910,17913,17915],{"class":142,"line":166},[140,17907,2037],{"class":150},[140,17909,194],{"class":193},[140,17911,17912],{"class":150},"{\"url\":\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRetrieval-augmented_generation\"}",[140,17914,2045],{"class":193},[140,17916,1190],{"class":150},[131,17918,17921],{"className":17919,"code":17920,"language":97,"meta":136},[248],"Provider Response: 200\ncontentLength:     74,552\nmarkdown begins:   \"[Jump to content] Main menu ... move to sidebar hide\n                    Navigation - [Main page] - [Contents] ...\"\n",[47,17922,17920],{"__ignoreMap":136},[11,17924,17925,17928],{},[38,17926,17927],{},"Six hundred and eighty-nine characters against seventy-four thousand, and the scrape opens with the navigation menu."," The official route also carries a revision identifier, which the scrape has no equivalent of and which is the field that makes a RAG index reproducible.",[11,17930,17931,17932,17935],{},"The general rule, and it holds well beyond Wikipedia: ",[38,17933,17934],{},"if the source publishes an API, that is the extraction endpoint."," It returns the content without the chrome, it carries identifiers you can cite, and it is what the publisher intends you to use. Reaching for a scraper against a source with an official feed is choosing the worse data and the weaker legal footing at the same time.",[16263,17937,17938],{},[11,17939,17940],{},"The best extraction API for a source is usually the one that source publishes. Check for it before you compare scrapers.",[27,17942,17944],{"id":17943},"why-is-scraped-page-text-worse-than-it-looks","Why is scraped page text worse than it looks?",[11,17946,17947],{},"Because clean markdown is not the same as clean content, and the difference is most of the file.",[11,17949,17950],{},"Our 74,552 characters were genuinely well-converted: readable markdown, working links, correct headings. They were also mostly not the article. A Wikipedia page carries a navigation menu, a sidebar, a language list, an edit toolbar, a references apparatus and a footer, and all of it converts perfectly into markdown that is perfectly useless to a RAG index.",[11,17952,17953],{},"Four consequences, in the order they bite:",[11,17955,17956,17959],{},[38,17957,17958],{},"Your embeddings get diluted."," Chunk that file naively and a meaningful fraction of your vectors encode navigation text. Those chunks are retrievable, they match on generic queries, and they push real content out of the top results.",[11,17961,17962,17965],{},[38,17963,17964],{},"Boilerplate is identical across pages."," Every page from one site shares its chrome, so those chunks are near-duplicates of each other. A similarity search over the index returns the same menu from forty different pages.",[11,17967,17968,17971],{},[38,17969,17970],{},"Token costs scale with the junk."," If chunks go into a context window, you are paying for the sidebar on every retrieval.",[11,17973,17974,17977],{},[38,17975,17976],{},"The signal-to-noise ratio is invisible in the status code."," The request succeeded, the markdown is valid, and nothing in the response tells you that the first eight hundred characters are a menu.",[11,17979,17980,17981,17985],{},"The fix is not a better scraper, it is a boundary-aware extraction step: keep the main content region, drop nav and footer, split on headings rather than on character counts, and carry the heading path into each chunk's metadata so a retrieved fragment knows where it came from. We covered the practical version of that in ",[18,17982,17984],{"href":17983},"\u002Fblog\u002Fbatch-youtube-transcripts-into-your-rag-store","batching transcripts into a RAG store",", where the timestamps do the same job that headings do here.",[232,17987,235],{"id":234},[11,17989,238,17990,244],{},[18,17991,243],{"href":241,"rel":17992},[124,125],[131,17994,17996],{"className":17995,"code":249,"language":97,"meta":136},[248],[47,17997,249],{"__ignoreMap":136},[11,17999,254,18000,260],{},[18,18001,259],{"href":257,"rel":18002},[124,125],[232,18004,264],{"id":263},[131,18006,18007],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,18008,18009,18019],{"__ignoreMap":136},[140,18010,18011,18013,18015,18017],{"class":142,"line":143},[140,18012,274],{"class":146},[140,18014,277],{"class":150},[140,18016,280],{"class":150},[140,18018,283],{"class":150},[140,18020,18021,18023,18025,18027,18029,18031,18033,18035,18037,18039],{"class":142,"line":166},[140,18022,147],{"class":146},[140,18024,290],{"class":150},[140,18026,293],{"class":150},[140,18028,296],{"class":150},[140,18030,299],{"class":193},[140,18032,302],{"class":150},[140,18034,305],{"class":183},[140,18036,308],{"class":193},[140,18038,311],{"class":150},[140,18040,314],{"class":150},[316,18042],{"category":18043},"web-extraction",[27,18045,18047],{"id":18046},"when-do-you-actually-need-a-general-extraction-endpoint","When do you actually need a general extraction endpoint?",[11,18049,18050],{},"When there is no official API, and that covers most of the web.",[11,18052,18053],{},"Wikipedia is the easy case precisely because it is unusually well served. The sources that make a RAG index worth building rarely are:",[11,18055,18056,18059],{},[38,18057,18058],{},"Documentation sites."," Most publish no API, and the content is the reason you are indexing at all.",[11,18061,18062,18065],{},[38,18063,18064],{},"Competitor and vendor pages."," Nobody publishes an API for their own marketing site, and pricing and feature pages are exactly what a competitive index wants.",[11,18067,18068,18071],{},[38,18069,18070],{},"News and blog archives."," Some have feeds, most feeds are truncated, and a summary is not the article.",[11,18073,18074,18077],{},[38,18075,18076],{},"PDFs and documents."," Reports, filings, manuals. A different extraction problem and one a general endpoint handles better than a hand-rolled parser.",[11,18079,18080,18081,18084],{},"For those, the choice is between running your own extraction and calling an endpoint, and the honest split is the same as everywhere else in this catalogue: ",[38,18082,18083],{},"build it when extraction is your product, buy it when the text is an input."," Fingerprint drift and boilerplate rules are continuous maintenance with no upside for a team whose product is the thing on top.",[11,18086,18087,18088,18094],{},"One thing worth checking before you commit: a schema-directed extractor is often the better tool for a RAG source. ",[18,18089,18091],{"href":16654,"rel":18090},[124,125],[47,18092,18093],{},"context.dev \u002Fweb\u002Fextract"," takes a schema and returns JSON matching it, so instead of a page of markdown you get the four fields you actually wanted, already separated. For structured sources that is a materially cleaner input than any amount of post-processing.",[320,18096,18097],{},[11,18098,324,18099,119,18101,18104,18105,18109],{},[38,18100,327],{},[18,18102,18103],{"href":2986},"turning any URL into LLM-ready markdown"," for the extraction mechanics, and ",[18,18106,18108],{"href":18107},"\u002Fblog\u002Fgive-your-agent-live-web-context","giving your agent live web context"," for the retrieval side.",[27,18111,18113],{"id":18112},"what-does-a-rag-pipeline-need-beyond-the-text","What does a RAG pipeline need beyond the text?",[11,18115,18116],{},"Four things, and only one of them is content. The other three are what makes a retrieved chunk trustworthy.",[11,18118,18119,18122,18123,1214,18126,18129],{},[38,18120,18121],{},"A stable identifier."," Something that says which document and which version this text came from. Wikipedia's API gives a ",[47,18124,18125],{},"revision",[47,18127,18128],{},"pageid","; a scrape gives a URL that may point at different content next month. Without it you cannot tell whether an answer was drawn from current information or from something you indexed in March.",[11,18131,18132,18135],{},[38,18133,18134],{},"A timestamp."," When was this fetched. A RAG index silently ages, and staleness is invisible at query time unless the chunk carries its own date.",[11,18137,18138,18141],{},[38,18139,18140],{},"Structure, preserved."," The heading path a chunk sits under is context a retrieval step cannot reconstruct. Splitting on character count throws it away; splitting on headings and storing the path keeps it, and it improves both retrieval and the answer.",[11,18143,18144,18147],{},[38,18145,18146],{},"Provenance you can show."," A citable URL per chunk. This is the difference between an answer a reader can check and one they have to trust, and it is the single feature that makes an internal RAG tool credible to the people using it.",[11,18149,18150,18151,18154],{},"The mistake this list is meant to prevent: ",[38,18152,18153],{},"treating extraction as a text problem when it is a metadata problem."," Getting readable text out of a page is largely solved. Knowing what that text was, when it was true and where it came from is what separates a RAG index people rely on from one they stop trusting after the first confidently wrong answer.",[232,18156,18158],{"id":18157},"how-to-test-a-source-before-indexing-all-of-it","How to test a source before indexing all of it",[11,18160,18161],{},"Four checks, on one page, before a crawl commits you to a thousand:",[11,18163,18164,18167],{},[38,18165,18166],{},"Read the first thousand characters."," Not a sample from the middle, the opening. That is where the chrome lives, and it tells you immediately how much of the file is not the article. Our Wikipedia scrape failed this check in the first line.",[11,18169,18170,18173],{},[38,18171,18172],{},"Count the ratio."," Rough is fine: how much of the extracted length is the content you wanted. If it is under half, you need a boundary-aware step before indexing, and you have just saved yourself finding that out from bad retrieval results a week later.",[11,18175,18176,18179],{},[38,18177,18178],{},"Check two pages from the same site against each other."," The parts that are identical are boilerplate by definition. This is the cheapest boilerplate detector there is and it needs no rules, no configuration and no third page.",[11,18181,18182,18185],{},[38,18183,18184],{},"Confirm you can produce a citation."," For a chunk in the middle of the document, can you say which URL, which section and which version it came from. If the answer is only the URL, your index cannot support a citation and you should decide that now rather than after somebody asks where an answer came from.",[11,18187,18188],{},"All four run on one or two extraction calls, which on a per-call endpoint is close to nothing, and they answer the questions that otherwise surface as unexplained retrieval quality problems after the index is built.",[421,18190],{"category":18043,"title":18191},"Browse the extraction endpoints, with live pricing",[27,18193,480],{"id":479},[482,18195,18196,18208],{},[485,18197,18198],{},[488,18199,18200,18202,18204,18206],{},[491,18201,493],{},[491,18203,496],{},[491,18205,499],{},[491,18207,502],{},[504,18209,18210,18224,18239,18256,18273,18290],{},[488,18211,18212,18215,18218,18221],{},[509,18213,18214],{},"A source with its own API",[509,18216,18217],{},"that source's API",[509,18219,18220],{},"varies",[509,18222,18223],{},"often free",[488,18225,18226,18228,18235,18237],{},[509,18227,3092],{},[509,18229,18230],{},[18,18231,18233],{"href":16654,"rel":18232},[124,125],[47,18234,16658],{},[509,18236,7168],{},[509,18238,542],{},[488,18240,18241,18244,18251,18254],{},[509,18242,18243],{},"A page to a schema you define",[509,18245,18246],{},[18,18247,18249],{"href":16654,"rel":18248},[124,125],[47,18250,18093],{},[509,18252,18253],{},"URL plus schema",[509,18255,542],{},[488,18257,18258,18261,18269,18271],{},[509,18259,18260],{},"A whole site for an index",[509,18262,18263],{},[18,18264,18266],{"href":16654,"rel":18265},[124,125],[47,18267,18268],{},"context.dev \u002Fweb\u002Fcrawl",[509,18270,7190],{},[509,18272,3551],{},[488,18274,18275,18278,18286,18288],{},[509,18276,18277],{},"List the URLs before crawling",[509,18279,18280],{},[18,18281,18283],{"href":16654,"rel":18282},[124,125],[47,18284,18285],{},"context.dev \u002Fweb\u002Fscrape\u002Fsitemap",[509,18287,7213],{},[509,18289,542],{},[488,18291,18292,18295,18303,18305],{},[509,18293,18294],{},"A PDF or Office document",[509,18296,18297],{},[18,18298,18300],{"href":16654,"rel":18299},[124,125],[47,18301,18302],{},"context.dev \u002Fparse",[509,18304,7168],{},[509,18306,542],{},[11,18308,16684,18309,604,18311,16689],{},[47,18310,603],{},[47,18312,607],{},[11,18314,18315],{},"The first row is not a joke and it belongs at the top. The last row is the one people forget: a large share of the documents worth indexing are PDFs, and running them through a parser endpoint is far less work than a local extraction stack that has to handle scanned pages.",[27,18317,657],{"id":656},[11,18319,18320,18323],{},[38,18321,18322],{},"The source publishes an API."," Use it. Free, cleaner, versioned, and intended for this. That covers Wikipedia, most government data, many documentation platforms and every source with a real developer programme.",[11,18325,18326,18329],{},[38,18327,18328],{},"You are indexing your own content."," Read it from your CMS or your repository, where you already have the structure and the identifiers. Scraping your own site to get text you already own is a strange amount of work.",[11,18331,18332,18335],{},[38,18333,18334],{},"Extraction is your product."," Own the pipeline.",[11,18337,18338,18341],{},[38,18339,18340],{},"You need a managed vector store too."," We return text. The chunking, the embeddings and the index are yours to build or buy, and a platform that does all of it may fit better than assembling the pieces.",[11,18343,18344,18346],{},[38,18345,686],{}," Our scrape of a Wikipedia page returned seventy-four thousand characters beginning with a navigation menu, with a 200 and valid markdown. Nothing in that response flagged that most of it was chrome. Read the first thousand characters of any new source before you index a thousand pages of it.",[27,18348,696],{"id":695},[11,18350,18351],{},"There is a free API to extract page content for RAG, and for the source that generated this question it is Wikipedia's own. The measurement was not close: 689 clean characters with a revision identifier against 74,552 that open with a navigation menu.",[11,18353,18354,18355,18358,18359,18362],{},"Two things matter more than which extraction vendor you pick. ",[38,18356,18357],{},"Check for an official API before comparing scrapers",", because a publisher's own feed gives cleaner text, stable identifiers and a defensible legal position, and it is usually free. And ",[38,18360,18361],{},"extraction is a metadata problem, not a text problem",": readable markdown is close to solved, while knowing which document a chunk came from, which version, and when it was fetched is what decides whether anyone keeps trusting the answers.",[11,18364,18365,18366,18368,18369,260],{},"Start with the free part: check the source for an API, and where there is none, ",[47,18367,607],{}," shows the extraction schema before you spend. Then extract one page and read the first thousand characters before indexing the site. Begin at ",[18,18370,725],{"href":723,"rel":18371},[124,125],[27,18373,729],{"id":728},[731,18375,18377],{"q":18376},"Is Wikipedia's API really free?",[11,18378,18379],{},"Yes, with no key for normal use, and it returns clean prose plus a revision identifier the scraped version has no equivalent of. There are rate expectations and a user-agent policy for heavy use, both documented, and both far easier to satisfy than any scraping arrangement. For wiki content specifically, reaching for a scraper is choosing worse data and more work.",[731,18381,18383],{"q":18382},"How do I strip navigation from scraped markdown?",[11,18384,18385],{},"Not by pattern-matching the menu text, which changes per site and per template. Split on headings and keep only the section tree under the main content heading, or use a schema-directed extraction endpoint that returns named fields instead of a page. The second is less work and it fails more visibly, which on this problem is a feature.",[731,18387,18389],{"q":18388},"Does chunk size matter more than cleaning?",[11,18390,18391],{},"Cleaning first, by a wide margin. A perfectly tuned chunk size over text that is half navigation still indexes navigation, and those chunks are near-identical across every page from that site, so they crowd retrieval results. Get the boilerplate out, split on structure rather than character counts, then tune size against your own queries.",[731,18393,18395],{"q":18394},"Can I index a site behind a login?",[11,18396,18397],{},"Not with a per-call scrape, which is stateless. Anything requiring a maintained session wants browser automation you control, and anything behind someone else's login raises a terms question that a working request does not settle. For your own authenticated content, read it from the system that stores it rather than from its rendered pages.",[11,18399,18400],{},[758,18401,760],{},[762,18403,18404],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":136,"searchDepth":166,"depth":166,"links":18406},[18407,18408,18412,18413,18416,18417,18418,18419],{"id":17846,"depth":166,"text":17847},{"id":17943,"depth":166,"text":17944,"children":18409},[18410,18411],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":18046,"depth":166,"text":18047},{"id":18112,"depth":166,"text":18113,"children":18414},[18415],{"id":18157,"depth":187,"text":18158},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Ffree-api-extract-page-content-rag.png","We scraped a Wikipedia page and got 74,552 characters starting with the nav menu. The official API gave 689 clean ones. When each is right.","\u002Fimg\u002Fblog\u002Ffree-api-extract-page-content-rag-card.png",{},{"title":17829,"description":18421},"blog\u002Fguides\u002Ffree-api-extract-page-content-rag",[4343,18427,18428,18429],"web extraction","chunking","llm context","EWglOgh-_sY6q-P-8uYcgQlihACXonJ3I4nHfqI-8N0",{"id":18432,"title":18433,"author":6,"body":18434,"category":19063,"cover":19064,"description":19065,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":19066,"meta":19067,"navigation":790,"ogImage":787,"path":19068,"publishedAt":16806,"readTime":793,"seo":19069,"stem":19070,"tags":19071,"toolCategory":18646,"updatedAt":16806,"__hash__":19075},"blogGuides\u002Fblog\u002Fguides\u002Fgoogle-maps-scraper-alternatives.md","Google Maps Scraper Alternatives: Building a Local Lead List",{"type":8,"value":18435,"toc":19048},[18436,18439,18445,18448,18452,18455,18458,18478,18481,18487,18493,18496,18501,18505,18508,18511,18546,18552,18558,18561,18571,18580,18586,18589,18591,18596,18601,18606,18608,18644,18647,18651,18654,18657,18663,18666,18675,18682,18694,18705,18715,18729,18733,18736,18739,18745,18761,18771,18780,18787,18791,18794,18806,18816,18826,18832,18835,18838,18840,18955,18961,18964,18966,18972,18978,18983,18989,18994,18996,18999,19010,19016,19018,19024,19030,19036,19042,19046],[11,18437,18438],{},"Someone wants every pizza place in a city, with a phone number and a website, and they want it as a spreadsheet by lunchtime. It is one of the oldest jobs in lead generation and the tooling around it is genuinely good, which is why the question people actually ask is not how to do it but what to use instead of the thing they tried first.",[11,18440,18441,18442,18444],{},"This guide answers that with runs rather than opinions. Monid is ",[18,18443,21],{"href":20},", so the actors below are reachable on one balance and we can show what each returns.",[11,18446,18447],{},"Fair disclosure: you are on the Monid blog, and Apify is a provider in our catalogue. One of the two actors measured here returned nothing on a reasonable query, and that is in the post because it is the most useful thing in it.",[27,18449,18451],{"id":18450},"what-are-the-alternatives-for-the-google-maps-scraper-on-apify","What are the alternatives for the Google Maps scraper on Apify?",[11,18453,18454],{},"Mostly other Google Maps scrapers on Apify, and the useful discovery is that they are not interchangeable.",[11,18456,18457],{},"We searched the catalogue on 2026-08-19 for the job rather than the vendor:",[131,18459,18461],{"className":133,"code":18460,"language":135,"meta":136,"style":136},"monid discover -q \"google maps business listings reviews\"\n",[47,18462,18463],{"__ignoreMap":136},[140,18464,18465,18467,18469,18471,18473,18476],{"class":142,"line":143},[140,18466,147],{"class":146},[140,18468,2667],{"class":150},[140,18470,2670],{"class":150},[140,18472,2673],{"class":193},[140,18474,18475],{"class":150},"google maps business listings reviews",[140,18477,2679],{"class":193},[11,18479,18480],{},"Two Apify actors came back, plus three endpoints that are not Google Maps at all:",[131,18482,18485],{"className":18483,"code":18484,"language":97,"meta":136},[248],"apify \u002Fcompass\u002Fgoogle-maps-reviews-scraper   reviews and place metadata\napify \u002Fdamilo\u002Fgoogle-maps-scraper            local business listings\ntrustpilot \u002Fget_company_reviews              a different review source\nclutch \u002Fget_company_reviews                  agency and B2B reviews\nloopnet \u002Fsearch_listings                     commercial real estate\n",[47,18486,18484],{"__ignoreMap":136},[11,18488,18489,18492],{},[38,18490,18491],{},"The two Apify rows do different jobs."," One starts from a place and returns its reviews; the other starts from a search and returns places. Asking which is the better alternative to the other is the wrong comparison, and it is the comparison the question invites.",[11,18494,18495],{},"The three non-Apify rows matter for a different reason. If the underlying need is \"reviews about a business\" rather than \"reviews on Google\", then Trustpilot and Clutch are separate sources with separate coverage, and a Google-only pull is answering a narrower question than the one that was asked.",[16263,18497,18498],{},[11,18499,18500],{},"Two actors with the same platform and the same subject can still be answering different questions. Read what each one takes as input, not what it is called.",[27,18502,18504],{"id":18503},"why-did-my-scraper-return-an-empty-list","Why did my scraper return an empty list?",[11,18506,18507],{},"Because a 200 is not a promise of data, and we hit this on the first try.",[11,18509,18510],{},"We ran the listings actor with a query any human would call reasonable:",[131,18512,18514],{"className":133,"code":18513,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Fdamilo\u002Fgoogle-maps-scraper \\\n  -i '{\"query\":\"restaurant\",\"location\":\"San Francisco, CA, USA\"}' -w\n",[47,18515,18516,18533],{"__ignoreMap":136},[140,18517,18518,18520,18522,18524,18526,18528,18531],{"class":142,"line":143},[140,18519,147],{"class":146},[140,18521,171],{"class":150},[140,18523,154],{"class":150},[140,18525,157],{"class":150},[140,18527,160],{"class":150},[140,18529,18530],{"class":150}," \u002Fdamilo\u002Fgoogle-maps-scraper",[140,18532,184],{"class":183},[140,18534,18535,18537,18539,18542,18544],{"class":142,"line":166},[140,18536,190],{"class":150},[140,18538,194],{"class":193},[140,18540,18541],{"class":150},"{\"query\":\"restaurant\",\"location\":\"San Francisco, CA, USA\"}",[140,18543,2045],{"class":193},[140,18545,1190],{"class":150},[131,18547,18550],{"className":18548,"code":18549,"language":97,"meta":136},[248],"Provider Response: 200\nOutput:            []\nCost:              nothing\n",[47,18551,18549],{"__ignoreMap":136},[11,18553,18554,18557],{},[38,18555,18556],{},"Two hundred, empty array, no charge."," The values we passed were the actor's own documented example values, so this was not a nonsense query. Something in that combination produced no rows, and the response says nothing about why.",[11,18559,18560],{},"Three things to take from it:",[11,18562,18563,18566,18567,18570],{},[38,18564,18565],{},"Check the body, not the status."," A pipeline that branches on ",[47,18568,18569],{},"response.ok"," treats this run as a success and writes an empty batch downstream. That failure is silent and it compounds: the next stage does its work correctly on nothing.",[11,18572,18573,18576,18577,18579],{},[38,18574,18575],{},"Per-result billing means an empty result is free."," No records, no charge, which is why probing is cheap. On a per-call endpoint the same empty response costs full price, and the billing shape is in ",[47,18578,3936],{}," before you run.",[11,18581,18582,18585],{},[38,18583,18584],{},"An empty result is not proof the actor is broken."," It is one query on one day. The correct next step is a different input shape or the other actor, not a conclusion about quality, and this is exactly why keeping a second endpoint reachable matters.",[11,18587,18588],{},"The reviews actor, run immediately afterwards on the same day with a place URL, returned real data. Same platform, same subject, different job, different outcome.",[232,18590,235],{"id":234},[11,18592,238,18593,244],{},[18,18594,243],{"href":241,"rel":18595},[124,125],[131,18597,18599],{"className":18598,"code":249,"language":97,"meta":136},[248],[47,18600,249],{"__ignoreMap":136},[11,18602,254,18603,260],{},[18,18604,259],{"href":257,"rel":18605},[124,125],[232,18607,264],{"id":263},[131,18609,18610],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,18611,18612,18622],{"__ignoreMap":136},[140,18613,18614,18616,18618,18620],{"class":142,"line":143},[140,18615,274],{"class":146},[140,18617,277],{"class":150},[140,18619,280],{"class":150},[140,18621,283],{"class":150},[140,18623,18624,18626,18628,18630,18632,18634,18636,18638,18640,18642],{"class":142,"line":166},[140,18625,147],{"class":146},[140,18627,290],{"class":150},[140,18629,293],{"class":150},[140,18631,296],{"class":150},[140,18633,299],{"class":193},[140,18635,302],{"class":150},[140,18637,305],{"class":183},[140,18639,308],{"class":193},[140,18641,311],{"class":150},[140,18643,314],{"class":150},[316,18645],{"category":18646},"local-data",[27,18648,18650],{"id":18649},"what-does-a-place-record-actually-tell-you-about-a-business","What does a place record actually tell you about a business?",[11,18652,18653],{},"More than a name and a phone number, and the extra fields are the ones that decide whether a lead is worth calling.",[11,18655,18656],{},"The reviews actor returned roughly fifty fields per record on 2026-08-19. Grouped by what they are for:",[131,18658,18661],{"className":18659,"code":18660,"language":97,"meta":136},[248],"identity     placeId, cid, fid, kgmid, businessProfileId\nlocation     title, address, street, city, state, postalCode, countryCode,\n             neighborhood, lat, lng\ncommercial   categories, price, hotelStars, totalScore, reviewsCount\nstatus       permanentlyClosed, temporarilyClosed\nreview       reviewId, text, textTranslated, stars, publishedAtDate,\n             likesCount, reviewImageUrls, reviewDetailedRating, visitedIn\nreviewer     reviewerId, reviewerUrl, reviewerNumberOfReviews, isLocalGuide\nowner        responseFromOwnerText, responseFromOwnerDate\n",[47,18662,18660],{"__ignoreMap":136},[11,18664,18665],{},"Four of those are worth more than the rest for a lead list, and none of them is the phone number:",[11,18667,18668,18674],{},[38,18669,18670,102,18672,260],{},[47,18671,16330],{},[47,18673,16333],{}," A list that includes closed businesses is worse than a shorter list, because somebody spends time on every row. This is the cheapest filter available and most exports ignore it.",[11,18676,18677,18681],{},[38,18678,18679,260],{},[47,18680,16337],{}," Whether anybody replies to reviews. An owner who answers is an owner who logs in, which for anything sold to small businesses is a better qualifier than the rating.",[11,18683,18684,18693],{},[38,18685,18686,18689,18690,260],{},[47,18687,18688],{},"reviewsCount"," with ",[47,18691,18692],{},"publishedAtDate"," Volume and recency together. Forty reviews with the newest from two years ago describes a different business from forty with the newest from last week, and the count alone cannot tell them apart.",[11,18695,18696,18704],{},[38,18697,18698,102,18701,260],{},[47,18699,18700],{},"lat",[47,18702,18703],{},"lng"," Territory assignment without a geocoding step, which is a whole second API call you do not have to make.",[11,18706,18707,18708,18714],{},"The field that flatters and misleads: ",[38,18709,18710,18713],{},[47,18711,18712],{},"totalScore"," on its own."," A 4.9 from six reviews and a 4.3 from four hundred are not comparable, and sorting a lead list by rating puts the six-review business on top.",[320,18716,18717],{},[11,18718,324,18719,119,18721,18723,18724,18728],{},[38,18720,327],{},[18,18722,16505],{"href":16504},", which compares actors on review coverage specifically, and ",[18,18725,18727],{"href":18726},"\u002Fblog\u002Fautomate-google-maps-business-listings","automating Google Maps business listings into a lead table"," for the scheduled version of this job.",[27,18730,18732],{"id":18731},"how-do-you-turn-a-place-list-into-a-lead-list","How do you turn a place list into a lead list?",[11,18734,18735],{},"By adding the two things Google Maps does not carry: a person and a verified way to reach them.",[11,18737,18738],{},"A place record gives you a business. A lead needs a human, and the gap between those is where most local lead lists quietly fail. Four steps, and only the first is a Maps job:",[11,18740,18741,18744],{},[38,18742,18743],{},"Pull the places."," Search plus location, filtered by category and by the status fields above. Drop the closed ones before anything else touches the list, because every later step costs something per row.",[11,18746,18747,18750,18751,18756,18757,260],{},[38,18748,18749],{},"Resolve the business to a company record."," The website from the place record is the join key. ",[18,18752,18754],{"href":569,"rel":18753},[124,125],[47,18755,573],{}," resolves a name or domain at no cost per call, which makes it safe to run across the whole list before you spend on anything. We covered the ambiguity cases in ",[18,18758,18760],{"href":18759},"\u002Fblog\u002Fguides\u002Fapi-to-find-a-company-website","finding a company's website from its name",[11,18762,18763,18766,18767,18770],{},[38,18764,18765],{},"Find a person."," Local businesses are small enough that the owner is usually the buyer, and a company employee search returns the roles that exist rather than the roles you hoped for. ",[18,18768,18769],{"href":12653},"The LinkedIn scraper guide"," compares the endpoints that do this.",[11,18772,18773,18776,18777,18779],{},[38,18774,18775],{},"Verify the address before sending."," A local lead list is exactly the shape that produces bounces: small businesses, catch-all mailboxes, addresses that have not been used in years. ",[18,18778,17371],{"href":17370}," covers the check, and skipping it is what damages a sending domain.",[11,18781,18782,18783,18786],{},"The rule that keeps this affordable: ",[38,18784,18785],{},"filter before you enrich, always."," Every step after the Maps pull costs something per row, so the closed businesses, the wrong categories and the out-of-territory rows should be gone before the first enrichment call. A thousand places filtered to two hundred and then enriched costs a fraction of a thousand enriched and then filtered.",[232,18788,18790],{"id":18789},"the-four-filters-that-pay-for-themselves","The four filters that pay for themselves",[11,18792,18793],{},"Applied in this order, because each one is cheaper than the one after it and removes rows the next would have charged for:",[11,18795,18796,18799,18800,18802,18803,18805],{},[38,18797,18798],{},"Status, first and free."," Drop ",[47,18801,16330],{}," and flag ",[47,18804,16333],{}," for review. It is a field you already have and it removes rows nobody could sell to. On a city-wide pull this is routinely a tenth of the list.",[11,18807,18808,18811,18812,18815],{},[38,18809,18810],{},"Category, second."," The ",[47,18813,18814],{},"categories"," array is more specific than the search term that produced it, so a query for restaurant returns caterers, food trucks and hotel dining rooms alongside the thing you meant. Filter on the array rather than trusting the query.",[11,18817,18818,119,18821,102,18823,18825],{},[38,18819,18820],{},"Territory, third.",[47,18822,18700],{},[47,18824,18703],{}," are in the record, so a bounding box or a radius runs locally with no geocoding call. Doing this before enrichment rather than after is the difference between paying for the rows you keep and paying for every row the search returned.",[11,18827,18828,18831],{},[38,18829,18830],{},"Signal of life, last."," Review recency and owner replies. This is the one that needs judgement rather than a rule, and it is worth spending the judgement: a business with no review in three years and no owner reply is technically open and practically unreachable.",[11,18833,18834],{},"What survives all four is a smaller list than the one you started with and a materially better one, and the whole sequence runs on fields the Maps pull already returned. Nothing here costs an extra call.",[421,18836],{"category":18646,"title":18837},"Browse the local data endpoints, with live pricing",[27,18839,480],{"id":479},[482,18841,18842,18854],{},[485,18843,18844],{},[488,18845,18846,18848,18850,18852],{},[491,18847,493],{},[491,18849,496],{},[491,18851,499],{},[491,18853,502],{},[504,18855,18856,18873,18889,18905,18923,18939],{},[488,18857,18858,18861,18868,18871],{},[509,18859,18860],{},"Reviews and place metadata",[509,18862,18863],{},[18,18864,18866],{"href":16581,"rel":18865},[124,125],[47,18867,16585],{},[509,18869,18870],{},"Place URL or place ID",[509,18872,3551],{},[488,18874,18875,18878,18885,18887],{},[509,18876,18877],{},"Business listings from a search",[509,18879,18880],{},[18,18881,18883],{"href":16581,"rel":18882},[124,125],[47,18884,16603],{},[509,18886,16606],{},[509,18888,3551],{},[488,18890,18891,18894,18901,18903],{},[509,18892,18893],{},"Reviews from a second source",[509,18895,18896],{},[18,18897,18899],{"href":16672,"rel":18898},[124,125],[47,18900,16676],{},[509,18902,16679],{},[509,18904,542],{},[488,18906,18907,18910,18918,18921],{},[509,18908,18909],{},"B2B and agency reviews",[509,18911,18912],{},[18,18913,18915],{"href":16672,"rel":18914},[124,125],[47,18916,18917],{},"clutch \u002Fget_company_reviews",[509,18919,18920],{},"Company",[509,18922,542],{},[488,18924,18925,18928,18935,18937],{},[509,18926,18927],{},"Resolve a business to a company",[509,18929,18930],{},[18,18931,18933],{"href":569,"rel":18932},[124,125],[47,18934,573],{},[509,18936,576],{},[509,18938,579],{},[488,18940,18941,18944,18951,18953],{},[509,18942,18943],{},"Read the business website itself",[509,18945,18946],{},[18,18947,18949],{"href":16654,"rel":18948},[124,125],[47,18950,16658],{},[509,18952,7168],{},[509,18954,542],{},[11,18956,16684,18957,604,18959,16689],{},[47,18958,603],{},[47,18960,607],{},[11,18962,18963],{},"The row people skip is the last one. A local business website carries the owner's name, the services list and often a direct email, and reading one page costs less than most enrichment calls. For a list of two hundred local businesses it is frequently the highest-yield step in the whole pipeline.",[27,18965,657],{"id":656},[11,18967,18968,18971],{},[38,18969,18970],{},"You need Google's own Places API."," For anything customer-facing, or where the terms matter to a partner or a platform review, use the official API and pay for it. A scraped place record is not licensed data.",[11,18973,18974,18977],{},[38,18975,18976],{},"You are building a maps product."," Continuous, high-volume place data at the centre of a product is a licensing conversation, not a per-call one.",[11,18979,18980,18982],{},[38,18981,16705],{}," Scheduling, run history, storage and the actor editor are their product. We expose the endpoint.",[11,18984,18985,18988],{},[38,18986,18987],{},"Your territory is outside the actors' coverage."," Coverage varies by country and by language, and neither actor documents it usefully. Run your own city before assuming.",[11,18990,18991,18993],{},[38,18992,686],{}," One of the two actors here returned an empty array on the actor's own documented example values, with a 200 and no charge. That is the failure mode to design around on any endpoint in this catalogue: read the body, not the status, and run your real query before sizing a batch.",[27,18995,696],{"id":695},[11,18997,18998],{},"The alternatives to the Apify Google Maps scraper are mostly other Google Maps scrapers, and the more useful reframing is that the two obvious ones do different jobs. One starts from a place and returns reviews; the other starts from a search and returns places, and choosing between them on reputation rather than on input shape is how people end up with an empty result.",[11,19000,19001,19002,19005,19006,19009],{},"Two things matter more than which actor you pick. ",[38,19003,19004],{},"A 200 with an empty array is the failure that costs you most",", because it passes every status check and writes an empty batch into whatever comes next, and we hit it on our first run using the actor's own example values. And ",[38,19007,19008],{},"the fields that qualify a lead are not the contact fields",": closed status, owner replies and review recency decide whether a row is worth a call, and every export that sorts by star rating gets this backwards.",[11,19011,19012,19013,260],{},"Start with the free part: discovery and inspection cost nothing, and on per-result endpoints an empty result costs nothing either, so probing your actual city is close to free. Run it before you plan the batch. Begin at ",[18,19014,725],{"href":723,"rel":19015},[124,125],[27,19017,729],{"id":728},[731,19019,19021],{"q":19020},"Is scraping Google Maps allowed?",[11,19022,19023],{},"Google's terms restrict automated collection from Maps, and the official Places API is the licensed route. A scraped record is not licensed data, which matters most for anything customer-facing, resold, or reviewed by a partner. For internal prospecting the practical risk is lower and the terms question does not disappear, so read them for your use rather than treating a working request as permission.",[731,19025,19027],{"q":19026},"Why do two actors for the same site return different things?",[11,19028,19029],{},"Because they are written by different authors solving different problems. One takes a place URL and walks its reviews; the other takes a search and returns listings. They share a subject and not a job, and the input schema is the fastest way to tell which is which. Read what an actor takes before comparing what it returns.",[731,19031,19033],{"q":19032},"Can I get email addresses from Google Maps?",[11,19034,19035],{},"Not from the place record, which carries a website and a phone number rather than an address. Getting to an email means the extra steps: resolve the business to a company, find a person, then verify the address before sending. Each of those costs something per row, which is why filtering the place list first is what keeps the whole thing affordable.",[731,19037,19039],{"q":19038},"How current is the place data?",[11,19040,19041],{},"It reflects what the listing showed when the run happened, which is why the closed flags are worth reading rather than assuming. Google's own data lags reality for small businesses, sometimes by months, so a list built once and used for a quarter will contain businesses that no longer exist. Re-run before a campaign rather than re-using an export.",[11,19043,19044],{},[758,19045,760],{},[762,19047,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":19049},[19050,19051,19055,19056,19059,19060,19061,19062],{"id":18450,"depth":166,"text":18451},{"id":18503,"depth":166,"text":18504,"children":19052},[19053,19054],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":18649,"depth":166,"text":18650},{"id":18731,"depth":166,"text":18732,"children":19057},[19058],{"id":18789,"depth":187,"text":18790},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"Local data","\u002Fimg\u002Fblog\u002Fgoogle-maps-scraper-alternatives.png","Two Google Maps actors, same catalogue, different jobs. One returned nothing on a plausible query. What the fields tell you about a business, measured.","\u002Fimg\u002Fblog\u002Fgoogle-maps-scraper-alternatives-card.png",{},"\u002Fblog\u002Fguides\u002Fgoogle-maps-scraper-alternatives",{"title":18433,"description":19065},"blog\u002Fguides\u002Fgoogle-maps-scraper-alternatives",[19072,19073,5174,19074],"google maps scraper","local leads","lead list","O-XJQ6s5qgqPqGraLSRWC9XE9lTCXCERiu2I3s_-eAA",{"id":19077,"title":19078,"author":6,"body":19079,"category":19422,"cover":19423,"description":19424,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":19425,"meta":19426,"navigation":790,"ogImage":787,"path":5553,"publishedAt":16806,"readTime":793,"seo":19427,"stem":19428,"tags":19429,"toolCategory":19360,"updatedAt":16806,"__hash__":19434},"blogGuides\u002Fblog\u002Fguides\u002Fmeta-ad-library-longest-running-ads.md","Mining the Meta Ad Library with Wireflow: Ninety Days Means It Works",{"type":8,"value":19080,"toc":19412},[19081,19084,19087,19090,19094,19097,19100,19103,19110,19116,19120,19123,19132,19150,19170,19183,19186,19190,19193,19199,19205,19211,19217,19223,19230,19234,19237,19240,19272,19275,19281,19285,19288,19296,19299,19302,19306,19309,19332,19339,19342,19346,19349,19352,19355,19358,19365,19367,19379,19389,19395,19405,19409],[11,19082,19083],{},"Every competitor tells you which of their ads is making money. Not on purpose, and not in any dashboard you can log into. They tell you by leaving it running.",[11,19085,19086],{},"An ad that has been live for ninety days survived ninety days of somebody watching its cost per acquisition. Nobody keeps paying for a creative that loses money, and nobody has the patience to keep a mediocre one in rotation when the account is being managed at all. Run duration is the closest thing to a profitability disclosure that paid social produces, and Meta publishes it for every commercial ad, on a line that reads \"Started running on\".",[11,19088,19089],{},"Fair disclosure: you are on the Monid blog, and the data layer under all of this is ours. The section on when this signal lies is the one worth reading first, because run duration fools people constantly.",[27,19091,19093],{"id":19092},"why-does-a-ninety-day-old-ad-beat-a-clever-one","Why does a ninety day old ad beat a clever one?",[11,19095,19096],{},"Because it has been graded, and the clever one has not.",[11,19098,19099],{},"Creative in a managed account lives under constant pressure. Frequency climbs, click through rate decays, and the media buyer rotates out what stops working. Anything still on after a quarter has been re-approved implicitly, over and over, by somebody with a spend report open. That is a harsher review than any awards jury.",[11,19101,19102],{},"It helps to know why the rotation happens, because it is what makes the signal trustworthy. A creative shown repeatedly to the same audience decays: frequency climbs, the people most likely to convert have already converted, and cost per acquisition drifts up week over week. The buyer notices in the report before they notice in the creative, and the fix is always the same, swap it out. That decay curve is the machine grading every ad in the account continuously, and it does not care whether the agency liked the concept.",[11,19104,19105,19106,19109],{},"This flips how you read a competitor's library. A brand running forty ads is not showing you forty ideas of equal weight. It is showing you a distribution: a long tail launched in the last two weeks that is still being tested, and a small set of survivors carrying the account. ",[38,19107,19108],{},"The survivors are the only ones with information in them."," Sorting by start date is what separates the two, and it costs nothing to do.",[11,19111,19112],{},[5252,19113],{"alt":19114,"src":19115},"Two clusters in the same ad library: a wide tail of recent launches still under test, and a handful of survivors past ninety days that carry the account","\u002Fimg\u002Fblog\u002Fmeta-ad-library-longest-running-ads-fig-distribution.png",[27,19117,19119],{"id":19118},"how-do-you-get-the-run-dates-out-in-the-first-place","How do you get the run dates out in the first place?",[11,19121,19122],{},"Through a scraper, because the official route does not cover you.",[11,19124,19125,19126,19131],{},"Meta's ",[18,19127,19130],{"href":19128,"rel":19129},"https:\u002F\u002Fwww.facebook.com\u002Fads\u002Flibrary\u002Fapi\u002F",[124,125],"Ad Library API"," is scoped to political and issue ads behind identity verification, so for ordinary commercial creative there is no supported bulk feed. The web UI has the dates but fights you with infinite scroll and no export.",[11,19133,19134,19135,19139,19140,19144,19145,19149],{},"We have written this part three times already and will not repeat it here. ",[18,19136,19138],{"href":19137},"\u002Fblog\u002Ffacebook-ad-library-as-a-json-feed","The Facebook Ad Library as a clean JSON feed"," is the field by field version, ",[18,19141,19143],{"href":19142},"\u002Fblog\u002Ffacebook-ad-library-api-vs-rolling-your-own","the API versus rolling your own scraper"," weighs the three ways to do it, and ",[18,19146,19148],{"href":19147},"\u002Fblog\u002Fbrand-name-to-competitor-ad-archive","turning a brand name into a competitor ad archive"," is the copy and paste recipe. The short version is one endpoint:",[131,19151,19153],{"className":133,"code":19152,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Fcurious_coder\u002Ffacebook-ads-library-scraper\n",[47,19154,19155],{"__ignoreMap":136},[140,19156,19157,19159,19161,19163,19165,19167],{"class":142,"line":143},[140,19158,147],{"class":146},[140,19160,151],{"class":150},[140,19162,154],{"class":150},[140,19164,157],{"class":150},[140,19166,160],{"class":150},[140,19168,19169],{"class":150}," \u002Fcurious_coder\u002Ffacebook-ads-library-scraper\n",[11,19171,19172,19173,19176,19177,19179,19180,260],{},"Inspection is free and shows the schema and the billing shape before you spend anything. It bills per result, so a bounded ",[47,19174,19175],{},"limitPerSource"," is the whole cost control. Current prices sit on ",[18,19178,1233],{"href":17100},", and the provider page is ",[18,19181,19182],{"href":19182},"\u002Ftools\u002Ffacebook",[11,19184,19185],{},"The rest of this article assumes you have the JSON in front of you.",[27,19187,19189],{"id":19188},"when-does-run-duration-lie","When does run duration lie?",[11,19191,19192],{},"Often enough that you have to check, and this is the section most teardowns skip.",[11,19194,19195,19198],{},[38,19196,19197],{},"Always-on brand budget."," A large advertiser keeps brand creative live for reasons that have nothing to do with direct response. Ninety days of a brand film means the brand team has a budget line, not that the ad converts. Tell them apart by intent: a hard offer, a price, a CTA to buy means somebody is measuring it. A mood piece means nobody is.",[11,19200,19201,19204],{},[38,19202,19203],{},"The reset trap."," Editing an ad can restart its clock, and a duplicated ad set starts a new one entirely. So a genuine two year winner can show as thirty days old because it was rebuilt in a new campaign. Duration is a floor on how long the creative has worked, never a ceiling.",[11,19206,19207,19210],{},[38,19208,19209],{},"Regional skew."," The library is per country. The same creative can be a survivor in one market and absent in another, and if you pull one country you are reading one market's verdict.",[11,19212,19213,19216],{},[38,19214,19215],{},"Nobody is home."," Small advertisers set campaigns live and forget them. An ad running six months on an unmanaged account proves inattention, not performance. The tell is the rest of the library: if nothing has launched in months, there is no optimisation happening, and the survivor is a survivor by neglect.",[11,19218,19219,19222],{},[38,19220,19221],{},"Scale is invisible."," Duration tells you an ad works. It says nothing about whether it spent fifty dollars or five million. Reach and spend bands exist only for political and issue ads, so for commercial creative the honest position is that you know direction and not magnitude.",[11,19224,19225,19226,19229],{},"The workable rule: ",[38,19227,19228],{},"a long runner plus a recently launched cluster of variations on the same hook."," Duration says it works, iteration says somebody is paying attention. Together they are a strong signal. Either one alone is a hypothesis.",[27,19231,19233],{"id":19232},"what-do-you-actually-take-from-a-long-runner","What do you actually take from a long runner?",[11,19235,19236],{},"Structure, not pixels.",[11,19238,19239],{},"Copying a competitor's ad is both legally stupid and strategically useless, since their creative is tuned to their product and their audience. What transfers is the skeleton underneath:",[5222,19241,19242,19248,19254,19260,19266],{},[5225,19243,19244,19247],{},[38,19245,19246],{},"The hook, and where it lands."," Most survivors state a problem out loud inside the first two seconds. Note the words and the timestamp.",[5225,19249,19250,19253],{},[38,19251,19252],{},"The beat order."," Problem, proof, offer, ask is the common one. What changes between winners is which beat gets the most time.",[5225,19255,19256,19259],{},[38,19257,19258],{},"The shot list."," Count the cuts and what each one shows. Six shots with cuts at two, four and seven seconds is a reusable template.",[5225,19261,19262,19265],{},[38,19263,19264],{},"The proof type."," Testimonial, demo, before and after, or a number on screen. This is usually the load bearing element and the one people fail to notice.",[5225,19267,19268,19271],{},[38,19269,19270],{},"The format spread."," If the same hook is running as UGC, static and carousel, the hook itself is what tested well, not the production.",[11,19273,19274],{},"Worked through on a real shape: a survivor for a coffee brand opens on a person saying \"cafe espresso without the cafe\" at 0:02, cuts to a pack shot at 0:04, a pour at 0:06, a first sip at 0:08, then a price card. The transferable brief is problem stated aloud in under two seconds, product on screen by four, proof of use before eight, offer last. None of that is about coffee. Point it at a running shoe and the beats hold; only the shots change. That is the difference between taking structure and taking pixels, and it is also why a teardown of one survivor is worth more than a swipe file of fifty ads nobody graded.",[11,19276,19277],{},[5252,19278],{"alt":19279,"src":19280},"From one surviving ad to a reusable brief: hook, beat order, shot list and proof type extracted, product specific pixels discarded","\u002Fimg\u002Fblog\u002Fmeta-ad-library-longest-running-ads-fig-teardown.png",[27,19282,19284],{"id":19283},"how-do-you-get-from-a-teardown-to-finished-creative","How do you get from a teardown to finished creative?",[11,19286,19287],{},"This is the step where most competitor research dies, and it is worth being honest about why: the analysis is the easy half. You now have a brief that says six shots, hook at two seconds, testimonial proof, three formats. Producing that is a shoot, an editor, a UGC creator and a week.",[11,19289,19290,19295],{},[18,19291,19294],{"href":19292,"rel":19293},"https:\u002F\u002Fwireflow.ai",[124,125],"Wireflow"," is built for exactly this gap. It pulls the Meta Ad Library sorted by run duration, breaks the winner into hook and shot list, then rebuilds the structure around your product, and returns the batch as UGC, statics and carousels ready for the feed. It runs on generation models underneath and publishes to the channels on a schedule.",[11,19297,19298],{},"The two halves fit cleanly. The endpoint above is the raw signal, queryable by an agent and billed per result, which is what you want when the job is monitoring a category week over week. A composed pipeline is what you want when the job is producing next week's slate. An agent that has both can go from \"what has been running longest in this category\" to finished variants without a person in the middle, and neither half does that alone.",[316,19300],{"prompt":19301},"pull the ads a competitor Page has been running longest and summarise the hooks",[27,19303,19305],{"id":19304},"does-the-same-signal-exist-on-tiktok","Does the same signal exist on TikTok?",[11,19307,19308],{},"Partly, and it is worth knowing where the analogy breaks.",[11,19310,19311,19312,98,19315,102,19318,19321,19322,19324,19325,3933,19328,19331],{},"TikTok surfaces top performing ads with engagement indicators directly, and the endpoints for it sit in the same catalogue: ",[47,19313,19314],{},"search_ads",[47,19316,19317],{},"get_top_ads_spotlight",[47,19319,19320],{},"get_ad_interactive_analysis",", all under ",[18,19323,14332],{"href":14332},". We compared the providers for this surface in ",[18,19326,19327],{"href":13893},"the best social media scraping API",[18,19329,19330],{"href":13888},"Apify versus TikHub for TikTok scraping"," covers the tradeoff between them.",[11,19333,19334,19335,19338],{},"The difference that matters: TikTok hands you performance rather than making you infer it from duration, but its window is shorter and skewed to what is spiking now. Meta rewards patience and shows you what has been quietly working for a quarter. Reading both is how you tell a durable hook from a trend, and that distinction is usually the whole question. If organic signal is what you are after rather than paid, ",[18,19336,19337],{"href":14136},"wiring up TikTok trend tracking"," is the neighbouring job.",[11,19340,19341],{},"There is a practical reason to read the paid surface first even when organic looks richer. An organic hit tells you a piece of content earned attention once. A paid survivor tells you somebody kept choosing to buy that attention after seeing what it returned. Those are different claims, and only the second one has money behind it. Organic is where hooks are discovered; paid is where they are confirmed.",[27,19343,19345],{"id":19344},"when-is-this-not-worth-doing","When is this not worth doing?",[11,19347,19348],{},"When you have no creative capacity to act on what you find.",[11,19350,19351],{},"A competitor teardown that produces a document nobody makes ads from is a waste of a good afternoon. If your bottleneck is production rather than ideas, fix production first and come back to research after.",[11,19353,19354],{},"It is also weak in categories where nobody advertises much. Ad Library mining works because competitors are spending; in a thin category you will find three ads and learn nothing. And in regulated categories, the survivors you find may be running under compliance constraints you do not share, or the reverse, which makes the structure less transferable than it looks.",[11,19356,19357],{},"One more thing worth sitting with: the arrow points both ways. Your own long runners are in the same public archive, sorted by the same date, readable by anyone who thinks to look. A competitor watching you learns which of your creatives you cannot afford to turn off, and if you run a narrow set of survivors you are broadcasting exactly where your acquisition comes from. There is no opting out, the archive is public by design. The only real answer is to keep enough live variation that the pattern is harder to read, which happens to be good practice for the account anyway.",[421,19359,19362],{"category":19360,"title":19361},"facebook","Read the run dates before you brief anything",[11,19363,19364],{},"Inspect the endpoint, see the per result price, pull one bounded query. No seat, no monthly floor.",[27,19366,729],{"id":728},[731,19368,19370],{"q":19369},"Is scraping the Meta Ad Library allowed?",[11,19371,19372,19373,19378],{},"The archive is deliberately public, published under Meta's ",[18,19374,19377],{"href":19375,"rel":19376},"https:\u002F\u002Ftransparency.fb.com\u002Fen-gb\u002Fad-library-api\u002F",[124,125],"ad transparency"," commitments, and the data is available to anyone without a login. That is different from a licence to do anything you like with it, and your own terms of service and jurisdiction still govern what you collect and store. The endpoint reads public pages only.",[731,19380,19382],{"q":19381},"Why not just use the official Ad Library API?",[11,19383,19384,19385,19388],{},"Because it is scoped to political and issue ads and gated behind identity verification. For ordinary commercial creative, which is what almost everyone is researching, it returns nothing useful. ",[18,19386,19387],{"href":19142},"The API versus rolling your own"," works through the three options in detail.",[731,19390,19392],{"q":19391},"How far back does run duration go?",[11,19393,19394],{},"The library shows a start date for currently running ads and retains political and issue ads for seven years. Commercial ads that have stopped drop out, so you are reading a live snapshot rather than a history. This is why a weekly diff is worth more than a single pull: the ad that disappears this week just told you something too.",[731,19396,19398],{"q":19397},"Can an agent do this on a schedule without me?",[11,19399,19400,19401,19404],{},"Yes, and this is the shape most people end up wanting. The endpoint is callable from an agent with the price visible before it commits, so a weekly sweep of a competitor set, a diff against last week, and a summary of what changed is a standing job rather than a task. ",[18,19402,19403],{"href":19147},"Turning a brand name into a competitor ad archive"," is the mechanical version of that loop.",[11,19406,19407],{},[758,19408,760],{},[762,19410,19411],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":136,"searchDepth":166,"depth":166,"links":19413},[19414,19415,19416,19417,19418,19419,19420,19421],{"id":19092,"depth":166,"text":19093},{"id":19118,"depth":166,"text":19119},{"id":19188,"depth":166,"text":19189},{"id":19232,"depth":166,"text":19233},{"id":19283,"depth":166,"text":19284},{"id":19304,"depth":166,"text":19305},{"id":19344,"depth":166,"text":19345},{"id":728,"depth":166,"text":729},"Ads intelligence","\u002Fimg\u002Fblog\u002Fmeta-ad-library-longest-running-ads.png","Run duration is the profitability signal competitors publish by accident. How to read it, when it lies, and how to turn a long runner into creative.","\u002Fimg\u002Fblog\u002Fmeta-ad-library-longest-running-ads-card.png",{},{"title":19078,"description":19424},"blog\u002Fguides\u002Fmeta-ad-library-longest-running-ads",[19430,19431,19432,19433],"meta ad library","competitor ads","ad creative","facebook ads","zpRj0QwIcEzXG2oua09k1abjW5-13Bd38HtqWIU1dEQ",{"id":19436,"title":9913,"author":6,"body":19437,"category":1674,"cover":20101,"description":20102,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":20103,"meta":20104,"navigation":790,"ogImage":787,"path":5687,"publishedAt":20105,"readTime":793,"seo":20106,"stem":20107,"tags":20108,"toolCategory":8934,"updatedAt":20105,"__hash__":20110},"blogGuides\u002Fblog\u002Fguides\u002Fai-agent-needs-two-integrations.md",{"type":8,"value":19438,"toc":20088},[19439,19452,19455,19458,19471,19475,19478,19481,19490,19493,19496,19502,19506,19509,19512,19515,19613,19616,19627,19631,19634,19640,19697,19710,19722,19725,19729,19732,19734,19739,19744,19749,19751,19756,19766,19769,19773,19776,19782,19802,19805,19808,19814,19832,19835,19841,19873,19882,19885,19957,19960,19966,19977,19980,19984,19987,19993,19996,20002,20008,20012,20015,20018,20025,20028,20031,20037,20039,20048,20055,20065,20071,20081,20085],[11,19440,19441,19442,19447,19448,19451],{},"Wire a model gateway like ",[18,19443,19446],{"href":19444,"rel":19445},"https:\u002F\u002Faihubmix.com",[124,125],"AIHubMix"," into your application and something satisfying happens. One integration, a change of ",[47,19449,19450],{},"base_url",", and hundreds of models are suddenly reachable across text, image, speech and retrieval. Swap the model ID, get a different brain, keep the code.",[11,19453,19454],{},"Then you ask the agent for something it cannot know, and the illusion breaks. How many people work at this company right now. What is this competitor charging today. What did that TikTok account post yesterday. The agent either declines or invents, and a better model ID does not fix either response.",[11,19456,19457],{},"This is not a model quality problem. It is a missing integration, and it is the one almost nobody plans for.",[11,19459,19460,19461,19464,19465,19470],{},"Fair disclosure before we go further: you are on the Monid blog, Monid is the tool layer described below, and the section near the end names the cases where you do not need one. ",[18,19462,19446],{"href":19444,"rel":19463},[124,125]," appears throughout as the model-side example because the two products sit on opposite halves of the same problem, not because they compete. Their ",[18,19466,19469],{"href":19467,"rel":19468},"https:\u002F\u002Fdocs.aihubmix.com\u002Fen",[124,125],"developer docs"," cover the model half in more depth than this article will.",[27,19472,19474],{"id":19473},"your-model-is-connected-why-can-your-agent-still-not-do-anything","Your model is connected. Why can your agent still not do anything?",[11,19476,19477],{},"Because a model integration and a tool integration are different things, and only one of them is usually done.",[11,19479,19480],{},"A model gateway solves selection at the model layer. You stop hard-coding one provider and start choosing per request. What it does not do, and does not claim to do, is give the agent hands. The model can reason about a company's headcount beautifully. It cannot go and find out.",[11,19482,19483,19484,19489],{},"The usual response is to wire in one API by hand. That works exactly once. The second capability means another vendor, another signup, another key, another schema to learn, another invoice, and a rebuild the moment the task changes shape. Browse ",[18,19485,19488],{"href":19486,"rel":19487},"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fmcp\u002F",[124,125],"r\u002Fmcp"," on any given week and you can watch this happening in public: one server for social data, one for a knowledge base, one for search, each announced separately, each wrapping one vendor. The fragmentation is not a complaint anyone is filing. It is just the shape of the ecosystem.",[11,19491,19492],{},"The workaround people reach for first is to describe the tools in the system prompt. It fails in a specific way worth naming, because it fails quietly. The model happily produces a call that looks right, against a schema it half remembers, with a parameter name that was renamed two releases ago. Nothing errors. You get a plausible payload, a 400 from the provider, and an agent that reports the task as done. A broken integration that throws is a Tuesday afternoon. A broken integration that returns confident nonsense is the class of bug that survives to production, and it is the reason the schema has to be read at run time rather than remembered at training time.",[11,19494,19495],{},"Which is a familiar shape. It is the same problem model gateways were built to solve, moved one layer over.",[11,19497,19498],{},[5252,19499],{"alt":19500,"src":19501},"The agent sits between two integrations: a model gateway on the left choosing which model answers, and a tool layer on the right choosing which API gets called.","\u002Fimg\u002Fblog\u002Fai-agent-needs-two-integrations-fig-layers.png",[27,19503,19505],{"id":19504},"what-does-an-agent-actually-need-besides-a-model","What does an agent actually need besides a model?",[11,19507,19508],{},"A catalogue it can search at run time, and a way to pay for one call without a contract.",[11,19510,19511],{},"Those two requirements sound modest and they rule out most of the obvious answers. A list of tools handed to the agent at build time fails the first, because the agent can only use what you predicted it would need. A vendor account per capability fails the second, because signing up is a human action and the agent is mid-task.",[11,19513,19514],{},"The symmetry with the model side is exact enough to be worth putting in a table.",[482,19516,19517,19529],{},[485,19518,19519],{},[488,19520,19521,19523,19526],{},[491,19522],{},[491,19524,19525],{},"Model layer",[491,19527,19528],{},"Tool layer",[504,19530,19531,19542,19555,19566,19577,19588,19599],{},[488,19532,19533,19536,19539],{},[509,19534,19535],{},"The question it answers",[509,19537,19538],{},"Which model should answer this",[509,19540,19541],{},"Which API should be called",[488,19543,19544,19547,19552],{},[509,19545,19546],{},"Integration",[509,19548,19549,19550],{},"One endpoint, change ",[47,19551,19450],{},[509,19553,19554],{},"One key, or one line for an agent",[488,19556,19557,19560,19563],{},[509,19558,19559],{},"Selection happens",[509,19561,19562],{},"At request time",[509,19564,19565],{},"At run time",[488,19567,19568,19571,19574],{},[509,19569,19570],{},"Cost of choosing",[509,19572,19573],{},"Free, routing is not billed",[509,19575,19576],{},"Free, discover and inspect are not billed",[488,19578,19579,19582,19585],{},[509,19580,19581],{},"What is billed",[509,19583,19584],{},"The completion",[509,19586,19587],{},"The call, or the result",[488,19589,19590,19593,19596],{},[509,19591,19592],{},"What it spans",[509,19594,19595],{},"Text, image, speech and retrieval models",[509,19597,19598],{},"Scraping, search, enrichment, media, browser automation",[488,19600,19601,19604,19610],{},[509,19602,19603],{},"Example",[509,19605,19606,19609],{},[18,19607,19446],{"href":19444,"rel":19608},[124,125],", an OpenAI-compatible model gateway",[509,19611,19612],{},"Monid, the tool layer for AI agents",[11,19614,19615],{},"Read the middle rows again, because that is the actual argument. Both layers move a decision that used to happen in your code, at build time, into the moment the request runs. That is the whole idea in both cases. An agent that picks its model per request and its tool per task is a different kind of program from one that was handed both.",[11,19617,19618,19619,19621,19622,19626],{},"Monid is ",[18,19620,21],{"href":20},": one key and one balance reach over a thousand tools across many providers, billed per call, with no separate signup per vendor. The agent searches the catalogue in plain language, reads a schema and a price before it commits, and then calls. If you want the mechanics rather than the pitch, ",[18,19623,19625],{"href":19624},"\u002Fdocs\u002Fguide\u002Fhow-it-works","how it works"," is the short version.",[27,19628,19630],{"id":19629},"how-do-you-connect-the-model-side","How do you connect the model side?",[11,19632,19633],{},"Point the SDK you already use at the gateway and pick a model ID.",[11,19635,19636,19637,19639],{},"We are not going to re-document someone else's product. AIHubMix keeps the OpenAI calling pattern, so the change is the ",[47,19638,19450],{}," and the key:",[131,19641,19643],{"className":1257,"code":19642,"language":1259,"meta":136,"style":136},"from openai import OpenAI\n\nclient = OpenAI(\n    api_key=\"\u003Cyour-aihubmix-key>\",\n    base_url=\"https:\u002F\u002Faihubmix.com\u002Fv1\",\n)\n\nresponse = client.chat.completions.create(\n    model=\"auto\",\n    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n)\n",[47,19644,19645,19650,19654,19659,19664,19669,19674,19678,19683,19688,19693],{"__ignoreMap":136},[140,19646,19647],{"class":142,"line":143},[140,19648,19649],{},"from openai import OpenAI\n",[140,19651,19652],{"class":142,"line":166},[140,19653,1173],{"emptyLinePlaceholder":790},[140,19655,19656],{"class":142,"line":187},[140,19657,19658],{},"client = OpenAI(\n",[140,19660,19661],{"class":142,"line":1279},[140,19662,19663],{},"    api_key=\"\u003Cyour-aihubmix-key>\",\n",[140,19665,19666],{"class":142,"line":1284},[140,19667,19668],{},"    base_url=\"https:\u002F\u002Faihubmix.com\u002Fv1\",\n",[140,19670,19671],{"class":142,"line":1290},[140,19672,19673],{},")\n",[140,19675,19676],{"class":142,"line":1296},[140,19677,1173],{"emptyLinePlaceholder":790},[140,19679,19680],{"class":142,"line":1302},[140,19681,19682],{},"response = client.chat.completions.create(\n",[140,19684,19685],{"class":142,"line":1308},[140,19686,19687],{},"    model=\"auto\",\n",[140,19689,19690],{"class":142,"line":1314},[140,19691,19692],{},"    messages=[{\"role\": \"user\", \"content\": \"...\"}],\n",[140,19694,19695],{"class":142,"line":1320},[140,19696,19673],{},[11,19698,19699,19700,19703,19704,19709],{},"The detail worth noticing for agent work is ",[47,19701,19702],{},"model=\"auto\"",". Instead of naming a model, you let AIHubMix read the request and pick one, and routing itself is not billed. Their ",[18,19705,19708],{"href":19706,"rel":19707},"https:\u002F\u002Fdocs.aihubmix.com\u002Fen\u002Fapi\u002FClaude-Code",[124,125],"Claude Code setup page"," covers the same thing for an agent runtime rather than a script.",[11,19711,19712,19713,98,19716,102,19719,260],{},"That matters more for an agent than for a chatbot, because a single agent run is not a single kind of work. Deciding which tool to call is a cheap classification. Reading a page of scraped JSON and turning it into a paragraph is a summarisation. Writing the final brief is the part a reader will judge. A chatbot can pick one model for all three and accept the compromise. An agent making dozens of calls per task pays for that compromise dozens of times, which is why the routing variants matter: bias toward latency on the mechanical steps, toward quality on the one that gets read. AIHubMix exposes those as ",[47,19714,19715],{},"auto:balanced",[47,19717,19718],{},"auto:quality_first",[47,19720,19721],{},"auto:latency_critical",[11,19723,19724],{},"Note what has and has not happened. Your agent can now think using any of hundreds of models, and pick a different one per step. It still has no way to look anything up.",[27,19726,19728],{"id":19727},"how-do-i-set-up-monid-with-claude-or-another-ai-agent","How do I set up Monid with Claude or another AI agent?",[11,19730,19731],{},"One line, and the agent learns the rest itself.",[232,19733,235],{"id":234},[11,19735,238,19736,244],{},[18,19737,243],{"href":241,"rel":19738},[124,125],[131,19740,19742],{"className":19741,"code":249,"language":97},[248],[47,19743,249],{"__ignoreMap":136},[11,19745,19746,19747,260],{},"It reads the file and learns the whole discover, inspect, run workflow without further instruction. More detail in the ",[18,19748,259],{"href":16865},[232,19750,264],{"id":263},[131,19752,19754],{"className":19753,"code":8536,"language":97},[248],[47,19755,8536],{"__ignoreMap":136},[11,19757,12381,19758,19760,19761,19765],{},[18,19759,8582],{"href":16877},". There is also a ",[18,19762,19764],{"href":19763},"\u002Fdocs\u002Fguide\u002Fquickstart-mcp","remote MCP server"," if your runtime speaks MCP, which is what most agent frameworks want.",[11,19767,19768],{},"The asymmetry between the two setups is not an accident. The model side needs a config change because a human writes the config. The tool side needs a document the agent can read, because the agent is the one doing the choosing.",[27,19770,19772],{"id":19771},"what-does-it-look-like-when-both-layers-are-wired","What does it look like when both layers are wired?",[11,19774,19775],{},"The agent picks a tool it was never told about. Here is the sequence, run by hand so you can see each step.",[11,19777,19778,19781],{},[38,19779,19780],{},"Step one: find something that can answer the question."," Discovery is free, so the agent can afford to look before it commits.",[131,19783,19785],{"className":133,"code":19784,"language":135,"meta":136,"style":136},"monid discover -q \"company profile and funding by domain\"\n",[47,19786,19787],{"__ignoreMap":136},[140,19788,19789,19791,19793,19795,19797,19800],{"class":142,"line":143},[140,19790,147],{"class":146},[140,19792,2667],{"class":150},[140,19794,2670],{"class":150},[140,19796,2673],{"class":193},[140,19798,19799],{"class":150},"company profile and funding by domain",[140,19801,2679],{"class":193},[11,19803,19804],{},"It comes back with ranked endpoints, each with its provider, a description, a price and a verified flag. Nobody had to know in advance which provider covers company data.",[11,19806,19807],{},"That result set is written for a reader who is not a person. Each row carries the provider slug and endpoint path the next command needs, the billing shape rather than a marketing description, and a flag saying whether the endpoint has been tested. An agent can rank those rows against its own constraints, prefer a verified endpoint that bills per call over an unverified one that bills per result, and act on the answer without asking anyone. That is the difference between a catalogue and a directory: a directory is a page a human reads, a catalogue is a response an agent can branch on.",[11,19809,19810,19813],{},[38,19811,19812],{},"Step two: read the contract before signing it."," Also free.",[131,19815,19816],{"className":133,"code":9370,"language":135,"meta":136,"style":136},[47,19817,19818],{"__ignoreMap":136},[140,19819,19820,19822,19824,19826,19828,19830],{"class":142,"line":143},[140,19821,147],{"class":146},[140,19823,151],{"class":150},[140,19825,154],{"class":150},[140,19827,9015],{"class":150},[140,19829,160],{"class":150},[140,19831,9387],{"class":150},[11,19833,19834],{},"You get the input schema, the pricing shape and the docs. This is the step that stops an agent calling something expensive by accident, and it is why the price appears before the call rather than on an invoice afterwards.",[11,19836,19837,19840],{},[38,19838,19839],{},"Step three: call it."," This is the only step that costs anything.",[131,19842,19844],{"className":133,"code":19843,"language":135,"meta":136,"style":136},"monid run -p pdl -e \u002Fv5\u002Fcompany\u002Fenrich \\\n  --query '{\"website\": \"aihubmix.com\"}'\n",[47,19845,19846,19862],{"__ignoreMap":136},[140,19847,19848,19850,19852,19854,19856,19858,19860],{"class":142,"line":143},[140,19849,147],{"class":146},[140,19851,171],{"class":150},[140,19853,154],{"class":150},[140,19855,9015],{"class":150},[140,19857,160],{"class":150},[140,19859,9018],{"class":150},[140,19861,184],{"class":183},[140,19863,19864,19866,19868,19871],{"class":142,"line":166},[140,19865,2037],{"class":150},[140,19867,194],{"class":193},[140,19869,19870],{"class":150},"{\"website\": \"aihubmix.com\"}",[140,19872,200],{"class":193},[11,19874,19875,19878,19879,19881],{},[38,19876,19877],{},"Step four: the model does the part it is good at."," The tool returned facts, not prose. The completion goes back through AIHubMix, where ",[47,19880,19718],{}," is the sensible setting for the step whose output a human reads, and comes back as the brief you actually asked for.",[11,19883,19884],{},"In code, the two halves meet in about a dozen lines. The tool result is just context, and the AIHubMix client is the same one from earlier in this post:",[131,19886,19888],{"className":1257,"code":19887,"language":1259,"meta":136,"style":136},"from openai import OpenAI\n\nclient = OpenAI(\n    api_key=\"\u003Cyour-aihubmix-key>\",\n    base_url=\"https:\u002F\u002Faihubmix.com\u002Fv1\",\n)\n\n# `facts` is the JSON your agent got back from the Monid run above\nbrief = client.chat.completions.create(\n    model=\"auto:quality_first\",\n    messages=[\n        {\"role\": \"system\", \"content\": \"Write a two sentence brief. Cite only what is in the data.\"},\n        {\"role\": \"user\", \"content\": str(facts)},\n    ],\n)\n",[47,19889,19890,19894,19898,19902,19906,19910,19914,19918,19923,19928,19933,19938,19943,19948,19953],{"__ignoreMap":136},[140,19891,19892],{"class":142,"line":143},[140,19893,19649],{},[140,19895,19896],{"class":142,"line":166},[140,19897,1173],{"emptyLinePlaceholder":790},[140,19899,19900],{"class":142,"line":187},[140,19901,19658],{},[140,19903,19904],{"class":142,"line":1279},[140,19905,19663],{},[140,19907,19908],{"class":142,"line":1284},[140,19909,19668],{},[140,19911,19912],{"class":142,"line":1290},[140,19913,19673],{},[140,19915,19916],{"class":142,"line":1296},[140,19917,1173],{"emptyLinePlaceholder":790},[140,19919,19920],{"class":142,"line":1302},[140,19921,19922],{},"# `facts` is the JSON your agent got back from the Monid run above\n",[140,19924,19925],{"class":142,"line":1308},[140,19926,19927],{},"brief = client.chat.completions.create(\n",[140,19929,19930],{"class":142,"line":1314},[140,19931,19932],{},"    model=\"auto:quality_first\",\n",[140,19934,19935],{"class":142,"line":1320},[140,19936,19937],{},"    messages=[\n",[140,19939,19940],{"class":142,"line":1325},[140,19941,19942],{},"        {\"role\": \"system\", \"content\": \"Write a two sentence brief. Cite only what is in the data.\"},\n",[140,19944,19945],{"class":142,"line":1331},[140,19946,19947],{},"        {\"role\": \"user\", \"content\": str(facts)},\n",[140,19949,19950],{"class":142,"line":1337},[140,19951,19952],{},"    ],\n",[140,19954,19955],{"class":142,"line":1343},[140,19956,19673],{},[11,19958,19959],{},"Four steps, two vendors, and at no point did anyone hard-code which model or which provider. That is the whole arrangement.",[11,19961,19962],{},[5252,19963],{"alt":19964,"src":19965},"Discover, inspect and run are three separate steps, and only the last one is billed, so an agent can survey the whole catalogue for free before it commits.","\u002Fimg\u002Fblog\u002Fai-agent-needs-two-integrations-fig-flow.png",[11,19967,19968,19969,19972,19973,19976],{},"The moment that matters is step one. The agent needed company data, searched for it, and found a provider nobody had wired in. Add live web results, social data or transcripts to the same agent and none of it requires a new account. If web context is the specific job you have, ",[18,19970,19971],{"href":18107},"give your agent live web context"," walks through that one end to end, and ",[18,19974,19975],{"href":3563},"the best web search API for AI agents"," compares the options for it.",[316,19978],{"prompt":19979},"find company data for a domain and write a one paragraph brief",[27,19981,19983],{"id":19982},"what-does-each-layer-cost","What does each layer cost?",[11,19985,19986],{},"Different units, and the difference matters more than either number.",[11,19988,19989,19990,19992],{},"Model calls bill per token. Tool calls bill per call or per result, depending on the endpoint, and the shape is visible in ",[47,19991,3936],{}," before you run anything. Both layers make the choosing free: AIHubMix does not bill for routing, and discover and inspect cost nothing on ours. You pay for completions and for calls, not for having access to either catalogue.",[11,19994,19995],{},"The practical consequence is that the two bills answer different questions. A model bill tells you how much your agent thought. A tool bill tells you how much it went and found out. When a run costs more than expected, that split is the first thing worth looking at, because the fix is different in each case: a cheaper routing variant on one side, a more precise query or a per-call rather than per-result endpoint on the other.",[11,19997,19998,19999,20001],{},"That last point is the one that changes architecture. Because access costs nothing until it is used, an agent can carry the entire catalogue and still only pay for the handful of calls it makes. You are not buying a seat, a plan or a monthly minimum on either side. Current prices for every tool are on ",[18,20000,1233],{"href":17100},", which stays accurate in a way a sentence in a blog post does not.",[11,20003,20004,20005,20007],{},"If you are weighing this against a per-seat data subscription, ",[18,20006,6511],{"href":2325}," works through when each one wins, and subscriptions do win sometimes.",[27,20009,20011],{"id":20010},"when-do-you-not-need-a-tool-layer","When do you not need a tool layer?",[11,20013,20014],{},"When the agent only ever calls one API, and you already know which.",[11,20016,20017],{},"A pipeline that fetches from one endpoint on a schedule should call that endpoint. Adding a layer in front of a single known dependency buys you nothing and costs you a hop. The same goes for anything with a hard compliance requirement about which vendor processes the data, where the point is that the choice is fixed and not the agent's to make.",[11,20019,20020,20021,20024],{},"There is a subtler case. If your agent's tool use is narrow and completely predictable, a single-vendor MCP server is simpler to reason about, and simpler is worth real money in production. ",[18,20022,20023],{"href":4915},"Which MCP server gives an agent live web data"," works through that trade in more depth, and it does not conclude that the catalogue always wins.",[11,20026,20027],{},"The symmetric caveat holds on the model side too, and AIHubMix would tell you the same thing: if your workload is one prompt shape against one model you have already benchmarked, routing is solving a problem you do not have. Both layers are answers to variety. Neither is an answer to a pipeline that does the same thing every time.",[11,20029,20030],{},"The tool layer earns its place when you cannot list in advance everything the agent will need. That is a description of most agents people are actually trying to ship, but it is not a description of all of them.",[421,20032,20034],{"category":8934,"title":20033},"Give the agent a catalogue instead of a checklist",[11,20035,20036],{},"Discover what exists, read the price before the call, run it from one balance. No seat, no monthly floor.",[27,20038,729],{"id":728},[731,20040,20041],{"q":4894},[11,20042,20043,20044,20047],{},"It depends on the target, and that is the reason to reach them through a catalogue rather than picking one. Different providers win on protected ecommerce pages, on social platforms and on plain article text, and an agent that can only call the one you chose will hit the wall the first time the target changes. ",[18,20045,20046],{"href":13893},"The best social media scraping API"," compares the social side specifically.",[731,20049,20050],{"q":15469},[11,20051,20052,20053,260],{},"Several, and they split into vendor servers that wrap one company and catalogue servers that expose many. We wrote a whole guide on that split: ",[18,20054,5683],{"href":4915},[731,20056,20058],{"q":20057},"I already use a different model gateway. Does this still work?",[11,20059,20060,20061,20064],{},"Yes. Nothing on the tool side cares which model answered. This post uses ",[18,20062,19446],{"href":19444,"rel":20063},[124,125]," because it keeps the OpenAI calling pattern and routes at request time, which makes the symmetry easy to show, but any gateway your agent already talks to leaves the tool half unchanged. The two integrations are independent by design.",[731,20066,20068],{"q":20067},"Do I have to use both layers from the same vendor?",[11,20069,20070],{},"No, and you probably should not. They are independent integrations with different failure modes. Use whichever model gateway suits your workload and whichever tool layer suits your catalogue needs. The example in this post pairs AIHubMix with Monid because the two halves fit cleanly, not because either requires the other.",[731,20072,20074],{"q":20073},"Can I use this inside n8n or a similar workflow tool?",[11,20075,20076,20077,20080],{},"Yes. The workflow runs the steps, the model gateway answers the reasoning step and the tool layer answers the data step. Nothing about a tool layer replaces the automation platform, it is what the automation calls when it needs something from outside itself. ",[18,20078,20079],{"href":2986},"Any URL to LLM-ready markdown"," is a good first job to wire in this way.",[11,20082,20083],{},[758,20084,760],{},[762,20086,20087],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":136,"searchDepth":166,"depth":166,"links":20089},[20090,20091,20092,20093,20097,20098,20099,20100],{"id":19473,"depth":166,"text":19474},{"id":19504,"depth":166,"text":19505},{"id":19629,"depth":166,"text":19630},{"id":19727,"depth":166,"text":19728,"children":20094},[20095,20096],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":19771,"depth":166,"text":19772},{"id":19982,"depth":166,"text":19983},{"id":20010,"depth":166,"text":20011},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fai-agent-needs-two-integrations.png","A model gateway gets your agent talking. It still cannot look anything up. How to wire both halves, with AIHubMix on models and Monid on tools.","\u002Fimg\u002Fblog\u002Fai-agent-needs-two-integrations-card.png",{},"2026-08-18",{"title":9913,"description":20102},"blog\u002Fguides\u002Fai-agent-needs-two-integrations",[1687,20109,8987,8986],"model gateway","jN-7x9ZCiUTMJZSL07nb-HzQvq9u3vfq5DTmu2zggJc",{"id":20112,"title":14950,"author":6,"body":20113,"category":1674,"cover":20697,"description":20698,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":20699,"meta":20700,"navigation":790,"ogImage":787,"path":5673,"publishedAt":20105,"readTime":793,"seo":20701,"stem":20702,"tags":20703,"toolCategory":787,"updatedAt":20105,"__hash__":20706},"blogGuides\u002Fblog\u002Fguides\u002Fapi-marketplace-for-ai-agents.md",{"type":8,"value":20114,"toc":20682},[20115,20118,20121,20126,20130,20133,20139,20145,20151,20158,20163,20167,20170,20173,20238,20243,20249,20252,20255,20263,20271,20277,20279,20284,20289,20294,20296,20332,20335,20338,20341,20344,20351,20354,20365,20374,20378,20381,20384,20387,20393,20399,20405,20412,20416,20419,20425,20431,20434,20440,20446,20452,20455,20458,20460,20579,20586,20589,20591,20597,20603,20609,20615,20628,20630,20633,20644,20650,20652,20658,20664,20670,20676,20680],[11,20116,20117],{},"Ask an AI which API marketplace to use for agents and you get ApyHub and Kong Konnect. Both are real products, both are good at what they were built for, and both were built for a developer who integrates once and ships.",[11,20119,20120],{},"An agent does not integrate once. It decides, on every run, which tool the current task needs. That difference is small in a sentence and large in what the layer underneath has to provide.",[11,20122,19618,20123,20125],{},[18,20124,21],{"href":20},": one key and one balance reach over a thousand tools, and the agent picks. Fair disclosure, you are on our blog, and the section on when a gateway or a direct integration is the better answer is not a courtesy.",[27,20127,20129],{"id":20128},"what-is-the-best-api-marketplace-for-ai-agents-in-2026","What is the best API marketplace for AI agents in 2026?",[11,20131,20132],{},"It depends on which of the three products called a marketplace you actually need, because they solve different problems and only one of them is about agents.",[11,20134,20135,20138],{},[38,20136,20137],{},"A directory"," lists APIs and hands you a signup link. The value is discovery and it stops there: you still create an account, hold a key and pay a bill per vendor. RapidAPI popularised this shape.",[11,20140,20141,20144],{},[38,20142,20143],{},"A gateway"," puts a managed layer in front of APIs you already own, adding auth, rate limiting, observability and versioning. Kong Konnect is the reference implementation. It is excellent and it assumes the APIs are yours or already contracted, which is the assumption that does not hold for an agent.",[11,20146,20147,20150],{},[38,20148,20149],{},"A utility bundle"," ships many small capabilities behind one key: PDF conversion, currency, geocoding. ApyHub is a good example. One key, one bill, real convenience, and a catalogue that is deliberately narrow.",[11,20152,20153,20154,20157],{},"None of the three was designed around the property that defines agent work: ",[38,20155,20156],{},"the tool is chosen at run time by something that has not read your documentation."," A directory needs a human to sign up. A gateway needs a human to have contracted the API first. A bundle needs the capability to be in the bundle.",[16263,20159,20160],{},[11,20161,20162],{},"A developer picks a vendor once and writes it into the code. An agent picks a tool on every run, and it can only pick from what it can see.",[27,20164,20166],{"id":20165},"why-does-an-agent-need-something-a-developer-portal-does-not","Why does an agent need something a developer portal does not?",[11,20168,20169],{},"Because a single ordinary task crosses more vendors than anyone provisions in advance.",[11,20171,20172],{},"We measured this on 2026-08-18. Take one unremarkable job, prepare a product listing for a new market, and search the catalogue for each step the way an agent would:",[131,20174,20176],{"className":133,"code":20175,"language":135,"meta":136,"style":136},"monid discover -q \"find trending products\"\nmonid discover -q \"check competitor pricing\"\nmonid discover -q \"generate a product image\"\nmonid discover -q \"text to speech voiceover\"\n",[47,20177,20178,20193,20208,20223],{"__ignoreMap":136},[140,20179,20180,20182,20184,20186,20188,20191],{"class":142,"line":143},[140,20181,147],{"class":146},[140,20183,2667],{"class":150},[140,20185,2670],{"class":150},[140,20187,2673],{"class":193},[140,20189,20190],{"class":150},"find trending products",[140,20192,2679],{"class":193},[140,20194,20195,20197,20199,20201,20203,20206],{"class":142,"line":166},[140,20196,147],{"class":146},[140,20198,2667],{"class":150},[140,20200,2670],{"class":150},[140,20202,2673],{"class":193},[140,20204,20205],{"class":150},"check competitor pricing",[140,20207,2679],{"class":193},[140,20209,20210,20212,20214,20216,20218,20221],{"class":142,"line":187},[140,20211,147],{"class":146},[140,20213,2667],{"class":150},[140,20215,2670],{"class":150},[140,20217,2673],{"class":193},[140,20219,20220],{"class":150},"generate a product image",[140,20222,2679],{"class":193},[140,20224,20225,20227,20229,20231,20233,20236],{"class":142,"line":1279},[140,20226,147],{"class":146},[140,20228,2667],{"class":150},[140,20230,2670],{"class":150},[140,20232,2673],{"class":193},[140,20234,20235],{"class":150},"text to speech voiceover",[140,20237,2679],{"class":193},[11,20239,20240],{},[38,20241,20242],{},"Four steps, five providers:",[131,20244,20247],{"className":20245,"code":20246,"language":97,"meta":136},[248],"find trending products    context.dev, tikhub\ncheck competitor pricing  strale\ngenerate a product image  minimax, context.dev\ntext to speech voiceover  elevenlabs\n",[47,20248,20246],{"__ignoreMap":136},[11,20250,20251],{},"Not one of those providers covers the next step. A developer building this by hand signs up five times, holds five keys, and reconciles five invoices, and that is for the version of the task they anticipated. The moment the requirement shifts, say the listing needs reviews summarised, it is a sixth signup before any code runs.",[11,20253,20254],{},"Three properties are what make run-time choice work rather than merely sound good:",[11,20256,20257,119,20260,20262],{},[38,20258,20259],{},"Discovery is free and ranked.",[47,20261,603],{}," returns candidate endpoints with provider, description and price. An agent that had to pay to look would learn to guess instead, and guessing is how you get a general scraper pointed at a job with a purpose-built endpoint.",[11,20264,20265,119,20268,20270],{},[38,20266,20267],{},"Inspection is free.",[47,20269,607],{}," returns the input schema before anything runs, so the agent constructs a correct payload rather than discovering the shape through failed calls.",[11,20272,20273,20276],{},[38,20274,20275],{},"Only the run bills."," The catalogue is not a subscription you keep alive. That is the property that lets an agent carry a thousand tools rather than the four you predicted.",[232,20278,235],{"id":234},[11,20280,238,20281,244],{},[18,20282,243],{"href":241,"rel":20283},[124,125],[131,20285,20287],{"className":20286,"code":249,"language":97,"meta":136},[248],[47,20288,249],{"__ignoreMap":136},[11,20290,254,20291,260],{},[18,20292,259],{"href":257,"rel":20293},[124,125],[232,20295,264],{"id":263},[131,20297,20298],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,20299,20300,20310],{"__ignoreMap":136},[140,20301,20302,20304,20306,20308],{"class":142,"line":143},[140,20303,274],{"class":146},[140,20305,277],{"class":150},[140,20307,280],{"class":150},[140,20309,283],{"class":150},[140,20311,20312,20314,20316,20318,20320,20322,20324,20326,20328,20330],{"class":142,"line":166},[140,20313,147],{"class":146},[140,20315,290],{"class":150},[140,20317,293],{"class":150},[140,20319,296],{"class":150},[140,20321,299],{"class":193},[140,20323,302],{"class":150},[140,20325,305],{"class":183},[140,20327,308],{"class":193},[140,20329,311],{"class":150},[140,20331,314],{"class":150},[316,20333],{"prompt":20334},"show me what I can do for finding and comparing products across platforms",[27,20336,15469],{"id":20337},"which-mcp-server-gives-an-ai-agent-access-to-live-web-data",[11,20339,20340],{},"Several do, and the question worth asking underneath it is how many servers you want to be running.",[11,20342,20343],{},"MCP is the transport: it is how a model calls a tool at all, and the ecosystem now has a server for most individual capabilities. Bright Data and Firecrawl both ship one, both work, and both give an agent exactly the capability that vendor sells.",[11,20345,20346,20347,20350],{},"The cost of that shape is arithmetic. ",[38,20348,20349],{},"One server per vendor means one configuration, one credential and one failure mode per vendor",", and an agent with eight capabilities is running eight servers. Every one is a thing to install, authorise, monitor and update.",[11,20352,20353],{},"The alternative is one server whose catalogue is broad, where adding a capability is a search rather than an install. That is the shape we ship, and the trade is honest in both directions: you get breadth and one credential, and you give up the vendor-specific surface that a dedicated server exposes.",[11,20355,20356,20359,20360,20362,20363,260],{},[38,20357,20358],{},"When a dedicated server is the better call:"," you use one vendor deeply, you need their advanced configuration, or their server exposes something specialised that a general catalogue entry does not. We wrote the comparison out properly in ",[18,20361,5683],{"href":4915},", and the wiring in ",[18,20364,18108],{"href":18107},[320,20366,20367],{},[11,20368,324,20369,119,20371,20373],{},[38,20370,327],{},[18,20372,19975],{"href":3563}," for the search layer specifically, which is a different job from extraction.",[27,20375,20377],{"id":20376},"what-does-this-cost-when-the-agent-is-idle","What does this cost when the agent is idle?",[11,20379,20380],{},"Nothing, and that is the property that decides whether broad tool access is affordable at all rather than a pricing detail.",[11,20382,20383],{},"The usual shape for API access is a plan: a monthly floor per vendor that buys availability whether or not you call. For a human integration that is fine, because you chose the vendor deliberately and you will use it. For an agent it inverts badly: the whole point is carrying capabilities you might need, and paying a floor for each one makes breadth the expensive choice.",[11,20385,20386],{},"Pay as you go from one shared balance changes which architecture is cheap:",[11,20388,20389,20392],{},[38,20390,20391],{},"Access costs nothing until it is used."," An agent can carry the whole catalogue and pay only for the calls it makes. Nothing is billed for the tools it considered and did not run.",[11,20394,20395,20398],{},[38,20396,20397],{},"Discovery and inspection stay free",", so looking is never a cost decision. This matters more than it sounds: a system that charges for lookups teaches its users not to look.",[11,20400,20401,20404],{},[38,20402,20403],{},"Billing shape is per call or per result",", and the shape is what changes how you architect. Per result multiplies with the size of the list you request, so an unbounded query is the one that surprises people. Cap your arrays.",[11,20406,20407,20408,20411],{},"Live figures are on ",[18,20409,1233],{"href":5582,"rel":20410},[124,125]," rather than in this sentence, because a number written into a post is wrong the first time anything reprices.",[232,20413,20415],{"id":20414},"where-per-result-billing-surprises-people","Where per-result billing surprises people",[11,20417,20418],{},"The shape that catches teams out is not the price, it is the multiplier, and it only appears at the moment you scale.",[11,20420,20421,20424],{},[38,20422,20423],{},"Per call is flat."," One request, one charge, whatever comes back. A search that returns two results and a search that returns two hundred cost the same, so the only lever is how many times you call.",[11,20426,20427,20430],{},[38,20428,20429],{},"Per result multiplies by the response."," The charge tracks records returned, which means the size of your limit is the size of your bill. A query with a limit of a thousand is not slightly more expensive than the same query with a limit of ten.",[11,20432,20433],{},"Three habits keep that predictable:",[11,20435,20436,20439],{},[38,20437,20438],{},"Set an explicit limit on every array parameter."," Not because the default is unreasonable, but because a default you did not choose is a number you will not remember when the invoice arrives.",[11,20441,20442,20445],{},[38,20443,20444],{},"Run the small version first and read the charge."," The run reports what it billed. One test call tells you the real per-record cost of your query shape, which is the only figure that predicts the batch.",[11,20447,20448,20451],{},[38,20449,20450],{},"Watch for the flat fee."," Some endpoints charge per result plus a small fixed amount per run. That combination rewards batching: the same thousand records pulled in one run and in a hundred runs cost measurably different amounts, and nothing in the payload hints at it.",[11,20453,20454],{},"None of this is exotic, and all of it is invisible until the first real batch. Inspect prints the shape before you spend, which is the cheapest place to find out.",[421,20456],{"title":20457},"Browse the catalogue, with live pricing",[27,20459,480],{"id":479},[482,20461,20462,20474],{},[485,20463,20464],{},[488,20465,20466,20468,20470,20472],{},[491,20467,493],{},[491,20469,496],{},[491,20471,499],{},[491,20473,502],{},[504,20475,20476,20492,20509,20525,20541,20560],{},[488,20477,20478,20481,20488,20490],{},[509,20479,20480],{},"Read one page as clean text",[509,20482,20483],{},[18,20484,20486],{"href":16654,"rel":20485},[124,125],[47,20487,16658],{},[509,20489,7168],{},[509,20491,542],{},[488,20493,20494,20497,20505,20507],{},[509,20495,20496],{},"Search the web for pages",[509,20498,20499],{},[18,20500,20502],{"href":16654,"rel":20501},[124,125],[47,20503,20504],{},"context.dev \u002Fweb\u002Fsearch",[509,20506,6380],{},[509,20508,3551],{},[488,20510,20511,20514,20521,20523],{},[509,20512,20513],{},"Resolve a company by name",[509,20515,20516],{},[18,20517,20519],{"href":569,"rel":20518},[124,125],[47,20520,573],{},[509,20522,576],{},[509,20524,579],{},[488,20526,20527,20530,20537,20539],{},[509,20528,20529],{},"Enrich a company record",[509,20531,20532],{},[18,20533,20535],{"href":569,"rel":20534},[124,125],[47,20536,592],{},[509,20538,595],{},[509,20540,542],{},[488,20542,20543,20546,20555,20558],{},[509,20544,20545],{},"Generate an image",[509,20547,20548],{},[18,20549,20552],{"href":20550,"rel":20551},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fgenerative-media",[124,125],[47,20553,20554],{},"minimax \u002Fv1\u002Fimage_generation",[509,20556,20557],{},"Prompt",[509,20559,3551],{},[488,20561,20562,20565,20573,20576],{},[509,20563,20564],{},"Generate speech",[509,20566,20567],{},[18,20568,20570],{"href":20550,"rel":20569},[124,125],[47,20571,20572],{},"elevenlabs \u002Ftext-to-speech",[509,20574,20575],{},"Text",[509,20577,20578],{},"Per unit of text",[11,20580,20581,20582,604,20584,16689],{},"Verified present on 2026-08-18 with ",[47,20583,603],{},[47,20585,607],{},[11,20587,20588],{},"Read that table as the argument rather than a menu. Six rows, five providers, one key, and no row required a decision before the agent started running.",[27,20590,657],{"id":656},[11,20592,20593,20596],{},[38,20594,20595],{},"You are managing APIs you already own."," That is a gateway problem, not a catalogue problem. Kong and its peers exist for exactly this, and they do things we do not: policy, versioning, per-consumer rate limits on your own services.",[11,20598,20599,20602],{},[38,20600,20601],{},"You have one vendor and a stable integration."," If your agent does one job against one API, a direct integration is fewer moving parts and one less hop. Flexibility you never exercise is complexity you pay for.",[11,20604,20605,20608],{},[38,20606,20607],{},"You need vendor-specific surface area."," Actor configuration, custom browser scripts, a vendor's own scheduling and monitoring console. Those live in the vendor's product, and a catalogue entry exposes the endpoint rather than the whole product around it.",[11,20610,20611,20614],{},[38,20612,20613],{},"Your consumer is a person in a dashboard."," We ship an endpoint, a CLI and an MCP server. If the user wants to click, buy the platform with the console.",[11,20616,20617,20619,20620,20623,20624,692],{},[38,20618,686],{}," A catalogue entry describes what an endpoint claims. Behaviour has disagreed with that description before, including one endpoint that ",[18,20621,20622],{"href":633},"returned half its fields empty at full price",", and a US company lookup that ",[18,20625,20627],{"href":20626},"\u002Fblog\u002Fguides\u002Fbusiness-entity-search-api","returned an error for one of the largest private companies in the country",[27,20629,696],{"id":695},[11,20631,20632],{},"The best API marketplace for an agent is the one that answers a question the agent has not asked yet, which is a different requirement from anything a developer portal was built to satisfy. Directories assume a human signup, gateways assume you already own the API, and utility bundles assume the capability is in the bundle.",[11,20634,20635,20636,20639,20640,20643],{},"Two things matter more than which product you pick. ",[38,20637,20638],{},"One ordinary task crosses more vendors than anyone provisions",", which we measured: four steps of a single product-listing job touched five different providers, and no vendor covered the step after its own. And ",[38,20641,20642],{},"a per-vendor floor makes breadth the expensive choice",", which is exactly backwards for a system whose value comes from carrying capabilities it might need.",[11,20645,20646,20647,260],{},"Start with the free part: discovery and inspection cost nothing, so point an agent at the catalogue and read what it finds for a task you actually have. The gap between what it finds and what you would have provisioned is the whole argument. Begin at ",[18,20648,725],{"href":723,"rel":20649},[124,125],[27,20651,729],{"id":728},[731,20653,20655],{"q":20654},"How is this different from an API gateway?",[11,20656,20657],{},"A gateway manages APIs you already own or have contracted, adding policy, auth and observability in front of them. This is the other side of that boundary: reaching tools you have no relationship with, without creating one per vendor. If your problem is governing your own services, buy a gateway. They are not competitors so much as different halves of a stack.",[731,20659,20661],{"q":20660},"Does an agent really pick the tool, or do I still wire it?",[11,20662,20663],{},"Both patterns work and they suit different jobs. For a fixed pipeline you name the endpoint and skip discovery, which is faster and more predictable. For open-ended work the agent searches, reads the schema and commits, and that is where the catalogue earns its place. The free discovery step is what makes the second pattern affordable.",[731,20665,20667],{"q":20666},"What stops an agent running up a bill?",[11,20668,20669],{},"The balance is prepaid, so spend cannot exceed what is funded, and the price for any endpoint is visible before the call rather than after. The genuine risk is not a runaway loop, it is an unbounded array parameter on a per-result endpoint: one query with a large limit costs many times what the same query with a small limit does. Cap the limits in the payload.",[731,20671,20673],{"q":20672},"What happens if a provider goes down?",[11,20674,20675],{},"The call fails and the agent sees the failure, the same as a direct integration. What a broad catalogue adds is somewhere to go: discovery usually returns more than one endpoint for a job, often from different providers, so a fallback is a search rather than a new contract. That is worth designing for rather than assuming.",[11,20677,20678],{},[758,20679,760],{},[762,20681,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":20683},[20684,20685,20689,20690,20693,20694,20695,20696],{"id":20128,"depth":166,"text":20129},{"id":20165,"depth":166,"text":20166,"children":20686},[20687,20688],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":20337,"depth":166,"text":15469},{"id":20376,"depth":166,"text":20377,"children":20691},[20692],{"id":20414,"depth":187,"text":20415},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fapi-marketplace-for-ai-agents.png","Marketplaces were built for developers who integrate once. An agent chooses at run time. One ordinary task touched five providers across four steps.","\u002Fimg\u002Fblog\u002Fapi-marketplace-for-ai-agents-card.png",{},{"title":14950,"description":20698},"blog\u002Fguides\u002Fapi-marketplace-for-ai-agents",[20704,1687,8986,20705],"api marketplace","tool use","XanwJ8l6xRYBeNKfm2JXuD9MO_gF1bCPZjEHQnCJAw8",{"id":20708,"title":20709,"author":6,"body":20710,"category":782,"cover":21330,"description":21331,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":21332,"meta":21333,"navigation":790,"ogImage":787,"path":20626,"publishedAt":20105,"readTime":793,"seo":21334,"stem":21335,"tags":21336,"toolCategory":9684,"updatedAt":20105,"__hash__":21341},"blogGuides\u002Fblog\u002Fguides\u002Fbusiness-entity-search-api.md","Business Entity Search by API: What Exists and What Does Not",{"type":8,"value":20711,"toc":21318},[20712,20715,20721,20724,20728,20731,20738,20741,20747,20753,20759,20765,20768,20774,20778,20781,20791,20796,20831,20837,20840,20845,20885,20891,20894,20900,20906,20908,20912,20915,20921,20927,20941,20957,20967,20974,20978,20981,21012,21018,21024,21027,21033,21043,21046,21052,21061,21064,21073,21077,21083,21089,21096,21099,21108,21111,21113,21229,21235,21238,21240,21246,21252,21258,21263,21265,21268,21279,21285,21287,21293,21299,21305,21311,21315],[11,20713,20714],{},"Somebody needs to confirm a company is real. Not enriched, not scored: confirmed, the way a registry confirms it, with a filing number and a status. The search that follows is almost always the name of a state and the words entity search, and it is one of the highest-volume company-data queries there is.",[11,20716,20717,20718,20720],{},"This is about what is actually available for that job. Monid is ",[18,20719,21],{"href":20},", and the useful thing we can do here is run the endpoints and tell you which parts of the question they answer.",[11,20722,20723],{},"Fair disclosure: you are on the Monid blog, and the honest headline of this post is that the most-searched version of this job is the one we cannot do. The measured result below is the least flattering thing in the guide and it is the reason to read it.",[27,20725,20727],{"id":20726},"is-there-an-api-for-state-business-entity-search","Is there an API for state business entity search?",[11,20729,20730],{},"Not in this catalogue, and it is worth being precise about what that means rather than softening it.",[11,20732,20733,20734,20737],{},"The demand is unambiguous. In our own keyword library, the state-registry cluster totals ",[38,20735,20736],{},"55,600 searches a month",": Texas at 22,200, New York at 12,100, Oregon at 8,100, plus two more Oregon phrasings. Every one of those rows is currently ranked by a scraping vendor, which tells you how people are solving it.",[11,20739,20740],{},"What a state registry actually holds is different from what any enrichment provider sells:",[11,20742,20743,20746],{},[38,20744,20745],{},"The filing itself."," Entity number, formation date, entity type, and the exact registered name including the suffix. This is the record of legal existence, not a description of a business.",[11,20748,20749,20752],{},[38,20750,20751],{},"Status."," Active, dissolved, forfeited, administratively dissolved for not filing. This is the field people are usually after, and no commercial dataset is authoritative on it.",[11,20754,20755,20758],{},[38,20756,20757],{},"The registered agent."," The person or service accepting legal service, with an address. Frequently the only real address a small entity publishes anywhere.",[11,20760,20761,20764],{},[38,20762,20763],{},"Officers and filing history",", in the states that publish them.",[11,20766,20767],{},"Fifty states, fifty systems, fifty interfaces, no common schema and no shared identifier. That is why there is no single endpoint: the underlying thing is not one dataset, it is fifty, and several of them are still HTML forms with session tokens.",[11,20769,20770,20773],{},[38,20771,20772],{},"If you need certified registry data, go to the state."," Every Secretary of State runs a public search, most publish bulk data, and some sell an API. For a legal or compliance requirement that is the source, and a resold copy is not a substitute for it.",[27,20775,20777],{"id":20776},"what-does-the-us-company-endpoint-actually-return","What does the US company endpoint actually return?",[11,20779,20780],{},"SEC filings, which is a much smaller universe than the one you searched for.",[11,20782,20783,20784,20790],{},"There is a US company endpoint in the catalogue, ",[18,20785,20787],{"href":569,"rel":20786},[124,125],[47,20788,20789],{},"strale \u002Fx402\u002Fus-company-data",", and its description says what it reads: SEC EDGAR. We ran it twice on 2026-08-18 to see where the boundary sits.",[11,20792,20793],{},[38,20794,20795],{},"A public company, Snowflake:",[131,20797,20799],{"className":133,"code":20798,"language":135,"meta":136,"style":136},"monid run -p api.strale.io -e \u002Fx402\u002Fus-company-data \\\n  --query '{\"company\":\"Snowflake\"}' -w\n",[47,20800,20801,20818],{"__ignoreMap":136},[140,20802,20803,20805,20807,20809,20811,20813,20816],{"class":142,"line":143},[140,20804,147],{"class":146},[140,20806,171],{"class":150},[140,20808,154],{"class":150},[140,20810,3762],{"class":150},[140,20812,160],{"class":150},[140,20814,20815],{"class":150}," \u002Fx402\u002Fus-company-data",[140,20817,184],{"class":183},[140,20819,20820,20822,20824,20827,20829],{"class":142,"line":166},[140,20821,2037],{"class":150},[140,20823,194],{"class":193},[140,20825,20826],{"class":150},"{\"company\":\"Snowflake\"}",[140,20828,2045],{"class":193},[140,20830,1190],{"class":150},[131,20832,20835],{"className":20833,"code":20834,"language":97,"meta":136},[248],"company_name      Snowflake Inc.\ncik               0001640147\nentity_type       operating\nsic               7372  Services-Prepackaged Software\nstate             DE\naddress           135 CONSTITUTION DRIVE, MENLO PARK, CA, 94025\nein               460636374\nticker            SNOW\nexchange          NYSE\nstatus            active\nmatch_confidence  exact\n",[47,20836,20834],{"__ignoreMap":136},[11,20838,20839],{},"A clean record, with the state of incorporation, the federal tax number and a provenance block naming the exact EDGAR document it came from. For a registered filer this is good data and it is traceable, which matters more than it sounds.",[11,20841,20842],{},[38,20843,20844],{},"A private company, Stripe:",[131,20846,20848],{"className":133,"code":20847,"language":135,"meta":136,"style":136},"monid run -p api.strale.io -e \u002Fx402\u002Fus-company-data \\\n  --query '{\"company\":\"Stripe\"}' -w\n# HTTP 400\n",[47,20849,20850,20866,20879],{"__ignoreMap":136},[140,20851,20852,20854,20856,20858,20860,20862,20864],{"class":142,"line":143},[140,20853,147],{"class":146},[140,20855,171],{"class":150},[140,20857,154],{"class":150},[140,20859,3762],{"class":150},[140,20861,160],{"class":150},[140,20863,20815],{"class":150},[140,20865,184],{"class":183},[140,20867,20868,20870,20872,20875,20877],{"class":142,"line":166},[140,20869,2037],{"class":150},[140,20871,194],{"class":193},[140,20873,20874],{"class":150},"{\"company\":\"Stripe\"}",[140,20876,2045],{"class":193},[140,20878,1190],{"class":150},[140,20880,20881],{"class":142,"line":187},[140,20882,20884],{"class":20883},"sHwdD","# HTTP 400\n",[11,20886,20887,20890],{},[38,20888,20889],{},"Nothing."," Not an empty record, not a low-confidence match: an error. Stripe is one of the largest private companies in the United States and it is not in EDGAR, so the endpoint has nothing to return.",[11,20892,20893],{},"Two things follow, and the second is the one that will bite you:",[11,20895,20896,20899],{},[38,20897,20898],{},"The coverage boundary is SEC registration, not size or importance."," Every public company is in there. Almost no private company is, which excludes the overwhelming majority of the entities anyone searches a state registry for.",[11,20901,20902,20905],{},[38,20903,20904],{},"A miss is a 400, not an empty result."," That is a real handling difference. Code that treats a non-200 as a transient failure will retry a company that will never be found, and a batch built that way burns calls on the same permanent misses. Treat 400 from this endpoint as a coverage answer, not an error to retry.",[316,20907],{"category":9684},[27,20909,20911],{"id":20910},"what-do-you-use-when-the-registry-is-not-available","What do you use when the registry is not available?",[11,20913,20914],{},"You separate the question into the two things people are actually asking, because only one of them needs a registry.",[11,20916,20917,20920],{},[38,20918,20919],{},"\"Does this company legally exist, with this exact name and status?\""," That is a registry question and it has a registry answer. Go to the state, or to a specialist compliance vendor who has licensed the filings. Nothing in a commercial enrichment dataset is authoritative here, and treating it as such in a KYC or contracting workflow is a real risk rather than a shortcut.",[11,20922,20923,20926],{},[38,20924,20925],{},"\"Is this a real, operating business I should deal with?\""," That is a different question, it is the one most people actually have, and it does have an API answer. Three signals, none of them a filing:",[11,20928,20929,20932,20933,20938,20939,260],{},[38,20930,20931],{},"Resolution."," Does the name map to a real domain and a real company record. ",[18,20934,20936],{"href":569,"rel":20935},[124,125],[47,20937,573],{}," resolves a name to candidates at no cost per call, which makes it the right first step in any batch. We covered the ambiguity cases in ",[18,20940,18760],{"href":18759},[11,20942,20943,20946,20947,20952,20953,20956],{},[38,20944,20945],{},"Firmographics."," Headcount, location, industry, funding history from ",[18,20948,20950],{"href":569,"rel":20949},[124,125],[47,20951,592],{},". Not proof of registration, but a company with a hundred employees on record and a funding history is not a shell. The ",[18,20954,20955],{"href":461},"full firmographics walkthrough"," covers the fields.",[11,20958,20959,20962,20963,20966],{},[38,20960,20961],{},"Activity."," Is anything happening. Hiring, news, a site that resolves and returns content. A dissolved entity does not post jobs, and ",[18,20964,20965],{"href":791},"reading hiring as a signal"," is a better liveness check than most people expect.",[11,20968,20969,20970,20973],{},"The honest framing: ",[38,20971,20972],{},"these tell you a business is operating, not that an entity is in good standing."," They are different claims and they fail in different directions. A company can be operating and administratively dissolved for a missed filing, and a company can be in perfect standing and dormant for three years.",[232,20975,20977],{"id":20976},"what-the-free-resolution-step-actually-returns","What the free resolution step actually returns",[11,20979,20980],{},"Worth running before you plan a batch, because the output shape decides how much human review a list needs. We ran it on 2026-08-18:",[131,20982,20984],{"className":133,"code":20983,"language":135,"meta":136,"style":136},"monid run -p akta -e \u002Fv1\u002Fcompany\u002Fsearch   --query '{\"query\":\"Perplexity AI\"}' -w\n",[47,20985,20986],{"__ignoreMap":136},[140,20987,20988,20990,20992,20994,20996,20998,21000,21003,21005,21008,21010],{"class":142,"line":143},[140,20989,147],{"class":146},[140,20991,171],{"class":150},[140,20993,154],{"class":150},[140,20995,401],{"class":150},[140,20997,160],{"class":150},[140,20999,406],{"class":150},[140,21001,21002],{"class":150},"   --query",[140,21004,194],{"class":193},[140,21006,21007],{"class":150},"{\"query\":\"Perplexity AI\"}",[140,21009,2045],{"class":193},[140,21011,1190],{"class":150},[11,21013,21014,21017],{},[38,21015,21016],{},"Twenty-five candidates",", each carrying four fields:",[131,21019,21022],{"className":21020,"code":21021,"language":97,"meta":136},[248],"name              Perplexity\nwebsite           perplexity.ai\nproduct_category  AI-powered search and answer engine\ncompany_status    Private\nuuid              the handle to pass to enrichment\n",[47,21023,21021],{"__ignoreMap":136},[11,21025,21026],{},"The first row was correct. The rest of the list is the part worth looking at, because it shows what the match is doing:",[131,21028,21031],{"className":21029,"code":21030,"language":97,"meta":136},[248],"Perplexity Fund     perplexityfund.ai     Venture Capital\nPerplex             perplex.ch            Custom Acrylic Manufacturing\nPaperplane          paperplane.ch         Graphic Design Services\n",[47,21032,21030],{"__ignoreMap":136},[11,21034,21035,21038,21039,21042],{},[38,21036,21037],{},"The search is fuzzy and it does not pretend otherwise."," A venture fund with a similar name, an acrylic manufacturer, and a company that merely shares some letters all came back for one query. That is the correct behaviour for a resolver, whose job is to offer candidates rather than to guess, and it is the reason ",[47,21040,21041],{},"product_category"," is in every row: it is what lets you eliminate the acrylic manufacturer without opening a page.",[11,21044,21045],{},"Two things follow for a batch:",[11,21047,21048,21051],{},[38,21049,21050],{},"Never take row one unread."," It was right here and it will not always be. Score the candidate on category and website plausibility before you spend an enrichment call on it, because enriching the wrong company produces a confident record about somebody else.",[11,21053,21054,21060],{},[38,21055,21056,21059],{},[47,21057,21058],{},"company_status"," is not registry status."," It says private or public, which is a market classification. It is not active, dissolved or forfeited, and reading it as good standing is exactly the mistake this whole post exists to prevent.",[11,21062,21063],{},"The step costs nothing per call, which is what makes it the right first pass on a list of any size: you can resolve everything, discard what does not match, and only pay on the survivors.",[320,21065,21066],{},[11,21067,324,21068,119,21070,21072],{},[38,21069,327],{},[18,21071,17503],{"href":12459},", where a record's self-reported size band disagreed with its own counted headcount.",[27,21074,21076],{"id":21075},"which-countries-do-have-a-registry-endpoint","Which countries do have a registry endpoint?",[11,21078,21079,21080,21082],{},"Three, measured with ",[47,21081,603],{}," on 2026-08-18, and the pattern behind them is instructive.",[131,21084,21087],{"className":21085,"code":21086,"language":97,"meta":136},[248],"UK        strale \u002Fx402\u002Fuk-company-data        Companies House\nSweden    strale \u002Fx402\u002Fswedish-company-data   Bolagsverket\nGermany   strale \u002Fx402\u002Fgerman-company-data    Handelsregister\n",[47,21088,21086],{"__ignoreMap":136},[11,21090,21091,21092,21095],{},"All three countries run a ",[38,21093,21094],{},"single national registry with a public API",". One system, one identifier, one schema, which is what makes an endpoint possible at all.",[11,21097,21098],{},"The United States has no national business registry. Incorporation is a state function, so there is no federal equivalent of Companies House and no number that identifies an entity nationally. EDGAR is the closest thing and it is a securities-filing system that happens to contain companies, which is why its coverage looks arbitrary from the outside.",[11,21100,223,21101,21107],{},[18,21102,21104],{"href":569,"rel":21103},[124,125],[47,21105,21106],{},"strale \u002Fx402\u002Fcompany-id-detect",", which identifies the type and country of a company identifier. Useful in a pipeline receiving mixed international input: work out what an identifier is before deciding which registry, if any, can resolve it.",[421,21109],{"category":9684,"title":21110},"Browse the company endpoints, with live pricing",[27,21112,480],{"id":479},[482,21114,21115,21127],{},[485,21116,21117],{},[488,21118,21119,21121,21123,21125],{},[491,21120,493],{},[491,21122,496],{},[491,21124,499],{},[491,21126,502],{},[504,21128,21129,21146,21164,21181,21197,21213],{},[488,21130,21131,21134,21141,21144],{},[509,21132,21133],{},"US SEC filer lookup",[509,21135,21136],{},[18,21137,21139],{"href":569,"rel":21138},[124,125],[47,21140,20789],{},[509,21142,21143],{},"Name, ticker or CIK",[509,21145,542],{},[488,21147,21148,21151,21159,21162],{},[509,21149,21150],{},"UK registry record",[509,21152,21153],{},[18,21154,21156],{"href":569,"rel":21155},[124,125],[47,21157,21158],{},"strale \u002Fx402\u002Fuk-company-data",[509,21160,21161],{},"Company number or name",[509,21163,542],{},[488,21165,21166,21169,21176,21179],{},[509,21167,21168],{},"Identify an unknown company ID",[509,21170,21171],{},[18,21172,21174],{"href":569,"rel":21173},[124,125],[47,21175,21106],{},[509,21177,21178],{},"Identifier string",[509,21180,542],{},[488,21182,21183,21186,21193,21195],{},[509,21184,21185],{},"Resolve a name to a company, free",[509,21187,21188],{},[18,21189,21191],{"href":569,"rel":21190},[124,125],[47,21192,573],{},[509,21194,576],{},[509,21196,579],{},[488,21198,21199,21202,21209,21211],{},[509,21200,21201],{},"Firmographics on a known company",[509,21203,21204],{},[18,21205,21207],{"href":569,"rel":21206},[124,125],[47,21208,592],{},[509,21210,595],{},[509,21212,542],{},[488,21214,21215,21218,21225,21227],{},[509,21216,21217],{},"Read a state registry page yourself",[509,21219,21220],{},[18,21221,21223],{"href":16654,"rel":21222},[124,125],[47,21224,16658],{},[509,21226,7168],{},[509,21228,542],{},[11,21230,20581,21231,604,21233,16689],{},[47,21232,603],{},[47,21234,607],{},[11,21236,21237],{},"That last row is the honest workaround and it comes with a warning. State search pages are public and readable, and reading them is a scrape against a government system with its own terms, its own rate limits and no obligation to keep its markup stable. It works for a handful of lookups and it is a poor foundation for anything you have to keep running.",[27,21239,657],{"id":656},[11,21241,21242,21245],{},[38,21243,21244],{},"You need certified or legally sufficient registry data."," Go to the state, or to a licensed compliance vendor. A resold record is not a certificate of good standing and no amount of convenience changes that.",[11,21247,21248,21251],{},[38,21249,21250],{},"Your workflow is US state registry lookup at volume."," That is the job this catalogue does not do, and the measured Stripe result is the proof rather than a hedge. Buy a specialist, or build against the states you actually need.",[11,21253,21254,21257],{},[38,21255,21256],{},"You need officers, registered agents or filing history."," None of the endpoints above return them. EDGAR carries filings for registered filers and nothing for anyone else.",[11,21259,21260,21262],{},[38,21261,686],{}," The US endpoint returned a 400 for one of the largest private companies in the country. That is not a defect in the endpoint, it is EDGAR's coverage showing through, and it is a good illustration of the rule that holds across this catalogue: metadata describes intent, a run describes behaviour. Run your own hardest case before you size a batch.",[27,21264,696],{"id":695},[11,21266,21267],{},"The most-searched version of business entity search, a state registry lookup by API, does not exist in this catalogue and mostly does not exist as a product, because the underlying data is fifty separate systems with no shared identifier. Anyone selling you one national US registry API is selling you a scraper with a search box on it.",[11,21269,21270,21271,21274,21275,21278],{},"Two things matter more than which vendor you try. ",[38,21272,21273],{},"Coverage is defined by SEC registration, not by size",", and our measured proof was blunt: Snowflake returned a full record and Stripe returned a 400. And ",[38,21276,21277],{},"a coverage miss arrives as an error rather than an empty result",", so code that retries non-200 responses will burn calls forever on companies that will never be there.",[11,21280,21281,21282,260],{},"Start with the free part: company resolution costs nothing per call, so you can separate the names that resolve from the ones that do not before spending anything on enrichment. Then run your hardest known case, private and unlisted, and see what comes back. Begin at ",[18,21283,725],{"href":723,"rel":21284},[124,125],[27,21286,729],{"id":728},[731,21288,21290],{"q":21289},"Can I look up a Texas LLC through any of these?",[11,21291,21292],{},"Not through the endpoints in this catalogue. A Texas LLC is a state filing and none of the available endpoints read state registries; the US endpoint reads SEC EDGAR, which a private LLC is not in. The Texas Secretary of State runs its own public search, and for anything beyond a handful of lookups that or a licensed compliance vendor is the route.",[731,21294,21296],{"q":21295},"Why did a real company return an error rather than no result?",[11,21297,21298],{},"Because the endpoint resolves against EDGAR and a company absent from EDGAR has no record to shape a response around. It is worth handling explicitly: treat a 400 from this endpoint as a coverage answer rather than a transient failure, or a retry loop will spend calls on companies that are permanently not there.",[731,21300,21302],{"q":21301},"Is EDGAR data good enough to verify a company?",[11,21303,21304],{},"For a public company, yes, and it is better than most commercial sources because it is the primary filing with a traceable document behind every field. Our measured record carried the CIK, the state of incorporation, the tax number and a link to the exact EDGAR submission. For a private company it tells you nothing at all, which is the whole limitation.",[731,21306,21308],{"q":21307},"What about registries outside the US?",[11,21309,21310],{},"Better, and the reason is structural: countries with a single national registry can expose it as one API. The UK, Sweden and Germany all have an endpoint here for that reason. If your entity verification is European, this is a solved problem in a way it is not for the United States.",[11,21312,21313],{},[758,21314,760],{},[762,21316,21317],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":136,"searchDepth":166,"depth":166,"links":21319},[21320,21321,21322,21325,21326,21327,21328,21329],{"id":20726,"depth":166,"text":20727},{"id":20776,"depth":166,"text":20777},{"id":20910,"depth":166,"text":20911,"children":21323},[21324],{"id":20976,"depth":187,"text":20977},{"id":21075,"depth":166,"text":21076},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fbusiness-entity-search-api.png","State registries are the most searched company lookup and the least available by API. We ran the US endpoint on a private company and it returned nothing.","\u002Fimg\u002Fblog\u002Fbusiness-entity-search-api-card.png",{},{"title":20709,"description":21331},"blog\u002Fguides\u002Fbusiness-entity-search-api",[21337,21338,21339,21340],"business entity search","company registry","sec edgar","company data","h7mZ6iUhw7vny9de6MUzcCfEttvil2chUKDOPUQDcN4",{"id":21343,"title":1878,"author":6,"body":21344,"category":2378,"cover":21929,"description":21930,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":21931,"meta":21932,"navigation":790,"ogImage":787,"path":1877,"publishedAt":20105,"readTime":793,"seo":21933,"stem":21934,"tags":21935,"toolCategory":18043,"updatedAt":20105,"__hash__":21938},"blogGuides\u002Fblog\u002Fguides\u002Fscraper-blocked-what-gets-through.md",{"type":8,"value":21345,"toc":21914},[21346,21349,21355,21358,21362,21365,21368,21396,21403,21406,21412,21418,21424,21430,21437,21441,21444,21450,21456,21462,21465,21467,21472,21477,21482,21484,21520,21522,21526,21535,21569,21574,21577,21583,21586,21592,21598,21601,21610,21614,21617,21623,21629,21635,21637,21641,21644,21650,21656,21659,21665,21671,21677,21687,21698,21700,21811,21817,21820,21822,21828,21834,21840,21846,21855,21857,21860,21871,21881,21883,21889,21895,21901,21907,21911],[11,21347,21348],{},"You wrote the request, it works in the browser, and the same URL from your code returns a wall. Not an error you can read, not a rate limit that tells you to wait: a 403 with a challenge page behind it, or an empty body where the content should be.",[11,21350,21351,21352,21354],{},"This is about what changes that outcome. Monid is ",[18,21353,21],{"href":20},", and one of those tools is a scrape endpoint we can point at a page and show you the response rather than describe it.",[11,21356,21357],{},"Fair disclosure: you are on the Monid blog, and the endpoint below is one we resell. The section on when to build it yourself is not a courtesy, and the measured result includes the part that is less flattering.",[27,21359,21361],{"id":21360},"why-does-a-request-that-works-in-my-browser-return-403","Why does a request that works in my browser return 403?",[11,21363,21364],{},"Because the block is not reading your URL, it is reading everything around it.",[11,21366,21367],{},"We measured this on 2026-08-18. A plain request to a well-known review site, with a Python library's default user agent:",[131,21369,21371],{"className":133,"code":21370,"language":135,"meta":136,"style":136},"curl -A \"python-requests\u002F2.31\" https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Fapify\u002Freviews\n# HTTP 403\n",[47,21372,21373,21391],{"__ignoreMap":136},[140,21374,21375,21377,21380,21382,21385,21388],{"class":142,"line":143},[140,21376,17868],{"class":146},[140,21378,21379],{"class":150}," -A",[140,21381,2673],{"class":193},[140,21383,21384],{"class":150},"python-requests\u002F2.31",[140,21386,21387],{"class":193},"\"",[140,21389,21390],{"class":150}," https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Fapify\u002Freviews\n",[140,21392,21393],{"class":142,"line":166},[140,21394,21395],{"class":20883},"# HTTP 403\n",[11,21397,21398,21399,21402],{},"The page is public. It renders for anyone in a browser. The 403 is not about permission, it is about ",[38,21400,21401],{},"recognition",": the request arrived without the several dozen signals a real browser emits, and a protection layer decided on that basis alone.",[11,21404,21405],{},"Four things are being read, and they compound:",[11,21407,21408,21411],{},[38,21409,21410],{},"The TLS handshake, before any HTTP."," Browsers negotiate a distinctive cipher order and extension set. A stock HTTP library negotiates a different one, and the mismatch is legible before your request line is even parsed. Changing the user agent string does nothing here, which is why the first fix everyone tries is the one that never works.",[11,21413,21414,21417],{},[38,21415,21416],{},"Header shape, not header content."," Real browsers send a specific set in a specific order, with client hints and an accept string that matches the resource type. A request with three headers in the wrong order is identifiable regardless of what those headers say.",[11,21419,21420,21423],{},[38,21421,21422],{},"IP reputation."," Datacenter ranges are catalogued. A request from a cloud host is treated differently from one on a residential line, before anything about the request itself is considered.",[11,21425,21426,21429],{},[38,21427,21428],{},"Behaviour over time."," One request looks like a person. Two hundred sequential requests with identical timing do not, and the block often arrives at request 40 rather than request 1, which is what makes it feel intermittent.",[11,21431,21432,21433,21436],{},"The practical consequence: ",[38,21434,21435],{},"a block is a fingerprinting result, not a rule you can read."," There is no header to add that fixes it, because the thing being detected is the absence of a hundred small consistencies you would have to reproduce all at once.",[27,21438,21440],{"id":21439},"how-do-i-automate-scraping-without-getting-blocked","How do I automate scraping without getting blocked?",[11,21442,21443],{},"By not being the thing that gets fingerprinted. There are three routes and they cost very different amounts of your time.",[11,21445,21446,21449],{},[38,21447,21448],{},"Run a real browser."," Playwright or Puppeteer emit genuine TLS and header signatures because they are a genuine browser. This works and it is expensive: a browser per page, memory per browser, and a fleet to manage once you need concurrency.",[11,21451,21452,21455],{},[38,21453,21454],{},"Buy the plumbing separately."," Residential proxies from one vendor, a fingerprint library from another, retry logic you write. You own the integration and every part of it drifts independently.",[11,21457,21458,21461],{},[38,21459,21460],{},"Call an endpoint that has already solved it."," You send a URL, something on the other side runs the browser, rotates the address and returns the content. You own none of the plumbing and none of its maintenance.",[11,21463,21464],{},"The third is the one this post measures, because it is the one people ask about and the one AI answers keep recommending competitors for.",[232,21466,235],{"id":234},[11,21468,238,21469,244],{},[18,21470,243],{"href":241,"rel":21471},[124,125],[131,21473,21475],{"className":21474,"code":249,"language":97,"meta":136},[248],[47,21476,249],{"__ignoreMap":136},[11,21478,254,21479,260],{},[18,21480,259],{"href":257,"rel":21481},[124,125],[232,21483,264],{"id":263},[131,21485,21486],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,21487,21488,21498],{"__ignoreMap":136},[140,21489,21490,21492,21494,21496],{"class":142,"line":143},[140,21491,274],{"class":146},[140,21493,277],{"class":150},[140,21495,280],{"class":150},[140,21497,283],{"class":150},[140,21499,21500,21502,21504,21506,21508,21510,21512,21514,21516,21518],{"class":142,"line":166},[140,21501,147],{"class":146},[140,21503,290],{"class":150},[140,21505,293],{"class":150},[140,21507,296],{"class":150},[140,21509,299],{"class":193},[140,21511,302],{"class":150},[140,21513,305],{"class":183},[140,21515,308],{"class":193},[140,21517,311],{"class":150},[140,21519,314],{"class":150},[316,21521],{"category":18043},[27,21523,21525],{"id":21524},"what-does-a-managed-endpoint-actually-return","What does a managed endpoint actually return?",[11,21527,21528,21529,21534],{},"More than the page. We ran the same URL that returned 403 above, on the same day, through ",[18,21530,21532],{"href":16654,"rel":21531},[124,125],[47,21533,16658],{},":",[131,21536,21538],{"className":133,"code":21537,"language":135,"meta":136,"style":136},"monid run -p context.dev -e \u002Fweb\u002Fscrape\u002Fmarkdown \\\n  --query '{\"url\":\"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Fapify\u002Freviews\"}' -w\n",[47,21539,21540,21556],{"__ignoreMap":136},[140,21541,21542,21544,21546,21548,21550,21552,21554],{"class":142,"line":143},[140,21543,147],{"class":146},[140,21545,171],{"class":150},[140,21547,154],{"class":150},[140,21549,1718],{"class":150},[140,21551,160],{"class":150},[140,21553,1721],{"class":150},[140,21555,184],{"class":183},[140,21557,21558,21560,21562,21565,21567],{"class":142,"line":166},[140,21559,2037],{"class":150},[140,21561,194],{"class":193},[140,21563,21564],{"class":150},"{\"url\":\"https:\u002F\u002Fwww.g2.com\u002Fproducts\u002Fapify\u002Freviews\"}",[140,21566,2045],{"class":193},[140,21568,1190],{"class":150},[11,21570,21571,21573],{},[38,21572,16317],{}," The block did not apply, because the request that reached the site was not the one we sent.",[11,21575,21576],{},"What came back was not just HTML converted to text:",[131,21578,21581],{"className":21579,"code":21580,"language":97,"meta":136},[248],"markdown       23,319 characters of clean, readable page text\nmetadata       title, description, canonical URL, favicon, charset, robots\nopenGraph      the social card the page declares\ntwitter        the same again for the other card format\njsonLd         the page's own structured data, parsed\n",[47,21582,21580],{"__ignoreMap":136},[11,21584,21585],{},"That last one is the part worth planning around. The structured-data block carried, without any parsing on our side:",[131,21587,21590],{"className":21588,"code":21589,"language":97,"meta":136},[248],"aggregateRating   4.7 from 580 reviews\noffers            the product's pricing tiers, as structured objects\nreview            an individual review, with its author\npositiveNotes     the page's own summary of what users praise\nnegativeNotes     and what they complain about\ncontactPoint      support contact details\naddress           the company's registered address\n",[47,21591,21589],{"__ignoreMap":136},[11,21593,21594,21597],{},[38,21595,21596],{},"The structured data was already there, and most scrapers throw it away."," A pipeline that pulls prices out of rendered text with a regular expression is reconstructing, badly, a field the page published deliberately. If a site ships structured data, that is the highest-quality content on it and the easiest to consume.",[11,21599,21600],{},"One honest note about the markdown: 23,319 characters is the whole page, navigation included. The first several hundred characters are a menu. Clean does not mean pre-filtered, and if you are feeding a model, you still want to cut the chrome.",[320,21602,21603],{},[11,21604,324,21605,119,21607,21609],{},[38,21606,327],{},[18,21608,18103],{"href":2986}," for the extraction half of this in more depth.",[232,21611,21613],{"id":21612},"why-one-request-succeeding-is-not-a-guarantee","Why one request succeeding is not a guarantee",[11,21615,21616],{},"A single 200 proves the route works today on that domain. It does not prove a batch will finish, and treating it as proof is how a scrape that worked in testing dies at scale.",[11,21618,21619,21622],{},[38,21620,21621],{},"Protection is per site and per moment."," The same endpoint against a different domain, or the same domain during an incident, can behave differently. Test the domains you actually need.",[11,21624,21625,21628],{},[38,21626,21627],{},"Volume changes the shape of the problem."," One page is a request; ten thousand pages is a traffic pattern, and patterns get noticed even when individual requests do not.",[11,21630,21631,21634],{},[38,21632,21633],{},"A 200 is not always content."," Some sites return a successful status with a challenge page in the body. Check that the response contains what you expect rather than checking the status code, which is the check almost everyone writes first and regrets.",[421,21636],{"category":18043,"title":18191},[27,21638,21640],{"id":21639},"is-a-managed-scraping-api-worth-it-or-should-i-build-in-house","Is a managed scraping API worth it, or should I build in house?",[11,21642,21643],{},"It depends on one thing: whether scraping is your product or your input.",[11,21645,21646,21649],{},[38,21647,21648],{},"Build it when the scraping IS the product."," If you sell data, the pipeline is the thing customers pay for and owning it is not overhead, it is the business. Outsourcing your core competency to a per-call endpoint is the wrong trade at any price.",[11,21651,21652,21655],{},[38,21653,21654],{},"Buy it when the data is an input."," If the scrape feeds a feature, a report or an agent, then every hour spent on fingerprint drift is an hour not spent on the thing users see. The plumbing has no upside for you: nobody buys your product because your proxy rotation is elegant.",[11,21657,21658],{},"Three things people underestimate about building it:",[11,21660,21661,21664],{},[38,21662,21663],{},"The maintenance is continuous, not one-off."," Detection updates, and a working scraper degrades rather than breaking cleanly. The failure mode is a slow rise in empty results that nobody notices for a week.",[11,21666,21667,21670],{},[38,21668,21669],{},"Proxy costs are the real bill."," Residential bandwidth is priced by the gigabyte and pages are heavier than people estimate. The proxy line item routinely exceeds what a managed endpoint would have cost for the same volume.",[11,21672,21673,21676],{},[38,21674,21675],{},"Concurrency is where it gets hard."," One browser is easy. Two hundred browsers, with restarts and memory limits and a queue, is infrastructure work with its own on-call.",[11,21678,21679,21680,21683,21684,260],{},"The honest split: ",[38,21681,21682],{},"build when scraping is the product or the volume is enormous and steady; buy when it is an input, when the sites vary, or when usage is bursty enough that a standing fleet would idle."," We wrote up the same trade for one specific case in ",[18,21685,21686],{"href":17022},"buy versus build on Amazon product feeds",[11,21688,21689,21690,21693,21694,21697],{},"For the search half of the job rather than the extraction half, ",[18,21691,21692],{"href":10993},"live web search your agent can call"," covers finding the pages worth scraping in the first place, and ",[18,21695,21696],{"href":18107},"giving an agent live web context"," covers wiring the result into a model.",[27,21699,480],{"id":479},[482,21701,21702,21714],{},[485,21703,21704],{},[488,21705,21706,21708,21710,21712],{},[491,21707,493],{},[491,21709,496],{},[491,21711,499],{},[491,21713,502],{},[504,21715,21716,21731,21747,21763,21779,21794],{},[488,21717,21718,21720,21727,21729],{},[509,21719,3092],{},[509,21721,21722],{},[18,21723,21725],{"href":16654,"rel":21724},[124,125],[47,21726,16658],{},[509,21728,7168],{},[509,21730,542],{},[488,21732,21733,21736,21743,21745],{},[509,21734,21735],{},"A whole site, following links",[509,21737,21738],{},[18,21739,21741],{"href":16654,"rel":21740},[124,125],[47,21742,18268],{},[509,21744,7190],{},[509,21746,3551],{},[488,21748,21749,21752,21759,21761],{},[509,21750,21751],{},"List a site's URLs before scraping",[509,21753,21754],{},[18,21755,21757],{"href":16654,"rel":21756},[124,125],[47,21758,18285],{},[509,21760,7213],{},[509,21762,542],{},[488,21764,21765,21768,21775,21777],{},[509,21766,21767],{},"A PDF or Office file at a URL",[509,21769,21770],{},[18,21771,21773],{"href":16654,"rel":21772},[124,125],[47,21774,18302],{},[509,21776,7168],{},[509,21778,542],{},[488,21780,21781,21783,21790,21792],{},[509,21782,5008],{},[509,21784,21785],{},[18,21786,21788],{"href":16654,"rel":21787},[124,125],[47,21789,20504],{},[509,21791,6380],{},[509,21793,3551],{},[488,21795,21796,21799,21807,21809],{},[509,21797,21798],{},"A rendered screenshot instead of text",[509,21800,21801],{},[18,21802,21804],{"href":16654,"rel":21803},[124,125],[47,21805,21806],{},"context.dev \u002Fweb\u002Fscreenshot",[509,21808,7168],{},[509,21810,542],{},[11,21812,20581,21813,604,21815,16689],{},[47,21814,603],{},[47,21816,607],{},[11,21818,21819],{},"The row worth pairing: run the sitemap endpoint before a crawl. Knowing the URL list up front turns an open-ended crawl into a bounded batch, which is the difference between a predictable bill and a surprising one.",[27,21821,657],{"id":656},[11,21823,21824,21827],{},[38,21825,21826],{},"Scraping is your product."," Covered above and it is the clearest case. Own the pipeline.",[11,21829,21830,21833],{},[38,21831,21832],{},"You need a persistent logged-in session."," A per-call scrape is stateless. Anything requiring a maintained login, a cart, or a multi-step authenticated flow wants browser automation you control, not a URL-in-content-out endpoint.",[11,21835,21836,21839],{},[38,21837,21838],{},"The site forbids it and you need the relationship."," A block is a technical signal; terms of service are a legal one, and getting through the first does not settle the second. If you have a commercial relationship with the site, use their API and ask about the fields you are missing.",[11,21841,21842,21845],{},[38,21843,21844],{},"Enormous, steady, single-domain volume."," At that shape a dedicated fleet against one known target eventually beats per-call pricing, because you are amortising a fixed cost across a load that never stops.",[11,21847,21848,21850,21851,21854],{},[38,21849,686],{}," One measured 200 is one measured 200. This catalogue has surprised us before, including an endpoint whose ",[18,21852,21853],{"href":633},"fields came back half empty at full price",". Run your domains, read the body rather than the status, then size the batch.",[27,21856,696],{"id":695},[11,21858,21859],{},"A block is a fingerprint result, not a rule, which is why the fix is never a header and always a different kind of request. Our measurement was blunt: 403 from a plain request, 200 through a managed endpoint, same URL, same day.",[11,21861,21862,21863,21866,21867,21870],{},"Two things matter more than which vendor you pick. ",[38,21864,21865],{},"Check the body, not the status code",", because a challenge page served with a 200 will pass every health check you are likely to write and quietly poison a batch. And ",[38,21868,21869],{},"the structured data is usually already on the page",": our scrape returned the site's own structured block with the rating, the review count, the pricing tiers and the pros and cons already parsed, which is better data than anything a pattern match over rendered text will reconstruct.",[11,21872,713,21873,102,21875,21877,21878,260],{},[47,21874,603],{},[47,21876,607],{}," cost nothing, so you can read the exact response schema before spending. Then run one page from a domain you actually care about and read the whole body. Begin at ",[18,21879,725],{"href":723,"rel":21880},[124,125],[27,21882,729],{"id":728},[731,21884,21886],{"q":21885},"Will changing my user agent fix a 403?",[11,21887,21888],{},"Almost never. The user agent is one string among dozens of signals, and the ones that give a script away sit below HTTP: the TLS handshake shape, the header order, the missing browser hints. Changing the string makes your request a stock library claiming to be Chrome, which is a more suspicious combination than not claiming anything.",[731,21890,21892],{"q":21891},"Why did my scraper work for a week and then stop?",[11,21893,21894],{},"Because detection updates and because volume accumulates. Nothing about your code changed; the pattern it produces became recognisable, or the protection layer got a new rule. This is the strongest practical argument for not owning the plumbing: the maintenance is continuous, and it is invisible until results quietly go empty.",[731,21896,21898],{"q":21897},"Is scraping a public page legal?",[11,21899,21900],{},"Public visibility is not permission, and the two questions are separate. A page anyone can open may still be covered by terms that forbid automated collection, and jurisdictions differ on how much that matters. Getting through a technical block settles nothing legal. Read the terms for the sites you depend on, and where a relationship exists, ask for API access instead.",[731,21902,21904],{"q":21903},"Does a proxy alone solve this?",[11,21905,21906],{},"Rarely on its own. A residential address fixes the IP reputation signal and leaves the TLS and header signals exactly as they were, so a well-fingerprinted request from a residential IP still gets caught. Proxies are one layer of three, and buying only that layer is the most common way to spend real money and still get blocked.",[11,21908,21909],{},[758,21910,760],{},[762,21912,21913],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":136,"searchDepth":166,"depth":166,"links":21915},[21916,21917,21921,21924,21925,21926,21927,21928],{"id":21360,"depth":166,"text":21361},{"id":21439,"depth":166,"text":21440,"children":21918},[21919,21920],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":21524,"depth":166,"text":21525,"children":21922},[21923],{"id":21612,"depth":187,"text":21613},{"id":21639,"depth":166,"text":21640},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fscraper-blocked-what-gets-through.png","A raw request to a Cloudflare-protected page returns 403. We ran the same URL through a managed endpoint and read what came back, field by field.","\u002Fimg\u002Fblog\u002Fscraper-blocked-what-gets-through-card.png",{},{"title":1878,"description":21930},"blog\u002Fguides\u002Fscraper-blocked-what-gets-through",[2389,21936,1952,21937],"cloudflare","blocked","Rs44ltAvJ6OQACogN9JNE3UZSgDQKTt1ujgKrqDeWns",{"id":21940,"title":2561,"author":6,"body":21941,"category":2378,"cover":22501,"description":22502,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":22503,"meta":22504,"navigation":790,"ogImage":787,"path":2560,"publishedAt":20105,"readTime":793,"seo":22505,"stem":22506,"tags":22507,"toolCategory":18043,"updatedAt":20105,"__hash__":22509},"blogGuides\u002Fblog\u002Fguides\u002Fweb-scraping-api-for-ai-agents.md",{"type":8,"value":21942,"toc":22486},[21943,21946,21952,21955,21957,21960,21966,21972,21975,21980,21984,21987,21992,22042,22047,22053,22060,22067,22070,22081,22090,22092,22097,22102,22107,22109,22145,22147,22151,22154,22157,22160,22166,22176,22182,22193,22197,22200,22206,22212,22218,22221,22230,22234,22237,22243,22249,22256,22264,22272,22274,22276,22387,22393,22396,22398,22404,22410,22415,22421,22428,22430,22433,22444,22454,22456,22462,22468,22474,22480,22484],[11,21944,21945],{},"Ask an AI which web scraping API to use from an agent and you get a shortlist: Apify, Bright Data, Firecrawl. It is a reasonable list and it answers a question one level up from the one that matters, because the hard part is not which vendor is best. It is that your agent has to decide, at run time, without you there.",[11,21947,21948,21949,21951],{},"This is about that decision. Monid is ",[18,21950,21],{"href":20},": one key and one balance reach over a thousand tools, and the agent picks which one to call.",[11,21953,21954],{},"Fair disclosure: you are on the Monid blog. The section on when a single vendor is the better answer is not a courtesy, and for a real share of readers it is the right call.",[27,21956,4894],{"id":4893},[11,21958,21959],{},"The honest answer is that the question has two halves and only one of them is about vendors.",[11,21961,21962,21965],{},[38,21963,21964],{},"The first half is capability."," Can the thing get the page, get through the protection, and hand back something a model can read. Apify, Bright Data and Firecrawl all clear that bar, along with several others, and picking between them on capability alone is close to a coin flip for most jobs.",[11,21967,21968,21971],{},[38,21969,21970],{},"The second half is selection."," An agent working on a task does not know in advance whether it needs a generic page scrape, a marketplace product endpoint, a social platform reader or a document parser. If it holds one vendor's key, it has one vendor's answer to every question, and it will use a general-purpose scraper on a job that has a purpose-built endpoint sitting one search away.",[11,21973,21974],{},"That second half is where the agent case diverges from the human case, and it is the half the shortlists skip.",[16263,21976,21977],{},[11,21978,21979],{},"A human picks the vendor once, at integration time. An agent picks a tool every time it runs, and it can only pick from what it can see.",[27,21981,21983],{"id":21982},"why-can-an-agent-not-just-be-given-a-scraping-api-key","Why can an agent not just be given a scraping API key?",[11,21985,21986],{},"It can, and then it uses that key for everything, including the jobs it fits badly.",[11,21988,21989,21990,21534],{},"We measured what the alternative looks like on 2026-08-18. The same underlying job, phrased three ways a task might actually arrive, run through ",[47,21991,603],{},[131,21993,21995],{"className":133,"code":21994,"language":135,"meta":136,"style":136},"monid discover -q \"scrape a product page\"\nmonid discover -q \"get reviews for a product\"\nmonid discover -q \"extract structured data from a website\"\n",[47,21996,21997,22012,22027],{"__ignoreMap":136},[140,21998,21999,22001,22003,22005,22007,22010],{"class":142,"line":143},[140,22000,147],{"class":146},[140,22002,2667],{"class":150},[140,22004,2670],{"class":150},[140,22006,2673],{"class":193},[140,22008,22009],{"class":150},"scrape a product page",[140,22011,2679],{"class":193},[140,22013,22014,22016,22018,22020,22022,22025],{"class":142,"line":166},[140,22015,147],{"class":146},[140,22017,2667],{"class":150},[140,22019,2670],{"class":150},[140,22021,2673],{"class":193},[140,22023,22024],{"class":150},"get reviews for a product",[140,22026,2679],{"class":193},[140,22028,22029,22031,22033,22035,22037,22040],{"class":142,"line":187},[140,22030,147],{"class":146},[140,22032,2667],{"class":150},[140,22034,2670],{"class":150},[140,22036,2673],{"class":193},[140,22038,22039],{"class":150},"extract structured data from a website",[140,22041,2679],{"class":193},[11,22043,22044],{},[38,22045,22046],{},"Three phrasings, three almost disjoint provider sets:",[131,22048,22051],{"className":22049,"code":22050,"language":97,"meta":136},[248],"scrape a product page        apify: facebook pages, amazon product details,\n                             google shopping, amazon reviews\nget reviews for a product    akta company reviews, tikhub xiaohongshu,\n                             tikhub tiktok shop, strale product reviews\nextract structured data      context.dev web\u002Fextract, strale web-extract,\n                             context.dev web\u002Fcrawl, octen extract\n",[47,22052,22050],{"__ignoreMap":136},[11,22054,22055,22056,22059],{},"Read the middle row again. A request for product reviews surfaced a company-reviews endpoint, two platform-specific shop endpoints and a generic extractor, from four different providers. ",[38,22057,22058],{},"No single vendor's catalogue covers that row",", and an agent holding one key would have scraped a page to reconstruct data that a purpose-built endpoint returns as fields.",[11,22061,22062,22063,22066],{},"The price spread matters too, and it is wider than people expect. Across those three result sets, the cheapest and most expensive rows for adjacent jobs differed by ",[38,22064,22065],{},"two orders of magnitude",". Same task, same day. An agent that cannot see the spread cannot avoid the expensive end of it.",[11,22068,22069],{},"Two properties make this workable rather than chaotic:",[11,22071,22072,119,22075,22077,22078,22080],{},[38,22073,22074],{},"Discovery and inspection are free.",[47,22076,4274],{}," ranks endpoints with provider, description and price. ",[47,22079,3936],{}," returns the input schema. Neither costs anything, so an agent can look before it commits, every time, without a budget for looking.",[11,22082,22083,22089],{},[38,22084,22085,22086,22088],{},"Only ",[47,22087,12716],{}," bills."," Which means the catalogue is not a subscription you are paying to keep available. Access costs nothing until it is used, so an agent can carry a thousand tools and still pay only for the calls it makes.",[232,22091,235],{"id":234},[11,22093,238,22094,244],{},[18,22095,243],{"href":241,"rel":22096},[124,125],[131,22098,22100],{"className":22099,"code":249,"language":97,"meta":136},[248],[47,22101,249],{"__ignoreMap":136},[11,22103,254,22104,260],{},[18,22105,259],{"href":257,"rel":22106},[124,125],[232,22108,264],{"id":263},[131,22110,22111],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,22112,22113,22123],{"__ignoreMap":136},[140,22114,22115,22117,22119,22121],{"class":142,"line":143},[140,22116,274],{"class":146},[140,22118,277],{"class":150},[140,22120,280],{"class":150},[140,22122,283],{"class":150},[140,22124,22125,22127,22129,22131,22133,22135,22137,22139,22141,22143],{"class":142,"line":166},[140,22126,147],{"class":146},[140,22128,290],{"class":150},[140,22130,293],{"class":150},[140,22132,296],{"class":150},[140,22134,299],{"class":193},[140,22136,302],{"class":150},[140,22138,305],{"class":183},[140,22140,308],{"class":193},[140,22142,311],{"class":150},[140,22144,314],{"class":150},[316,22146],{"category":18043},[27,22148,22150],{"id":22149},"what-should-i-use-for-the-scraping-layer-in-an-n8n-automation","What should I use for the scraping layer in an n8n automation?",[11,22152,22153],{},"Whatever the node can call with one credential, because the alternative is a credential per vendor and a branch per case.",[11,22155,22156],{},"A workflow tool is the clearest version of the agent problem, since the constraint is visible in the editor: every extra vendor is another credential, another node type, another set of error shapes to handle. The pattern that stays maintainable is a single HTTP node pointed at one endpoint surface, with the choice of tool expressed as a parameter rather than as a branch.",[11,22158,22159],{},"Three things to get right in that shape:",[11,22161,22162,22165],{},[38,22163,22164],{},"Inspect once, at build time, not per run."," The schema is stable; fetching it on every execution adds latency for nothing. Read it while you are building, hard-code the payload, and let discovery be the thing you do when requirements change.",[11,22167,22168,22171,22172,22175],{},[38,22169,22170],{},"Handle async explicitly."," Longer jobs return a run ID rather than a body, and ",[47,22173,22174],{},"monid runs get"," polls for it. A workflow that assumes a synchronous response works fine on small inputs and silently truncates on large ones, which is the worst way for it to fail.",[11,22177,22178,22181],{},[38,22179,22180],{},"Cap the array parameters."," Per-result billing multiplies by the size of the list you send. A query with a limit of ten behaves very differently from the same query with a limit of a thousand, and the difference is not visible until the invoice.",[11,22183,22184,22185,22188,22189,22192],{},"For the scheduled version of this rather than the ad-hoc one, ",[18,22186,22187],{"href":466},"pulling company data on a schedule"," walks a working build, and ",[18,22190,22191],{"href":474},"wiring an ICP prospect search"," covers the enrichment side of the same pipeline.",[232,22194,22196],{"id":22195},"the-three-node-shape-that-survives-a-requirement-change","The three-node shape that survives a requirement change",[11,22198,22199],{},"Concretely, the workflow that does not need rebuilding when the target site changes:",[11,22201,22202,22205],{},[38,22203,22204],{},"One HTTP node, parameterised."," The endpoint and payload come from workflow variables rather than being typed into the node. Changing what you scrape is then editing a value, not rewiring a branch, and the difference shows the first time somebody asks for a second source.",[11,22207,22208,22211],{},[38,22209,22210],{},"One branch on run state, not on vendor."," Synchronous responses return a body; longer jobs return a run ID. Branch on which of those you got, and poll in the second path. Branching on vendor instead means a new branch every time the catalogue answer changes, which is the thing you were trying to avoid.",[11,22213,22214,22217],{},[38,22215,22216],{},"One validation step before anything downstream."," Check that the response contains the field you need, not that the status was 200. A challenge page, an empty result and a schema change all arrive as a successful request, and all three poison whatever comes next silently.",[11,22219,22220],{},"What this buys you is narrow and worth it: when the requirement moves from scraping a page to reading a marketplace product, the change is a different endpoint string in one variable. Nothing about the workflow's shape changes, because the shape was never about the vendor.",[320,22222,22223],{},[11,22224,324,22225,119,22227,22229],{},[38,22226,327],{},[18,22228,5683],{"href":4915}," for the transport layer under all of this.",[27,22231,22233],{"id":22232},"what-is-web-scraping-and-how-does-it-differ-from-data-enrichment","What is web scraping and how does it differ from data enrichment?",[11,22235,22236],{},"Scraping starts from a location. Enrichment starts from an identity. Confusing them is the most common reason people reach for the wrong endpoint and conclude the data is bad.",[11,22238,22239,22242],{},[38,22240,22241],{},"Scraping"," takes a URL and returns what is on it. The input is an address, the output is content, and the quality ceiling is whatever the page happens to publish. If the page does not say how many employees a company has, no scraper will tell you.",[11,22244,22245,22248],{},[38,22246,22247],{},"Enrichment"," takes an identifier, a domain, an email, a company name, and returns fields from a maintained dataset. The input is who, not where. The provider has already done the collection and the resolution, and you are querying their record rather than reading a page.",[11,22250,22251,22252,22255],{},"The practical test: ",[38,22253,22254],{},"if you can name the page, you want a scraper. If you can only name the company, you want enrichment."," Trying to scrape your way to firmographics means writing a crawler that finds the about page, parses inconsistent prose and guesses at headcount, which is a worse version of a lookup that already exists.",[11,22257,22258,22259,22261,22262,260],{},"They compose well in one direction. Resolve the company first, then scrape the specific page you now know the URL of. We covered the resolution half in ",[18,22260,18760],{"href":18759},", and the firmographics half in ",[18,22263,462],{"href":461},[11,22265,22266,22267,22269,22270,260],{},"There is a third category people fold into scraping and should not: ",[38,22268,4297],{},", which takes a question and returns pages worth reading. That is a different endpoint family and we compared it separately in ",[18,22271,19975],{"href":3563},[421,22273],{"category":18043,"title":18191},[27,22275,480],{"id":479},[482,22277,22278,22290],{},[485,22279,22280],{},[488,22281,22282,22284,22286,22288],{},[491,22283,493],{},[491,22285,496],{},[491,22287,499],{},[491,22289,502],{},[504,22291,22292,22307,22322,22337,22352,22370],{},[488,22293,22294,22296,22303,22305],{},[509,22295,3092],{},[509,22297,22298],{},[18,22299,22301],{"href":16654,"rel":22300},[124,125],[47,22302,16658],{},[509,22304,7168],{},[509,22306,542],{},[488,22308,22309,22311,22318,22320],{},[509,22310,18243],{},[509,22312,22313],{},[18,22314,22316],{"href":16654,"rel":22315},[124,125],[47,22317,18093],{},[509,22319,18253],{},[509,22321,542],{},[488,22323,22324,22326,22333,22335],{},[509,22325,21735],{},[509,22327,22328],{},[18,22329,22331],{"href":16654,"rel":22330},[124,125],[47,22332,18268],{},[509,22334,7190],{},[509,22336,3551],{},[488,22338,22339,22341,22348,22350],{},[509,22340,5008],{},[509,22342,22343],{},[18,22344,22346],{"href":16654,"rel":22345},[124,125],[47,22347,20504],{},[509,22349,6380],{},[509,22351,3551],{},[488,22353,22354,22357,22365,22368],{},[509,22355,22356],{},"A marketplace product, not a page",[509,22358,22359],{},[18,22360,22362],{"href":16581,"rel":22361},[124,125],[47,22363,22364],{},"apify \u002Fdelicious_zebu\u002Famazon-product-details-scraper",[509,22366,22367],{},"ASIN",[509,22369,3551],{},[488,22371,22372,22375,22383,22385],{},[509,22373,22374],{},"A company's own reviews",[509,22376,22377],{},[18,22378,22380],{"href":569,"rel":22379},[124,125],[47,22381,22382],{},"akta \u002Fv1\u002Fcompany\u002Fproduct-reviews",[509,22384,18920],{},[509,22386,3551],{},[11,22388,20581,22389,604,22391,16689],{},[47,22390,603],{},[47,22392,607],{},[11,22394,22395],{},"The last two rows are the argument in miniature. Both are jobs a general scraper can attempt by fetching a page and parsing it, and both have an endpoint that returns the same information as fields. An agent that can see the whole table picks the second; an agent holding one vendor's key never knows the row exists.",[27,22397,657],{"id":656},[11,22399,22400,22403],{},[38,22401,22402],{},"You have already standardised on one vendor and it covers your jobs."," If every scrape you run is one shape against one kind of site, the selection problem does not exist for you and a direct integration is simpler. Fewer moving parts wins when the flexibility has nothing to do.",[11,22405,22406,22409],{},[38,22407,22408],{},"You need vendor-specific features we do not surface."," Actor-level configuration, custom browser scripts, a vendor's own scheduling and monitoring UI. Those live in the vendor's product, and calling through another layer is not where you want to be if you depend on them.",[11,22411,22412,22414],{},[38,22413,21826],{}," Then the pipeline is the thing you sell and owning it is the business, not overhead.",[11,22416,22417,22420],{},[38,22418,22419],{},"You need a human in a dashboard."," We ship an endpoint, a CLI and an MCP server. If the consumer is an ops team that wants to click, buy the platform that ships the console.",[11,22422,22423,22425,22426,692],{},[38,22424,686],{}," Metadata in this catalogue has disagreed with real behaviour before, including an endpoint billing per record while its description read per query, and another that ",[18,22427,20622],{"href":633},[27,22429,696],{"id":695},[11,22431,22432],{},"The best web scraping API for an agent is not a vendor, it is a surface the agent can search at run time. Capability is table stakes across the well-known names; the thing that changes outcomes is whether the agent can see the purpose-built endpoint sitting next to the general-purpose one.",[11,22434,22435,22436,22439,22440,22443],{},"Two things matter more than the shortlist. ",[38,22437,22438],{},"The same job phrased differently reaches different tools",", which we measured: three natural phrasings of one task returned three almost disjoint provider sets, so an agent locked to one catalogue is answering every question with the same tool. And ",[38,22441,22442],{},"the price spread across adjacent jobs runs to two orders of magnitude",", which means tool choice is a cost decision as much as a capability one, and it cannot be made by something that cannot see the options.",[11,22445,713,22446,102,22448,22450,22451,260],{},[47,22447,4274],{},[47,22449,3936],{}," cost nothing, so point an agent at the catalogue and read what it finds for your actual task before spending anything. Begin at ",[18,22452,725],{"href":723,"rel":22453},[124,125],[27,22455,729],{"id":728},[731,22457,22459],{"q":22458},"Does this add latency versus calling a vendor directly?",[11,22460,22461],{},"A call passes through one more hop, so yes, a little. What it removes is a class of work you were doing instead: the credential per vendor, the branch per case, and the integration you rewrite when the requirement changes. If you have one fixed job against one vendor, the direct call is faster and simpler and you should make it.",[731,22463,22465],{"q":22464},"How does an agent know which endpoint to pick?",[11,22466,22467],{},"It searches, reads and then commits. Discovery returns ranked candidates with provider, description and price; inspection returns the input schema. Both are free, which is the property that makes the loop viable: an agent that had to pay to look would be trained by its budget to guess instead.",[731,22469,22471],{"q":22470},"What happens when a provider changes an endpoint?",[11,22472,22473],{},"The catalogue entry changes with it, and your agent reads the current schema rather than one hard-coded months ago. That is the argument for inspecting at build time and re-inspecting when something breaks, rather than assuming a payload copied from a blog post is still correct. We have shipped a wrong payload before, which is why the rule exists.",[731,22475,22477],{"q":22476},"Is scraping through an API allowed?",[11,22478,22479],{},"The endpoint does not change the terms of the site you are reading. Public visibility is not permission, robots directives still apply, and anything commercial or at scale deserves a look at the target's terms before it becomes a dependency. Where a site offers an official API, that is the route that survives scrutiny.",[11,22481,22482],{},[758,22483,760],{},[762,22485,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":22487},[22488,22489,22493,22496,22497,22498,22499,22500],{"id":4893,"depth":166,"text":4894},{"id":21982,"depth":166,"text":21983,"children":22490},[22491,22492],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":22149,"depth":166,"text":22150,"children":22494},[22495],{"id":22195,"depth":187,"text":22196},{"id":22232,"depth":166,"text":22233},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fweb-scraping-api-for-ai-agents.png","An agent cannot pick a scraper from a list it has never seen. What changes when the catalogue is discoverable at run time, measured across three phrasings.","\u002Fimg\u002Fblog\u002Fweb-scraping-api-for-ai-agents-card.png",{},{"title":2561,"description":22502},"blog\u002Fguides\u002Fweb-scraping-api-for-ai-agents",[22508,1687,8986,10498],"web scraping api","gb2y7zLFDZNrQ_Euje2G95xe6VS1B6res8aPxziAGMg",{"id":22511,"title":22512,"author":6,"body":22513,"category":782,"cover":23079,"description":23080,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":23081,"meta":23082,"navigation":790,"ogImage":787,"path":18759,"publishedAt":792,"readTime":793,"seo":23083,"stem":23084,"tags":23085,"toolCategory":9684,"updatedAt":792,"__hash__":23089},"blogGuides\u002Fblog\u002Fguides\u002Fapi-to-find-a-company-website.md","The Best API to Find a Company's Website From Its Name",{"type":8,"value":22514,"toc":23063},[22515,22518,22524,22527,22531,22534,22541,22547,22550,22553,22559,22562,22568,22574,22580,22584,22587,22595,22638,22645,22648,22650,22655,22660,22665,22667,22703,22707,22716,22718,22722,22725,22728,22736,22742,22748,22754,22760,22764,22767,22770,22784,22790,22801,22814,22817,22828,22832,22835,22838,22844,22847,22860,22862,22977,22983,22985,22987,22993,22999,23005,23014,23016,23019,23022,23031,23033,23039,23045,23051,23057,23061],[11,22516,22517],{},"Someone hands you a spreadsheet of company names and asks for their websites. It sounds like a search problem, so people reach for a search API, and it half works: you get a result for the obvious names and quiet nonsense for the rest.",[11,22519,22520,22521,22523],{},"It is not a search problem. It is a resolution problem, and the difference is what this guide is about. Monid is ",[18,22522,21],{"href":20},", so the endpoints below sit on one key, and the first one is free to call.",[11,22525,22526],{},"Fair disclosure: you are on the Monid blog. The section near the end names where a general search API or a full enrichment vendor beats what is described here.",[27,22528,22530],{"id":22529},"why-is-finding-a-companys-website-harder-than-it-sounds","Why is finding a company's website harder than it sounds?",[11,22532,22533],{},"Because company names are not unique and search engines optimise for the popular one.",[11,22535,22536,22537,22540],{},"We ran a resolution call for the string ",[47,22538,22539],{},"canva"," on 2026-08-17. The top three results were:",[131,22542,22545],{"className":22543,"code":22544,"language":97,"meta":136},[248],"Canva     canva.com        Visual Design Software\nCanvas    canvasapp.com    Business Intelligence Software\nCanvas    canvas.build     Construction Robotics\n",[47,22546,22544],{"__ignoreMap":136},[11,22548,22549],{},"Three different companies. Two share a name with each other and neither is the one you meant, unless it is.",[11,22551,22552],{},"A search engine would have returned canva.com first and buried the other two, which looks like the right answer and is the wrong behaviour for this job. When you are resolving a list, the rows you get wrong are exactly the ones where the obvious answer is not yours: the small company that shares a name with a big one, the local business behind a global brand.",[11,22554,22555,22558],{},[38,22556,22557],{},"Fuzzy matching is the feature."," An endpoint that returns one confident row for every input is hiding the ambiguity rather than resolving it, and you find out months later when someone notices a construction robotics company in the design-tool segment.",[11,22560,22561],{},"Three things make this harder than a lookup table:",[11,22563,22564,22567],{},[38,22565,22566],{},"Legal name is not trading name."," Filings say one thing and the website says another, and your spreadsheet almost always has the trading name.",[11,22569,22570,22573],{},[38,22571,22572],{},"Suffixes are noise, until they are not."," Inc, Ltd, GmbH, Pty are usually strippable and occasionally the only thing separating two companies.",[11,22575,22576,22579],{},[38,22577,22578],{},"A homepage is not always the answer."," Subsidiaries, regional sites, product sites and holding companies all resolve differently depending on what you plan to do next.",[27,22581,22583],{"id":22582},"which-api-turns-a-company-name-into-a-website","Which API turns a company name into a website?",[11,22585,22586],{},"A company resolution endpoint, and the one worth starting with costs nothing to call.",[11,22588,22589,22594],{},[18,22590,22592],{"href":569,"rel":22591},[124,125],[47,22593,573],{}," takes a name or a website in one field, auto-detects which you gave it, and returns candidate companies:",[131,22596,22598],{"className":133,"code":22597,"language":135,"meta":136,"style":136},"monid inspect -p akta -e \u002Fv1\u002Fcompany\u002Fsearch\nmonid run -p akta -e \u002Fv1\u002Fcompany\u002Fsearch --query '{\"query\":\"canva\"}'\n",[47,22599,22600,22615],{"__ignoreMap":136},[140,22601,22602,22604,22606,22608,22610,22612],{"class":142,"line":143},[140,22603,147],{"class":146},[140,22605,151],{"class":150},[140,22607,154],{"class":150},[140,22609,401],{"class":150},[140,22611,160],{"class":150},[140,22613,22614],{"class":150}," \u002Fv1\u002Fcompany\u002Fsearch\n",[140,22616,22617,22619,22621,22623,22625,22627,22629,22631,22633,22636],{"class":142,"line":166},[140,22618,147],{"class":146},[140,22620,171],{"class":150},[140,22622,154],{"class":150},[140,22624,401],{"class":150},[140,22626,160],{"class":150},[140,22628,406],{"class":150},[140,22630,409],{"class":150},[140,22632,194],{"class":193},[140,22634,22635],{"class":150},"{\"query\":\"canva\"}",[140,22637,200],{"class":193},[11,22639,22640,22641,22644],{},"Each row carries the company name, the website, a product category and its status. The measured run above charged ",[38,22642,22643],{},"nothing",": this endpoint is free per call, which changes how you use it. Resolution stops being a step you budget for and becomes something you can do speculatively, on every row, including the ones you expect to fail.",[11,22646,22647],{},"That matters more than it sounds. The usual pattern is to resolve cheaply and enrich expensively, and when resolution is free the only cost in your pipeline is the enrichment you actually chose to buy.",[232,22649,235],{"id":234},[11,22651,238,22652,244],{},[18,22653,243],{"href":241,"rel":22654},[124,125],[131,22656,22658],{"className":22657,"code":249,"language":97,"meta":136},[248],[47,22659,249],{"__ignoreMap":136},[11,22661,254,22662,260],{},[18,22663,259],{"href":257,"rel":22664},[124,125],[232,22666,264],{"id":263},[131,22668,22669],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,22670,22671,22681],{"__ignoreMap":136},[140,22672,22673,22675,22677,22679],{"class":142,"line":143},[140,22674,274],{"class":146},[140,22676,277],{"class":150},[140,22678,280],{"class":150},[140,22680,283],{"class":150},[140,22682,22683,22685,22687,22689,22691,22693,22695,22697,22699,22701],{"class":142,"line":166},[140,22684,147],{"class":146},[140,22686,290],{"class":150},[140,22688,293],{"class":150},[140,22690,296],{"class":150},[140,22692,299],{"class":193},[140,22694,302],{"class":150},[140,22696,305],{"class":183},[140,22698,308],{"class":193},[140,22700,311],{"class":150},[140,22702,314],{"class":150},[232,22704,22706],{"id":22705},"the-other-shape-resolve-by-brand","The other shape: resolve by brand",[11,22708,22709,22715],{},[18,22710,22712],{"href":569,"rel":22711},[124,125],[47,22713,22714],{},"context.dev \u002Fbrand\u002Fretrieve"," resolves a company from a domain, a name or a ticker and returns brand-level detail alongside the identity. Reach for it when the next step is presentation rather than analysis: it carries the visual identity a page or a card needs, which a firmographics record does not.",[316,22717],{"category":9684},[27,22719,22721],{"id":22720},"how-do-you-pick-the-right-row-when-several-match","How do you pick the right row when several match?",[11,22723,22724],{},"With a rule you write down, not by taking the first row, and the rule depends on what you are going to do with the domain.",[11,22726,22727],{},"This is the part every vendor page skips, and it is where list quality is actually won or lost.",[11,22729,22730,18811,22733,22735],{},[38,22731,22732],{},"Match on more than the name.",[47,22734,22539],{}," run returned a product category with every row. If your spreadsheet has an industry column, even a rough one, comparing categories disambiguates most collisions immediately. Two companies called Canvas are easy to separate when one is business intelligence and the other is construction robotics.",[11,22737,22738,22741],{},[38,22739,22740],{},"Treat a single result as a match, several as a question."," One row back is a resolution. Three rows back is the endpoint telling you it does not know, and the correct handling is to route those to a second signal or to a human, not to take the top one because it sorts first.",[11,22743,22744,22747],{},[38,22745,22746],{},"Keep the ambiguity in your data."," Store the candidate count alongside the chosen domain. A row resolved from one candidate and a row resolved from six are different qualities of fact, and six months later nothing else will tell you which is which.",[11,22749,22750,22753],{},[38,22751,22752],{},"Verify the domain resolves before you trust it."," A returned website is a claim about a company, not a promise the site is live. If a downstream step is going to fetch that page, check it rather than discovering the failure inside a batch.",[11,22755,454,22756,22759],{},[38,22757,22758],{},"resolution should output a domain and a confidence, and the confidence should come from how many candidates it had to choose between."," An endpoint that gives you the first without the second has made the decision for you and not told you.",[27,22761,22763],{"id":22762},"what-do-you-do-once-you-have-the-domain","What do you do once you have the domain?",[11,22765,22766],{},"The domain is the join key, and everything expensive happens after it.",[11,22768,22769],{},"That ordering is the point of resolving cheaply. Once you hold a domain you can:",[11,22771,22772,119,22775,22780,22781,22783],{},[38,22773,22774],{},"Enrich the company.",[18,22776,22778],{"href":569,"rel":22777},[124,125],[47,22779,592],{}," takes a website and returns firmographics: size, industry, employee count, funding history, social profiles. We measured what that record actually contains in ",[18,22782,17503],{"href":12459},", including the two fields that disagreed with each other.",[11,22785,22786,22789],{},[38,22787,22788],{},"Find the people."," A domain is what a people-search endpoint filters on, so resolution is the step before any prospecting list exists.",[11,22791,22792,119,22795,22800],{},[38,22793,22794],{},"Read the site itself.",[18,22796,22798],{"href":16654,"rel":22797},[124,125],[47,22799,16658],{}," turns the homepage into clean text, which is how you get positioning and product language rather than a database's guess at an industry label.",[11,22802,22803,119,22806,22813],{},[38,22804,22805],{},"Watch it.",[18,22807,22810],{"href":22808,"rel":22809},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fcompany-news",[124,125],[47,22811,22812],{},"akta \u002Fv1\u002Fnews"," takes a resolved company and returns news, which is the difference between a static list and a monitored one.",[11,22815,22816],{},"The pipeline shape that works: resolve everything, filter on what you learn, then enrich only the survivors. Reversing those last two is the most common way to overspend on B2B data, because enrichment is priced per record and filtering is not.",[320,22818,22819],{},[11,22820,324,22821,119,22823,22827],{},[38,22822,327],{},[18,22824,462],{"href":22825,"rel":22826},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fturn-a-domain-into-full-firmographics",[124,125]," for the step after this one.",[232,22829,22831],{"id":22830},"what-resolution-costs-you-when-it-goes-wrong","What resolution costs you when it goes wrong",[11,22833,22834],{},"Worth stating plainly, because the failure is silent and compounding.",[11,22836,22837],{},"A wrong domain does not error. It flows into enrichment, which returns a complete and confident record for the wrong company, which flows into scoring, which files a construction robotics firm under design software. Every step after the mistake works perfectly, which is why nobody catches it until someone reads a list and frowns.",[11,22839,22840,22843],{},[38,22841,22842],{},"The cost is not the wasted enrichment call."," It is that the row now looks identical to a correct one. There is no field in an enrichment response that says \"this was resolved from an ambiguous name six weeks ago\", unless you put it there.",[11,22845,22846],{},"So the practical defence is bookkeeping rather than cleverness: store the input string, the chosen domain, the candidate count and the date, on every row. Four columns, written once, and they are the only thing that lets a later run tell a careful decision from a coin flip.",[11,22848,22849,22850,22852,22853,22856,22857,22859],{},"We have run the downstream half of this often enough to have written it up: ",[18,22851,462],{"href":461}," is what happens next, and ",[18,22854,22855],{"href":9528},"the cost comparison across two providers"," is what it costs. If the list is heading for prospecting, ",[18,22858,475],{"href":474}," is the step after that.",[27,22861,480],{"id":479},[482,22863,22864,22876],{},[485,22865,22866],{},[488,22867,22868,22870,22872,22874],{},[491,22869,493],{},[491,22871,496],{},[491,22873,499],{},[491,22875,502],{},[504,22877,22878,22894,22911,22928,22945,22961],{},[488,22879,22880,22883,22890,22892],{},[509,22881,22882],{},"Name to candidate companies",[509,22884,22885],{},[18,22886,22888],{"href":569,"rel":22887},[124,125],[47,22889,573],{},[509,22891,576],{},[509,22893,579],{},[488,22895,22896,22899,22906,22909],{},[509,22897,22898],{},"Resolve with brand detail",[509,22900,22901],{},[18,22902,22904],{"href":569,"rel":22903},[124,125],[47,22905,22714],{},[509,22907,22908],{},"Domain, name or ticker",[509,22910,542],{},[488,22912,22913,22916,22923,22926],{},[509,22914,22915],{},"Domain to firmographics",[509,22917,22918],{},[18,22919,22921],{"href":569,"rel":22920},[124,125],[47,22922,592],{},[509,22924,22925],{},"Website, name, LinkedIn URL",[509,22927,542],{},[488,22929,22930,22933,22941,22943],{},[509,22931,22932],{},"Domain to assessment",[509,22934,22935],{},[18,22936,22938],{"href":569,"rel":22937},[124,125],[47,22939,22940],{},"akta \u002Fv1\u002Fcompany\u002Fenrichment",[509,22942,7213],{},[509,22944,3551],{},[488,22946,22947,22950,22957,22959],{},[509,22948,22949],{},"Read the homepage as text",[509,22951,22952],{},[18,22953,22955],{"href":16654,"rel":22954},[124,125],[47,22956,16658],{},[509,22958,7168],{},[509,22960,542],{},[488,22962,22963,22966,22973,22975],{},[509,22964,22965],{},"Watch a resolved company",[509,22967,22968],{},[18,22969,22971],{"href":22808,"rel":22970},[124,125],[47,22972,22812],{},[509,22974,18920],{},[509,22976,524],{},[11,22978,600,22979,604,22981,608],{},[47,22980,603],{},[47,22982,607],{},[421,22984],{"category":9684,"title":21110},[27,22986,657],{"id":656},[11,22988,22989,22992],{},[38,22990,22991],{},"You have a domain already."," Resolution is the step you skip when the spreadsheet arrived with websites in it. Go straight to enrichment, and buy that from whoever covers your segment best.",[11,22994,22995,22998],{},[38,22996,22997],{},"You need legal entity data."," Registered names, filings, officers and jurisdictions are a different dataset from commercial firmographics, and the registries that hold them are national. If you need what a company is legally rather than what it sells, look for the registry rather than an enrichment vendor.",[11,23000,23001,23004],{},[38,23002,23003],{},"You need one vendor's full platform."," If a revenue team lives inside a UI with lists, alerts and CRM sync, buy that. We ship an API, a CLI and an MCP server, and none of them is a substitute for the thing a non-engineer opens every morning.",[11,23006,23007,23009,23010,23013],{},[38,23008,686],{}," Endpoint metadata in this catalogue has disagreed with real behaviour before: we measured a company-detail endpoint returning ",[18,23011,23012],{"href":690},"empty commercial fields at full price"," and published it. A free resolution call removes that risk for the first step and not for the rest, so run one small enrichment before a batch and read what comes back.",[27,23015,696],{"id":695},[11,23017,23018],{},"Name to website looks like search and behaves like resolution, and the difference shows up on exactly the rows you cannot afford to get wrong: the company that shares a name with a bigger one. A search API hands you the popular answer confidently. A resolution endpoint hands you the candidates and makes you choose, which feels worse and is correct.",[11,23020,23021],{},"Two things matter more than which endpoint you pick. Write down the rule for choosing between candidates, because \"take the first row\" is a rule too and it is the one that quietly poisons a list. And keep the candidate count next to the domain you chose, because it is the only record you will ever have of how confident that row was.",[11,23023,713,23024,23027,23028,260],{},[47,23025,23026],{},"monid inspect -p akta -e \u002Fv1\u002Fcompany\u002Fsearch"," shows the schema without spending, and the call itself costs nothing, so you can resolve your whole list before deciding what to enrich. Begin at ",[18,23029,725],{"href":723,"rel":23030},[124,125],[27,23032,729],{"id":728},[731,23034,23036],{"q":23035},"What happens when two companies genuinely have the same name?",[11,23037,23038],{},"You get both rows back, which is the endpoint working rather than failing. Separate them on whatever second attribute you already hold: the product category returned with each row disambiguates most collisions, and an industry column in your source data is usually enough. If nothing separates them, the honest outcome is to mark the row unresolved rather than pick one, because a wrong domain propagates silently through every step after it.",[731,23040,23042],{"q":23041},"Can I resolve a company from an email address instead?",[11,23043,23044],{},"Yes, and it is often more reliable than a name, because a corporate email domain is already the answer for most B2B cases. Strip the domain from the address and you have skipped resolution entirely. The exception is free-provider addresses, where the domain tells you nothing about the company and you are back to resolving from a name.",[731,23046,23048],{"q":23047},"Is a free endpoint worse than a paid one?",[11,23049,23050],{},"Not here, and it is worth understanding why it is free: resolution is the step that makes the paid steps possible, so an endpoint that resolves cheaply is doing its job by increasing what you enrich, not by being a lesser product. The thing to check is coverage rather than quality: a resolution endpoint is only as good as the company database behind it, and none of them cover every small business everywhere.",[731,23052,23054],{"q":23053},"Should I cache the domains I resolve?",[11,23055,23056],{},"Yes, and with a date. Company names change, companies get acquired, and domains redirect to a parent brand, so a resolution is a fact about the day it was made. Storing the result with its date and its candidate count means a later run can tell what changed rather than silently overwriting a decision somebody made carefully.",[11,23058,23059],{},[758,23060,760],{},[762,23062,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":23064},[23065,23066,23071,23072,23075,23076,23077,23078],{"id":22529,"depth":166,"text":22530},{"id":22582,"depth":166,"text":22583,"children":23067},[23068,23069,23070],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":22705,"depth":187,"text":22706},{"id":22720,"depth":166,"text":22721},{"id":22762,"depth":166,"text":22763,"children":23073},[23074],{"id":22830,"depth":187,"text":22831},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fapi-to-find-a-company-website.png","Name to homepage is a resolution problem, not a search one. Which endpoint does it, why fuzzy matches are a feature, and how to pick the right row.","\u002Fimg\u002Fblog\u002Fapi-to-find-a-company-website-card.png",{},{"title":22512,"description":23080},"blog\u002Fguides\u002Fapi-to-find-a-company-website",[23086,23087,23088,10499],"company website api","company lookup","domain resolution","MlngHwq4d2tbP6zLZQRijQ26i50DOBI5_Lxure9sPnY",{"id":23091,"title":23092,"author":6,"body":23093,"category":2378,"cover":23722,"description":23723,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":23724,"meta":23725,"navigation":790,"ogImage":787,"path":23726,"publishedAt":792,"readTime":793,"seo":23727,"stem":23728,"tags":23729,"toolCategory":23285,"updatedAt":792,"__hash__":23734},"blogGuides\u002Fblog\u002Fguides\u002Fcompany-news-api-press-releases.md","Company News API: Press Releases Without the Newswire Contract",{"type":8,"value":23094,"toc":23708},[23095,23098,23104,23107,23111,23114,23120,23132,23176,23183,23210,23215,23228,23230,23235,23240,23245,23247,23283,23286,23290,23293,23296,23304,23315,23323,23334,23351,23359,23370,23374,23377,23380,23386,23389,23394,23402,23410,23419,23425,23432,23435,23447,23451,23454,23457,23460,23466,23476,23489,23505,23507,23609,23615,23618,23620,23626,23632,23638,23644,23651,23653,23656,23667,23676,23678,23684,23690,23696,23702,23706],[11,23096,23097],{},"Searching for a press release API usually turns up the newswires, and they are selling the opposite thing. PR Newswire, Business Wire and their peers are distribution: you pay them to put your announcement in front of journalists. If what you want is to read what has been published about a company, that is monitoring, and it is a different product.",[11,23099,23100,23101,23103],{},"This is about the monitoring half. Monid is ",[18,23102,21],{"href":20},", so the endpoint below sits on the same key as the company resolution that has to happen first.",[11,23105,23106],{},"Fair disclosure: you are on the Monid blog. The section near the end names where a dedicated media-monitoring platform is the right buy, and it is not a short list.",[27,23108,23110],{"id":23109},"is-there-an-api-for-press-releases-without-a-newswire-contract","Is there an API for press releases without a newswire contract?",[11,23112,23113],{},"Yes, for reading. Not for publishing, and the distinction is the whole first decision.",[11,23115,23116,23119],{},[38,23117,23118],{},"Distribution"," puts your release on the wire and into the syndication network that follows. That is what a newswire contract buys, it is priced accordingly, and no read API substitutes for it.",[11,23121,23122,23125,23126,23131],{},[38,23123,23124],{},"Monitoring"," returns what has been published, by anyone, about a company or a topic. That is a data problem, and ",[18,23127,23129],{"href":22808,"rel":23128},[124,125],[47,23130,22812],{}," does it:",[131,23133,23135],{"className":133,"code":23134,"language":135,"meta":136,"style":136},"monid inspect -p akta -e \u002Fv1\u002Fnews\nmonid run -p akta -e \u002Fv1\u002Fnews --query '{\"company\":\"https:\u002F\u002Fcanva.com\"}'\n",[47,23136,23137,23152],{"__ignoreMap":136},[140,23138,23139,23141,23143,23145,23147,23149],{"class":142,"line":143},[140,23140,147],{"class":146},[140,23142,151],{"class":150},[140,23144,154],{"class":150},[140,23146,401],{"class":150},[140,23148,160],{"class":150},[140,23150,23151],{"class":150}," \u002Fv1\u002Fnews\n",[140,23153,23154,23156,23158,23160,23162,23164,23167,23169,23171,23174],{"class":142,"line":166},[140,23155,147],{"class":146},[140,23157,171],{"class":150},[140,23159,154],{"class":150},[140,23161,401],{"class":150},[140,23163,160],{"class":150},[140,23165,23166],{"class":150}," \u002Fv1\u002Fnews",[140,23168,409],{"class":150},[140,23170,194],{"class":193},[140,23172,23173],{"class":150},"{\"company\":\"https:\u002F\u002Fcanva.com\"}",[140,23175,200],{"class":193},[11,23177,23178,23179,23182],{},"One thing about the input is worth knowing before you build: ",[38,23180,23181],{},"a bare company name is not accepted."," The endpoint takes a website or a company uuid, so a name has to be resolved first. That resolution is free:",[131,23184,23186],{"className":133,"code":23185,"language":135,"meta":136,"style":136},"monid run -p akta -e \u002Fv1\u002Fcompany\u002Fsearch --query '{\"query\":\"canva\"}'\n",[47,23187,23188],{"__ignoreMap":136},[140,23189,23190,23192,23194,23196,23198,23200,23202,23204,23206,23208],{"class":142,"line":143},[140,23191,147],{"class":146},[140,23193,171],{"class":150},[140,23195,154],{"class":150},[140,23197,401],{"class":150},[140,23199,160],{"class":150},[140,23201,406],{"class":150},[140,23203,409],{"class":150},[140,23205,194],{"class":193},[140,23207,22635],{"class":150},[140,23209,200],{"class":193},[11,23211,23212,23213,260],{},"Which makes the working shape a two-step: resolve the name to a company, then watch it. We covered the resolution half in ",[18,23214,18760],{"href":18759},[11,23216,23217,23218,23220,23221,23223,23224,23227],{},"The endpoint also takes a ",[47,23219,3880],{}," for open-ended themes, a ",[47,23222,2077],{}," match, and an ",[47,23225,23226],{},"industry"," filter that resolves against a taxonomy of tens of thousands of industry codes. So it is not only a company watcher: \"FDA drug approval\" or a commodity movement are equally valid inputs, which matters if your signal is a market rather than an account.",[232,23229,235],{"id":234},[11,23231,238,23232,244],{},[18,23233,243],{"href":241,"rel":23234},[124,125],[131,23236,23238],{"className":23237,"code":249,"language":97,"meta":136},[248],[47,23239,249],{"__ignoreMap":136},[11,23241,254,23242,260],{},[18,23243,259],{"href":257,"rel":23244},[124,125],[232,23246,264],{"id":263},[131,23248,23249],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,23250,23251,23261],{"__ignoreMap":136},[140,23252,23253,23255,23257,23259],{"class":142,"line":143},[140,23254,274],{"class":146},[140,23256,277],{"class":150},[140,23258,280],{"class":150},[140,23260,283],{"class":150},[140,23262,23263,23265,23267,23269,23271,23273,23275,23277,23279,23281],{"class":142,"line":166},[140,23264,147],{"class":146},[140,23266,290],{"class":150},[140,23268,293],{"class":150},[140,23270,296],{"class":150},[140,23272,299],{"class":193},[140,23274,302],{"class":150},[140,23276,305],{"class":183},[140,23278,308],{"class":193},[140,23280,311],{"class":150},[140,23282,314],{"class":150},[316,23284],{"category":23285},"company-news",[27,23287,23289],{"id":23288},"what-does-a-company-news-record-actually-contain","What does a company news record actually contain?",[11,23291,23292],{},"Twenty-seven fields, and the analysis you would otherwise build is already in them.",[11,23294,23295],{},"We ran one company query on 2026-08-17 and read a record end to end. The obvious fields are there: title, url, publisher, published date, author, full text. These are the ones that change what you build:",[11,23297,23298,23303],{},[38,23299,23300],{},[47,23301,23302],{},"ai_summary"," is a written summary of the article, in the record. If your pipeline was going to send each article to a model for summarisation, that step is already done and paid for.",[11,23305,23306,23314],{},[38,23307,23308,102,23311],{},[47,23309,23310],{},"sentiment",[47,23312,23313],{},"sentiment_score"," arrive as a label and a number. Same argument: the classification pass you were planning has happened.",[11,23316,23317,23322],{},[38,23318,23319],{},[47,23320,23321],{},"is_press_release"," separates a company's own announcement from independent coverage. This single boolean is the difference between measuring what a company said and measuring what the press said about it, and treating those as one number is the most common error in media reporting.",[11,23324,23325,23333],{},[38,23326,23327,102,23330],{},[47,23328,23329],{},"is_opinion",[47,23331,23332],{},"is_breaking"," do the same job for two other categories that should never be aggregated together.",[11,23335,23336,23350],{},[38,23337,23338,98,23341,98,23344,98,23347],{},[47,23339,23340],{},"naics_codes",[47,23342,23343],{},"sic_codes",[47,23345,23346],{},"iptc_codes",[47,23348,23349],{},"iab_categories"," put every article into four standard taxonomies at once. If you are joining news to a CRM segmented by industry code, the join key is in the record.",[11,23352,23353,23358],{},[38,23354,23355],{},[47,23356,23357],{},"newsworthiness_score"," ranks the article's significance, which is what you sort by when a query returns more than a person can read.",[11,23360,23361,23369],{},[38,23362,23363,102,23366],{},[47,23364,23365],{},"entities",[47,23367,23368],{},"company_mentions"," list what the article actually names, which turns out to matter more than it sounds.",[27,23371,23373],{"id":23372},"why-does-a-company-query-return-articles-that-look-unrelated","Why does a company query return articles that look unrelated?",[11,23375,23376],{},"Because it matches on mention, not on subject, and those diverge more than you would expect.",[11,23378,23379],{},"Here is the mistake, because we made it. Our first look at the results included an article titled \"Dog vacation checklist: 10 things to do before you leave\", returned for a query about a design software company. That looks like a broken relevance filter, and the obvious conclusion is that the endpoint is noisy.",[11,23381,23382,23383],{},"It is not. Every one of the ten articles genuinely referenced the company: that one names it as a tool for making a pet-care document. ",[38,23384,23385],{},"Ten out of ten were correct matches and most of them were not about the company at all.",[11,23387,23388],{},"That is the actual shape of company news monitoring, and it is not a defect to be filtered away at the source. A mention in a listicle is real evidence of surface area. It is just not coverage, and if you are reporting on how a company is being written about, mixing the two produces a number that goes up when nothing happened.",[11,23390,23391],{},[38,23392,23393],{},"The fix is downstream, and the fields for it are already in the record:",[11,23395,23396,23401],{},[38,23397,23398,23399],{},"Sort by ",[47,23400,23357],{}," rather than by date. The article that matters and the article that mentions you in passing arrive in the same response, and recency does not separate them.",[11,23403,23404,23409],{},[38,23405,23406,23407,260],{},"Split on ",[47,23408,23321],{}," A company's own announcements and what others wrote are two series. Reported as one, a busy PR month reads as momentum.",[11,23411,23412,23418],{},[38,23413,23414,23415,23417],{},"Check ",[47,23416,23368],{}," for position."," An article naming twenty companies is a roundup. One naming two is about a relationship.",[11,23420,23421,23424],{},[38,23422,23423],{},"Use the taxonomy codes to detect off-topic mentions."," An article coded to an industry unrelated to the company is a passing reference, and that is a rule you can write once rather than reading every row.",[11,23426,23427,23428,23431],{},"The general lesson, which applies beyond news: ",[38,23429,23430],{},"when a search returns something surprising, check whether it is wrong before deciding it is."," We nearly wrote that this endpoint had a relevance problem. It had a vocabulary problem, and the vocabulary was ours.",[421,23433],{"category":23285,"title":23434},"Browse the news and company endpoints, with live pricing",[320,23436,23437],{},[11,23438,324,23439,119,23441,23446],{},[38,23440,327],{},[18,23442,23445],{"href":23443,"rel":23444},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fbuild-a-company-news-watcher",[124,125],"building a company news watcher"," for the scheduled version of this.",[232,23448,23450],{"id":23449},"why-one-source-is-never-enough-for-company-news","Why one source is never enough for company news",[11,23452,23453],{},"The uncomfortable part of monitoring: coverage of a given company is uneven across providers in ways that do not average out.",[11,23455,23456],{},"Trade publications, regional press and non-English sources are where the differences live. A feed strong on US technology media can be thin on European manufacturing trade press, and the gap is invisible from inside the feed: you see articles, so it looks like it is working.",[11,23458,23459],{},"Three consequences worth designing around:",[11,23461,23462,23465],{},[38,23463,23464],{},"Absence proves nothing."," A quiet week may be a quiet week or a coverage gap, and no field distinguishes them. Any alert built on \"no news\" as a signal is unreliable in a way that never announces itself.",[11,23467,23468,23471,23472,23475],{},[38,23469,23470],{},"Language skews the sentiment."," The measured record carried an ",[47,23473,23474],{},"original_language"," field, which is there because feeds are not evenly multilingual. Aggregate sentiment across a company with heavy non-English coverage measures the English-language subset.",[11,23477,23478,23481,23482,23484,23485,23488],{},[38,23479,23480],{},"Syndication inflates counts."," One wire release republished across twenty outlets is twenty articles and one event. The ",[47,23483,23321],{}," flag plus the ",[47,23486,23487],{},"group_id"," in the record are what let you collapse them, and skipping that step is what makes coverage graphs spike on days nothing happened.",[11,23490,23491,23492,23496,23497,23501,23502,23504],{},"We wrote up the multi-source version of this argument in ",[18,23493,23495],{"href":23494},"\u002Fblog\u002Fwhy-one-vendor-cannot-cover-company-news","why one vendor cannot cover company news",". For the scheduled implementation rather than the ad-hoc query, ",[18,23498,23500],{"href":23499},"\u002Fblog\u002Fbuild-a-company-news-watcher","the company news watcher"," is the working build, and ",[18,23503,22187],{"href":466}," is the firmographic half of the same job.",[27,23506,480],{"id":479},[482,23508,23509,23521],{},[485,23510,23511],{},[488,23512,23513,23515,23517,23519],{},[491,23514,493],{},[491,23516,496],{},[491,23518,499],{},[491,23520,502],{},[504,23522,23523,23540,23559,23575,23593],{},[488,23524,23525,23528,23535,23538],{},[509,23526,23527],{},"News about a known company",[509,23529,23530],{},[18,23531,23533],{"href":22808,"rel":23532},[124,125],[47,23534,22812],{},[509,23536,23537],{},"Website or company uuid",[509,23539,524],{},[488,23541,23542,23545,23552,23557],{},[509,23543,23544],{},"News on a theme or commodity",[509,23546,23547],{},[18,23548,23550],{"href":22808,"rel":23549},[124,125],[47,23551,22812],{},[509,23553,23554,23555],{},"Open-ended ",[47,23556,3880],{},[509,23558,524],{},[488,23560,23561,23564,23571,23573],{},[509,23562,23563],{},"Resolve a name first, free",[509,23565,23566],{},[18,23567,23569],{"href":569,"rel":23568},[124,125],[47,23570,573],{},[509,23572,576],{},[509,23574,579],{},[488,23576,23577,23580,23588,23591],{},[509,23578,23579],{},"News about companies in Apollo",[509,23581,23582],{},[18,23583,23585],{"href":215,"rel":23584},[124,125],[47,23586,23587],{},"apollo \u002Fnews_articles\u002Fsearch",[509,23589,23590],{},"Organization ids",[509,23592,542],{},[488,23594,23595,23598,23605,23607],{},[509,23596,23597],{},"Read one article's page yourself",[509,23599,23600],{},[18,23601,23603],{"href":16654,"rel":23602},[124,125],[47,23604,16658],{},[509,23606,7168],{},[509,23608,542],{},[11,23610,600,23611,604,23613,16689],{},[47,23612,603],{},[47,23614,607],{},[11,23616,23617],{},"The shape to plan around: news bills per result plus a flat fee per run, so a daily watch across many companies is many small runs, and the flat fee is paid on each. Batching companies into fewer, larger runs costs less than looping one call per account.",[27,23619,657],{"id":656},[11,23621,23622,23625],{},[38,23623,23624],{},"You want distribution."," If the job is getting your announcement published, buy a newswire. This endpoint reads; it does not place.",[11,23627,23628,23631],{},[38,23629,23630],{},"You need guaranteed coverage of a specific publication."," A monitoring dataset covers what it covers. If a single trade publication is the one that matters to your industry, check it is in there before building on it, and consider a subscription to that source.",[11,23633,23634,23637],{},[38,23635,23636],{},"You need alerting infrastructure."," Dedicated monitoring platforms ship dashboards, share-of-voice reporting, alert routing and a UI for a comms team. We ship an endpoint. If the consumer is a communications department rather than a pipeline, buy the platform.",[11,23639,23640,23643],{},[38,23641,23642],{},"You need legal-grade archives."," Litigation and compliance want completeness and provenance guarantees that a commercial monitoring feed does not offer.",[11,23645,23646,687,23648,23650],{},[38,23647,686],{},[18,23649,691],{"href":690},". Run one small query, read the fields and the charge, then scale.",[27,23652,696],{"id":695},[11,23654,23655],{},"Press release APIs and company news APIs sound like the same product and sit on opposite sides of the transaction. One is distribution and is sold by the newswires. The other is monitoring, and it is a data problem with a per-call answer.",[11,23657,23658,23659,23662,23663,23666],{},"Two things matter more than the endpoint. ",[38,23660,23661],{},"A mention is not coverage",", and a query that correctly returns ten articles naming a company may return only two that are about it, so the split has to happen in your code and the fields for it are already in the record. And ",[38,23664,23665],{},"the analysis you were going to build is largely already there",": summary, sentiment, significance and four taxonomies arrive with the article, which changes the pipeline from \"fetch then process\" to \"fetch then filter\".",[11,23668,23669,23670,23672,23673,260],{},"Start with the free part: company resolution costs nothing, and ",[47,23671,607],{}," shows the news schema before you spend. Then run one company and read ten articles properly before deciding what the query is doing. Begin at ",[18,23674,725],{"href":723,"rel":23675},[124,125],[27,23677,729],{"id":728},[731,23679,23681],{"q":23680},"Can I publish a press release through this?",[11,23682,23683],{},"No. This reads published articles; it does not place them. Distribution is what a newswire contract buys and there is no API shortcut around it. If you need both, they are two purchases: a wire for publishing and a monitoring feed for reading what came back.",[731,23685,23687],{"q":23686},"Why do I have to resolve the company name first?",[11,23688,23689],{},"Because a name is ambiguous and the endpoint refuses to guess. It accepts a website or a company uuid, so two companies with the same name cannot silently merge into one feed. The resolution call that turns a name into candidates is free, which makes the two-step cheaper than a single fuzzy one would be, and considerably more honest about ambiguity.",[731,23691,23693],{"q":23692},"Is the sentiment score reliable enough to report?",[11,23694,23695],{},"Reliable enough to sort and filter by, not to report as a metric on its own. Article-level sentiment struggles with the cases that matter most: irony, a negative headline on a positive story, a neutral piece about a bad event. Use it to surface what to read, and have a person read the ones that will end up in a slide.",[731,23697,23699],{"q":23698},"How do I stop a roundup article inflating my numbers?",[11,23700,23701],{},"Read the mention list. An article naming twenty companies is a listicle and counting it the same as a profile is what makes coverage graphs meaningless. A simple rule on the number of companies mentioned, plus the press-release flag, removes most of the distortion, and both fields are in the record already.",[11,23703,23704],{},[758,23705,760],{},[762,23707,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":23709},[23710,23714,23715,23718,23719,23720,23721],{"id":23109,"depth":166,"text":23110,"children":23711},[23712,23713],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":23288,"depth":166,"text":23289},{"id":23372,"depth":166,"text":23373,"children":23716},[23717],{"id":23449,"depth":187,"text":23450},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fcompany-news-api-press-releases.png","PR Newswire sells distribution. Monitoring is the other half. What a news record carries, and why a mention is not the same as coverage.","\u002Fimg\u002Fblog\u002Fcompany-news-api-press-releases-card.png",{},"\u002Fblog\u002Fguides\u002Fcompany-news-api-press-releases",{"title":23092,"description":23723},"blog\u002Fguides\u002Fcompany-news-api-press-releases",[23730,23731,23732,23733],"company news api","press release api","media monitoring","signals","sNej6Efrp4PTE1477m3KyoCR24BAVUNybEI9zZ23zQU",{"id":23736,"title":23737,"author":6,"body":23738,"category":782,"cover":24272,"description":24273,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":24274,"meta":24275,"navigation":790,"ogImage":787,"path":24276,"publishedAt":792,"readTime":793,"seo":24277,"stem":24278,"tags":24279,"toolCategory":9684,"updatedAt":792,"__hash__":24284},"blogGuides\u002Fblog\u002Fguides\u002Fcrunchbase-api-alternatives-funding-data.md","Crunchbase API Alternatives: Getting Funding Data by the Call",{"type":8,"value":23739,"toc":24258},[23740,23743,23749,23752,23756,23759,23762,23768,23774,23777,23819,23824,23826,23831,23836,23841,23843,23879,23881,23885,23888,23894,23897,23903,23906,23914,23922,23926,23933,23950,23956,23959,23965,23971,23977,23984,23993,23997,24000,24009,24022,24035,24045,24056,24060,24063,24069,24075,24081,24087,24093,24095,24191,24199,24202,24204,24206,24209,24218,24226,24228,24234,24240,24246,24252,24256],[11,23741,23742],{},"Crunchbase and PitchBook are sold the way market data is sold: a seat, a contract, an annual number. That is the right shape if a team lives in the product all day, and the wrong shape if what you actually need is four fields attached to a domain inside a pipeline nobody logs into.",[11,23744,23745,23746,23748],{},"This is about the second case. Monid is ",[18,23747,21],{"href":20},", and company enrichment endpoints in the catalogue carry funding history alongside firmographics, which most people using them do not realise.",[11,23750,23751],{},"Fair disclosure: you are on the Monid blog. The section on when you genuinely need Crunchbase or PitchBook is not a courtesy, and for a real share of readers it is the answer.",[27,23753,23755],{"id":23754},"is-there-a-crunchbase-api-alternative-that-bills-per-call","Is there a Crunchbase API alternative that bills per call?",[11,23757,23758],{},"Yes, if what you need is funding fields on a company rather than a funding database you can query.",[11,23760,23761],{},"That distinction decides everything, so it is worth being precise about which you have.",[11,23763,23764,23767],{},[38,23765,23766],{},"A funding database"," answers questions like \"every Series B in fintech in Q2, sorted by size\". You are querying rounds. That is what Crunchbase and PitchBook sell, and no enrichment endpoint substitutes for it.",[11,23769,23770,23773],{},[38,23771,23772],{},"Funding fields on a company"," answers \"how much has this company raised, and when did they last do it\", for a company you already identified. That is a lookup, and enrichment endpoints carry it.",[11,23775,23776],{},"Most GTM work is the second. You have an account list, and you want the funding signal on those accounts, not a market map.",[131,23778,23780],{"className":133,"code":23779,"language":135,"meta":136,"style":136},"monid inspect -p pdl -e \u002Fv5\u002Fcompany\u002Fenrich\nmonid run -p pdl -e \u002Fv5\u002Fcompany\u002Fenrich -i '{\"website\":\"\u003Cdomain>\"}'\n",[47,23781,23782,23796],{"__ignoreMap":136},[140,23783,23784,23786,23788,23790,23792,23794],{"class":142,"line":143},[140,23785,147],{"class":146},[140,23787,151],{"class":150},[140,23789,154],{"class":150},[140,23791,9015],{"class":150},[140,23793,160],{"class":150},[140,23795,9387],{"class":150},[140,23797,23798,23800,23802,23804,23806,23808,23810,23812,23814,23817],{"class":142,"line":166},[140,23799,147],{"class":146},[140,23801,171],{"class":150},[140,23803,154],{"class":150},[140,23805,9015],{"class":150},[140,23807,160],{"class":150},[140,23809,9018],{"class":150},[140,23811,7819],{"class":150},[140,23813,194],{"class":193},[140,23815,23816],{"class":150},"{\"website\":\"\u003Cdomain>\"}",[140,23818,200],{"class":193},[11,23820,23821,23823],{},[47,23822,3936],{}," is free and prints the schema and price. The call bills per company, so a hundred accounts is a hundred calls and a market map is not on the menu.",[232,23825,235],{"id":234},[11,23827,238,23828,244],{},[18,23829,243],{"href":241,"rel":23830},[124,125],[131,23832,23834],{"className":23833,"code":249,"language":97,"meta":136},[248],[47,23835,249],{"__ignoreMap":136},[11,23837,254,23838,260],{},[18,23839,259],{"href":257,"rel":23840},[124,125],[232,23842,264],{"id":263},[131,23844,23845],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,23846,23847,23857],{"__ignoreMap":136},[140,23848,23849,23851,23853,23855],{"class":142,"line":143},[140,23850,274],{"class":146},[140,23852,277],{"class":150},[140,23854,280],{"class":150},[140,23856,283],{"class":150},[140,23858,23859,23861,23863,23865,23867,23869,23871,23873,23875,23877],{"class":142,"line":166},[140,23860,147],{"class":146},[140,23862,290],{"class":150},[140,23864,293],{"class":150},[140,23866,296],{"class":150},[140,23868,299],{"class":193},[140,23870,302],{"class":150},[140,23872,305],{"class":183},[140,23874,308],{"class":193},[140,23876,311],{"class":150},[140,23878,314],{"class":150},[316,23880],{"category":9684},[27,23882,23884],{"id":23883},"what-funding-fields-does-one-enrichment-call-actually-return","What funding fields does one enrichment call actually return?",[11,23886,23887],{},"Five, and they are more detailed than the field list suggests. We ran one call on 2026-08-17 and read what came back:",[131,23889,23892],{"className":23890,"code":23891,"language":97,"meta":136},[248],"total_funding_raised     a single cumulative figure\nlatest_funding_stage     e.g. \"debt_financing\"\nlast_funding_date        e.g. \"2026-06-09\"\nnumber_funding_rounds    e.g. 30\nfunding_stages           the full list of stage types the company has raised\n",[47,23893,23891],{"__ignoreMap":136},[11,23895,23896],{},"That last field is the one worth having. On the company we tested it listed fourteen distinct stage types across thirty rounds: seed through Series H, plus convertible notes, secondary market activity, corporate rounds, debt financing and undisclosed.",[11,23898,23899,23902],{},[38,23900,23901],{},"A stage list is a funding history in one field."," You cannot reconstruct dates or amounts per round from it, so it is not a substitute for a rounds table. What it does give you is shape: a company that has raised A through H is a different animal from one with a seed and a bridge, and the list says so without a second call.",[11,23904,23905],{},"Two more fields travel with it and matter for how you use the rest:",[11,23907,23908,23913],{},[38,23909,23910],{},[47,23911,23912],{},"employee_count_by_country"," turns a headcount into a footprint, which is usually the better segmentation axis for anything territory-shaped.",[11,23915,23916,23921],{},[38,23917,23918],{},[47,23919,23920],{},"likelihood"," is the provider's confidence that the company it matched is the one you asked for. It is the first field to read on any bulk run, because everything else is conditional on the match being right. It measures identity resolution and not field accuracy, so a high value does not mean the funding figures are current.",[27,23923,23925],{"id":23924},"where-does-this-data-get-funding-wrong","Where does this data get funding wrong?",[11,23927,23928,23929,23932],{},"In one specific and predictable place: ",[47,23930,23931],{},"latest_funding_stage"," on its own will mislead you.",[11,23934,23935,23936,23941,23942,23945,23946,23949],{},"On our measured company, that field read ",[38,23937,23938],{},[47,23939,23940],{},"debt_financing",". Read alone, that is a company taking on debt, which for most scoring models is a late, defensive or distressed signal. Read alongside ",[47,23943,23944],{},"funding_stages",", which listed Series A through H, and ",[47,23947,23948],{},"number_funding_rounds"," at thirty, the picture is completely different: a heavily funded company that recently added a debt facility on top of a long equity history.",[11,23951,23952,23955],{},[38,23953,23954],{},"The latest round is not the company's stage."," Debt, secondary sales, corporate rounds and convertible notes all show up as \"latest\" and none of them describes where a company sits in its lifecycle. A scoring rule keyed on that single field puts this company in the wrong bucket, and nothing in the response warns you.",[11,23957,23958],{},"Three more limits worth knowing before you build on this:",[11,23960,23961,23964],{},[38,23962,23963],{},"No per-round detail."," You get a total and a count, not a table. Which investor led which round is a database question and this is a lookup.",[11,23966,23967,23970],{},[38,23968,23969],{},"Cumulative totals include everything."," Debt and equity land in the same figure, so \"raised\" is not the same as \"raised in equity\", and comparisons between companies with different capital structures are not like for like.",[11,23972,23973,23976],{},[38,23974,23975],{},"Recency is not guaranteed."," The date field says when the last observed round was, not when the last round happened. A company that raised last week may not show it yet, and the response does not distinguish \"no round\" from \"no round we know about\".",[11,23978,23979,23980,23983],{},"The working rule: ",[38,23981,23982],{},"use these fields to segment and prioritise, not to state facts about a company in a document someone will act on."," If a number is going in front of an investment committee, buy the database.",[320,23985,23986],{},[11,23987,324,23988,119,23990,23992],{},[38,23989,327],{},[18,23991,17503],{"href":12459},", where we measured a company record whose self-reported size band disagreed with its counted headcount.",[232,23994,23996],{"id":23995},"how-to-use-funding-as-a-trigger-without-a-database","How to use funding as a trigger without a database",[11,23998,23999],{},"The reason anyone wants this data is timing, and timing does not need a rounds table.",[11,24001,24002,24005,24006,24008],{},[38,24003,24004],{},"Score on the stage list, not the latest stage."," A company whose ",[47,24007,23944],{}," ends at seed is early and buys differently from one that has raised through Series D, and that read survives whatever the most recent instrument happened to be. This is the fix for the trap above, expressed as a rule.",[11,24010,24011,119,24014,24017,24018,24021],{},[38,24012,24013],{},"Watch the date, not the total.",[47,24015,24016],{},"last_funding_date"," moving is the event. The cumulative figure barely changes what you do; a round two weeks old changes who picks up the phone. Pair the lookup with ",[18,24019,24020],{"href":23499},"a news watch on the same company"," and the announcement usually arrives before the enrichment record updates.",[11,24023,24024,24027,24028,24030,24031,24034],{},[38,24025,24026],{},"Combine with headcount, or you will misread the signal."," Money raised without hiring is a different situation from money raised with a hiring spree. The same record carries ",[47,24029,23912],{},", and postings data adds the direction of travel: we covered reading ",[18,24032,24033],{"href":791},"hiring as a buying signal"," separately.",[11,24036,24037,24040,24041,24044],{},[38,24038,24039],{},"Resolve first, always."," Funding fields hang off a company, and a company hangs off a resolved domain. That step is free, and getting it wrong attaches one company's funding history to another's name. The ",[18,24042,24043],{"href":18759},"resolution guide"," covers the ambiguity cases.",[11,24046,24047,24048,24051,24052,260],{},"For the cost comparison against a firmographics-only provider, we priced ",[18,24049,24050],{"href":9528},"the same job across two vendors"," previously, and for the wider question of leaving an enrichment subscription, ",[18,24053,24055],{"href":24054},"\u002Fblog\u002Fstopped-paying-clearbit-company-enrichment","that account is here",[27,24057,24059],{"id":24058},"when-do-you-actually-need-crunchbase-or-pitchbook","When do you actually need Crunchbase or PitchBook?",[11,24061,24062],{},"Four cases, and they are common.",[11,24064,24065,24068],{},[38,24066,24067],{},"You are querying the market, not a list."," \"Show me every company that raised a Series A in this sector in the last six months\" is a database query. There is no enrichment call that answers it, and framing it as one produces a worse version of the wrong thing.",[11,24070,24071,24074],{},[38,24072,24073],{},"You need round-level detail."," Investors, lead investors, valuations, terms. That data is licensed, expensively, and it is the product these vendors actually sell.",[11,24076,24077,24080],{},[38,24078,24079],{},"You need it defensible."," Diligence, board material, an investment memo. A cumulative figure from an enrichment API is a segmentation signal, not a citation, and the difference matters when someone asks where the number came from.",[11,24082,24083,24086],{},[38,24084,24085],{},"Your team lives in a UI."," Analysts browsing, saving searches, sharing lists. We ship an API and a CLI.",[11,24088,21679,24089,24092],{},[38,24090,24091],{},"buy the database when funding data is the product you are working on, and buy calls when it is one attribute on a list you are prioritising."," Most engineering-led GTM work is the second, and most investment work is the first.",[27,24094,480],{"id":479},[482,24096,24097,24109],{},[485,24098,24099],{},[488,24100,24101,24103,24105,24107],{},[491,24102,493],{},[491,24104,496],{},[491,24106,499],{},[491,24108,502],{},[504,24110,24111,24127,24143,24159,24175],{},[488,24112,24113,24116,24123,24125],{},[509,24114,24115],{},"Funding fields on a known company",[509,24117,24118],{},[18,24119,24121],{"href":569,"rel":24120},[124,125],[47,24122,592],{},[509,24124,22925],{},[509,24126,542],{},[488,24128,24129,24132,24139,24141],{},[509,24130,24131],{},"Firmographics plus assessment",[509,24133,24134],{},[18,24135,24137],{"href":569,"rel":24136},[124,125],[47,24138,22940],{},[509,24140,7213],{},[509,24142,3551],{},[488,24144,24145,24148,24155,24157],{},[509,24146,24147],{},"Resolve a name to a company first",[509,24149,24150],{},[18,24151,24153],{"href":569,"rel":24152},[124,125],[47,24154,573],{},[509,24156,576],{},[509,24158,579],{},[488,24160,24161,24164,24171,24173],{},[509,24162,24163],{},"Funding and launch news over time",[509,24165,24166],{},[18,24167,24169],{"href":22808,"rel":24168},[124,125],[47,24170,22812],{},[509,24172,18920],{},[509,24174,524],{},[488,24176,24177,24180,24187,24189],{},[509,24178,24179],{},"The company's own announcement",[509,24181,24182],{},[18,24183,24185],{"href":16654,"rel":24184},[124,125],[47,24186,16658],{},[509,24188,7168],{},[509,24190,542],{},[11,24192,600,24193,24195,24196,24198],{},[47,24194,603],{},". The billing column gives the shape rather than a figure, because figures move and ",[47,24197,607],{}," prints the current one for free.",[11,24200,24201],{},"The row worth pairing with the first: a news endpoint watching a resolved company catches the round when it is announced, which is the signal an annual snapshot misses by up to a year.",[421,24203],{"category":9684,"title":21110},[27,24205,696],{"id":695},[11,24207,24208],{},"There is a Crunchbase alternative for one of the two jobs people use Crunchbase for. Funding fields attached to companies you already have: yes, per call, alongside the firmographics you were fetching anyway. A queryable database of rounds and investors: no, and any vendor claiming otherwise is selling you a lookup with a search box on it.",[11,24210,24211,24212,24217],{},"Two things matter more than the choice. ",[38,24213,24214,24216],{},[47,24215,23931],{}," is not the company's stage",", and a scoring rule that treats it as one will file a Series H company as distressed the month it takes on debt. Read it with the stage list, always. And a cumulative total mixes debt with equity, so it ranks companies by capital raised rather than by anything about the business.",[11,24219,713,24220,24222,24223,260],{},[47,24221,607],{}," shows the full field list without spending, and resolution from a company name costs nothing, so you can build the domain list before deciding what to enrich. Begin at ",[18,24224,725],{"href":723,"rel":24225},[124,125],[27,24227,729],{"id":728},[731,24229,24231],{"q":24230},"Can I get investor names and round sizes this way?",[11,24232,24233],{},"No. The enrichment response carries a cumulative total, a count of rounds, the stage types and the last date, and nothing about who invested or how much per round. That is the licensed part of this market and it is what the database vendors sell. If you need it, buy it; a lookup endpoint returning it cheaply would be the surprising thing, not the missing one.",[731,24235,24237],{"q":24236},"How current is the funding data?",[11,24238,24239],{},"Current as of the last observation, which is not the same as current. The date field tells you when the most recent round it knows about happened, and there is no field distinguishing \"this company has not raised\" from \"we have not seen a round\". For anything time-sensitive, pair the lookup with a news endpoint on the same company: an announcement shows up there first.",[731,24241,24243],{"q":24242},"Does total funding include debt?",[11,24244,24245],{},"Yes, and that is the trap. The cumulative figure sums whatever rounds are recorded, debt facilities and convertible notes included, so two companies with the same total can have very different equity stories. If your model cares about the distinction, use the stage list to see what kinds of round make up the history rather than treating the total as an equity figure.",[731,24247,24249],{"q":24248},"Is this cheaper than a Crunchbase seat?",[11,24250,24251],{},"For the lookup job, yes, and the comparison is not really about price. A seat buys browsing, saved searches and a UI a person opens; a call buys one company's fields inside a pipeline. If nobody on your team would open the UI, you are paying for the half you do not use. If somebody would, the API does not replace them.",[11,24253,24254],{},[758,24255,760],{},[762,24257,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":24259},[24260,24264,24265,24268,24269,24270,24271],{"id":23754,"depth":166,"text":23755,"children":24261},[24262,24263],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":23883,"depth":166,"text":23884},{"id":23924,"depth":166,"text":23925,"children":24266},[24267],{"id":23995,"depth":187,"text":23996},{"id":24058,"depth":166,"text":24059},{"id":479,"depth":166,"text":480},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fcrunchbase-api-alternatives-funding-data.png","Crunchbase and PitchBook sell seats. If you only need funding fields on a domain, an enrichment call carries them. What it returns, and what it gets wrong.","\u002Fimg\u002Fblog\u002Fcrunchbase-api-alternatives-funding-data-card.png",{},"\u002Fblog\u002Fguides\u002Fcrunchbase-api-alternatives-funding-data",{"title":23737,"description":24273},"blog\u002Fguides\u002Fcrunchbase-api-alternatives-funding-data",[24280,24281,24282,24283],"crunchbase api","pitchbook api","funding data","company enrichment","hIIQ3v6JatTcrUxDJk_JLWH8K6KPZPOYtSkjZWv6QRI",{"id":4,"title":5,"author":6,"body":24286,"category":782,"cover":783,"description":784,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":788,"meta":24792,"navigation":790,"ogImage":787,"path":791,"publishedAt":792,"readTime":793,"seo":24793,"stem":795,"tags":24794,"toolCategory":318,"updatedAt":792,"__hash__":801},{"type":8,"value":24287,"toc":24775},[24288,24290,24294,24296,24298,24300,24304,24310,24316,24322,24328,24334,24346,24348,24350,24359,24403,24407,24416,24423,24425,24430,24435,24440,24442,24478,24480,24489,24491,24493,24495,24499,24503,24507,24511,24517,24519,24521,24547,24549,24551,24553,24555,24559,24563,24569,24577,24581,24583,24674,24680,24684,24686,24688,24690,24696,24700,24704,24708,24710,24714,24718,24722,24726,24732,24734,24736,24742,24751,24753,24757,24761,24765,24769,24773],[11,24289,13],{},[11,24291,16,24292,22],{},[18,24293,21],{"href":20},[11,24295,25],{},[27,24297,30],{"id":29},[11,24299,33],{},[11,24301,36,24302,41],{},[38,24303,40],{},[11,24305,24306,50],{},[38,24307,24308],{},[47,24309,49],{},[11,24311,24312,58],{},[38,24313,24314],{},[47,24315,57],{},[11,24317,24318,66],{},[38,24319,24320],{},[47,24321,65],{},[11,24323,24324,74],{},[38,24325,24326],{},[47,24327,73],{},[11,24329,77,24330,81,24332,85],{},[47,24331,80],{},[47,24333,84],{},[11,24335,24336,94,24340,98,24342,102,24344,106],{},[38,24337,24338,93],{},[47,24339,92],{},[47,24341,97],{},[47,24343,101],{},[47,24345,105],{},[27,24347,110],{"id":109},[11,24349,113],{},[11,24351,24352,119,24354,129],{},[38,24353,118],{},[18,24355,24357],{"href":122,"rel":24356},[124,125],[47,24358,128],{},[131,24360,24361],{"className":133,"code":134,"language":135,"meta":136,"style":136},[47,24362,24363,24377,24393],{"__ignoreMap":136},[140,24364,24365,24367,24369,24371,24373,24375],{"class":142,"line":143},[140,24366,147],{"class":146},[140,24368,151],{"class":150},[140,24370,154],{"class":150},[140,24372,157],{"class":150},[140,24374,160],{"class":150},[140,24376,163],{"class":150},[140,24378,24379,24381,24383,24385,24387,24389,24391],{"class":142,"line":166},[140,24380,147],{"class":146},[140,24382,171],{"class":150},[140,24384,154],{"class":150},[140,24386,157],{"class":150},[140,24388,160],{"class":150},[140,24390,180],{"class":150},[140,24392,184],{"class":183},[140,24394,24395,24397,24399,24401],{"class":142,"line":187},[140,24396,190],{"class":150},[140,24398,194],{"class":193},[140,24400,197],{"class":150},[140,24402,200],{"class":193},[11,24404,203,24405,207],{},[47,24406,206],{},[11,24408,24409,119,24411,220],{},[38,24410,212],{},[18,24412,24414],{"href":215,"rel":24413},[124,125],[47,24415,219],{},[11,24417,223,24418,230],{},[18,24419,24421],{"href":122,"rel":24420},[124,125],[47,24422,229],{},[232,24424,235],{"id":234},[11,24426,238,24427,244],{},[18,24428,243],{"href":241,"rel":24429},[124,125],[131,24431,24433],{"className":24432,"code":249,"language":97,"meta":136},[248],[47,24434,249],{"__ignoreMap":136},[11,24436,254,24437,260],{},[18,24438,259],{"href":257,"rel":24439},[124,125],[232,24441,264],{"id":263},[131,24443,24444],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,24445,24446,24456],{"__ignoreMap":136},[140,24447,24448,24450,24452,24454],{"class":142,"line":143},[140,24449,274],{"class":146},[140,24451,277],{"class":150},[140,24453,280],{"class":150},[140,24455,283],{"class":150},[140,24457,24458,24460,24462,24464,24466,24468,24470,24472,24474,24476],{"class":142,"line":166},[140,24459,147],{"class":146},[140,24461,290],{"class":150},[140,24463,293],{"class":150},[140,24465,296],{"class":150},[140,24467,299],{"class":193},[140,24469,302],{"class":150},[140,24471,305],{"class":183},[140,24473,308],{"class":193},[140,24475,311],{"class":150},[140,24477,314],{"class":150},[316,24479],{"category":318},[320,24481,24482],{},[11,24483,324,24484,119,24486,333],{},[38,24485,327],{},[18,24487,332],{"href":330,"rel":24488},[124,125],[27,24490,337],{"id":336},[11,24492,340],{},[11,24494,343],{},[11,24496,24497,349],{},[38,24498,348],{},[11,24500,24501,355],{},[38,24502,354],{},[11,24504,24505,361],{},[38,24506,360],{},[11,24508,24509,367],{},[38,24510,366],{},[11,24512,370,24513,374,24515,378],{},[38,24514,373],{},[47,24516,377],{},[232,24518,382],{"id":381},[11,24520,385],{},[131,24522,24523],{"className":133,"code":388,"language":135,"meta":136,"style":136},[47,24524,24525],{"__ignoreMap":136},[140,24526,24527,24529,24531,24533,24535,24537,24539,24541,24543,24545],{"class":142,"line":143},[140,24528,147],{"class":146},[140,24530,171],{"class":150},[140,24532,154],{"class":150},[140,24534,401],{"class":150},[140,24536,160],{"class":150},[140,24538,406],{"class":150},[140,24540,409],{"class":150},[140,24542,194],{"class":193},[140,24544,414],{"class":150},[140,24546,200],{"class":193},[11,24548,419],{},[421,24550],{"category":318,"title":423},[232,24552,427],{"id":426},[11,24554,430],{},[11,24556,24557,436],{},[38,24558,435],{},[11,24560,24561,442],{},[38,24562,441],{},[11,24564,24565,448,24567,451],{},[38,24566,447],{},[47,24568,80],{},[11,24570,454,24571,458,24573,463,24575,468],{},[38,24572,457],{},[18,24574,462],{"href":461},[18,24576,467],{"href":466},[11,24578,471,24579,476],{},[18,24580,475],{"href":474},[27,24582,480],{"id":479},[482,24584,24585,24597],{},[485,24586,24587],{},[488,24588,24589,24591,24593,24595],{},[491,24590,493],{},[491,24592,496],{},[491,24594,499],{},[491,24596,502],{},[504,24598,24599,24614,24629,24644,24659],{},[488,24600,24601,24603,24610,24612],{},[509,24602,511],{},[509,24604,24605],{},[18,24606,24608],{"href":122,"rel":24607},[124,125],[47,24609,128],{},[509,24611,521],{},[509,24613,524],{},[488,24615,24616,24618,24625,24627],{},[509,24617,529],{},[509,24619,24620],{},[18,24621,24623],{"href":215,"rel":24622},[124,125],[47,24624,219],{},[509,24626,539],{},[509,24628,542],{},[488,24630,24631,24633,24640,24642],{},[509,24632,547],{},[509,24634,24635],{},[18,24636,24638],{"href":122,"rel":24637},[124,125],[47,24639,229],{},[509,24641,557],{},[509,24643,542],{},[488,24645,24646,24648,24655,24657],{},[509,24647,564],{},[509,24649,24650],{},[18,24651,24653],{"href":569,"rel":24652},[124,125],[47,24654,573],{},[509,24656,576],{},[509,24658,579],{},[488,24660,24661,24663,24670,24672],{},[509,24662,584],{},[509,24664,24665],{},[18,24666,24668],{"href":569,"rel":24667},[124,125],[47,24669,592],{},[509,24671,595],{},[509,24673,542],{},[11,24675,600,24676,604,24678,608],{},[47,24677,603],{},[47,24679,607],{},[11,24681,611,24682,614],{},[47,24683,206],{},[232,24685,618],{"id":617},[11,24687,621],{},[11,24689,624],{},[11,24691,24692,630,24694,635],{},[38,24693,629],{},[18,24695,634],{"href":633},[11,24697,24698,641],{},[38,24699,640],{},[11,24701,24702,647],{},[38,24703,646],{},[11,24705,650,24706,653],{},[47,24707,229],{},[27,24709,657],{"id":656},[11,24711,24712,663],{},[38,24713,662],{},[11,24715,24716,669],{},[38,24717,668],{},[11,24719,24720,675],{},[38,24721,674],{},[11,24723,24724,681],{},[38,24725,680],{},[11,24727,24728,687,24730,692],{},[38,24729,686],{},[18,24731,691],{"href":690},[27,24733,696],{"id":695},[11,24735,699],{},[11,24737,702,24738,706,24740,710],{},[38,24739,705],{},[38,24741,709],{},[11,24743,713,24744,717,24746,720,24748,260],{},[47,24745,716],{},[47,24747,607],{},[18,24749,725],{"href":723,"rel":24750},[124,125],[27,24752,729],{"id":728},[731,24754,24755],{"q":733},[11,24756,736],{},[731,24758,24759],{"q":739},[11,24760,742],{},[731,24762,24763],{"q":745},[11,24764,748],{},[731,24766,24767],{"q":751},[11,24768,754],{},[11,24770,24771],{},[758,24772,760],{},[762,24774,764],{},{"title":136,"searchDepth":166,"depth":166,"links":24776},[24777,24778,24782,24786,24789,24790,24791],{"id":29,"depth":166,"text":30},{"id":109,"depth":166,"text":110,"children":24779},[24780,24781],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":336,"depth":166,"text":337,"children":24783},[24784,24785],{"id":381,"depth":187,"text":382},{"id":426,"depth":187,"text":427},{"id":479,"depth":166,"text":480,"children":24787},[24788],{"id":617,"depth":187,"text":618},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},{},{"title":5,"description":784},[797,798,799,800],{"id":24796,"title":24797,"author":6,"body":24798,"category":782,"cover":25282,"description":25283,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":25284,"meta":25285,"navigation":790,"ogImage":787,"path":633,"publishedAt":792,"readTime":793,"seo":25286,"stem":25287,"tags":25288,"toolCategory":9684,"updatedAt":792,"__hash__":25292},"blogGuides\u002Fblog\u002Fguides\u002Ftechnographic-data-platforms-vs-per-call.md","Technographic Data Platforms vs One API Call: What You Give Up",{"type":8,"value":24799,"toc":25269},[24800,24803,24809,24812,24816,24819,24825,24831,24834,24840,24847,24850,24860,24864,24867,24870,24876,24885,24891,24897,24900,24906,24908,24919,24923,24926,24929,24935,24941,24947,24953,24958,24965,24971,24974,24978,24981,24990,25002,25010,25020,25027,25034,25036,25135,25141,25148,25150,25154,25157,25163,25176,25182,25188,25191,25193,25199,25205,25211,25216,25218,25221,25231,25239,25241,25247,25253,25259,25265],[11,24801,24802],{},"Technographic platforms sell a promise that sounds unarguable: know what every company runs, target accordingly. The pitch works because the alternative sounds worse, and nobody selling it shows you what a detection actually returns.",[11,24804,24805,24806,24808],{},"So we ran one. Monid is ",[18,24807,21],{"href":20},", and a stack-detection endpoint is in the catalogue, which means we can show the output rather than describe it.",[11,24810,24811],{},"Fair disclosure: you are on the Monid blog, and the endpoint we ran is one we resell. The measured result below is the least flattering thing in this guide and it is the reason to read it.",[27,24813,24815],{"id":24814},"what-does-a-per-call-stack-detection-actually-return","What does a per-call stack detection actually return?",[11,24817,24818],{},"Less than the field list implies. We ran a detection against a large, well-known SaaS domain on 2026-08-17.",[11,24820,24821,24822],{},"The response carried fourteen structured fields. ",[38,24823,24824],{},"Seven came back empty:",[131,24826,24829],{"className":24827,"code":24828,"language":97,"meta":136},[248],"empty:      frontend_framework, meta_framework, css_framework, analytics,\n            cms, payment_processor, chat_widget\npopulated:  cdn, hosting_provider, email_provider, domain, plus the\n            detected list below\n",[47,24830,24828],{"__ignoreMap":136},[11,24832,24833],{},"The detection list held four items, every one at high confidence:",[131,24835,24838],{"className":24836,"code":24837,"language":97,"meta":136},[248],"Cloudflare              CDN\nAmazon Web Services     Hosting\nGoogle Workspace        Email Provider\nCustom font             Typography\n",[47,24839,24837],{"__ignoreMap":136},[11,24841,24842,24843,24846],{},"Read that list again, because the pattern in it is the finding. ",[38,24844,24845],{},"Everything detected sits at the infrastructure layer."," CDN, hosting, corporate email, a font. Nothing about the application: no framework, no analytics, no payments, no support tooling.",[11,24848,24849],{},"Those are exactly the fields a GTM team wants. Nobody segments an account list by CDN. They segment by whether a company runs a competing product, uses a particular analytics suite, or has a payment processor that implies a business model.",[11,24851,24852,24855,24856,24859],{},[38,24853,24854],{},"The empty fields are the ones you would have bought this for",", and the response does not distinguish \"not present\" from \"not detected\". A null in ",[47,24857,24858],{},"analytics"," does not mean the company runs no analytics. It means the detector did not find any, on the page it looked at, at that moment.",[27,24861,24863],{"id":24862},"why-do-detections-miss-so-much","Why do detections miss so much?",[11,24865,24866],{},"Because a detection reads one page's shipped markup, and modern applications hide almost everything from it.",[11,24868,24869],{},"Four reasons, and they compound:",[11,24871,24872,24875],{},[38,24873,24874],{},"The marketing site is not the product."," A detector fetches a homepage. The application lives behind a login, on a different subdomain, built with a different stack. What you learn about is the marketing team's CMS choice, and often not even that.",[11,24877,24878,24881,24882,24884],{},[38,24879,24880],{},"Tag managers hide the tags."," Analytics, chat widgets and A\u002FB tools increasingly load through a single container, or server-side. The detector sees the container and nothing inside it, which is why ",[47,24883,24858],{}," can be empty on a company that certainly measures its traffic.",[11,24886,24887,24890],{},[38,24888,24889],{},"Build tooling erases its own fingerprints."," Compiled, minified and hashed output does not announce the framework that produced it. The absence of a framework signal is evidence about the build pipeline, not about the framework.",[11,24892,24893,24896],{},[38,24894,24895],{},"Payment processors appear at checkout."," No checkout on the homepage, no processor detected. This one is nearly guaranteed and it is a field people rely on.",[11,24898,24899],{},"The honest reading of our result: it tells you the company is on Cloudflare and AWS, which is true and worth little, because so is a large share of the internet.",[11,24901,24902,24905],{},[38,24903,24904],{},"Detection is high-precision and low-recall."," What it finds is almost always right; what it does not find is unknown. Treat a positive as evidence and a null as no information, and never as a negative.",[316,24907],{"category":9684},[320,24909,24910],{},[11,24911,324,24912,119,24914,24918],{},[38,24913,327],{},[18,24915,24917],{"href":24916},"\u002Fblog\u002Fguides\u002Ftechnographic-data-api","the per-domain detection guide"," for the mechanics of running one.",[27,24920,24922],{"id":24921},"when-is-a-technographic-platform-worth-its-price","When is a technographic platform worth its price?",[11,24924,24925],{},"When you need the fields a page read cannot reach, and that is more often than the per-call story admits.",[11,24927,24928],{},"The platforms are expensive because the hard part is not detecting a technology on a page. It is everything around that:",[11,24930,24931,24934],{},[38,24932,24933],{},"Panel and partner data."," The good ones supplement page detection with data from sources that see beyond public markup. That is what fills the fields our run left empty, and it is licensed rather than derived.",[11,24936,24937,24940],{},[38,24938,24939],{},"History."," \"Which companies switched off a competitor last quarter\" is the highest-value technographic question there is, and it requires having watched. A call today cannot answer a question about last quarter.",[11,24942,24943,24946],{},[38,24944,24945],{},"Coverage as a dataset."," A platform has already scanned millions of domains, so you can query the population. Per-call detection can only answer about domains you name, which means you cannot discover an account list this way, only annotate one.",[11,24948,24949,24952],{},[38,24950,24951],{},"Normalisation."," Twenty ways of naming the same product, mapped to one. That work is invisible until you try to group your own results and find three spellings of one vendor.",[11,24954,24955],{},[38,24956,24957],{},"The honest split:",[11,24959,24960,24961,24964],{},"Buy the ",[38,24962,24963],{},"platform"," when technographics drive segmentation, when you need to discover accounts by what they run, or when change over time is the signal.",[11,24966,24960,24967,24970],{},[38,24968,24969],{},"call"," when you already have the account, when you want to annotate a record at signup or in a workflow, and when infrastructure-level facts are enough for the decision.",[11,24972,24973],{},"The second is a smaller job than the platform pitch implies, and it is also the more common one in an engineering-led pipeline.",[232,24975,24977],{"id":24976},"the-signals-that-actually-reach-the-application-layer","The signals that actually reach the application layer",[11,24979,24980],{},"If markup detection cannot see past the marketing site, the question becomes which public evidence can. Four sources, roughly in order of how much they tell you per item.",[11,24982,24983,24986,24987,24989],{},[38,24984,24985],{},"Job postings."," The strongest, and the most under-used. A description naming a database, a cloud, a CRM or an analytics suite was written by someone who had to be certain enough to hire against it. It reaches the application layer by definition, because that is what the person will be working on. We wrote up ",[18,24988,20965],{"href":791}," separately, and it applies directly here.",[11,24991,24992,24995,24996,25001],{},[38,24993,24994],{},"The company's own writing."," Engineering blog posts and conference talks name the stack on purpose. ",[18,24997,24999],{"href":16654,"rel":24998},[124,125],[47,25000,16658],{}," turns those pages into text for a fraction of what a detection costs, and the text says more.",[11,25003,25004,25007,25008,260],{},[38,25005,25006],{},"Announcements."," Vendor partnerships, integrations and migrations get press releases, and a news watch on an account catches them. The pattern is covered in ",[18,25009,23445],{"href":23499},[11,25011,25012,25015,25016,25019],{},[38,25013,25014],{},"Firmographics as context."," Not a stack signal, but the thing that makes one interpretable: the same technology means different things at fifty people and five thousand. ",[18,25017,25018],{"href":461},"Turning a domain into full firmographics"," is the step that supplies it.",[11,25021,25022,25023,25026],{},"The pattern across all four: ",[38,25024,25025],{},"the readable signals are the ones a human wrote on purpose."," Detection reads what a machine emitted by accident, which is why it finds infrastructure and misses intent. If you need to know what a company decided, look for where someone said so.",[11,25028,25029,25030,25033],{},"For the segmentation job this feeds, ",[18,25031,25032],{"href":474},"wiring up an ICP prospect search"," is the downstream half.",[27,25035,480],{"id":479},[482,25037,25038,25050],{},[485,25039,25040],{},[488,25041,25042,25044,25046,25048],{},[491,25043,493],{},[491,25045,496],{},[491,25047,499],{},[491,25049,502],{},[504,25051,25052,25070,25086,25101,25118],{},[488,25053,25054,25057,25065,25067],{},[509,25055,25056],{},"Detect one domain's stack",[509,25058,25059],{},[18,25060,25062],{"href":569,"rel":25061},[124,125],[47,25063,25064],{},"strale \u002Fx402\u002Fcompany-tech-stack",[509,25066,7213],{},[509,25068,25069],{},"Per call, the priciest row here",[488,25071,25072,25075,25082,25084],{},[509,25073,25074],{},"Enrich the company itself",[509,25076,25077],{},[18,25078,25080],{"href":569,"rel":25079},[124,125],[47,25081,592],{},[509,25083,595],{},[509,25085,542],{},[488,25087,25088,25090,25097,25099],{},[509,25089,23563],{},[509,25091,25092],{},[18,25093,25095],{"href":569,"rel":25094},[124,125],[47,25096,573],{},[509,25098,576],{},[509,25100,579],{},[488,25102,25103,25106,25113,25115],{},[509,25104,25105],{},"Read the site's own text",[509,25107,25108],{},[18,25109,25111],{"href":16654,"rel":25110},[124,125],[47,25112,16658],{},[509,25114,7168],{},[509,25116,25117],{},"Per call, a fraction of the above",[488,25119,25120,25123,25130,25133],{},[509,25121,25122],{},"Hiring as a stack signal",[509,25124,25125],{},[18,25126,25128],{"href":122,"rel":25127},[124,125],[47,25129,128],{},[509,25131,25132],{},"Titles, locations",[509,25134,524],{},[11,25136,600,25137,604,25139,16689],{},[47,25138,603],{},[47,25140,607],{},[11,25142,25143,25144,25147],{},"That last row is the one worth taking seriously. ",[38,25145,25146],{},"A job posting naming a technology is stronger evidence than a page detection",", because someone was confident enough to hire against it. It is also cheaper per record and reaches the application layer that markup detection cannot. If the question is \"what does this company run\", read what they are hiring for before you scan their homepage.",[421,25149],{"category":9684,"title":21110},[232,25151,25153],{"id":25152},"how-to-measure-a-detector-before-you-trust-it","How to measure a detector before you trust it",[11,25155,25156],{},"Run this before any purchase, platform or per-call. It takes twenty domains and half an hour.",[11,25158,25159,25162],{},[38,25160,25161],{},"Pick companies whose stack you already know."," Customers, partners, your own company. Ground truth is what makes the test worth anything, and it is the step people skip because it feels like cheating.",[11,25164,25165,25168,25169,25172,25173,25175],{},[38,25166,25167],{},"Count fill rate per field, not overall."," A detector with 60% overall coverage that fills ",[47,25170,25171],{},"cdn"," reliably and ",[47,25174,24858],{}," never is useless for a GTM team and fine for an infrastructure survey. The aggregate number hides exactly the distinction you are buying on.",[11,25177,25178,25181],{},[38,25179,25180],{},"Count false negatives explicitly."," For each domain where you know a technology is present, record whether the detector found it. That number is the one no vendor publishes and the only one that predicts your experience.",[11,25183,25184,25187],{},[38,25185,25186],{},"Check whether nulls are distinguishable from absences."," Ask the vendor, and if the answer is that they are not, your scoring rule needs to treat every empty field as unknown.",[11,25189,25190],{},"Twenty domains is enough to see the shape. If the fields you care about fill on fewer than half, the tool is not wrong, it is answering a different question than the one you have.",[27,25192,657],{"id":656},[11,25194,25195,25198],{},[38,25196,25197],{},"Technographics are your primary segmentation."," If your ICP is defined by what companies run, buy a platform. A per-call endpoint cannot discover accounts, only describe ones you name, and that is the wrong shape for building a list.",[11,25200,25201,25204],{},[38,25202,25203],{},"You need change over time."," Switching signals require history and history requires having collected it. Start collecting today if you like, but a platform already has three years.",[11,25206,25207,25210],{},[38,25208,25209],{},"You need application-layer detail reliably."," As measured above, that is where per-call detection is weakest, and the gaps are systematic rather than random.",[11,25212,25213,25215],{},[38,25214,686],{}," Our own run returned half its fields empty at full price, which is the sharpest example in this guide of a rule that holds across this catalogue: metadata describes intent and a run describes behaviour. Run one before you size a batch, on any vendor, ours included.",[27,25217,696],{"id":695},[11,25219,25220],{},"Technographic detection by API is real, cheap relative to a platform, and much narrower than the field list suggests. Our measured run returned four technologies, all infrastructure, and left empty every field a GTM team would have bought it for.",[11,25222,21862,25223,25226,25227,25230],{},[38,25224,25225],{},"A null is not a negative",": detection is high-precision and low-recall, so the absence of a signal tells you about the detector rather than the company, and any scoring rule that treats empty as \"does not use\" will be confidently wrong. And ",[38,25228,25229],{},"hiring data reaches the application layer that markup detection cannot",", because a job ad names the stack on purpose while a compiled bundle hides it by accident.",[11,25232,23669,25233,25235,25236,260],{},[47,25234,607],{}," shows the detection schema before you spend. Then run one domain you already know the answer for, and count how many fields come back empty. That number is your real coverage rate, and it is the one no vendor page publishes. Begin at ",[18,25237,725],{"href":723,"rel":25238},[124,125],[27,25240,729],{"id":728},[731,25242,25244],{"q":25243},"Does an empty field mean the company does not use that technology?",[11,25245,25246],{},"No, and this is the error that ruins technographic scoring. It means the detector did not find it on the page it read. Tag managers hide analytics, checkout-only scripts hide payment processors, and compiled bundles hide frameworks. Treat a populated field as evidence and an empty one as no information, never as a negative.",[731,25248,25250],{"q":25249},"Why did the detection only find infrastructure?",[11,25251,25252],{},"Because infrastructure announces itself and applications do not. A CDN and a host are visible in headers and IP ranges, corporate email shows in DNS records, and none of those can be hidden without breaking the site. Application choices ship as compiled output with their fingerprints removed, so the layer you care about is the layer designed not to be readable.",[731,25254,25256],{"q":25255},"Can I detect what a company runs behind a login?",[11,25257,25258],{},"Not by scanning. A page read reaches public markup only, and the product is not public. The signals that do reach it are indirect: job postings naming the stack, engineering blog posts, conference talks, and public repositories. Those are weaker per item and, in aggregate, more informative than a homepage scan.",[731,25260,25262],{"q":25261},"Is per-call detection cheaper than a platform?",[11,25263,25264],{},"Per account, yes, by a wide margin. Per useful answer, it depends entirely on which fields you need: cheap detection that returns nothing on the field you care about is not cheaper than an expensive one that returns it. Run a sample of domains you already know and count the fill rate on your fields before comparing prices at all.",[11,25266,25267],{},[758,25268,760],{},{"title":136,"searchDepth":166,"depth":166,"links":25270},[25271,25272,25273,25276,25279,25280,25281],{"id":24814,"depth":166,"text":24815},{"id":24862,"depth":166,"text":24863},{"id":24921,"depth":166,"text":24922,"children":25274},[25275],{"id":24976,"depth":187,"text":24977},{"id":479,"depth":166,"text":480,"children":25277},[25278],{"id":25152,"depth":187,"text":25153},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Ftechnographic-data-platforms-vs-per-call.png","We ran a stack detection on a major site and half the fields came back empty. What per-call detection sees, and when a platform earns its price.","\u002Fimg\u002Fblog\u002Ftechnographic-data-platforms-vs-per-call-card.png",{},{"title":24797,"description":25283},"blog\u002Fguides\u002Ftechnographic-data-platforms-vs-per-call",[25289,25290,25291,800],"technographic data","tech stack detection","b2b targeting","1XGcaPFdvpUlardTsOsDQi0tn9FkXwpD9O719bG5n5k",{"id":25294,"title":25295,"author":6,"body":25296,"category":8203,"cover":25926,"description":25927,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":25928,"meta":25929,"navigation":790,"ogImage":787,"path":13893,"publishedAt":25930,"readTime":793,"seo":25931,"stem":25932,"tags":25933,"toolCategory":25486,"updatedAt":25930,"__hash__":25936},"blogGuides\u002Fblog\u002Fguides\u002Fbest-social-media-scraping-api-2026.md","What Is the Best API for Social Media Scraping in 2026?",{"type":8,"value":25297,"toc":25906},[25298,25301,25307,25310,25314,25317,25320,25323,25330,25342,25346,25349,25355,25361,25367,25369,25374,25379,25384,25386,25422,25426,25476,25484,25487,25491,25494,25497,25500,25513,25519,25525,25528,25540,25544,25677,25685,25689,25695,25719,25726,25730,25737,25744,25747,25750,25754,25757,25762,25767,25770,25786,25790,25793,25796,25803,25809,25813,25816,25819,25826,25828,25834,25840,25846,25851,25853,25856,25859,25862,25874,25876,25882,25888,25893,25899,25903],[11,25299,25300],{},"Ask which API is best for social media scraping and the answer comes back as a list of general-purpose scrapers. That list is not wrong, but it answers a question about vendors when the thing in your way is the platforms.",[11,25302,25303,25304,25306],{},"Six networks, six different page structures, six different sets of what is public, and no single scraper that is best at all of them. Monid is ",[18,25305,21],{"href":20},", so we resell most of the options below rather than being one of them, which is why this can be a comparison rather than a pitch.",[11,25308,25309],{},"Fair disclosure: you are on the Monid blog. The section near the end says where a single vendor beats us, and it is not a token paragraph.",[27,25311,25313],{"id":25312},"why-is-one-api-never-enough-for-social","Why is one API never enough for social?",[11,25315,25316],{},"Because the platforms diverge in the two places that decide everything: what they expose publicly, and what shape it comes back in.",[11,25318,25319],{},"TikTok hands over a profile and its full post history cheaply, because that is what the page renders. LinkedIn withholds most identity from a logged-out visitor, so an employee list comes back with names missing. Instagram returns rich engagement on public accounts and nothing at all on private ones. X, YouTube and Reddit each have their own version of the same story.",[11,25321,25322],{},"A generic scraper handles the fetching, which is the part that is close to solved. What it does not do is know that a TikTok profile record and a LinkedIn profile record are different objects with different missing fields. That knowledge lives in per-platform endpoints, and it is why the catalogue for social is a list of specialists rather than one tool.",[11,25324,25325,25326,25329],{},"The corollary is the practical one: ",[38,25327,25328],{},"a serious social project uses several endpoints, so the thing to optimise is not which vendor, it is how much friction each new one adds."," That is a different question, and it has a different answer.",[320,25331,25332],{},[11,25333,324,25334,119,25336,25341],{},[38,25335,327],{},[18,25337,25340],{"href":25338,"rel":25339},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fapify-vs-tikhub-tiktok-scraping",[124,125],"Apify vs TikHub for TikTok scraping",", which takes one network and compares two providers on it directly.",[27,25343,25345],{"id":25344},"what-is-the-best-api-for-social-media-scraping","What is the best API for social media scraping?",[11,25347,25348],{},"The one that covers the network you are on, and there are three shapes worth knowing.",[11,25350,25351,25354],{},[38,25352,25353],{},"Per-platform specialists."," TikHub for TikTok, X, YouTube and Instagram; harvestapi for LinkedIn. Deep coverage of one network, records that match how that platform actually works.",[11,25356,25357,25360],{},[38,25358,25359],{},"Generalist actor marketplaces."," Apify's actors cover many platforms with a shared interface. Broader, and the depth varies by actor.",[11,25362,25363,25366],{},[38,25364,25365],{},"Aggregation layers."," One key over several providers, so the friction of adding the fourth platform is a parameter rather than a signup. Monid is this shape.",[232,25368,235],{"id":234},[11,25370,238,25371,244],{},[18,25372,243],{"href":241,"rel":25373},[124,125],[131,25375,25377],{"className":25376,"code":249,"language":97,"meta":136},[248],[47,25378,249],{"__ignoreMap":136},[11,25380,254,25381,260],{},[18,25382,259],{"href":257,"rel":25383},[124,125],[232,25385,264],{"id":263},[131,25387,25388],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,25389,25390,25400],{"__ignoreMap":136},[140,25391,25392,25394,25396,25398],{"class":142,"line":143},[140,25393,274],{"class":146},[140,25395,277],{"class":150},[140,25397,280],{"class":150},[140,25399,283],{"class":150},[140,25401,25402,25404,25406,25408,25410,25412,25414,25416,25418,25420],{"class":142,"line":166},[140,25403,147],{"class":146},[140,25405,290],{"class":150},[140,25407,293],{"class":150},[140,25409,296],{"class":150},[140,25411,299],{"class":193},[140,25413,302],{"class":150},[140,25415,305],{"class":183},[140,25417,308],{"class":193},[140,25419,311],{"class":150},[140,25421,314],{"class":150},[232,25423,25425],{"id":25424},"start-by-asking-what-covers-your-network","Start by asking what covers your network",[131,25427,25429],{"className":133,"code":25428,"language":135,"meta":136,"style":136},"monid discover -q \"tiktok profile posts\"\nmonid discover -q \"twitter user tweets\"\nmonid inspect -p apify -e \u002Fapidojo\u002Ftiktok-profile-scraper\n",[47,25430,25431,25446,25461],{"__ignoreMap":136},[140,25432,25433,25435,25437,25439,25441,25444],{"class":142,"line":143},[140,25434,147],{"class":146},[140,25436,2667],{"class":150},[140,25438,2670],{"class":150},[140,25440,2673],{"class":193},[140,25442,25443],{"class":150},"tiktok profile posts",[140,25445,2679],{"class":193},[140,25447,25448,25450,25452,25454,25456,25459],{"class":142,"line":166},[140,25449,147],{"class":146},[140,25451,2667],{"class":150},[140,25453,2670],{"class":150},[140,25455,2673],{"class":193},[140,25457,25458],{"class":150},"twitter user tweets",[140,25460,2679],{"class":193},[140,25462,25463,25465,25467,25469,25471,25473],{"class":142,"line":187},[140,25464,147],{"class":146},[140,25466,151],{"class":150},[140,25468,154],{"class":150},[140,25470,157],{"class":150},[140,25472,160],{"class":150},[140,25474,25475],{"class":150}," \u002Fapidojo\u002Ftiktok-profile-scraper\n",[11,25477,25478,25479,102,25481,25483],{},"Both ",[47,25480,4274],{},[47,25482,3936],{}," are free, so surveying the field for a new platform costs nothing. That is the step most comparisons skip, and it is the one that stops you buying before you know whether the fields you need are in the payload.",[316,25485],{"category":25486},"social-media",[27,25488,25490],{"id":25489},"how-do-i-build-a-lead-enrichment-workflow-that-finds-social-profiles","How do I build a lead enrichment workflow that finds social profiles?",[11,25492,25493],{},"Work from the identifier you hold, and do not try to do it in one call.",[11,25495,25496],{},"This question comes up constantly in automation communities, and it goes wrong the same way each time: someone looks for a single endpoint that turns a name into every profile that person has. That endpoint does not exist, because the platforms do not share identity.",[11,25498,25499],{},"What works is a chain, cheapest step first.",[11,25501,25502,25505,25506,25508,25509,25512],{},[38,25503,25504],{},"Start from the strongest identifier."," A company domain or a LinkedIn URL is worth far more than a name. ",[47,25507,592],{}," turns a domain into a company record; ",[47,25510,25511],{},"harvestapi\u002Flinkedin-company-employees"," turns a company URL into people.",[11,25514,25515,25518],{},[38,25516,25517],{},"Filter before you enrich."," Enrichment costs an order of magnitude more than a lookup, so cut the list first on whatever you already have. Paying premium rates to learn about people you will never contact is the most common waste in this pipeline.",[11,25520,25521,25524],{},[38,25522,25523],{},"Add social last, and only where it earns its place."," A TikTok or Instagram handle matters for creator work and rarely for B2B. Pull it when the use case actually reads it.",[11,25526,25527],{},"The reason to run this on one balance is that the chain crosses three or four providers. Wire it vendor by vendor and you have four signups, four keys and four invoices before you know whether the workflow is any good.",[320,25529,25530],{},[11,25531,324,25532,119,25534,25539],{},[38,25533,327],{},[18,25535,25538],{"href":25536,"rel":25537},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Flinkedin-profile-url-to-enriched-lead",[124,125],"turning a LinkedIn profile URL into an enriched lead"," for the step-by-step version.",[27,25541,25543],{"id":25542},"which-endpoint-should-i-use-for-which-network","Which endpoint should I use for which network?",[482,25545,25546,25559],{},[485,25547,25548],{},[488,25549,25550,25553,25555,25557],{},[491,25551,25552],{},"Network",[491,25554,496],{},[491,25556,7553],{},[491,25558,502],{},[504,25560,25561,25581,25601,25620,25639,25658],{},[488,25562,25563,25566,25575,25578],{},[509,25564,25565],{},"TikTok",[509,25567,25568],{},[18,25569,25572],{"href":25570,"rel":25571},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Ftiktok",[124,125],[47,25573,25574],{},"apify \u002Fapidojo\u002Ftiktok-profile-scraper",[509,25576,25577],{},"Profile plus full post history",[509,25579,25580],{},"Per result, very cheap",[488,25582,25583,25586,25595,25598],{},[509,25584,25585],{},"Instagram",[509,25587,25588],{},[18,25589,25592],{"href":25590,"rel":25591},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Finstagram",[124,125],[47,25593,25594],{},"apify \u002Fapify\u002Finstagram-post-scraper",[509,25596,25597],{},"Posts and reels with engagement",[509,25599,25600],{},"Tracks records returned",[488,25602,25603,25606,25615,25618],{},[509,25604,25605],{},"LinkedIn",[509,25607,25608],{},[18,25609,25612],{"href":25610,"rel":25611},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Flinkedin",[124,125],[47,25613,25614],{},"apify \u002Fharvestapi\u002Flinkedin-company-employees",[509,25616,25617],{},"Employee profiles, filterable",[509,25619,524],{},[488,25621,25622,25625,25634,25637],{},[509,25623,25624],{},"X",[509,25626,25627],{},[18,25628,25631],{"href":25629,"rel":25630},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Ftwitter",[124,125],[47,25632,25633],{},"tikhub \u002Ftwitter\u002Fweb\u002Ffetch_user_post_tweet",[509,25635,25636],{},"User posts",[509,25638,542],{},[488,25640,25641,25644,25653,25656],{},[509,25642,25643],{},"YouTube",[509,25645,25646],{},[18,25647,25650],{"href":25648,"rel":25649},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fyoutube",[124,125],[47,25651,25652],{},"apify \u002Fstreamers\u002Fyoutube-scraper",[509,25654,25655],{},"Videos, channels, playlists",[509,25657,3551],{},[488,25659,25660,25663,25672,25675],{},[509,25661,25662],{},"Reddit",[509,25664,25665],{},[18,25666,25669,25671],{"href":25667,"rel":25668},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Freddit",[124,125],[47,25670,5174],{}," Reddit actors",[509,25673,25674],{},"Posts and comments by subreddit or query",[509,25676,3551],{},[11,25678,25679,25680,25682,25683,24198],{},"Verified present on 2026-08-14 with ",[47,25681,603],{},". The billing column states the shape rather than a figure, because figures move and ",[47,25684,607],{},[232,25686,25688],{"id":25687},"what-one-profile-record-actually-contains","What one profile record actually contains",[11,25690,25691,25692],{},"We pulled an Instagram profile on 2026-08-14 to count rather than describe. ",[38,25693,25694],{},"69 fields, 16 of them empty.",[11,25696,25697,25698,102,25701,25704,25705,102,25708,25711,25712,102,25715,25718],{},"The useful ones are not the follower count. ",[47,25699,25700],{},"is_verified",[47,25702,25703],{},"is_private"," decide whether the rest of the record means anything. ",[47,25706,25707],{},"biography",[47,25709,25710],{},"external_url"," are where a creator states what they do and where they sell, which is the text you feed a model. ",[47,25713,25714],{},"business_email",[47,25716,25717],{},"public_email"," exist as fields and were null here, which is the honest answer to \"can I get contact details from a profile\": sometimes, on business accounts that chose to publish them, and you cannot plan around it.",[11,25720,25721,25722,25725],{},"Sixteen empty fields on a major account is the number to sit with. ",[38,25723,25724],{},"These records are sparse by default",", and the sparsity is not random: it tracks what that specific account chose to publish. A pipeline that assumes a field is present because it appeared in the schema will break on the second account it sees, not the hundredth.",[232,25727,25729],{"id":25728},"the-other-thing-that-happened","The other thing that happened",[11,25731,25732,25733,25736],{},"Our first call, against a different well-known account, returned ",[47,25734,25735],{},"\"This account does not exist.\""," The account plainly does exist. The second call, using the endpoint's own documented example username, returned a full record.",[11,25738,25739,25740,25743],{},"We are reporting this as one observation rather than a verdict, because one false negative is not a pattern and we did not chase it further. What it does illustrate is the part worth designing for: ",[38,25741,25742],{},"the call was charged."," A wrong answer bills the same as a right one, so a bulk job that treats \"does not exist\" as ground truth will quietly drop real accounts and pay for the privilege.",[11,25745,25746],{},"Handle it the way you would any noisy source. Treat a not-found as a retry candidate rather than a fact, and if an account matters, confirm it a second way before writing the absence into your data.",[421,25748],{"category":25486,"title":25749},"Browse every social endpoint, with live pricing",[27,25751,25753],{"id":25752},"what-does-social-data-actually-cost","What does social data actually cost?",[11,25755,25756],{},"Less than people expect per record, and the shape matters more than the unit.",[11,25758,25759,25761],{},[38,25760,542],{}," means one request, one price, however much comes back. TikHub's social endpoints work this way, which suits lookups: fetching one user's posts costs the same whether they have ten or a hundred.",[11,25763,25764,25766],{},[38,25765,3551],{}," means the bill tracks records. Apify's actors mostly work this way, which suits sweeps: you pay for what you collect, and a limit parameter is also a spending cap.",[11,25768,25769],{},"Using either in the wrong shape is where surprise bills come from. A per-result endpoint pointed at a thousand profiles with no cap is not the same purchase as a per-call lookup, even when the unit price looks similar.",[11,25771,25772,25773,25776,25777,25782,25783,260],{},"One caution we learned by measuring rather than reading, this month, on our own catalogue: ",[38,25774,25775],{},"the stated shape does not always predict the charge."," Two endpoints described one way billed another, and ",[18,25778,25781],{"href":25779,"rel":25780},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fguides\u002Fbest-amazon-reviews-api-2026",[124,125],"we published the numbers",", including the one that made us look worst. Before a sweep, run one small call and read the actual charge. Live per-endpoint pricing is at ",[18,25784,1233],{"href":5582,"rel":25785},[124,125],[232,25787,25789],{"id":25788},"the-field-that-decides-whether-the-rest-is-worth-anything","The field that decides whether the rest is worth anything",[11,25791,25792],{},"Every platform here exposes some version of a public-versus-private flag, and it is the field to branch on before you read anything else.",[11,25794,25795],{},"The reason is that a private account does not return an error. It returns a record, and the record is thin: identity and a follower count, with everything you actually wanted absent. A pipeline that checks for an error and finds none will happily store that thin record as though the account had no posts, no bio and no engagement. The account has all three; you just cannot see them.",[11,25797,25798,25799,25802],{},"So the shape that works is a branch, not a filter. ",[38,25800,25801],{},"Read the privacy flag first, and route."," Public accounts go down the normal path. Private ones get marked as unreadable rather than as empty, which is a different fact and the one you want in the database.",[11,25804,25805,25806,25808],{},"The same logic applies to verification. ",[47,25807,25700],{}," costs nothing extra and it is the cheapest signal you have for whether an account is who it claims, which matters most in exactly the workflow where people skip it: matching a person to a handle during enrichment.",[232,25810,25812],{"id":25811},"rate-is-a-platform-property-not-a-vendor-one","Rate is a platform property, not a vendor one",[11,25814,25815],{},"One more thing worth knowing before you plan a sweep.",[11,25817,25818],{},"How fast you can pull is set by the platform far more than by which vendor you buy from. Two providers reading the same network hit the same underlying limits, so a vendor promising dramatically more throughput on a public source is either using more infrastructure, which costs more, or reading something less complete.",[11,25820,25821,25822,25825],{},"The practical version: ",[38,25823,25824],{},"plan sweeps by how long they take, not by how much they cost."," A hundred thousand profiles is not a lunchtime job on any vendor, and discovering that after committing to a delivery date is worse than discovering it in the schema. Run a small batch, time it, and multiply before you promise anything.",[27,25827,657],{"id":656},[11,25829,25830,25833],{},[38,25831,25832],{},"You only work on one network, at volume, forever."," If your product is a TikTok analytics tool, buy TikHub directly. One vendor, direct support, better unit economics at scale, and the aggregation argument buys you nothing when there is nothing to aggregate.",[11,25835,25836,25839],{},[38,25837,25838],{},"You need the platform's own analytics."," Public scraping returns what a logged-out visitor sees, which is not a creator's private insights. For accounts you own, the platform's official API after app review is the right tool, and no scraper substitutes for it.",[11,25841,25842,25845],{},[38,25843,25844],{},"You need contractual guarantees."," A marketplace optimises for breadth and switching cost, not for an SLA with your name on it.",[11,25847,25848,25850],{},[38,25849,686],{}," Our price metadata has disagreed with real charges on endpoints we resell. We found it by measuring, corrected it publicly, and the working rule until it is fixed is to verify with a small run rather than trust the listing. That applies to every vendor in this category, including the ones we sell.",[27,25852,696],{"id":695},[11,25854,25855],{},"There is no best social media scraping API, because social is not one problem. TikTok gives up a full post history cheaply; LinkedIn anonymises most of what you want; Instagram returns nothing at all for a private account. Those are properties of the platforms, and no vendor choice changes them.",[11,25857,25858],{},"What you can choose is how much a new network costs you in friction. On a per-vendor setup the fourth platform is a signup, a key and an invoice. On a catalogue it is a parameter.",[11,25860,25861],{},"Two things matter more than the pick. Whether the endpoint bills per call or per record, because that decides your architecture and not just your bill. And whether you check with a small run before a big one, because a listing describes a vendor's intent and only a charge describes the charge.",[11,25863,713,25864,25867,25868,25870,25871,260],{},[47,25865,25866],{},"monid discover -q \"\u003Cyour network>\""," lists what exists and ",[47,25869,607],{}," shows the schema and price without spending anything. Begin at ",[18,25872,725],{"href":723,"rel":25873},[124,125],[27,25875,729],{"id":728},[731,25877,25879],{"q":25878},"How do I automate scraping public social data without getting blocked?",[11,25880,25881],{},"By not being the one making the requests. Blocks land on whoever holds the session and the IP, so driving a logged-in browser or running from your own address means restrictions arrive at your account. A managed endpoint reads public pages from the provider's pool and returns structured JSON, so there is no session of yours to restrict. Rotating user agents postpones the problem without changing who is exposed.",[731,25883,25885],{"q":25884},"Are follower and view counts from scraping actually accurate?",[11,25886,25887],{},"They are accurate as public numbers, which is not the same as the owner's analytics. Platforms expose rounded or delayed figures to logged-out visitors, and a creator's private dashboard can differ. For ranking creators against each other the public numbers are fine and consistent. For reporting on accounts you own, use the platform's own API.",[731,25889,25890],{"q":22150},[11,25891,25892],{},"One HTTP node against a catalogue, with the provider and endpoint as parameters, rather than a dedicated node per platform. Automations rarely need one network, and a node per source gives you several integrations that break independently. When an actor is removed you change two strings instead of rebuilding a branch.",[731,25894,25896],{"q":25895},"Can any of these read private accounts?",[11,25897,25898],{},"No, and a tool claiming otherwise is worth distrusting. Every endpoint here reads what a logged-out visitor can see. A private profile returns nothing, which is correct behaviour rather than a coverage gap, and it is the one limit that no amount of vendor shopping removes.",[11,25900,25901],{},[758,25902,760],{},[762,25904,25905],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":136,"searchDepth":166,"depth":166,"links":25907},[25908,25909,25914,25915,25919,25923,25924,25925],{"id":25312,"depth":166,"text":25313},{"id":25344,"depth":166,"text":25345,"children":25910},[25911,25912,25913],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":25424,"depth":187,"text":25425},{"id":25489,"depth":166,"text":25490},{"id":25542,"depth":166,"text":25543,"children":25916},[25917,25918],{"id":25687,"depth":187,"text":25688},{"id":25728,"depth":187,"text":25729},{"id":25752,"depth":166,"text":25753,"children":25920},[25921,25922],{"id":25788,"depth":187,"text":25789},{"id":25811,"depth":187,"text":25812},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fbest-social-media-scraping-api-2026.png","No single best one, because the platforms are not one problem. Which endpoint covers which network, and where a per-call bill differs from per-result.","\u002Fimg\u002Fblog\u002Fbest-social-media-scraping-api-2026-card.png",{},"2026-08-14",{"title":25295,"description":25927},"blog\u002Fguides\u002Fbest-social-media-scraping-api-2026",[25934,25935,13897,8103],"social media scraping api","social data","UaLCPvYN8bn-23jgVX9b60WlVJ9sGAWnD1ioTIpxuJk",{"id":25938,"title":4916,"author":6,"body":25939,"category":2378,"cover":26554,"description":26555,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":26556,"meta":26557,"navigation":790,"ogImage":787,"path":4915,"publishedAt":25930,"readTime":793,"seo":26558,"stem":26559,"tags":26560,"toolCategory":8934,"updatedAt":25930,"__hash__":26564},"blogGuides\u002Fblog\u002Fguides\u002Fmcp-server-live-web-data-agents.md",{"type":8,"value":25940,"toc":26538},[25941,25944,25950,25953,25955,25958,25964,25970,25973,25977,25980,25986,25989,26023,26035,26053,26057,26136,26143,26147,26150,26153,26159,26168,26181,26184,26195,26197,26200,26206,26212,26223,26226,26230,26233,26236,26242,26244,26246,26249,26252,26255,26261,26267,26273,26276,26288,26292,26295,26298,26301,26307,26310,26313,26315,26438,26446,26458,26460,26466,26472,26478,26486,26488,26491,26494,26497,26506,26508,26513,26519,26525,26531,26535],[11,25942,25943],{},"Ask an assistant which MCP server gives an agent live web data and you get a list of scrapers with an MCP wrapper. That answer is fine as far as it goes, and it quietly assumes the thing worth deciding has already been decided: that you pick one vendor, wire it in, and your agent is limited to whatever that vendor covers.",[11,25945,25946,25947,25949],{},"There is a second shape, and it is the one this article is actually about. Monid is ",[18,25948,21],{"href":20}," that ships as a remote MCP server, so the agent gets a catalogue it can search at runtime rather than a single tool it was handed at build time.",[11,25951,25952],{},"Fair disclosure: you are on the Monid blog. The section near the end names the cases where a single-vendor server is the better call, and they are real.",[27,25954,15469],{"id":20337},[11,25956,25957],{},"Several, and they divide into two kinds. The division matters more than the ranking.",[11,25959,25960,25963],{},[38,25961,25962],{},"Vendor servers"," wrap one company's API. Firecrawl's server gives an agent Firecrawl. Bright Data's gives it Bright Data. The tool list is fixed at connect time and every tool belongs to that vendor. This is the right shape when you already know exactly what you need and one vendor covers it.",[11,25965,25966,25969],{},[38,25967,25968],{},"Catalogue servers"," expose a search over many providers. The agent does not receive a list of scrapers; it receives the ability to ask what exists, read a schema, see a price, and then call. Monid is this shape.",[11,25971,25972],{},"The practical difference shows up the first time an agent needs something outside its wiring. With a vendor server it reports that it cannot do that. With a catalogue it looks, finds a Google Maps endpoint or a LinkedIn one or nothing at all, and tells you which.",[232,25974,25976],{"id":25975},"connecting-monid-over-mcp","Connecting Monid over MCP",[11,25978,25979],{},"Streamable HTTP, no install:",[131,25981,25984],{"className":25982,"code":25983,"language":97,"meta":136},[248],"https:\u002F\u002Fmcp.monid.ai\u002Fv1\n",[47,25985,25983],{"__ignoreMap":136},[11,25987,25988],{},"In Claude.ai that is Settings, Connectors, Add custom connector, then Connect and authorise. The terminal clients are one line each:",[131,25990,25991],{"className":133,"code":11519,"language":135,"meta":136,"style":136},[47,25992,25993,26009],{"__ignoreMap":136},[140,25994,25995,25997,25999,26001,26003,26005,26007],{"class":142,"line":143},[140,25996,11526],{"class":146},[140,25998,11529],{"class":150},[140,26000,293],{"class":150},[140,26002,11534],{"class":150},[140,26004,11537],{"class":150},[140,26006,4372],{"class":150},[140,26008,11542],{"class":150},[140,26010,26011,26013,26015,26017,26019,26021],{"class":142,"line":166},[140,26012,11547],{"class":146},[140,26014,11529],{"class":150},[140,26016,293],{"class":150},[140,26018,4372],{"class":150},[140,26020,11556],{"class":150},[140,26022,11542],{"class":150},[11,26024,26025,26026,26028,26029,26031,26032,260],{},"OpenCode takes a block in ",[47,26027,11564],{}," and then ",[47,26030,11568],{},"; ChatGPT adds it as a plugin with the same URL. Full steps for each are in the ",[18,26033,11574],{"href":11572,"rel":26034},[124,125],[11,26036,26037,26038,26041,26042,26046,26047,26052],{},"If your client prefers a skill file to a connector, ",[47,26039,26040],{},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md"," teaches it the same workflow, and there is a ",[18,26043,26045],{"href":8580,"rel":26044},[124,125],"CLI"," for humans. Payment is a prepaid balance by default, or ",[18,26048,26051],{"href":26049,"rel":26050},"https:\u002F\u002Fmonid.ai\u002Fdocs\u002Fguide\u002Fpay-with-x402",[124,125],"per run with USDC over x402"," if you would rather not hold one.",[232,26054,26056],{"id":26055},"the-three-verbs-an-agent-gets","The three verbs an agent gets",[131,26058,26060],{"className":133,"code":26059,"language":135,"meta":136,"style":136},"monid discover -q \"instagram profile\"    # search the catalogue, free\nmonid inspect -p tikhub -e \u003Cendpoint>    # schema and price, free\nmonid run -p tikhub -e \u003Cendpoint> --query '{...}'   # the only paid step\n",[47,26061,26062,26080,26105],{"__ignoreMap":136},[140,26063,26064,26066,26068,26070,26072,26075,26077],{"class":142,"line":143},[140,26065,147],{"class":146},[140,26067,2667],{"class":150},[140,26069,2670],{"class":150},[140,26071,2673],{"class":193},[140,26073,26074],{"class":150},"instagram profile",[140,26076,21387],{"class":193},[140,26078,26079],{"class":20883},"    # search the catalogue, free\n",[140,26081,26082,26084,26086,26088,26090,26092,26094,26097,26100,26102],{"class":142,"line":166},[140,26083,147],{"class":146},[140,26085,151],{"class":150},[140,26087,154],{"class":150},[140,26089,13698],{"class":150},[140,26091,160],{"class":150},[140,26093,299],{"class":193},[140,26095,26096],{"class":150},"endpoin",[140,26098,26099],{"class":183},"t",[140,26101,308],{"class":193},[140,26103,26104],{"class":20883},"    # schema and price, free\n",[140,26106,26107,26109,26111,26113,26115,26117,26119,26121,26123,26125,26127,26129,26131,26133],{"class":142,"line":187},[140,26108,147],{"class":146},[140,26110,171],{"class":150},[140,26112,154],{"class":150},[140,26114,13698],{"class":150},[140,26116,160],{"class":150},[140,26118,299],{"class":193},[140,26120,26096],{"class":150},[140,26122,26099],{"class":183},[140,26124,308],{"class":193},[140,26126,409],{"class":150},[140,26128,194],{"class":193},[140,26130,7824],{"class":150},[140,26132,2045],{"class":193},[140,26134,26135],{"class":20883},"   # the only paid step\n",[11,26137,26138,26139,26142],{},"Two of the three cost nothing, which is the part that changes agent behaviour. An agent can survey what exists and read what a call will cost ",[38,26140,26141],{},"before"," spending, so \"is this even available and what will it run me\" stops being a question you have to answer for it in advance.",[232,26144,26146],{"id":26145},"what-the-agent-actually-gets-back","What the agent actually gets back",[11,26148,26149],{},"Not a name and a link. Each result carries the fields an agent needs to choose without asking you, and one of them is more interesting than it looks.",[11,26151,26152],{},"Run against \"instagram profile\" on 2026-08-14, every row came back with:",[131,26154,26157],{"className":26155,"code":26156,"language":97,"meta":136},[248],"provider, providerName        who supplies it\nendpoint                      the exact path to call\ndescription                   one line, written for matching not marketing\nprice { type, amount }        PER_CALL or PER_RESULT, plus the figure\ntags                          \"verified\" where the endpoint is checked\nscore                         relevance for this query\nscoreBreakdown                why it scored that\n",[47,26158,26156],{"__ignoreMap":136},[11,26160,26161,26167],{},[38,26162,26163,26166],{},[47,26164,26165],{},"price.type"," is the field that matters most and gets read least."," PER_CALL and PER_RESULT are different purchases: one is a lookup, the other is a list whose size you control. An agent that reads the type can cap itself; one that reads only the amount cannot.",[11,26169,26170,26176,26177,26180],{},[38,26171,26172,26175],{},[47,26173,26174],{},"scoreBreakdown"," is the unusual one."," It decomposes the ranking into the semantic match, a bonus for being verified, a bonus for ",[38,26178,26179],{},"pricing predictability",", and a performance term. That third component is the catalogue saying out loud that an endpoint whose cost is easy to predict ranks above one whose cost is not, independent of how well it matches. For an agent choosing under a budget, that is a more useful sort order than pure relevance.",[11,26182,26183],{},"The reason to show the raw shape rather than describe it: an agent choosing between five Instagram endpoints is doing it on these fields and nothing else. If the fields are thin, the choice is a guess, and no amount of prompt engineering fixes a guess.",[320,26185,26186],{},[11,26187,324,26188,119,26190,26194],{},[38,26189,327],{},[18,26191,19975],{"href":26192,"rel":26193},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fbest-web-search-api-for-ai-agents-2026",[124,125],", which covers the narrower question of search specifically.",[27,26196,20129],{"id":20128},[11,26198,26199],{},"It depends on whether you want an API gateway or a data catalogue, and those get confused constantly because both are called marketplaces.",[11,26201,26202,26205],{},[38,26203,26204],{},"Gateways"," (Kong, and the API-management category generally) sit in front of APIs you already have contracts for. They handle auth, rate limits, routing and observability. The APIs are yours; the gateway governs them.",[11,26207,26208,26211],{},[38,26209,26210],{},"Aggregators of free and freemium APIs"," (ApyHub and similar) publish a directory of endpoints, many of them utility functions, and you sign up per API or use a bundled key.",[11,26213,26214,26217,26218,26222],{},[38,26215,26216],{},"Data marketplaces"," sell access to data you do not otherwise have, metered, with the commercial relationship held by the marketplace rather than by you. That is where Monid sits: ",[18,26219,26221],{"href":5582,"rel":26220},[124,125],"1,300 tools"," across providers including Apify, TikHub, People Data Labs, Apollo, Akta, Exa and Context.dev, reachable on one key and one balance.",[11,26224,26225],{},"The distinction is not academic for an agent. A gateway cannot help with a source you have no contract for. A data marketplace's whole job is that you never signed one.",[232,26227,26229],{"id":26228},"what-one-balance-actually-removes","What \"one balance\" actually removes",[11,26231,26232],{},"Not a small thing, and worth being concrete rather than hand-waving about convenience.",[11,26234,26235],{},"Without it, adding a data source to an agent means a signup, a payment method, a key in your secret store, a new client in your code, and a separate invoice. Five steps, mostly not engineering, and all of them before you know whether the data is any good.",[11,26237,26238,26239,26241],{},"With a catalogue, the agent runs ",[47,26240,4274],{},", reads a schema, and calls. If the data is wrong for the job you have spent a fraction of a cent finding out.",[316,26243],{"category":8934},[27,26245,4894],{"id":4893},[11,26247,26248],{},"The ones your agent can find without you, which is a different property from raw quality.",[11,26250,26251],{},"Agents fail at this in a specific way. Told to \"get the reviews for this product\", an agent with a fixed toolset either uses the tool it has, even when that tool is wrong for the site, or gives up. Neither is a data-quality problem. It is a discovery problem.",[11,26253,26254],{},"So for an agent workload, rank on three things before you rank on scraping quality:",[11,26256,26257,26260],{},[38,26258,26259],{},"Can it enumerate?"," If the agent cannot list what is available, you are the discovery mechanism, forever, for every new source.",[11,26262,26263,26266],{},[38,26264,26265],{},"Can it read the price before spending?"," An agent that cannot see cost cannot make a cost decision, so you end up capping it externally and guessing.",[11,26268,26269,26272],{},[38,26270,26271],{},"Can it fail informatively?"," \"No endpoint covers this source\" is a useful answer. A retry loop against the wrong tool is not.",[11,26274,26275],{},"Underneath, the actual scraping is done by specialists: Apify's actors, TikHub's social endpoints, Context.dev for clean Markdown. Monid does not scrape anything. It resells those, which is also why we can compare them without picking ourselves.",[320,26277,26278],{},[11,26279,324,26280,119,26282,26287],{},[38,26281,327],{},[18,26283,26286],{"href":26284,"rel":26285},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fwhat-an-instagram-profile-api-should-return",[124,125],"what an Instagram profile API should return"," for the field-level version of that comparison.",[27,26289,26291],{"id":26290},"what-happens-when-the-vendor-behind-your-mcp-server-loses-access","What happens when the vendor behind your MCP server loses access?",[11,26293,26294],{},"Your agent stops, and the blast radius is however many workflows were wired to that vendor.",[11,26296,26297],{},"This is not hypothetical. One widely-read r\u002Fn8n thread is somebody asking what to use after Apify was barred from scraping Apollo, with their pipeline already broken. The same shape recurs whenever an actor is removed or a provider loses a source.",[11,26299,26300],{},"A single-vendor MCP server couples your agent to one company's access. That coupling is invisible while everything works and total when it does not.",[11,26302,26303,26304,26306],{},"A catalogue changes the failure from a rebuild to a lookup: the agent runs ",[47,26305,4274],{}," again and either finds another endpoint for the job or reports that none exists. Both are better than a silent stop, and the second one at least tells you the truth quickly.",[11,26308,26309],{},"Two honest limits on that. The catalogue only helps if a second endpoint actually exists for your source, which is not guaranteed. And a marketplace is itself a dependency: if we lose a provider, the endpoints they supplied go with them. What it buys is that the dependency is one layer up, where swapping is a parameter change rather than an integration rewrite.",[421,26311],{"category":8934,"title":26312},"Browse what an agent can reach, with live pricing",[27,26314,480],{"id":479},[482,26316,26317,26329],{},[485,26318,26319],{},[488,26320,26321,26323,26325,26327],{},[491,26322,493],{},[491,26324,496],{},[491,26326,7553],{},[491,26328,502],{},[504,26330,26331,26349,26367,26385,26402,26419],{},[488,26332,26333,26336,26343,26346],{},[509,26334,26335],{},"Clean page text for a prompt",[509,26337,26338],{},[18,26339,26341],{"href":16654,"rel":26340},[124,125],[47,26342,16658],{},[509,26344,26345],{},"Article-quality Markdown",[509,26347,26348],{},"Per call, fraction of a cent",[488,26350,26351,26354,26362,26365],{},[509,26352,26353],{},"Find pages worth reading",[509,26355,26356],{},[18,26357,26360],{"href":26358,"rel":26359},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fweb-search",[124,125],[47,26361,20504],{},[509,26363,26364],{},"Ranked results, optional scrape",[509,26366,25580],{},[488,26368,26369,26372,26380,26383],{},[509,26370,26371],{},"Neural web search",[509,26373,26374],{},[18,26375,26377],{"href":26358,"rel":26376},[124,125],[47,26378,26379],{},"exa \u002Fsearch",[509,26381,26382],{},"Results with extracted content",[509,26384,542],{},[488,26386,26387,26390,26397,26400],{},[509,26388,26389],{},"Structured data from a site",[509,26391,26392],{},[18,26393,26395],{"href":16654,"rel":26394},[124,125],[47,26396,18093],{},[509,26398,26399],{},"JSON matching your schema",[509,26401,542],{},[488,26403,26404,26407,26414,26417],{},[509,26405,26406],{},"Company record from a domain",[509,26408,26409],{},[18,26410,26412],{"href":569,"rel":26411},[124,125],[47,26413,592],{},[509,26415,26416],{},"Firmographics",[509,26418,542],{},[488,26420,26421,26424,26433,26436],{},[509,26422,26423],{},"Social profiles and posts",[509,26425,26426],{},[18,26427,26430,26432],{"href":26428,"rel":26429},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Fsocial-media",[124,125],[47,26431,10095],{}," endpoints",[509,26434,26435],{},"Platform-specific records",[509,26437,542],{},[11,26439,25679,26440,26442,26443,26445],{},[47,26441,603],{},". The billing column states the shape, not the figure, because figures move: ",[47,26444,607],{}," prints the current one and costs nothing.",[11,26447,26448,26449,26452,26453,26457],{},"One caution learned the hard way this month. ",[38,26450,26451],{},"The stated billing shape does not always predict the charge."," We measured two endpoints whose real bills tracked records returned despite being described otherwise, and ",[18,26454,26456],{"href":25779,"rel":26455},[124,125],"published the numbers",". Before an agent runs anything at volume, run it once small and read the actual charge.",[27,26459,657],{"id":656},[11,26461,26462,26465],{},[38,26463,26464],{},"You need one source and you know which."," If your agent only ever reads web pages as Markdown, connect Context.dev's own server. One vendor, one bill, fewer moving parts, and their team supports you directly. The catalogue argument is about not knowing in advance; it is worth nothing when you do.",[11,26467,26468,26471],{},[38,26469,26470],{},"You need an SLA."," Buying direct from Bright Data or a similar vendor gets a contract and an account manager. A marketplace optimises for breadth and switching cost, which is a different thing to want.",[11,26473,26474,26477],{},[38,26475,26476],{},"You are governing APIs you already own."," That is a gateway job. Kong and its category exist for it and we do not do it.",[11,26479,26480,26482,26483,26485],{},[38,26481,686],{}," Our own price metadata has disagreed with real charges on endpoints we resell, which we found by measuring and then corrected in public. ",[47,26484,607],{}," is free and tells you what an endpoint claims. Only a run tells you what it delivers. Build the habit of one small run first, and treat any listing, ours included, as a description rather than a measurement.",[27,26487,696],{"id":695},[11,26489,26490],{},"The MCP question is usually asked as \"which server\", and answered with a vendor. The more useful question is whether your agent should hold a fixed toolset or a searchable catalogue, because that decides what happens the first time it needs something nobody wired in.",[11,26492,26493],{},"Fixed is right when the job is known and narrow. A catalogue is right when it is not, which is most agent work, and it is the only one of the two that can answer \"what else is there\" without a human.",[11,26495,26496],{},"Two things matter more than the pick. Whether the agent can see a price before it spends, because an agent that cannot has to be capped by guesswork instead. And where the coupling sits, because vendors do lose access to sources, and the difference between a parameter change and a rebuild is decided long before it happens.",[11,26498,26499,26500,26502,26503,260],{},"Start with the free part. Connect ",[47,26501,11515],{},", ask your agent what exists for a source you care about, and read what a call would cost before it makes one. Begin at ",[18,26504,725],{"href":723,"rel":26505},[124,125],[27,26507,729],{"id":728},[731,26509,26510],{"q":22150},[11,26511,26512],{},"One HTTP node pointed at a catalogue, with the provider and endpoint as parameters, rather than a dedicated node per vendor. An automation rarely needs one platform, and wiring a node per source gives you several integrations that break independently. When an actor is removed you change two strings instead of rebuilding.",[731,26514,26516],{"q":26515},"How do I automate scraping public data without getting blocked?",[11,26517,26518],{},"By not being the one making the requests. Blocks land on whoever holds the session and the IP, so if you drive a logged-in browser or run from your own address, the restriction arrives at your account. A managed endpoint reads public pages from the provider's own pool and hands back structured JSON, so there is no session of yours to restrict. The trade is that private or gated content stays out of reach, which is correct behaviour rather than a gap.",[731,26520,26522],{"q":26521},"Does connecting over MCP cost anything by itself?",[11,26523,26524],{},"No. Connecting is free, and so are the two verbs an agent uses most: searching the catalogue and reading an endpoint's schema and price. Only a run bills, at the price shown beforehand, against a pay-as-you-go balance. That is deliberate, because an agent that has to spend money to find out what things cost cannot budget.",[731,26526,26528],{"q":26527},"Is the scraping API market still worth entering in 2026?",[11,26529,26530],{},"As a builder, the undifferentiated part is finished: fetching a page is close to a commodity. What still has room is everything after retrieval, which is normalising fields, being honest about staleness, and making the thing discoverable by an agent rather than by a human reading docs. The gap between what an endpoint's metadata claims and what it actually returns is a real and unglamorous place to compete.",[11,26532,26533],{},[758,26534,760],{},[762,26536,26537],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":136,"searchDepth":166,"depth":166,"links":26539},[26540,26545,26548,26549,26550,26551,26552,26553],{"id":20337,"depth":166,"text":15469,"children":26541},[26542,26543,26544],{"id":25975,"depth":187,"text":25976},{"id":26055,"depth":187,"text":26056},{"id":26145,"depth":187,"text":26146},{"id":20128,"depth":166,"text":20129,"children":26546},[26547],{"id":26228,"depth":187,"text":26229},{"id":4893,"depth":166,"text":4894},{"id":26290,"depth":166,"text":26291},{"id":479,"depth":166,"text":480},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fmcp-server-live-web-data-agents.png","Most MCP servers wrap one vendor. The question is whether your agent needs a scraper or a catalogue it can search at runtime, and how to tell which.","\u002Fimg\u002Fblog\u002Fmcp-server-live-web-data-agents-card.png",{},{"title":4916,"description":26555},"blog\u002Fguides\u002Fmcp-server-live-web-data-agents",[26561,1687,26562,26563],"mcp server","web data","model context protocol","NYqeNJqaIaDxH0IazrwUi3BVGn9DC4h99g4GS-ljECw",{"id":26566,"title":26567,"author":6,"body":26568,"category":1674,"cover":27070,"description":27071,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":27072,"meta":27073,"navigation":790,"ogImage":787,"path":2325,"publishedAt":25930,"readTime":27074,"seo":27075,"stem":27076,"tags":27077,"toolCategory":9734,"updatedAt":792,"__hash__":27080},"blogGuides\u002Fblog\u002Fguides\u002Fpay-per-call-data-api-vs-subscription.md","Which Data API Lets You Pay Per Call Instead of a Subscription?",{"type":8,"value":26569,"toc":27055},[26570,26573,26578,26582,26585,26591,26597,26613,26616,26620,26683,26686,26699,26703,26714,26717,26720,26723,26725,26729,26732,26735,26738,26741,26746,26758,26760,26763,26766,26769,26775,26781,26787,26790,26793,26797,26800,26806,26812,26825,26833,26836,26840,26912,26915,26919,26922,26929,26935,26941,26948,26955,26959,26962,26968,26980,26985,27003,27005,27008,27011,27022,27024,27030,27036,27042,27048,27052],[11,26571,26572],{},"Most data APIs are sold as a subscription because subscriptions are easier to forecast, for the vendor. The question in the title gets asked constantly anyway, which tells you the shape does not fit how a lot of teams actually work.",[11,26574,19618,26575,26577],{},[18,26576,21],{"href":20},", billed per use, so we are one answer to that question and an interested party in it. The section near the end is where a subscription genuinely wins, and it is not a courtesy paragraph: at steady volume the maths goes the other way and we would rather you know that here than discover it on an invoice.",[27,26579,26581],{"id":26580},"which-data-api-lets-me-pay-per-call-instead-of-a-monthly-subscription","Which data API lets me pay per call instead of a monthly subscription?",[11,26583,26584],{},"Several, and they are not the same thing underneath. Three shapes get called pay-as-you-go.",[11,26586,26587,26590],{},[38,26588,26589],{},"Credit packs."," You buy a balance up front and spend it down. NeverBounce and most email verifiers work this way. It is metered, but you commit capital before you know your volume, and credits often carry an expiry clock, which is a subscription wearing a different hat.",[11,26592,26593,26596],{},[38,26594,26595],{},"Per-unit on a platform account."," Apify bills for what actors consume, on top of a plan whose floor you pay whether you run anything or not. Genuinely metered at the margin; not free at zero.",[11,26598,26599,26602,26603,26607,26608,102,26610,26612],{},[38,26600,26601],{},"Metered with no floor."," A balance that only moves when a call runs, no minimum, nothing owed in a month you do not use it. This is what Monid does: ",[18,26604,26606],{"href":5582,"rel":26605},[124,125],"over a thousand tools"," across providers, one key, and ",[47,26609,4274],{},[47,26611,3936],{}," cost nothing so surveying the catalogue is free.",[11,26614,26615],{},"The distinction that matters is what a quiet month costs. Under the first two shapes it is not zero. Under the third it is.",[232,26617,26619],{"id":26618},"the-three-verbs-and-why-two-are-free","The three verbs, and why two are free",[131,26621,26623],{"className":133,"code":26622,"language":135,"meta":136,"style":136},"monid discover -q \"company enrichment\"   # search the catalogue, free\nmonid inspect -p pdl -e \u002Fv5\u002Fcompany\u002Fenrich   # schema and price, free\nmonid run -p pdl -e \u002Fv5\u002Fcompany\u002Fenrich --query '{...}'   # the only paid step\n",[47,26624,26625,26642,26659],{"__ignoreMap":136},[140,26626,26627,26629,26631,26633,26635,26637,26639],{"class":142,"line":143},[140,26628,147],{"class":146},[140,26630,2667],{"class":150},[140,26632,2670],{"class":150},[140,26634,2673],{"class":193},[140,26636,24283],{"class":150},[140,26638,21387],{"class":193},[140,26640,26641],{"class":20883},"   # search the catalogue, free\n",[140,26643,26644,26646,26648,26650,26652,26654,26656],{"class":142,"line":166},[140,26645,147],{"class":146},[140,26647,151],{"class":150},[140,26649,154],{"class":150},[140,26651,9015],{"class":150},[140,26653,160],{"class":150},[140,26655,9018],{"class":150},[140,26657,26658],{"class":20883},"   # schema and price, free\n",[140,26660,26661,26663,26665,26667,26669,26671,26673,26675,26677,26679,26681],{"class":142,"line":187},[140,26662,147],{"class":146},[140,26664,171],{"class":150},[140,26666,154],{"class":150},[140,26668,9015],{"class":150},[140,26670,160],{"class":150},[140,26672,9018],{"class":150},[140,26674,409],{"class":150},[140,26676,194],{"class":193},[140,26678,7824],{"class":150},[140,26680,2045],{"class":193},[140,26682,26135],{"class":20883},[11,26684,26685],{},"Free discovery is not generosity, it is what makes metered billing usable. If finding out what something costs also costs money, you cannot evaluate before you commit, and the whole advantage of metering disappears.",[11,26687,26688,26689,3244,26694,26698],{},"A single call standing in for a whole subscription is easiest to see on a narrow job: pulling ",[18,26690,26693],{"href":26691,"rel":26692},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fevery-amazon-review-for-an-asin-one-call",[124,125],"every Amazon review for one ASIN",[18,26695,26697],{"href":22825,"rel":26696},[124,125],"turning a bare domain into full firmographics"," is one request each, and the bill is that request.",[232,26700,26702],{"id":26701},"predictability-is-a-ranking-factor-not-just-a-virtue","Predictability is a ranking factor, not just a virtue",[11,26704,26705,26706,26708,26709,26711,26712,260],{},"Each result from ",[47,26707,4274],{}," carries a ",[47,26710,26174],{}," explaining why it ranked where it did, and one of the components is ",[38,26713,26179],{},[11,26715,26716],{},"That is the catalogue stating, in the sort order, that an endpoint whose cost is easy to forecast outranks one whose cost is not, independently of how well it matches the query. Verified status and observed performance are the other two modifiers on top of the semantic match.",[11,26718,26719],{},"It is worth naming because predictability is the thing metered billing is usually accused of lacking. A subscription's appeal is that you know the number in advance. The metered answer is not \"trust us\", it is to make the shape visible before the call and to rank against surprise.",[11,26721,26722],{},"What makes a price unpredictable in practice is rarely the unit. It is whether the unit multiplies. A per-call endpoint bills once. A per-result endpoint bills per row, so an unset limit turns a test into a bill, and an array of queries multiplies again: results are roughly queries times per-query limit. Those two multiplications cause most of the surprise in this category, and both are visible in the schema before you spend anything.",[316,26724],{"category":9734},[27,26726,26728],{"id":26727},"why-is-zoominfo-so-much-more-expensive-than-other-providers","Why is ZoomInfo so much more expensive than other providers?",[11,26730,26731],{},"Because you are buying a contract and a dataset, not calls, and the price reflects what the contract covers rather than what you use.",[11,26733,26734],{},"Enterprise sales-intelligence pricing bundles several things: a maintained dataset with people whose job it is to keep it current, a seat-based UI for non-engineers, compliance paperwork a procurement team can sign, an SLA, and support. A per-call API sells you one of those five.",[11,26736,26737],{},"That is worth saying plainly because the comparison is often framed as a rip-off, and it is not. If you need the paperwork and the seats, the cheaper API does not replace it.",[11,26739,26740],{},"What the price does mean is that the model punishes uneven use badly. An annual commitment sized for your busiest quarter is paid in your quietest one too, and the record you looked up once costs the same as the one you look up daily.",[11,26742,26743,26745],{},[38,26744,24957],{}," buy the contract when the data is a standing input to a team's daily work. Buy calls when it is an input to a pipeline that runs in bursts. Most engineering-led use is the second and most sales-led use is the first, which is why the two camps talk past each other about price.",[320,26747,26748],{},[11,26749,324,26750,119,26752,26757],{},[38,26751,327],{},[18,26753,26756],{"href":26754,"rel":26755},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fpdl-vs-akta-firmographics-cost",[124,125],"what firmographics actually cost per record",", which prices the same job across two providers.",[27,26759,16468],{"id":16467},[11,26761,26762],{},"Not for the scraping itself, and it is worth being precise about which part people mean.",[11,26764,26765],{},"Apify's free tier covers small runs, and open-source crawlers are free to run and not free to operate: you pay in proxies, in the maintenance of parsers that break on the target's schedule, and in the reputation of the IPs you scrape from. That is a real cost, just not an invoiced one.",[11,26767,26768],{},"What can genuinely be free is everything before the call.",[11,26770,26771,26774],{},[38,26772,26773],{},"Discovery is free."," Searching the catalogue costs nothing, so working out whether an endpoint exists for your source is not a purchase decision.",[11,26776,26777,26780],{},[38,26778,26779],{},"Reading the schema and the price is free."," You can see exactly what comes back and what it will cost before spending anything.",[11,26782,26783,26786],{},[38,26784,26785],{},"A month you do not use costs nothing",", which no plan-based model matches.",[11,26788,26789],{},"Then the call bills. For a lot of teams the honest framing is not free versus paid but tiny versus committed: a competitor teardown across a few hundred records lands in single-digit dollars, and the alternative was a plan you would have paid twelve times a year.",[421,26791],{"category":9734,"title":26792},"Browse the catalogue and read prices before you spend",[27,26794,26796],{"id":26795},"what-are-the-best-alternatives-to-rapidapi","What are the best alternatives to RapidAPI?",[11,26798,26799],{},"Depends which half of RapidAPI you actually use, because it does two jobs and most alternatives do one.",[11,26801,26802,26805],{},[38,26803,26804],{},"As a directory",", it is a place to find APIs, mostly small and utility-shaped, each with its own publisher and plan. The alternative is any catalogue with a search over it.",[11,26807,26808,26811],{},[38,26809,26810],{},"As a billing layer",", it puts one payment method in front of many APIs so you do not sign up per vendor. That is the part people miss when they leave, and then rebuild by hand.",[11,26813,26814,26815,98,26818,98,26821,26824],{},"Monid overlaps the second job and differs on what is in the catalogue: data endpoints from named providers (",[18,26816,4442],{"href":16581,"rel":26817},[124,125],[18,26819,13576],{"href":25570,"rel":26820},[124,125],[18,26822,9397],{"href":17223,"rel":26823},[124,125],", Apollo, Akta, Exa, Context.dev) rather than a long tail of independently published utilities. Fewer things, deeper on data, and the marketplace holds the vendor relationship so you never sign one.",[11,26826,26827,26828,26832],{},"It also differs on who the consumer is. RapidAPI assumes a developer reading docs and choosing. Monid assumes an agent doing that at runtime, which is why the catalogue is searchable through an ",[18,26829,26831],{"href":11572,"rel":26830},[124,125],"MCP server"," and a skill file as well as a CLI.",[11,26834,26835],{},"If your APIs are ones you already hold contracts for, neither is the answer; that is an API gateway job.",[27,26837,26839],{"id":26838},"which-shape-fits-which-pattern","Which shape fits which pattern?",[482,26841,26842,26855],{},[485,26843,26844],{},[488,26845,26846,26849,26852],{},[491,26847,26848],{},"Your usage",[491,26850,26851],{},"Best shape",[491,26853,26854],{},"Why",[504,26856,26857,26868,26879,26890,26901],{},[488,26858,26859,26862,26865],{},[509,26860,26861],{},"Bursty, project-driven",[509,26863,26864],{},"Metered, no floor",[509,26866,26867],{},"Zero in quiet months, no capital committed before you know volume",[488,26869,26870,26873,26876],{},[509,26871,26872],{},"Steady and high, one source",[509,26874,26875],{},"Direct contract",[509,26877,26878],{},"Unit price falls with commitment, and support comes with it",[488,26880,26881,26884,26887],{},[509,26882,26883],{},"Unknown, still evaluating",[509,26885,26886],{},"Metered with free inspect",[509,26888,26889],{},"The evaluation itself costs nothing",[488,26891,26892,26895,26898],{},[509,26893,26894],{},"Agent-driven, sources unknown in advance",[509,26896,26897],{},"Metered plus a catalogue",[509,26899,26900],{},"The agent cannot sign up for a vendor mid-task",[488,26902,26903,26906,26909],{},[509,26904,26905],{},"Needs seats, SLA, procurement sign-off",[509,26907,26908],{},"Enterprise subscription",[509,26910,26911],{},"You are buying the paperwork, and it is not optional",[11,26913,26914],{},"The row that decides most cases is the first: whether your usage has quiet months. Everything else is second-order.",[232,26916,26918],{"id":26917},"what-a-quiet-month-actually-costs","What a quiet month actually costs",[11,26920,26921],{},"The clearest way to compare the models is to price the month you do nothing.",[11,26923,26924,26925,26928],{},"Under a ",[38,26926,26927],{},"subscription",", a quiet month costs the full plan. That is the deal and it is not a trick: you are paying for availability and for the vendor's ability to forecast revenue.",[11,26930,26924,26931,26934],{},[38,26932,26933],{},"credit pack",", a quiet month costs nothing directly, and it costs you the time value of capital you already committed, plus whatever expires. Packs with expiry clocks are the shape most often mistaken for pay-as-you-go.",[11,26936,26924,26937,26940],{},[38,26938,26939],{},"platform plan with usage on top",", a quiet month costs the floor. Metered at the margin, not at zero.",[11,26942,26943,26944,26947],{},"Under ",[38,26945,26946],{},"metered with no floor",", a quiet month costs nothing, and the evaluation you did that month also cost nothing because discovery and schema reads do not bill.",[11,26949,26950,26951,26954],{},"Most teams model the busy month and pick on unit price. The busy month is the one where every model looks similar. ",[38,26952,26953],{},"The quiet month is where they diverge",", and for project-shaped work most months are quiet.",[27,26956,26958],{"id":26957},"when-does-a-subscription-actually-win","When does a subscription actually win?",[11,26960,26961],{},"Four cases, and they are common enough to state before anything else here is believed.",[11,26963,26964,26967],{},[38,26965,26966],{},"Steady, high volume against one source."," Past a certain daily load the plan floor divided across records drops below any metered unit price. If you pull millions of records a month from one vendor, price the contract; it will probably win.",[11,26969,26970,26973,26974,26979],{},[38,26971,26972],{},"You need a UI for people who do not write code."," Every dedicated vendor ships a dashboard where someone drags in a CSV. We ship an API, a CLI and an MCP server. If the person doing the work is not an engineer, give them the tool built for them. The reverse case, where one call replaces a seat, is easier to see on a narrow job: ",[18,26975,26978],{"href":26976,"rel":26977},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fmy-bounce-rate-before-after",[124,125],"checking a list for bounces"," is a single request rather than a plan.",[11,26981,26982,26984],{},[38,26983,25844],{}," SLAs, uptime credits, a named account manager, signed data-processing terms. A marketplace optimises for breadth and switching cost, which is a different product.",[11,26986,26987,26989,26990,26994,26995,26997,26998,27002],{},[38,26988,686],{}," Metered pricing is only honest if the meter is accurate, and ours has not always been. Measuring our own catalogue this month, we found an endpoint described as billing per query that billed per record instead, at fifty times the quoted unit, and another listed as per-call whose charge tracked rows returned. We ",[18,26991,26993],{"href":25779,"rel":26992},[124,125],"published both"," because leaving an under-quote up is worse than admitting it. Until the listings are fixed, the working rule is that ",[47,26996,3936],{}," tells you what an endpoint claims and only a small real run tells you what it charges. We ran that comparison properly on enrichment, where ",[18,26999,27001],{"href":26754,"rel":27000},[124,125],"the per-record cost of firmographics"," only became clear after billing both providers for the same list.",[27,27004,696],{"id":695},[11,27006,27007],{},"Pay-per-call is not cheaper than a subscription. It is a different bet: you trade a lower unit price for the right to spend nothing in a month you do not use it, and that trade is good exactly when your usage is uneven and bad when it is not.",[11,27009,27010],{},"Two things matter more than the model. Whether evaluation is free, because a meter you have to pay to read cannot be evaluated, and cannot be used by an agent that must decide at runtime. And whether the meter is accurate, which is a question about the vendor's honesty rather than their pricing page, and the only way to answer it is to run one small call and read the charge.",[11,27012,713,27013,27015,27016,27018,27019,260],{},[47,27014,603],{}," to see what exists and ",[47,27017,607],{}," for the schema and price, neither of which bills. Then run one small call and compare. Begin at ",[18,27020,725],{"href":723,"rel":27021},[124,125],[27,27023,729],{"id":728},[731,27025,27027],{"q":27026},"How should I rate limit calls to a third party API?",[11,27028,27029],{},"Cap at your side rather than relying on the vendor to stop you, because the vendor's limit protects them and not your bill. On a metered endpoint the important cap is on results, not requests: a limit parameter on a per-result endpoint is a spending control, and leaving it unset is how a test run becomes an invoice. Add a per-run budget check in the code that calls, and log the actual charge rather than the expected one.",[731,27031,27033],{"q":27032},"Is there a minimum spend or a monthly floor?",[11,27034,27035],{},"No floor on the metered model described here: a month with no calls costs nothing, and discovery and schema reads are free at any volume. That is the property that distinguishes it from credit packs with expiry clocks and from platform plans whose base fee is due whether or not you run anything.",[731,27037,27039],{"q":27038},"How do I know the price shown is the price charged?",[11,27040,27041],{},"Run one small call and read the charge. We ask this of readers because we found our own listings wrong: two endpoints billed in a shape their metadata did not describe, which we only discovered by measuring. A listing is the vendor's description of their billing. The charge on a real run is the measurement, and where they disagree, the charge is what happens.",[731,27043,27045],{"q":27044},"Are free tiers worth using for evaluation?",[11,27046,27047],{},"For evaluating output quality, yes. For evaluating cost, no, because a free tier is usually a different code path with different limits, and the thing you want to know is what the paid path bills at your shape of usage. Free discovery plus one small paid run answers that better than a free tier does, and it takes a few cents.",[11,27049,27050],{},[758,27051,760],{},[762,27053,27054],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":136,"searchDepth":166,"depth":166,"links":27056},[27057,27061,27062,27063,27064,27067,27068,27069],{"id":26580,"depth":166,"text":26581,"children":27058},[27059,27060],{"id":26618,"depth":187,"text":26619},{"id":26701,"depth":187,"text":26702},{"id":26727,"depth":166,"text":26728},{"id":16467,"depth":166,"text":16468},{"id":26795,"depth":166,"text":26796},{"id":26838,"depth":166,"text":26839,"children":27065},[27066],{"id":26917,"depth":187,"text":26918},{"id":26957,"depth":166,"text":26958},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fpay-per-call-data-api-vs-subscription.png","Metered beats a subscription when your usage is bursty and loses when it is steady. The shapes, the crossover, and the measurement that decides it.","\u002Fimg\u002Fblog\u002Fpay-per-call-data-api-vs-subscription-card.png",{},"10 min",{"title":26567,"description":27071},"blog\u002Fguides\u002Fpay-per-call-data-api-vs-subscription",[16812,27078,20704,27079],"data api pricing","metered billing","ZaMfzN2TCe5kjJ_oP-LRqFvT59k2J_nRPAofFF5UHCg",{"id":27082,"title":27083,"author":6,"body":27084,"category":782,"cover":27693,"description":27694,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":27695,"meta":27696,"navigation":790,"ogImage":787,"path":12459,"publishedAt":25930,"readTime":793,"seo":27697,"stem":27698,"tags":27699,"toolCategory":12584,"updatedAt":25930,"__hash__":27703},"blogGuides\u002Fblog\u002Fguides\u002Fpeople-data-labs-apollo-zoominfo-alternatives.md","People Data Labs, Apollo, ZoomInfo: Which Should You Actually Buy?",{"type":8,"value":27085,"toc":27677},[27086,27089,27095,27099,27102,27107,27112,27118,27124,27127,27129,27134,27139,27144,27146,27182,27186,27189,27195,27201,27204,27252,27257,27260,27262,27273,27277,27280,27283,27289,27300,27306,27309,27313,27316,27319,27322,27325,27331,27334,27336,27452,27458,27467,27471,27480,27520,27537,27554,27564,27570,27574,27577,27580,27591,27594,27596,27602,27608,27614,27626,27628,27631,27634,27646,27648,27654,27659,27665,27671,27675],[11,27087,27088],{},"Every comparison of B2B data providers turns into an argument about who has more records, which is the one number that predicts almost nothing about whether you should buy them. Coverage of a database you query the wrong way is coverage you never see.",[11,27090,27091,27092,27094],{},"The useful split is by job. Some of these are built to find people you cannot name yet, some to fill in people you can, and one is built to be bought by a procurement department. Monid is ",[18,27093,21],{"href":20}," and resells several of them, which is why this can compare rather than pitch: we do not own the data and we are not the cheapest way to get any single one of them at scale.",[27,27096,27098],{"id":27097},"what-tools-are-similar-to-people-data-labs","What tools are similar to People Data Labs?",[11,27100,27101],{},"Ones that sell you a dataset by the record, rather than a seat with a UI on top. That is the family PDL belongs to, and the family is small.",[11,27103,27104,27106],{},[38,27105,9397],{}," licenses a person and company dataset accessible by API. You bring an identifier or a set of filters and get records back. There is no meaningful UI, which is the point: it is built to be a data source inside something else you are building.",[11,27108,27109,27111],{},[38,27110,12704],{}," does both. It is a sales platform with sequences and a UI, and it exposes an API over the same data. Teams that use only the API are using the half of the product that is closest to PDL.",[11,27113,27114,27117],{},[38,27115,27116],{},"Akta"," takes a company-first view: firmographics and assessments from a domain, priced per result.",[11,27119,27120,27123],{},[38,27121,27122],{},"ZoomInfo"," is the enterprise end: dataset, seats, compliance paperwork, SLA, support.",[11,27125,27126],{},"The similarity that matters is not the record count. It is whether the thing is bought by an engineer wiring a pipeline or by a revenue team buying seats, because that decides how it is priced and therefore what it costs you.",[232,27128,235],{"id":234},[11,27130,238,27131,244],{},[18,27132,243],{"href":241,"rel":27133},[124,125],[131,27135,27137],{"className":27136,"code":249,"language":97,"meta":136},[248],[47,27138,249],{"__ignoreMap":136},[11,27140,254,27141,260],{},[18,27142,259],{"href":257,"rel":27143},[124,125],[232,27145,264],{"id":263},[131,27147,27148],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,27149,27150,27160],{"__ignoreMap":136},[140,27151,27152,27154,27156,27158],{"class":142,"line":143},[140,27153,274],{"class":146},[140,27155,277],{"class":150},[140,27157,280],{"class":150},[140,27159,283],{"class":150},[140,27161,27162,27164,27166,27168,27170,27172,27174,27176,27178,27180],{"class":142,"line":166},[140,27163,147],{"class":146},[140,27165,290],{"class":150},[140,27167,293],{"class":150},[140,27169,296],{"class":150},[140,27171,299],{"class":193},[140,27173,302],{"class":150},[140,27175,305],{"class":183},[140,27177,308],{"class":193},[140,27179,311],{"class":150},[140,27181,314],{"class":150},[27,27183,27185],{"id":27184},"has-anyone-used-people-data-labs-for-customer-prospecting","Has anyone used People Data Labs for customer prospecting?",[11,27187,27188],{},"Yes, and the thing to know first is that prospecting needs two different calls and they cost different amounts.",[11,27190,27191,27194],{},[38,27192,27193],{},"Search"," finds people you cannot name yet, by title, seniority, function, company size or location. This is where a prospecting list comes from, and it bills per record returned, so the filter is also the budget.",[11,27196,27197,27200],{},[38,27198,27199],{},"Enrich"," fills in a person you can already identify, from an email or a LinkedIn URL. This is what runs when a form is submitted or an agent finds a name.",[11,27202,27203],{},"Confusing them is the most common way to overspend here. Enriching a list you have not filtered means paying premium per-record rates to learn about people you were never going to contact.",[131,27205,27207],{"className":133,"code":27206,"language":135,"meta":136,"style":136},"monid inspect -p pdl -e \u002Fv5\u002Fperson\u002Fsearch\nmonid run -p pdl -e \u002Fv5\u002Fperson\u002Fsearch \\\n  --query '{\"query\":\"...\",\"size\":25}'\n",[47,27208,27209,27224,27241],{"__ignoreMap":136},[140,27210,27211,27213,27215,27217,27219,27221],{"class":142,"line":143},[140,27212,147],{"class":146},[140,27214,151],{"class":150},[140,27216,154],{"class":150},[140,27218,9015],{"class":150},[140,27220,160],{"class":150},[140,27222,27223],{"class":150}," \u002Fv5\u002Fperson\u002Fsearch\n",[140,27225,27226,27228,27230,27232,27234,27236,27239],{"class":142,"line":166},[140,27227,147],{"class":146},[140,27229,171],{"class":150},[140,27231,154],{"class":150},[140,27233,9015],{"class":150},[140,27235,160],{"class":150},[140,27237,27238],{"class":150}," \u002Fv5\u002Fperson\u002Fsearch",[140,27240,184],{"class":183},[140,27242,27243,27245,27247,27250],{"class":142,"line":187},[140,27244,2037],{"class":150},[140,27246,194],{"class":193},[140,27248,27249],{"class":150},"{\"query\":\"...\",\"size\":25}",[140,27251,200],{"class":193},[11,27253,27254,27256],{},[47,27255,3936],{}," is free and prints the current price and the exact filter schema, which is worth reading before the first search rather than after: on a per-result endpoint the difference between a tight filter and a loose one is the difference between a list and a bill.",[11,27258,27259],{},"One honest note about the answer to this question in the wild. When an AI is asked whether PDL is good for prospecting, one of the pages it cites is a review published by ZoomInfo. That is a competitor's assessment of a competitor, and it may still be accurate, but it is worth knowing whose page you are reading.",[316,27261],{"category":12584},[320,27263,27264],{},[11,27265,324,27266,119,27268,27272],{},[38,27267,327],{},[18,27269,25032],{"href":27270,"rel":27271},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fwire-up-icp-prospect-search",[124,125]," for the working version of the search half.",[27,27274,27276],{"id":27275},"what-are-the-best-alternatives-to-apolloio-with-better-data-quality","What are the best alternatives to Apollo.io with better data quality?",[11,27278,27279],{},"\"Better quality\" is not a property a provider has. It is a property of a provider against a segment, and the answer flips by segment.",[11,27281,27282],{},"This is the least satisfying true answer in the category, so here is the useful version of it.",[11,27284,27285,27288],{},[38,27286,27287],{},"Quality is regional and vertical."," A provider strong on US tech mid-market can be thin on European manufacturing. Aggregate accuracy claims average over segments you do not sell into.",[11,27290,27291,27294,27295,260],{},[38,27292,27293],{},"Email deliverability is a separate axis from record accuracy."," A record can be current and its email still bounce. The fix is a verification step, not a different data vendor, and it costs an order of magnitude less than re-buying the record. We covered ",[18,27296,27299],{"href":27297,"rel":27298},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fguides\u002Fbest-email-verification-api-2026",[124,125],"that comparison separately",[11,27301,27302,27305],{},[38,27303,27304],{},"The only test that answers it is your own."," Take fifty accounts you know cold, run them through two providers, and count how many titles are current. That is a few dollars on metered pricing and it tells you more than every published accuracy figure combined, because it is measured on your segment.",[11,27307,27308],{},"That test is the actual argument for a marketplace here. Running it across providers normally means two signups, two contracts and two invoices before you learn anything. On one balance it is two calls.",[27,27310,27312],{"id":27311},"why-is-zoominfo-so-much-more-expensive-than-other-sales-intelligence-providers","Why is ZoomInfo so much more expensive than other sales intelligence providers?",[11,27314,27315],{},"Because you are buying five things and the API buyers are comparing one of them.",[11,27317,27318],{},"A ZoomInfo contract includes a maintained dataset, a seat-based interface for people who do not write code, compliance and procurement paperwork, an SLA, and support. A per-record API sells the first only.",[11,27320,27321],{},"Framed that way the gap stops looking like a markup. If your revenue team lives in the UI, if legal needs signed terms, and if someone needs to answer the phone when it breaks, those are the product and the price is for them.",[11,27323,27324],{},"Where the model hurts is unevenness. A commitment sized for your busiest quarter is paid in the quiet one, and a record looked up once costs the same as one looked up daily. Engineering-led use is usually bursty, which is exactly the shape an annual commitment handles worst.",[11,27326,27327,27330],{},[38,27328,27329],{},"The split, plainly:"," buy the contract when the data is a standing input to a team's daily work. Buy calls when it is an input to a pipeline that runs in bursts. Most of the disagreement about this price is two groups with different usage shapes talking past each other.",[421,27332],{"category":12584,"title":27333},"Compare providers on one balance, no contract",[27,27335,480],{"id":479},[482,27337,27338,27350],{},[485,27339,27340],{},[488,27341,27342,27344,27346,27348],{},[491,27343,493],{},[491,27345,496],{},[491,27347,14242],{},[491,27349,502],{},[504,27351,27352,27369,27386,27404,27421,27436],{},[488,27353,27354,27357,27364,27367],{},[509,27355,27356],{},"Find people you cannot name yet",[509,27358,27359],{},[18,27360,27362],{"href":17223,"rel":27361},[124,125],[47,27363,17646],{},[509,27365,27366],{},"Filters: title, seniority, size, location",[509,27368,3551],{},[488,27370,27371,27374,27381,27384],{},[509,27372,27373],{},"Enrich a person you can identify",[509,27375,27376],{},[18,27377,27379],{"href":17223,"rel":27378},[124,125],[47,27380,17227],{},[509,27382,27383],{},"Email, LinkedIn URL, name plus company",[509,27385,542],{},[488,27387,27388,27391,27399,27402],{},[509,27389,27390],{},"Enrich a person, Apollo's data",[509,27392,27393],{},[18,27394,27396],{"href":215,"rel":27395},[124,125],[47,27397,27398],{},"apollo \u002Fpeople\u002Fmatch",[509,27400,27401],{},"Email, name, domain",[509,27403,542],{},[488,27405,27406,27409,27416,27419],{},[509,27407,27408],{},"Find prospects, Apollo's data",[509,27410,27411],{},[18,27412,27414],{"href":215,"rel":27413},[124,125],[47,27415,12120],{},[509,27417,27418],{},"Title, seniority, function filters",[509,27420,542],{},[488,27422,27423,27425,27432,27434],{},[509,27424,26406],{},[509,27426,27427],{},[18,27428,27430],{"href":569,"rel":27429},[124,125],[47,27431,592],{},[509,27433,22925],{},[509,27435,542],{},[488,27437,27438,27441,27448,27450],{},[509,27439,27440],{},"Company firmographics plus assessment",[509,27442,27443],{},[18,27444,27446],{"href":569,"rel":27445},[124,125],[47,27447,22940],{},[509,27449,7213],{},[509,27451,3551],{},[11,27453,25679,27454,24195,27456,24198],{},[47,27455,603],{},[47,27457,607],{},[11,27459,27460,27461,27463,27464,27466],{},"The shape is the part to read. ",[38,27462,542],{}," means one price whatever comes back, which suits lookups. ",[38,27465,3551],{}," means the bill tracks records, which suits searches and makes your limit parameter a spending cap. A search endpoint run without a limit is the single most expensive mistake available in this category.",[232,27468,27470],{"id":27469},"what-one-company-record-actually-contains","What one company record actually contains",[11,27472,27473,27474,27476,27477],{},"We ran ",[47,27475,592],{}," against a domain on 2026-08-14 to see what a real record looks like rather than what the field list promises. ",[38,27478,27479],{},"36 fields, 10 of them empty.",[11,27481,27482,27483,98,27486,98,27488,98,27491,98,27494,98,27497,98,27500,98,27503,98,27506,102,27509,27512,27513],{},"The empties were ",[47,27484,27485],{},"founded",[47,27487,6114],{},[47,27489,27490],{},"naics",[47,27492,27493],{},"sic",[47,27495,27496],{},"ticker",[47,27498,27499],{},"twitter_url",[47,27501,27502],{},"tags",[47,27504,27505],{},"alternative_names",[47,27507,27508],{},"alternative_domains",[47,27510,27511],{},"mic_exchange",". Several of those are the ones people assume are always present: ",[38,27514,27515,102,27517,27519],{},[47,27516,6114],{},[47,27518,27485],{}," came back null on a well-known company with a public address and a widely reported founding year.",[11,27521,27522,27523,98,27526,98,27528,98,27530,98,27532,102,27534,27536],{},"The 26 populated fields were stronger than expected in one area. Alongside the obvious identity and social profiles, the record carried ",[47,27524,27525],{},"total_funding_raised",[47,27527,23931],{},[47,27529,24016],{},[47,27531,23948],{},[47,27533,23944],{},[47,27535,23912],{},". Funding history in a company-enrich response is genuinely useful and rarely what people buy this endpoint for.",[11,27538,27539,119,27542,27545,27546,27549,27550,27553],{},[38,27540,27541],{},"And one field pair disagreed with itself.",[47,27543,27544],{},"size"," came back as a band, \"51-200\". ",[47,27547,27548],{},"employee_count"," in the same response was 4,574. That is not a rounding difference; it is roughly eighty times, and it is the same failure mode we found in ",[18,27551,27552],{"href":12653},"LinkedIn company data",": a self-reported band that a company set once and never revised, sitting next to a counted figure that is current.",[11,27555,27556,27557,27563],{},"The lesson generalises past this vendor. ",[38,27558,27559,27560,27562],{},"Segmenting accounts by ",[47,27561,27544],{}," is segmenting on a field somebody typed years ago."," If the decision matters, use the counted field and treat the band as a label. Nothing in the response flags which of the two to trust, and both providers we have measured this on ship the contradiction the same way.",[11,27565,27566,27567,27569],{},"One more field worth knowing: ",[47,27568,23920],{},", which is the provider's own confidence that the match is correct. It is the only field in the record that tells you how much to trust the rest, and it is the first thing to read on any bulk enrich.",[232,27571,27573],{"id":27572},"the-decay-nobody-prices-in","The decay nobody prices in",[11,27575,27576],{},"One number is worth holding onto when comparing providers: none of them see a job change on the day it happens.",[11,27578,27579],{},"A person record is a snapshot of when it was last observed, and observation is not continuous. The gap between a title changing and any dataset reflecting it is the single largest source of \"bad data\" complaints in this category, and it is not a quality difference between vendors so much as a property of how the whole market works.",[11,27581,27582,27583,27586,27587,27590],{},"Two things follow. ",[38,27584,27585],{},"Recency beats coverage"," for anything you act on: a smaller dataset refreshed often is more useful for outreach than a larger one refreshed rarely, and coverage is the number vendors publish. And ",[38,27588,27589],{},"the confidence field is the one to read",", because a match the provider is unsure about is where decay and mismatching both show up first.",[11,27592,27593],{},"If you are building on this, store the observation date alongside the record and let it age visibly. A title with no date attached is a fact in your database and a guess in reality.",[27,27595,657],{"id":656},[11,27597,27598,27601],{},[38,27599,27600],{},"Your revenue team needs seats and a UI."," Every platform here ships one and we do not. If the people doing the work are not engineers, buy the tool built for them; the API is not a substitute.",[11,27603,27604,27607],{},[38,27605,27606],{},"You need procurement paperwork."," Signed DPAs, security review, an SLA with credits. That is what an enterprise contract is for and it is a legitimate thing to pay for.",[11,27609,27610,27613],{},[38,27611,27612],{},"One provider, high steady volume."," At scale a direct contract's unit price beats metered, and support comes with it. Price it out rather than assuming.",[11,27615,27616,27618,27619,13962,27623,27625],{},[38,27617,686],{}," Our price metadata has disagreed with real charges on endpoints we resell: measuring our own catalogue this month turned up one endpoint billing per record while described as per query, at fifty times the quoted unit. We ",[18,27620,27622],{"href":25779,"rel":27621},[124,125],"published it",[47,27624,607],{}," tells you what an endpoint claims; only a small run tells you what it charges. Do one before any batch, on any vendor, including ours.",[27,27627,696],{"id":695},[11,27629,27630],{},"The provider comparison that gets published is about record counts, and the decision that actually matters is about jobs: finding people you cannot name, filling in people you can, or buying a contract that includes seats and paperwork. Those are three purchases and only the middle one is really an API decision.",[11,27632,27633],{},"Two things beat picking a vendor on reputation. Test on your own segment, because quality is regional and vertical and aggregate accuracy figures average over markets you do not sell into. And read the billing shape before the price, because a per-result search without a limit costs more than any unit-price difference between vendors.",[11,27635,713,27636,27639,27640,27642,27643,260],{},[47,27637,27638],{},"monid discover -q \"person enrichment\""," shows what exists and ",[47,27641,607],{}," prints each schema and price without spending. Then run fifty accounts you already know through two of them and count. Begin at ",[18,27644,725],{"href":723,"rel":27645},[124,125],[27,27647,729],{"id":728},[731,27649,27651],{"q":27650},"Does anyone know an alternative to Pipl?",[11,27652,27653],{},"For identity resolution from a thin identifier, the closest working substitutes are the enrich endpoints above: PDL and Apollo both accept an email or a name plus company and return a person record. They are not equivalent products, and the honest limit is that consumer-scale identity search is a different and more regulated business than B2B enrichment. If the use case is B2B contact data, the enrich endpoints cover it; if it is people search in general, they do not.",[731,27655,27656],{"q":10137},[11,27657,27658],{},"Use Apollo's own API rather than a scraper pointed at their UI, which is the route that stops working when access is revoked. The broader lesson is about coupling: a pipeline wired directly to one vendor's access breaks entirely when that access changes, whereas one that treats the provider and endpoint as parameters turns the same event into a two-string edit.",[731,27660,27662],{"q":27661},"How do I enrich a list when all I have is email addresses?",[11,27663,27664],{},"Email is a supported identifier on the enrich endpoints, so it works directly. Verify before you enrich: verification costs roughly an order of magnitude less than enrichment, so filtering out dead addresses first is the cheapest saving in this pipeline. Enriching an unverified list means paying premium rates to learn about people you cannot reach.",[731,27666,27668],{"q":27667},"How accurate is any of this data, really?",[11,27669,27670],{},"Accurate enough to be useful and never current enough to trust blindly, and any provider that claims otherwise is selling. Job changes are the main decay: a record correct at collection can be wrong within months, and no vendor sees a departure the day it happens. Treat a title as evidence rather than fact, re-check before anything consequential, and measure decay on your own segment rather than accepting a published figure.",[11,27672,27673],{},[758,27674,760],{},[762,27676,25905],{},{"title":136,"searchDepth":166,"depth":166,"links":27678},[27679,27683,27684,27685,27686,27690,27691,27692],{"id":27097,"depth":166,"text":27098,"children":27680},[27681,27682],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":27184,"depth":166,"text":27185},{"id":27275,"depth":166,"text":27276},{"id":27311,"depth":166,"text":27312},{"id":479,"depth":166,"text":480,"children":27687},[27688,27689],{"id":27469,"depth":187,"text":27470},{"id":27572,"depth":187,"text":27573},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fpeople-data-labs-apollo-zoominfo-alternatives.png","Four providers, one honest split: search versus enrich versus contract. What each is genuinely best at, and why the price gap is not what it looks like.","\u002Fimg\u002Fblog\u002Fpeople-data-labs-apollo-zoominfo-alternatives-card.png",{},{"title":27083,"description":27694},"blog\u002Fguides\u002Fpeople-data-labs-apollo-zoominfo-alternatives",[17823,27700,27701,27702],"apollo alternatives","zoominfo","b2b data","zYfygCOeFS7_fMV55ndiU0vIbexOA1PSQveCBG98VKo",{"id":27705,"title":27706,"author":6,"body":27707,"category":8203,"cover":28226,"description":28227,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":28228,"meta":28229,"navigation":790,"ogImage":787,"path":28230,"publishedAt":25930,"readTime":27074,"seo":28231,"stem":28232,"tags":28233,"toolCategory":27841,"updatedAt":25930,"__hash__":28237},"blogGuides\u002Fblog\u002Fguides\u002Freddit-scraping-api-alternatives.md","Is There an Alternative to Apify for Scraping Reddit?",{"type":8,"value":27708,"toc":28208},[27709,27712,27718,27721,27725,27728,27743,27752,27758,27761,27763,27768,27773,27778,27780,27832,27839,27842,27846,27849,27852,27855,27861,27867,27873,27877,27883,27889,27895,27898,27909,27913,27916,27923,27929,27935,27941,27947,27950,27954,27957,27963,27969,27975,27982,27985,27987,28089,28095,28104,28108,28111,28114,28121,28124,28126,28132,28138,28144,28155,28157,28160,28163,28166,28177,28179,28184,28190,28196,28202,28206],[11,27710,27711],{},"Reddit is the most useful and least cooperative source in social listening. It is where people describe problems in their own words, which is exactly what you want, and it is also where a keyword search returns a pile of threads that have nothing to do with your keyword.",[11,27713,27714,27715,27717],{},"This guide answers both halves: which endpoints read Reddit if you would rather not run Apify, and why the results come back wrong so often. Monid is ",[18,27716,21],{"href":20},", so we resell most of these rather than being one of them.",[11,27719,27720],{},"Fair disclosure: you are on the Monid blog. We also use this data ourselves, and the field list below comes from a pull we actually ran rather than from a documentation page.",[27,27722,27724],{"id":27723},"is-there-an-alternative-to-apify-for-scraping-reddit","Is there an alternative to Apify for scraping Reddit?",[11,27726,27727],{},"Yes, and they split by what you are reading: a subreddit's feed, one post's comments, or a user's history.",[11,27729,27730,27732,27733,98,27736,98,27739,27742],{},[38,27731,13576],{}," covers all three with per-call endpoints: ",[47,27734,27735],{},"fetch_subreddit_feed",[47,27737,27738],{},"fetch_post_comments",[47,27740,27741],{},"fetch_user_comments",". One request, one price, whatever comes back. That suits a monitoring loop where you poll the same subreddit on a schedule.",[11,27744,27745,27747,27748,27751],{},[38,27746,5031],{}," cover deeper comment extraction: ",[47,27749,27750],{},"crawlerbros\u002Freddit-comment-scraper"," pulls full threads, billed per result with a flat fee per run. That suits a one-off deep read of a specific discussion.",[11,27753,27754,27757],{},[38,27755,27756],{},"Reddit's own API"," is the fourth option and the one people forget to consider. It is official, it is free at low volume, and it requires an app registration and OAuth. If your use is modest and you are willing to hold credentials, it is the correct answer and no scraper beats free-and-official.",[11,27759,27760],{},"The honest framing: the alternatives to Apify here are not better scrapers. They are different billing shapes and different depths, and picking well is mostly about which of those two you need.",[232,27762,235],{"id":234},[11,27764,238,27765,244],{},[18,27766,243],{"href":241,"rel":27767},[124,125],[131,27769,27771],{"className":27770,"code":249,"language":97,"meta":136},[248],[47,27772,249],{"__ignoreMap":136},[11,27774,254,27775,260],{},[18,27776,259],{"href":257,"rel":27777},[124,125],[232,27779,264],{"id":263},[131,27781,27783],{"className":133,"code":27782,"language":135,"meta":136,"style":136},"npm install -g @monid-ai\u002Fcli\nmonid keys add -k \u003Cyour-key> -l main\nmonid discover -q \"reddit posts comments\"\n",[47,27784,27785,27795,27817],{"__ignoreMap":136},[140,27786,27787,27789,27791,27793],{"class":142,"line":143},[140,27788,274],{"class":146},[140,27790,277],{"class":150},[140,27792,280],{"class":150},[140,27794,283],{"class":150},[140,27796,27797,27799,27801,27803,27805,27807,27809,27811,27813,27815],{"class":142,"line":166},[140,27798,147],{"class":146},[140,27800,290],{"class":150},[140,27802,293],{"class":150},[140,27804,296],{"class":150},[140,27806,299],{"class":193},[140,27808,302],{"class":150},[140,27810,305],{"class":183},[140,27812,308],{"class":193},[140,27814,311],{"class":150},[140,27816,314],{"class":150},[140,27818,27819,27821,27823,27825,27827,27830],{"class":142,"line":187},[140,27820,147],{"class":146},[140,27822,2667],{"class":150},[140,27824,2670],{"class":150},[140,27826,2673],{"class":193},[140,27828,27829],{"class":150},"reddit posts comments",[140,27831,2679],{"class":193},[11,27833,27834,102,27836,27838],{},[47,27835,4274],{},[47,27837,3936],{}," are free, so comparing the three shapes before spending costs nothing.",[316,27840],{"category":27841},"reddit",[27,27843,27845],{"id":27844},"why-does-a-reddit-scraper-return-irrelevant-posts-that-do-not-match-my-search-keywords","Why does a Reddit scraper return irrelevant posts that do not match my search keywords?",[11,27847,27848],{},"Because the scraper is passing your string to Reddit's own search and inheriting its behaviour. It is rarely the scraper ignoring you.",[11,27850,27851],{},"This is the most-reported complaint about Reddit scraping and the diagnosis matters, because the usual response is to switch tools, which does not help when every tool queries the same search.",[11,27853,27854],{},"Three things are happening.",[11,27856,27857,27860],{},[38,27858,27859],{},"Reddit's search is relevance-ranked, not filtered."," It returns what it judges related, and relatedness on a site of this size is loose. A query about \"scraping API\" surfaces threads about scraping in general, about APIs in general, and about neither.",[11,27862,27863,27866],{},[38,27864,27865],{},"Term ambiguity is brutal here."," Reddit spans every domain at once, so a term that is unambiguous in your industry is not unambiguous on Reddit. We hit this directly: pulling threads for \"linkedin scraping\" returned a 488-comment thread about whether to delete your LinkedIn profile before a policy change, which shares one word with the query and nothing else.",[11,27868,27869,27872],{},[38,27870,27871],{},"Sorting is not filtering."," Sorting by relevance or top still returns the whole result set in a different order. If the set is wrong, the order does not save you.",[232,27874,27876],{"id":27875},"what-actually-fixes-it","What actually fixes it",[11,27878,27879,27882],{},[38,27880,27881],{},"Search inside subreddits, not across Reddit."," A domain-specific subreddit does the disambiguation for you: the same query in r\u002Fwebscraping means one thing, and across Reddit it means several. This is the single highest-leverage change.",[11,27884,27885,27888],{},[38,27886,27887],{},"Filter after retrieval, on your own criteria."," Pull wider than you need, then keep rows that match a stricter local rule: required terms, minimum comment count, recency. Retrieval is cheap; judgement is yours.",[11,27890,27891,27894],{},[38,27892,27893],{},"Require more than one term to match."," A single shared word is not a topical match, and treating it as one is exactly how the irrelevant results get in.",[11,27896,27897],{},"We learned the third one by getting it wrong. Our own ranking treated a single-term overlap as a hit, and a busy off-topic thread outranked everything genuinely on-topic because it had 488 comments. The fix was to score by how much of the query a row covers and to scale popularity by that same coverage, so a busy thread only ranks if it is also relevant.",[320,27899,27900],{},[11,27901,324,27902,119,27904,27908],{},[38,27903,327],{},[18,27905,16505],{"href":27906,"rel":27907},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fwhy-one-google-maps-scraper-is-not-enough",[124,125],", which is the same lesson on a different source.",[27,27910,27912],{"id":27911},"what-do-you-actually-get-back","What do you actually get back?",[11,27914,27915],{},"Post title, body, subreddit, score, comment count, author, timestamp and permalink; comments come from a separate call.",[11,27917,27918,27919,27922],{},"We can be specific because we ran this job for our own SEO work: two rounds of pulls across roughly fifteen search terms, deduplicated to ",[38,27920,27921],{},"272 posts"," that we kept as evidence for which questions real people ask. The fields that earned their place:",[11,27924,27925,27928],{},[38,27926,27927],{},"Title"," does most of the work. On Reddit the title is usually the question, phrased the way the asker phrases it, which is the thing you cannot get from a keyword tool.",[11,27930,27931,27934],{},[38,27932,27933],{},"Comment count"," is the best single quality signal available. A thread with forty comments is a discussion; a thread with zero is a post. When we ranked what to pay attention to, comment count beat score.",[11,27936,27937,27940],{},[38,27938,27939],{},"Subreddit"," is context that changes meaning. The same question in r\u002Fn8n and r\u002FOSINT is two different questions with two different right answers.",[11,27942,27943,27946],{},[38,27944,27945],{},"Permalink"," is what makes the row auditable later. A finding you cannot trace back to its thread is not evidence.",[11,27948,27949],{},"What you do not get is anything from a private or removed thread, and deleted comments stay deleted. That is correct behaviour rather than a coverage gap.",[232,27951,27953],{"id":27952},"what-the-distribution-actually-looked-like","What the distribution actually looked like",[11,27955,27956],{},"Numbers from that pull, because the shape of a Reddit result set is the part that surprises people who have only read the docs.",[11,27958,27959,27962],{},[38,27960,27961],{},"39 of the 272 posts had zero comments."," Not deleted, not broken, just posted and ignored. That is one in seven, and it is the strongest argument for treating comment count as a filter rather than a display field: a seventh of any Reddit result set is noise by this measure alone.",[11,27964,27965,27968],{},[38,27966,27967],{},"The median post had five comments."," Not fifty. The threads that feel representative when you browse Reddit are the tail, and a pull weighted by relevance returns mostly the middle, which is quiet.",[11,27970,27971,27974],{},[38,27972,27973],{},"One subreddit supplied 32 of the 272."," r\u002FAPI_Finder, which turned out to be largely vendors posting their own listings, and those listings are why we learned that every LinkedIn scraper on the market leads with \"No Cookies\" in its title. Useful, but not what we were looking for, and it would have skewed any analysis that treated all 272 rows as equally independent evidence. The next four were r\u002Fn8n and r\u002Fapify at 13 each, r\u002FSideProject at 10, and r\u002Fscrapingtheweb at 5.",[11,27976,27977,27978,27981],{},"That last one is the practical warning. ",[38,27979,27980],{},"A keyword pull concentrates in whichever subreddit happens to use your vocabulary most",", and that subreddit's culture then dominates your conclusions. Check the distribution by source before you read anything into the aggregate. We nearly drew a conclusion about what buyers ask from what was in fact a wall of vendor self-promotion.",[421,27983],{"category":27841,"title":27984},"Browse the Reddit endpoints, with live pricing",[27,27986,480],{"id":479},[482,27988,27989,28001],{},[485,27990,27991],{},[488,27992,27993,27995,27997,27999],{},[491,27994,493],{},[491,27996,496],{},[491,27998,7553],{},[491,28000,502],{},[504,28002,28003,28021,28039,28057,28075],{},[488,28004,28005,28008,28016,28019],{},[509,28006,28007],{},"Monitor a subreddit",[509,28009,28010],{},[18,28011,28013],{"href":25667,"rel":28012},[124,125],[47,28014,28015],{},"tikhub \u002Freddit\u002Fapp\u002Ffetch_subreddit_feed",[509,28017,28018],{},"Feed of posts with metadata",[509,28020,542],{},[488,28022,28023,28026,28034,28037],{},[509,28024,28025],{},"Read one post's comments",[509,28027,28028],{},[18,28029,28031],{"href":25667,"rel":28030},[124,125],[47,28032,28033],{},"tikhub \u002Freddit\u002Fapp\u002Ffetch_post_comments",[509,28035,28036],{},"Comment tree for a post",[509,28038,542],{},[488,28040,28041,28044,28052,28055],{},[509,28042,28043],{},"Follow a user's history",[509,28045,28046],{},[18,28047,28049],{"href":25667,"rel":28048},[124,125],[47,28050,28051],{},"tikhub \u002Freddit\u002Fapp\u002Ffetch_user_comments",[509,28053,28054],{},"That user's comments",[509,28056,542],{},[488,28058,28059,28062,28070,28073],{},[509,28060,28061],{},"Deep-read a full thread",[509,28063,28064],{},[18,28065,28067],{"href":16581,"rel":28066},[124,125],[47,28068,28069],{},"apify \u002Fcrawlerbros\u002Freddit-comment-scraper",[509,28071,28072],{},"Full comment threads",[509,28074,524],{},[488,28076,28077,28080,28083,28086],{},[509,28078,28079],{},"Your own app, low volume",[509,28081,28082],{},"Reddit's official API",[509,28084,28085],{},"Everything above, officially",[509,28087,28088],{},"Free with OAuth",[11,28090,25679,28091,604,28093,16689],{},[47,28092,603],{},[47,28094,607],{},[11,28096,28097,28098,28100,28101,28103],{},"The shape decides your architecture here more than usual. ",[38,28099,542],{}," suits a schedule: polling one subreddit hourly costs the same whether it is busy or quiet. ",[38,28102,3551],{}," suits a burst: one deep read of a big thread, capped by a limit you set deliberately.",[232,28105,28107],{"id":28106},"why-the-title-is-the-whole-asset","Why the title is the whole asset",[11,28109,28110],{},"One more thing that pull taught us, and it changes what you build.",[11,28112,28113],{},"On most sources the body text is the data and the title is a label. On Reddit the title is usually the entire question, phrased by the person who has the problem, and the body often adds context you did not need. That inverts the usual pipeline: you can rank, filter and cluster on titles alone, and only fetch bodies and comments for the rows that survive.",[11,28115,28116,28117,28120],{},"That matters for cost and for quality. ",[38,28118,28119],{},"Fetching comments for every row is the expensive mistake",", and it is unnecessary when a title-only pass already removes the seventh of rows with no discussion and the ones that share a word with your query and nothing else.",[11,28122,28123],{},"It also means the useful output of a Reddit pull is often a list of sentences rather than a dataset. Ours became exactly that: a question bank we now write from, where each row is a real person's phrasing and a link back to where they said it.",[27,28125,657],{"id":656},[11,28127,28128,28131],{},[38,28129,28130],{},"Your volume is low and you can hold credentials."," Reddit's own API is free and official at modest volume. If you are building one integration for your own app and OAuth is acceptable, use it. Free and official beats metered when the coverage overlaps.",[11,28133,28134,28137],{},[38,28135,28136],{},"You need historical data at scale."," Live endpoints read what is there now. Deep historical archives are a different product with different terms, and no amount of scraping substitutes for one.",[11,28139,28140,28143],{},[38,28141,28142],{},"You are doing academic research with a compliance requirement."," Reddit's own programmes exist for that and come with the paperwork a review board will want.",[11,28145,28146,28148,28149,13962,28152,28154],{},[38,28147,686],{}," Measuring our own catalogue this month, we found an endpoint whose real charge did not match its stated billing shape, at fifty times the quoted unit, and ",[18,28150,27622],{"href":25779,"rel":28151},[124,125],[47,28153,607],{}," tells you what an endpoint claims. Only a small run tells you what it charges. Do one before any batch.",[27,28156,696],{"id":695},[11,28158,28159],{},"There are alternatives to Apify for Reddit, and choosing among them is mostly about billing shape and depth rather than quality. Per call for a monitoring loop, per result for a deep read, and Reddit's own free API when your volume is low enough to justify holding credentials.",[11,28161,28162],{},"The harder problem is the one people blame on scrapers. Irrelevant results come from Reddit's own relevance-ranked search and from the fact that a site spanning every domain makes almost every term ambiguous. Searching inside subreddits fixes more of it than switching vendors ever will, and filtering after retrieval on your own criteria fixes most of the rest.",[11,28164,28165],{},"The general form is worth keeping: retrieval is cheap and judgement is not transferable. Pull wider than you need, then decide locally what counts as a match, and require more than one term before you call something relevant.",[11,28167,713,28168,27639,28171,28173,28174,260],{},[47,28169,28170],{},"monid discover -q \"reddit\"",[47,28172,607],{}," prints the schema and price without spending. Begin at ",[18,28175,725],{"href":723,"rel":28176},[124,125],[27,28178,729],{"id":728},[731,28180,28181],{"q":22150},[11,28182,28183],{},"One HTTP node pointed at a catalogue, with the provider and endpoint as parameters, rather than a node per source. Reddit is rarely the only platform an automation touches, and a dedicated node per platform gives you several integrations that break independently. When an endpoint is removed you change two strings instead of rebuilding the branch.",[731,28185,28187],{"q":28186},"Why not just use Reddit's official API?",[11,28188,28189],{},"Often you should. It is free at low volume, it is official, and nothing beats that when the coverage matches. The reasons teams move off it are rate limits at scale, the OAuth app registration and credential handling, and terms that restrict some commercial use. If none of those bite, the official API is the right answer and this guide is about the cases where they do.",[731,28191,28193],{"q":28192},"How do I keep the cost predictable on a comment scrape?",[11,28194,28195],{},"Set the limit deliberately and run one small call first. A per-result endpoint pointed at a large thread with no cap is the expensive mistake here, and the limit parameter is a spending control rather than a convenience. We have measured endpoints whose charge did not match the stated shape, so read the actual charge on a small run before sizing a batch.",[731,28197,28199],{"q":28198},"Will scraping Reddit get me blocked?",[11,28200,28201],{},"Not if you are not the one making the requests. Blocks land on whoever holds the session and the IP, so a managed endpoint reading public pages from the provider's pool keeps that exposure off your infrastructure. The trade is that anything private, removed or deleted stays out of reach, which is correct behaviour rather than a gap to route around.",[11,28203,28204],{},[758,28205,760],{},[762,28207,25905],{},{"title":136,"searchDepth":166,"depth":166,"links":28209},[28210,28214,28217,28220,28223,28224,28225],{"id":27723,"depth":166,"text":27724,"children":28211},[28212,28213],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":27844,"depth":166,"text":27845,"children":28215},[28216],{"id":27875,"depth":187,"text":27876},{"id":27911,"depth":166,"text":27912,"children":28218},[28219],{"id":27952,"depth":187,"text":27953},{"id":479,"depth":166,"text":480,"children":28221},[28222],{"id":28106,"depth":187,"text":28107},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Freddit-scraping-api-alternatives.png","Yes, several. The more useful question is why a Reddit scraper returns posts that miss your keywords, because that is a search problem, not a scraper one.","\u002Fimg\u002Fblog\u002Freddit-scraping-api-alternatives-card.png",{},"\u002Fblog\u002Fguides\u002Freddit-scraping-api-alternatives",{"title":27706,"description":28227},"blog\u002Fguides\u002Freddit-scraping-api-alternatives",[28234,28235,28236,16810],"reddit api","reddit scraper","social listening","UtHw4HVmfwzqRkXigrXYqTjUT588GR0JNMKsPI_wPvc",{"id":28239,"title":28240,"author":6,"body":28241,"category":782,"cover":29148,"description":29149,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":29150,"meta":29151,"navigation":790,"ogImage":787,"path":12653,"publishedAt":29152,"readTime":793,"seo":29153,"stem":29154,"tags":29155,"toolCategory":13419,"updatedAt":792,"__hash__":29157},"blogGuides\u002Fblog\u002Fguides\u002Fbest-linkedin-scraper-api-2026.md","What Is the Best LinkedIn Scraper API in 2026?",{"type":8,"value":28242,"toc":29129},[28243,28249,28252,28256,28259,28262,28266,28269,28276,28283,28287,28290,28293,28296,28299,28310,28313,28316,28318,28323,28328,28333,28335,28371,28375,28380,28392,28396,28459,28468,28476,28484,28488,28493,28503,28507,28565,28580,28588,28610,28614,28619,28636,28640,28682,28690,28695,28702,28704,28715,28717,28723,28726,28729,28732,28734,28895,28901,28905,28908,28911,28917,28926,28928,28931,28937,28943,28949,28965,29042,29058,29068,29070,29073,29079,29091,29093,29102,29108,29116,29122,29126],[11,28244,28245,28246,28248],{},"Ask an AI assistant for the best LinkedIn scraper API and you get a list of vendors. That list is not wrong, but it answers a question nobody has. Nobody wants a LinkedIn scraper. They want employees at forty target accounts, or job postings that appeared this week, or a profile turned into a lead with a real email attached. Those are three different jobs with three different failure modes, and the endpoint that does one well is usually mediocre at the others. Monid is ",[18,28247,21],{"href":20},", so we sit on top of most of these vendors rather than being one of them, which is the only reason we can compare them without picking ourselves.",[11,28250,28251],{},"Fair disclosure before we start: you are on the Monid blog. We make money when you run these endpoints through us. What we will not do below is pretend the data is better than it is, and one of the sections is a worked example of our own output getting a field wrong.",[27,28253,28255],{"id":28254},"how-do-i-scrape-linkedin-without-getting-my-account-banned","How do I scrape LinkedIn without getting my account banned?",[11,28257,28258],{},"This is the first question almost everyone asks, and it is worth being precise about what is actually at risk, because the popular answer is imprecise in a way that costs people accounts.",[11,28260,28261],{},"There are two ways to get LinkedIn data, and they carry completely different risk.",[232,28263,28265],{"id":28264},"the-cookie-approach-and-why-your-account-is-the-thing-you-lose","The cookie approach, and why your account is the thing you lose",[11,28267,28268],{},"The older pattern is to hand a tool your LinkedIn session cookie, or run automation inside your logged-in browser. The tool then acts as you. This works, and it is why the free tier of so many tools exists.",[11,28270,28271,28272,28275],{},"The problem is not detection in the abstract. It is that ",[38,28273,28274],{},"detection lands on your account",", because your account is the one doing the browsing. If the pattern trips a limit, the consequence is a restriction or a ban on the profile you have spent ten years building, not on some vendor's infrastructure. Teams discover this when the account that gets restricted is the founder's.",[11,28277,28278,28279,28282],{},"The market has priced this in more clearly than most blog posts have. Search r\u002FAPI_Finder for LinkedIn scrapers and you get a run of listings from vendors: profile details, profile posts, company employees, post reactions. ",[38,28280,28281],{},"Every one of them puts \"No Cookies\" in the title",", several with a checkmark emoji for emphasis. When eight competing vendors all lead with the same negative feature, that is the objection they hear on every call.",[232,28284,28286],{"id":28285},"the-cookie-free-approach-and-what-you-give-up","The cookie-free approach, and what you give up",[11,28288,28289],{},"The alternative is an endpoint that reads public LinkedIn pages from its own infrastructure and hands you structured JSON. You never log in, so there is no session of yours to restrict. This is what the endpoints in this article do.",[11,28291,28292],{},"You give up two things, and both matter.",[11,28294,28295],{},"You give up anything behind the login: connection-degree, InMail state, who viewed your profile, and the fields a member has chosen to show only to signed-in visitors. If the data you need is gated, no cookie-free endpoint will get it, and one that claims to should be treated with suspicion.",[11,28297,28298],{},"You also give up the pretence of completeness on people data. LinkedIn anonymises a lot of what it shows to signed-out visitors, and you will see that directly in the output further down.",[320,28300,28301],{},[11,28302,324,28303,119,28305],{},[38,28304,327],{},[18,28306,28309],{"href":28307,"rel":28308},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fwhich-linkedin-scraper-returns-emails",[124,125],"Which LinkedIn Scraper Actually Returns Emails?",[27,28311,13458],{"id":28312},"what-is-the-best-linkedin-scraper-api",[11,28314,28315],{},"The best one for the job you are doing. Here are the three jobs, each with the endpoint that fits and what it actually returns.",[232,28317,235],{"id":234},[11,28319,238,28320,244],{},[18,28321,243],{"href":241,"rel":28322},[124,125],[131,28324,28326],{"className":28325,"code":249,"language":97,"meta":136},[248],[47,28327,249],{"__ignoreMap":136},[11,28329,254,28330,260],{},[18,28331,259],{"href":257,"rel":28332},[124,125],[232,28334,264],{"id":263},[131,28336,28337],{"className":133,"code":267,"language":135,"meta":136,"style":136},[47,28338,28339,28349],{"__ignoreMap":136},[140,28340,28341,28343,28345,28347],{"class":142,"line":143},[140,28342,274],{"class":146},[140,28344,277],{"class":150},[140,28346,280],{"class":150},[140,28348,283],{"class":150},[140,28350,28351,28353,28355,28357,28359,28361,28363,28365,28367,28369],{"class":142,"line":166},[140,28352,147],{"class":146},[140,28354,290],{"class":150},[140,28356,293],{"class":150},[140,28358,296],{"class":150},[140,28360,299],{"class":193},[140,28362,302],{"class":150},[140,28364,305],{"class":183},[140,28366,308],{"class":193},[140,28368,311],{"class":150},[140,28370,314],{"class":150},[232,28372,28374],{"id":28373},"job-1-look-up-one-company","Job 1. Look up one company",[11,28376,28377,28379],{},[38,28378,1131],{}," Turns a LinkedIn company URL into a structured company record.",[11,28381,28382,119,28385,28391],{},[38,28383,28384],{},"The endpoint.",[18,28386,28388],{"href":25610,"rel":28387},[124,125],[47,28389,28390],{},"tikhub \u002Fapi\u002Fv1\u002Flinkedin\u002Fweb_v2\u002Fget_company_profile",", billed per call, so a lookup costs the same whether the company has ten employees or ten thousand.",[11,28393,28394],{},[38,28395,1148],{},[131,28397,28399],{"className":133,"code":28398,"language":135,"meta":136,"style":136},"monid discover -q \"linkedin company\"\nmonid inspect -p tikhub -e \u002Fapi\u002Fv1\u002Flinkedin\u002Fweb_v2\u002Fget_company_profile\nmonid run -p tikhub -e \u002Fapi\u002Fv1\u002Flinkedin\u002Fweb_v2\u002Fget_company_profile \\\n  --query '{\"url\":\"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fanthropicresearch\u002F\"}'\n",[47,28400,28401,28416,28431,28448],{"__ignoreMap":136},[140,28402,28403,28405,28407,28409,28411,28414],{"class":142,"line":143},[140,28404,147],{"class":146},[140,28406,2667],{"class":150},[140,28408,2670],{"class":150},[140,28410,2673],{"class":193},[140,28412,28413],{"class":150},"linkedin company",[140,28415,2679],{"class":193},[140,28417,28418,28420,28422,28424,28426,28428],{"class":142,"line":166},[140,28419,147],{"class":146},[140,28421,151],{"class":150},[140,28423,154],{"class":150},[140,28425,13698],{"class":150},[140,28427,160],{"class":150},[140,28429,28430],{"class":150}," \u002Fapi\u002Fv1\u002Flinkedin\u002Fweb_v2\u002Fget_company_profile\n",[140,28432,28433,28435,28437,28439,28441,28443,28446],{"class":142,"line":187},[140,28434,147],{"class":146},[140,28436,171],{"class":150},[140,28438,154],{"class":150},[140,28440,13698],{"class":150},[140,28442,160],{"class":150},[140,28444,28445],{"class":150}," \u002Fapi\u002Fv1\u002Flinkedin\u002Fweb_v2\u002Fget_company_profile",[140,28447,184],{"class":183},[140,28449,28450,28452,28454,28457],{"class":142,"line":1279},[140,28451,2037],{"class":150},[140,28453,194],{"class":193},[140,28455,28456],{"class":150},"{\"url\":\"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fanthropicresearch\u002F\"}",[140,28458,200],{"class":193},[11,28460,28461,28463,28464,28467],{},[38,28462,1195],{}," Name, about text, industry, website, company ID, follower count, a headcount observed on LinkedIn, a self-reported size band, a sample of employees, and a ",[47,28465,28466],{},"similar"," array of comparable companies. That last field is the underrated one: it is LinkedIn's own view of who competes with whom, and it is free inside a call you were making anyway.",[11,28469,28470,28471,260],{},"Run this across an account list on a schedule and you have a firmographics table that maintains itself, which is the pattern in ",[18,28472,28475],{"href":28473,"rel":28474},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fautomate-linkedin-company-data-pulls",[124,125],"automating company data pulls into a table",[11,28477,28478,28480,28481,260],{},[38,28479,1229],{}," A fraction of a cent per call. Current figures at ",[18,28482,1233],{"href":5582,"rel":28483},[124,125],[232,28485,28487],{"id":28486},"job-2-find-the-people-at-those-companies","Job 2. Find the people at those companies",[11,28489,28490,28492],{},[38,28491,1131],{}," Takes company URLs and returns employee profiles, filtered by title, seniority, location or function.",[11,28494,28495,119,28497,28502],{},[38,28496,28384],{},[18,28498,28500],{"href":25610,"rel":28499},[124,125],[47,28501,25614],{},", billed per result plus a small flat fee per run.",[11,28504,28505],{},[38,28506,1148],{},[131,28508,28510],{"className":133,"code":28509,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Fharvestapi\u002Flinkedin-company-employees\nmonid run -p apify -e \u002Fharvestapi\u002Flinkedin-company-employees \\\n  -i '{\"companies\":[\"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fanthropicresearch\"],\n       \"profileScraperMode\":\"Full\",\n       \"maxItems\":50}'\n",[47,28511,28512,28527,28544,28553,28558],{"__ignoreMap":136},[140,28513,28514,28516,28518,28520,28522,28524],{"class":142,"line":143},[140,28515,147],{"class":146},[140,28517,151],{"class":150},[140,28519,154],{"class":150},[140,28521,157],{"class":150},[140,28523,160],{"class":150},[140,28525,28526],{"class":150}," \u002Fharvestapi\u002Flinkedin-company-employees\n",[140,28528,28529,28531,28533,28535,28537,28539,28542],{"class":142,"line":166},[140,28530,147],{"class":146},[140,28532,171],{"class":150},[140,28534,154],{"class":150},[140,28536,157],{"class":150},[140,28538,160],{"class":150},[140,28540,28541],{"class":150}," \u002Fharvestapi\u002Flinkedin-company-employees",[140,28543,184],{"class":183},[140,28545,28546,28548,28550],{"class":142,"line":187},[140,28547,190],{"class":150},[140,28549,194],{"class":193},[140,28551,28552],{"class":150},"{\"companies\":[\"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fanthropicresearch\"],\n",[140,28554,28555],{"class":142,"line":1279},[140,28556,28557],{"class":150},"       \"profileScraperMode\":\"Full\",\n",[140,28559,28560,28563],{"class":142,"line":1284},[140,28561,28562],{"class":150},"       \"maxItems\":50}",[140,28564,200],{"class":193},[11,28566,28567,28569,28570,28573,28574,28579],{},[38,28568,1195],{}," Identity and public profile URL, headline, current and prior positions, parsed location, education, skills, and follower counts. ",[47,28571,28572],{},"profileScraperMode"," is the field to read carefully: it has a short mode, a full mode, and a full-plus-email mode, and it changes both the depth and the price. The email mode runs SMTP validation, which is the difference between an address and a deliverable address. Whether you need it at all depends on what you are replacing: we have ",[18,28575,28578],{"href":28576,"rel":28577},"https:\u002F\u002Fmonid.ai\u002Fblog\u002F500-linkedin-emails-without-sales-navigator",[124,125],"built a list this way without Sales Navigator"," and the validation step was the part that mattered.",[11,28581,28582,28584,28585,28587],{},[38,28583,1229],{}," Cents per profile, with the mode you pick moving it. The ",[47,28586,14461],{}," parameter caps the result count directly, which means it also caps the bill. Set it deliberately.",[11,28589,28590,28591,28596,28597,28600,28601,28605,28606,260],{},"If you already hold the profile URLs and only need them enriched, skip the search and go straight to ",[18,28592,28594],{"href":25610,"rel":28593},[124,125],[47,28595,16639],{},", which takes a ",[47,28598,28599],{},"profileUrls"," array. We walked that path start to finish in ",[18,28602,28604],{"href":25536,"rel":28603},[124,125],"turning a profile URL into an enriched lead",", and compared what each option actually returns in ",[18,28607,28609],{"href":28307,"rel":28608},[124,125],"the email question",[232,28611,28613],{"id":28612},"job-3-watch-jobs-and-posts-over-time","Job 3. Watch jobs and posts over time",[11,28615,28616,28618],{},[38,28617,1131],{}," Runs a saved query on a schedule so you see what is new.",[11,28620,28621,119,28623,28628,28629,28635],{},[38,28622,1137],{},[18,28624,28626],{"href":25610,"rel":28625},[124,125],[47,28627,128],{}," for postings, and ",[18,28630,28632],{"href":25610,"rel":28631},[124,125],[47,28633,28634],{},"apify \u002Fharvestapi\u002Flinkedin-profile-posts"," for content from a profile or company page.",[11,28637,28638],{},[38,28639,1148],{},[131,28641,28643],{"className":133,"code":28642,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Fharvestapi\u002Flinkedin-job-search \\\n  -i '{\"jobTitles\":[\"data engineer\"],\n       \"locations\":[\"Berlin\"],\n       \"maxItems\":100}'\n",[47,28644,28645,28661,28670,28675],{"__ignoreMap":136},[140,28646,28647,28649,28651,28653,28655,28657,28659],{"class":142,"line":143},[140,28648,147],{"class":146},[140,28650,171],{"class":150},[140,28652,154],{"class":150},[140,28654,157],{"class":150},[140,28656,160],{"class":150},[140,28658,180],{"class":150},[140,28660,184],{"class":183},[140,28662,28663,28665,28667],{"class":142,"line":166},[140,28664,190],{"class":150},[140,28666,194],{"class":193},[140,28668,28669],{"class":150},"{\"jobTitles\":[\"data engineer\"],\n",[140,28671,28672],{"class":142,"line":187},[140,28673,28674],{"class":150},"       \"locations\":[\"Berlin\"],\n",[140,28676,28677,28680],{"class":142,"line":1279},[140,28678,28679],{"class":150},"       \"maxItems\":100}",[140,28681,200],{"class":193},[11,28683,28684,28686,28687,28689],{},[38,28685,1195],{}," Job title, company, location, posting date and the listing URL. The pricing note on this endpoint is worth reading before you scale it: it runs once per query in ",[47,28688,206],{},", so total results are roughly queries multiplied by the per-query limit. Pass one query at a time until you know what a run returns.",[11,28691,28692,28694],{},[38,28693,1229],{}," The cheapest of the three per result, because a job listing is a much smaller object than a person.",[11,28696,28697,28698,24034],{},"Freshness is the thing to check here rather than price, since a stale posting is worse than no posting: we tested ",[18,28699,28701],{"href":330,"rel":28700},[124,125],"which job APIs actually stay current",[316,28703],{"category":13419},[320,28705,28706],{},[11,28707,324,28708,119,28710],{},[38,28709,327],{},[18,28711,28714],{"href":28712,"rel":28713},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fship-a-linkedin-job-alert-bot",[124,125],"Ship a LinkedIn Job-Alert Bot With One Metered API Call",[27,28716,22150],{"id":22149},[11,28718,28719,28720],{},"This question comes up constantly in r\u002Fn8n, and the answer that matters is not which vendor. It is: ",[38,28721,28722],{},"put a layer between your workflow and the vendor.",[11,28724,28725],{},"The reason is the thing that keeps happening to people. An actor gets removed, a vendor gets barred from a source, pricing changes, and every workflow that hardcoded that vendor's node breaks at once. One widely-read r\u002Fn8n thread is literally somebody asking what to do after Apify was barred from scraping Apollo, with their pipeline already broken.",[11,28727,28728],{},"In practice that means your workflow calls one HTTP node pointed at a marketplace, with the provider and endpoint as parameters rather than as the integration itself. When an endpoint dies you change two strings. That is the whole argument for a marketplace layer, and it is an argument about switching cost, not about data quality.",[421,28730],{"category":13419,"title":28731},"Browse every LinkedIn endpoint, with live pricing",[27,28733,480],{"id":479},[482,28735,28736,28752],{},[485,28737,28738],{},[488,28739,28740,28742,28744,28746,28748,28750],{},[491,28741,496],{},[491,28743,6334],{},[491,28745,1443],{},[491,28747,1446],{},[491,28749,3531],{},[491,28751,1449],{},[504,28753,28754,28778,28802,28824,28848,28871],{},[488,28755,28756,28764,28767,28770,28773,28776],{},[509,28757,28758],{},[18,28759,28761],{"href":25610,"rel":28760},[124,125],[47,28762,28763],{},"tikhub \u002Fget_company_profile",[509,28765,28766],{},"One company record",[509,28768,28769],{},"Company URL",[509,28771,28772],{},"Firmographics, headcount, similar companies",[509,28774,28775],{},"Account research",[509,28777,26348],{},[488,28779,28780,28787,28790,28793,28796,28799],{},[509,28781,28782],{},[18,28783,28785],{"href":25610,"rel":28784},[124,125],[47,28786,25614],{},[509,28788,28789],{},"People at a company",[509,28791,28792],{},"Company URLs, filters",[509,28794,28795],{},"Profiles, positions, optional verified email",[509,28797,28798],{},"Building a list",[509,28800,28801],{},"Per result plus small flat fee",[488,28803,28804,28811,28814,28816,28819,28822],{},[509,28805,28806],{},[18,28807,28809],{"href":25610,"rel":28808},[124,125],[47,28810,16639],{},[509,28812,28813],{},"Enrich known profiles",[509,28815,10274],{},[509,28817,28818],{},"Full profile, email and phone where found",[509,28820,28821],{},"You already have URLs",[509,28823,3551],{},[488,28825,28826,28833,28836,28839,28842,28845],{},[509,28827,28828],{},[18,28829,28831],{"href":25610,"rel":28830},[124,125],[47,28832,128],{},[509,28834,28835],{},"Job postings by query",[509,28837,28838],{},"Job titles, locations",[509,28840,28841],{},"Title, company, location, date, URL",[509,28843,28844],{},"Hiring signals",[509,28846,28847],{},"Per result, cheapest of these",[488,28849,28850,28857,28860,28863,28866,28869],{},[509,28851,28852],{},[18,28853,28855],{"href":25610,"rel":28854},[124,125],[47,28856,28634],{},[509,28858,28859],{},"Posts from a profile",[509,28861,28862],{},"Profile or company URL",[509,28864,28865],{},"Post text, engagement, timestamps",[509,28867,28868],{},"Content monitoring",[509,28870,3551],{},[488,28872,28873,28881,28884,28887,28890,28893],{},[509,28874,28875],{},[18,28876,28878],{"href":25610,"rel":28877},[124,125],[47,28879,28880],{},"tikhub \u002Fget_post_comments",[509,28882,28883],{},"Comments on a post",[509,28885,28886],{},"Post URL",[509,28888,28889],{},"Commenter identity and text",[509,28891,28892],{},"Engagement mining",[509,28894,542],{},[11,28896,28897,28898,28900],{},"Prices move, so this column says the shape rather than the number. ",[47,28899,607],{}," prints the current figure for any endpoint and costs nothing to run. Schemas verified 2026-08-12.",[27,28902,28904],{"id":28903},"what-does-linkedin-data-actually-cost","What does LinkedIn data actually cost?",[11,28906,28907],{},"Take a real job: research forty target accounts, then pull twenty-five decision makers at each.",[11,28909,28910],{},"The company lookups are forty per-call requests, and per-call pricing here is a fraction of a cent, so the whole first stage is well under a dollar. The second stage is a thousand profiles billed per result, which lands in the tens of dollars, and the mode you choose moves it by roughly a factor of three: the short mode is a headline and a link, the full-plus-email mode runs SMTP validation on every address. If you only need email for the ten people you will actually contact, run the cheap mode wide and the expensive mode narrow.",[11,28912,28913,28914,28916],{},"There is a detail in the search-style endpoints worth internalising. They bill per result and the result count is your limit multiplied by your query count, so two extra job titles in an array is not a small change to the bill. Set ",[47,28915,14461],{},", pass one query first, look at what comes back.",[11,28918,28919,28920,28922,28923,260],{},"The free step is the one to build the habit around: ",[47,28921,607],{}," shows the exact current price and the exact schema before anything bills, and it is the reason a copied payload from a blog post is never the thing you should run. Current per-endpoint pricing lives at ",[18,28924,1233],{"href":5582,"rel":28925},[124,125],[27,28927,657],{"id":656},[11,28929,28930],{},"Four honest cases.",[11,28932,28933,28936],{},[38,28934,28935],{},"You need one record a week."," Open LinkedIn and read it. Any API is overhead at that volume.",[11,28938,28939,28942],{},[38,28940,28941],{},"You need gated data."," Connection degrees, InMail status, profile viewers, recruiter-only fields. Those live behind the login and no cookie-free endpoint reaches them. If that is your requirement, LinkedIn's own partner programs are the real answer, not a scraper.",[11,28944,28945,28948],{},[38,28946,28947],{},"You need contractual guarantees on freshness or volume."," Buying directly from Bright Data or a similar vendor gets you an SLA and an account manager. A marketplace optimises for switching cost and breadth, which is a different thing to want.",[11,28950,28951,28954,28955,28957,28958,28960,28961,28964],{},[38,28952,28953],{},"The data will not carry the decision you want to put on it."," This one is ours to own, so here is our own output failing. One call to ",[47,28956,28390],{}," on 2026-08-12, with ",[47,28959,2063],{}," set to ",[47,28962,28963],{},"linkedin.com\u002Fcompany\u002Fanthropicresearch\u002F",", returned all of these in the same response:",[131,28966,28970],{"className":28967,"code":28968,"language":28969,"meta":136,"style":136},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"followers\": 4481424,\n\"employees_in_linkedin\": 5680,\n\"company_size\": \"501-1,000 employees\",\n\"locations\": [],\n","json",[47,28971,28972,28990,29006,29026],{"__ignoreMap":136},[140,28973,28974,28976,28979,28981,28984,28987],{"class":142,"line":143},[140,28975,21387],{"class":193},[140,28977,28978],{"class":150},"followers",[140,28980,21387],{"class":193},[140,28982,28983],{"class":183},": ",[140,28985,28986],{"class":8726},"4481424",[140,28988,28989],{"class":183},",\n",[140,28991,28992,28994,28997,28999,29001,29004],{"class":142,"line":166},[140,28993,21387],{"class":193},[140,28995,28996],{"class":150},"employees_in_linkedin",[140,28998,21387],{"class":193},[140,29000,28983],{"class":183},[140,29002,29003],{"class":8726},"5680",[140,29005,28989],{"class":183},[140,29007,29008,29010,29013,29015,29017,29019,29022,29024],{"class":142,"line":187},[140,29009,21387],{"class":193},[140,29011,29012],{"class":150},"company_size",[140,29014,21387],{"class":193},[140,29016,28983],{"class":183},[140,29018,21387],{"class":193},[140,29020,29021],{"class":150},"501-1,000 employees",[140,29023,21387],{"class":193},[140,29025,28989],{"class":183},[140,29027,29028,29030,29033,29035,29037,29040],{"class":142,"line":1279},[140,29029,21387],{"class":193},[140,29031,29032],{"class":150},"locations",[140,29034,21387],{"class":193},[140,29036,28983],{"class":183},[140,29038,29039],{"class":193},"[]",[140,29041,28989],{"class":183},[11,29043,29044,29045,29047,29048,29050,29051,29053,29054,29057],{},"The headcount observed on LinkedIn and the self-reported size band disagree by a factor of five, because ",[47,29046,29012],{}," is a band a company picked once and rarely updates, while ",[47,29049,28996],{}," is counted today. ",[47,29052,29032],{}," came back empty for a company that has offices. And in the employee sample, most entries were literally ",[47,29055,29056],{},"\"title\": \"LinkedIn Member\""," with no name and no link, because LinkedIn anonymises most profiles for signed-out visitors.",[11,29059,29060,29061,29063,29064,29067],{},"None of that is a bug. It is what public LinkedIn shows. But if you were about to segment accounts by ",[47,29062,29012],{},", you would have been segmenting on a self-reported field that is often years stale, and nothing in the response would have warned you. ",[38,29065,29066],{},"Read the fields before you build on them."," That is true of every vendor in this category, including the ones we resell.",[27,29069,696],{"id":695},[11,29071,29072],{},"The question does not have the answer it asks for. There is no single best LinkedIn scraper API, and a list of vendors ranked one to ten is answering a question about procurement when yours is a question about a job. Three jobs, three answers: a per-call company lookup for account research, a per-result employee search for list building, a cheap per-result job or post query for monitoring. Pick by job and the choice becomes obvious. Pick by vendor and you inherit whichever job that vendor happens to be good at.",[11,29074,29075,29076,29078],{},"Two things carry more weight than the choice itself. The first is whether an endpoint asks for your session cookie, because that decides whether your own account is the thing at risk, and it is the one mistake here that costs something you cannot re-buy. The second is that you should read the fields before building on them. The ",[47,29077,29012],{}," contradiction above took one call to find, and it would have quietly corrupted an account segmentation if nobody had looked.",[11,29080,713,29081,29084,29085,29087,29088,260],{},[47,29082,29083],{},"monid discover -q \"linkedin\""," shows what exists, and ",[47,29086,607],{}," prints the schema and the current price without spending anything. When the shape matches, one small paid run tells you more than any comparison table. Begin at ",[18,29089,725],{"href":723,"rel":29090},[124,125],[27,29092,729],{"id":728},[731,29094,29095],{"q":4894},[11,29096,29097,29098,260],{},"For agents specifically, the deciding feature is not the scraper, it is whether the agent can discover and inspect endpoints without you hardcoding them. An agent that can list what is available, read a schema, and see the price before it spends is one that can handle a source it was not built for. That is the case for a marketplace over a single vendor SDK, and it is why Monid ships a ",[18,29099,29101],{"href":257,"rel":29100},[124,125],"skill file an agent can read directly",[731,29103,29105],{"q":29104},"Why does a scraper return irrelevant results that do not match my search keywords?",[11,29106,29107],{},"Usually because the endpoint is passing your string to the platform's own search, and inheriting that search's behaviour including fuzzy matching and relevance ranking. It is rarely the scraper ignoring you. Check whether the endpoint exposes a strict or exact-match flag, and prefer endpoints that take a URL or an ID over ones that take a free-text query when you know exactly what you want.",[731,29109,29110],{"q":26527},[11,29111,29112,29113,29115],{},"As a builder, the undifferentiated part is finished: raw HTML retrieval is close to a commodity. What still has room is everything after retrieval, which is normalising fields, validating what came back, and being honest about staleness. The ",[47,29114,29012],{}," example above is exactly that gap.",[731,29117,29119],{"q":29118},"Can I just build it myself with n8n and no paid APIs?",[11,29120,29121],{},"Yes, and people do: one r\u002Fn8n thread on a free LinkedIn lead workflow drew ninety-three comments. It works until it does not, and what it costs is your attention every time LinkedIn changes markup, plus the account risk if the free path is a logged-in one. Build it yourself when the pipeline is the product you are learning; buy it when the leads are.",[11,29123,29124],{},[758,29125,760],{},[762,29127,29128],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":136,"searchDepth":166,"depth":166,"links":29130},[29131,29135,29142,29143,29144,29145,29146,29147],{"id":28254,"depth":166,"text":28255,"children":29132},[29133,29134],{"id":28264,"depth":187,"text":28265},{"id":28285,"depth":187,"text":28286},{"id":28312,"depth":166,"text":13458,"children":29136},[29137,29138,29139,29140,29141],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":28373,"depth":187,"text":28374},{"id":28486,"depth":187,"text":28487},{"id":28612,"depth":187,"text":28613},{"id":22149,"depth":166,"text":22150},{"id":479,"depth":166,"text":480},{"id":28903,"depth":166,"text":28904},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fbest-linkedin-scraper-api-2026.png","There is no single best LinkedIn scraper API. There are three jobs, and the honest answer is which endpoint fits which job, and what each one gets wrong.","\u002Fimg\u002Fblog\u002Fbest-linkedin-scraper-api-2026-card.png",{},"2026-08-12",{"title":28240,"description":29149},"blog\u002Fguides\u002Fbest-linkedin-scraper-api-2026",[29156,13419,13517,9734],"linkedin scraper api","ufOyhpSk5Rpc4hRLta3AAND_MWW0HhxToQzflGc7U5I",{"id":29159,"title":29160,"author":6,"body":29161,"category":782,"cover":29676,"description":29677,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":29678,"meta":29679,"navigation":790,"ogImage":787,"path":12268,"publishedAt":29680,"readTime":793,"seo":29681,"stem":29682,"tags":29683,"toolCategory":787,"updatedAt":792,"__hash__":29687},"blogGuides\u002Fblog\u002Fguides\u002Fapollo-scraper.md","Apollo Scraper: Export Apollo.io Leads Safely by API in 2026",{"type":8,"value":29162,"toc":29667},[29163,29166,29173,29178,29182,29185,29267,29273,29276,29280,29283,29291,29336,29347,29353,29356,29387,29404,29408,29411,29414,29432,29468,29474,29477,29481,29488,29491,29493,29501,29578,29598,29600,29603,29614,29622,29624,29634,29640,29652,29661,29665],[11,29164,29165],{},"We do a lot of outbound, which means we pull a lot of Apollo data, and every few weeks someone on the team asks the same thing: \"can we just grab an Apollo scraper to get more leads out?\" The instinct is right, the tool most people reach for is wrong. Search \"apollo scraper\" and the first page is a wall of Chrome extensions that drive your own logged-in Apollo.io session to export past your plan's cap. They work until they do not, and when they stop it is usually because the account driving them got flagged.",[11,29167,29168,29169,29172],{},"So the real question behind \"apollo scraper\" is not \"which extension,\" it is \"how do I get Apollo.io people and company data out, at the volume I need, without putting an account at risk.\" There are two honest answers, and only one of them survives contact with scale. This guide lays out both, shows the free-then-metered API pattern that most people miss, and yes, you are on the ",[18,29170,864],{"href":723,"rel":29171},[124,125]," blog, so one of the two options is ours. We will be straight about when it is not the one you want.",[320,29174,29175],{},[11,29176,29177],{},"An Apollo scraper that drives your logged-in session can bypass an export cap and get the account flagged in the same afternoon. The licensed Data API does the same job without betting your seat on it.",[27,29179,29181],{"id":29180},"what-does-an-apollo-scraper-actually-do","What does an \"Apollo scraper\" actually do?",[11,29183,29184],{},"Strip away the branding and there are two completely different tools wearing the same name. The first is a browser extension that automates the Apollo.io web app you are already signed into: it clicks through search results and copies rows faster than a human, which is how it slips past the export limits on your plan. The second is Apollo's own Data API, the licensed, documented channel Apollo sells for exactly this purpose, which returns the same records as structured JSON with no browser in the loop. They land in very different places on the risk and stability curve.",[482,29186,29187,29199],{},[485,29188,29189],{},[488,29190,29191,29193,29196],{},[491,29192],{},[491,29194,29195],{},"Session-driving extension",[491,29197,29198],{},"Apollo Data API (metered on Monid)",[504,29200,29201,29212,29223,29234,29245,29256],{},[488,29202,29203,29206,29209],{},[509,29204,29205],{},"How it gets data",[509,29207,29208],{},"Automates your logged-in Apollo tab",[509,29210,29211],{},"Licensed API call, no account session",[488,29213,29214,29217,29220],{},[509,29215,29216],{},"Account ban risk",[509,29218,29219],{},"Real: bypassing export caps violates the terms",[509,29221,29222],{},"None: this is the sanctioned data channel",[488,29224,29225,29228,29231],{},[509,29226,29227],{},"Breaks when",[509,29229,29230],{},"Apollo changes its web UI",[509,29232,29233],{},"Rarely, the API contract is versioned",[488,29235,29236,29239,29242],{},[509,29237,29238],{},"Ceiling",[509,29240,29241],{},"What your seat can see and export",[509,29243,29244],{},"Up to 50,000 records per search, paginated",[488,29246,29247,29250,29253],{},[509,29248,29249],{},"Contact reveal",[509,29251,29252],{},"Whatever your plan already unlocked",[509,29254,29255],{},"Metered per person, only when you enrich",[488,29257,29258,29261,29264],{},[509,29259,29260],{},"Cost shape",[509,29262,29263],{},"Extension fee plus your Apollo seat",[509,29265,29266],{},"Pay per call, zero when idle",[11,29268,29269],{},[5252,29270],{"alt":29271,"src":29272},"Two tools share the name Apollo scraper: a browser extension that drives your logged-in Apollo.io session to bypass export caps and risks the account being flagged, versus the licensed Apollo Data API called directly, which returns the same records as JSON with no session and no ban risk","\u002Fimg\u002Fblog\u002Fapollo-scraper-fig-two-paths.png",[11,29274,29275],{},"The extension route is not evil, it is just fragile. It is fine for a one-off pull inside limits you already pay for. The moment you want data programmatically, on a schedule, or fed to an agent, you are one UI change or one flagged account away from a dead pipeline. The API route is the one that scales, and it has a pricing shape that surprises people the first time they see it.",[27,29277,29279],{"id":29278},"why-is-apollo-search-free-and-enrichment-metered","Why is Apollo search free and enrichment metered?",[11,29281,29282],{},"Here is the part that changes the economics. Apollo's people search and the enrichment that reveals contact data are two separate calls with two separate prices, and the first one costs nothing. You can filter Apollo's database of 230M plus people by title, seniority, location, employer, headcount, revenue, and the technologies a company runs, and paginate through the matches, without spending a cent or burning an Apollo credit. Search returns previews with a stable Apollo person id but no email and no phone. You only pay at the second step, when you hand an id or a name back to Apollo and ask it to reveal the verified contact.",[11,29284,29285,29286,29290],{},"That split is the whole trick to keeping an Apollo scraper cheap. You cast a wide, free net, the same move behind our ",[18,29287,29289],{"href":27270,"rel":29288},[124,125],"ICP prospect search walkthrough",", decide which people are actually worth contacting, and pay to enrich only those. Verify the schema first, which is also free, then run the search:",[131,29292,29294],{"className":133,"code":29293,"language":135,"meta":136,"style":136},"monid inspect -p apollo -e \u002Fmixed_people\u002Fapi_search\nmonid run -p apollo -e \u002Fmixed_people\u002Fapi_search --query '{\"person_titles[]\":[\"Head of Growth\",\"VP Marketing\"],\"person_seniorities[]\":[\"vp\",\"head\",\"director\"],\"organization_num_employees_ranges[]\":[\"50,200\"],\"person_locations[]\":[\"United States\"],\"per_page\":25}' -w\n",[47,29295,29296,29311],{"__ignoreMap":136},[140,29297,29298,29300,29302,29304,29306,29308],{"class":142,"line":143},[140,29299,147],{"class":146},[140,29301,151],{"class":150},[140,29303,154],{"class":150},[140,29305,10015],{"class":150},[140,29307,160],{"class":150},[140,29309,29310],{"class":150}," \u002Fmixed_people\u002Fapi_search\n",[140,29312,29313,29315,29317,29319,29321,29323,29325,29327,29329,29332,29334],{"class":142,"line":166},[140,29314,147],{"class":146},[140,29316,171],{"class":150},[140,29318,154],{"class":150},[140,29320,10015],{"class":150},[140,29322,160],{"class":150},[140,29324,12145],{"class":150},[140,29326,409],{"class":150},[140,29328,194],{"class":193},[140,29330,29331],{"class":150},"{\"person_titles[]\":[\"Head of Growth\",\"VP Marketing\"],\"person_seniorities[]\":[\"vp\",\"head\",\"director\"],\"organization_num_employees_ranges[]\":[\"50,200\"],\"person_locations[]\":[\"United States\"],\"per_page\":25}",[140,29333,2045],{"class":193},[140,29335,1190],{"class":150},[11,29337,29338,29339,29342,29343,29346],{},"Every filter above is optional and stackable. Titles match any one in the list, seniorities narrow the level, ",[47,29340,29341],{},"organization_num_employees_ranges"," scopes to company size in ",[47,29344,29345],{},"min,max"," string form, and there are filters for revenue, headquarters location, and even the technologies a target account uses. Each search page returns up to 100 records, and you can walk up to 500 pages, so one query fans out across a serious slice of a market. None of it bills.",[11,29348,29349],{},[5252,29350],{"alt":29351,"src":29352},"A funnel for an Apollo scraper: one free people search filtered by title, seniority, location, and headcount returns a wide list of person previews with Apollo ids and no contacts, you keep only the ones worth reaching, then a metered enrich call reveals the verified work email and optional phone for just those people","\u002Fimg\u002Fblog\u002Fapollo-scraper-fig-search-enrich.png",[11,29354,29355],{},"When you have chosen who is worth reaching, enrich them one at a time. Pass any identifier you hold, an Apollo id from the search, a name plus company domain, or a LinkedIn URL, and more identifiers improve the match:",[131,29357,29359],{"className":133,"code":29358,"language":135,"meta":136,"style":136},"monid run -p apollo -e \u002Fpeople\u002Fmatch --query '{\"name\":\"Jane Doe\",\"domain\":\"acme.com\"}' -w\n",[47,29360,29361],{"__ignoreMap":136},[140,29362,29363,29365,29367,29369,29371,29373,29376,29378,29380,29383,29385],{"class":142,"line":143},[140,29364,147],{"class":146},[140,29366,171],{"class":150},[140,29368,154],{"class":150},[140,29370,10015],{"class":150},[140,29372,160],{"class":150},[140,29374,29375],{"class":150}," \u002Fpeople\u002Fmatch",[140,29377,409],{"class":150},[140,29379,194],{"class":193},[140,29381,29382],{"class":150},"{\"name\":\"Jane Doe\",\"domain\":\"acme.com\"}",[140,29384,2045],{"class":193},[140,29386,1190],{"class":150},[11,29388,29389,29390,29395,29396,29399,29400,29403],{},"The base enrich returns the verified work email, title, seniority, department, employment history, and current employer, the same one-identifier-in, ",[18,29391,29394],{"href":29392,"rel":29393},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fan-email-in-a-full-person-profile-out",[124,125],"full-profile-out"," move we lean on across enrichment. Two flags add depth only when you ask: ",[47,29397,29398],{},"reveal_personal_emails"," appends personal addresses, and ",[47,29401,29402],{},"reveal_phone_number"," returns a direct or mobile number. The phone path is worth understanding before you use it, because Apollo produces those numbers asynchronously. That run stays in a RUNNING state for several minutes while Apollo works, so you poll it rather than waiting inline, and it only charges the phone premium when a number actually comes back. A no-match consumes nothing.",[27,29405,29407],{"id":29406},"should-i-run-it-direct-on-apollo-or-metered-on-monid","Should I run it direct on Apollo, or metered on Monid?",[11,29409,29410],{},"This is the honest fork, and it is the real reason this page exists. This is Apollo's data through Apollo's API, and you can absolutely go direct. Apollo sells API access on its higher plans, and if Apollo is the spine of your go-to-market, you live in the product every day, and your volume is steady, buying their API seat and calling it straight is the right move. You get their console, their credit dashboard, and their support. We will not pretend a marketplace beats that for a heavy daily Apollo shop.",[11,29412,29413],{},"The friction is the same one that shows up with every data vendor: going direct means a plan with an API tier, a credit balance you top up in blocks, and a seat you pay for whether this month is busy or dead. That suits steady heavy use and chafes against the far more common shape, which is bursty. You want two thousand prospects enriched for one campaign, then nothing for six weeks. Paying a monthly floor to idle between campaigns is the cost that never makes it into the plan.",[11,29415,29416,29417,29420,29421,29423,29424,29428,29429,29431],{},"That bursty shape is what ",[18,29418,864],{"href":723,"rel":29419},[124,125]," is for. It is ",[18,29422,21],{"href":20},": one key and one balance reach over a thousand tools, ",[18,29425,29427],{"href":215,"rel":29426},[124,125],"Apollo's people and company APIs"," among them, with the price shown before anything runs and zero cost when idle. You do not hold an Apollo API seat or a credit block. Discovering an endpoint and reading its schema are free, so you can inspect the search and enrich calls, confirm the exact fields, and only pay when an enrich actually fires. Point an agent at it and it learns the whole discover, inspect, run loop on its own from ",[47,29430,26040],{},". For a human, setup is two lines:",[131,29433,29434],{"className":133,"code":8536,"language":135,"meta":136,"style":136},[47,29435,29436,29446],{"__ignoreMap":136},[140,29437,29438,29440,29442,29444],{"class":142,"line":143},[140,29439,274],{"class":146},[140,29441,277],{"class":150},[140,29443,280],{"class":150},[140,29445,283],{"class":150},[140,29447,29448,29450,29452,29454,29456,29458,29460,29462,29464,29466],{"class":142,"line":166},[140,29449,147],{"class":146},[140,29451,290],{"class":150},[140,29453,293],{"class":150},[140,29455,8559],{"class":150},[140,29457,8562],{"class":150},[140,29459,8565],{"class":150},[140,29461,299],{"class":193},[140,29463,1114],{"class":150},[140,29465,305],{"class":183},[140,29467,8574],{"class":193},[11,29469,29470],{},[5252,29471],{"alt":29472,"src":29473},"Choosing how to pull Apollo data: for a one-off export inside your plan limits use Apollo's native export, for a steady daily program at high volume buy Apollo's own API seat and call it direct, and for bursty, occasional, or agent-driven pulls run the same Apollo search and enrich metered per call on Monid with nothing paid while idle","\u002Fimg\u002Fblog\u002Fapollo-scraper-fig-decide.png",[11,29475,29476],{},"The short version: use Apollo's native export for a quick pull inside your limits, buy Apollo's API seat when Apollo data is a daily fixture at volume, and run the same search and enrich metered on Monid when your usage is spiky, occasional, or spread across an agent that would rather call one endpoint than manage a vendor account and a credit balance.",[27,29478,29480],{"id":29479},"what-does-this-cost-and-where-is-the-catch","What does this cost, and where is the catch?",[11,29482,29483,29484,29487],{},"We do not print rates, because the number that matters is cost per usable contact and live magnitudes sit at ",[18,29485,1233],{"href":5582,"rel":29486},[124,125],". The reasoning that survives any price change: search costs nothing, so the wide part of the funnel is always free, and enrichment bills in the fraction-of-a-cent to low-cents range per person depending on whether you pull email only, add personal emails, or reveal a phone. Enrich a couple thousand chosen contacts and you are in the low tens of dollars for that campaign, dropping to zero the moment it ends. Direct on Apollo, the marginal cost per credit can be similar or lower, but it rides on top of a seat you pay for every month regardless. The crossover is volume: past a high, steady daily load the seat divided across contacts finally dips below the per-call price, and below that load metered wins.",[11,29489,29490],{},"The caveat that matters more than price: this route is clean precisely because it is Apollo's licensed data, so keep it that way. The Data API is meant for building your own prospecting and enrichment, not for cloning Apollo's database wholesale or reselling the raw records, and Apollo's terms draw that line clearly. Respect suppression and consent rules on the contacts you pull, honor regional privacy law when you reach out, and treat a verified email as permission to do research, not a licence to spam. The reason this beats a session-driving extension is not just that it survives a UI change, it is that it keeps you inside the terms instead of one policy sweep away from a banned account.",[27,29492,480],{"id":479},[11,29494,29495,29496,29500],{},"Everything above runs on a small set of Apollo endpoints, all reachable through one Monid key, and discovering or inspecting any of them is free so you can read the exact fields and price before you spend. The full set lives on the ",[18,29497,29499],{"href":215,"rel":29498},[124,125],"Apollo tools page",", and the four that carry the lead workflow are these.",[482,29502,29503,29514],{},[485,29504,29505],{},[488,29506,29507,29509,29511],{},[491,29508,496],{},[491,29510,6334],{},[491,29512,29513],{},"Bills",[504,29515,29516,29531,29547,29563],{},[488,29517,29518,29526,29529],{},[509,29519,29520],{},[18,29521,29523],{"href":215,"rel":29522},[124,125],[47,29524,29525],{},"\u002Fmixed_people\u002Fapi_search",[509,29527,29528],{},"Filter Apollo's 230M plus people by title, seniority, location, employer, headcount, and technology",[509,29530,5527],{},[488,29532,29533,29541,29544],{},[509,29534,29535],{},[18,29536,29538],{"href":215,"rel":29537},[124,125],[47,29539,29540],{},"\u002Fpeople\u002Fmatch",[509,29542,29543],{},"Reveal one person's verified work email, and optionally personal email or mobile phone",[509,29545,29546],{},"Metered per person",[488,29548,29549,29557,29560],{},[509,29550,29551],{},[18,29552,29554],{"href":215,"rel":29553},[124,125],[47,29555,29556],{},"\u002Forganizations\u002Fenrich",[509,29558,29559],{},"Enrich one company by domain with firmographics, funding, and tech stack",[509,29561,29562],{},"Metered per call",[488,29564,29565,29573,29576],{},[509,29566,29567],{},[18,29568,29570],{"href":215,"rel":29569},[124,125],[47,29571,29572],{},"\u002Fmixed_companies\u002Fsearch",[509,29574,29575],{},"Find companies by headcount, revenue, funding, location, and technology",[509,29577,29562],{},[11,29579,29580,29581,98,29586,3933,29589,29592,29593,260],{},"If the job runs wider than Apollo, the same balance reaches every provider in the ",[18,29582,29585],{"href":29583,"rel":29584},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Flead-generation",[124,125],"lead-generation",[18,29587,12584],{"href":17223,"rel":29588},[124,125],[18,29590,9684],{"href":569,"rel":29591},[124,125]," categories, so you can cross-check a contact against a second source without signing a second contract. For more on how we use this data channel, see the ",[18,29594,29597],{"href":29595,"rel":29596},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fapollo",[124,125],"Apollo on Monid overview",[27,29599,696],{"id":695},[11,29601,29602],{},"The best Apollo scraper is not a scraper at all. It is the licensed search and enrich pattern: cast a wide free net over the people database, keep only the accounts worth reaching, and pay to reveal contact data one person at a time.",[11,29604,29605,29606,29609,29610,29613],{},"Two things matter more than which route you pick. ",[38,29607,29608],{},"The free half is the half that decides your cost",", because every dollar you spend is a person you chose to reveal, and a sloppy filter is what turns a cheap campaign into an expensive one. And ",[38,29611,29612],{},"the ban risk is a licensing question, not a technical one",": an extension driving your logged-in session is against Apollo's terms whether or not it works today, while the Data API is the sanctioned path and stays sanctioned through a UI change.",[11,29615,713,29616,29618,29619,260],{},[47,29617,29525],{}," costs nothing and returns person ids, so you can build and refine the whole target list before spending anything. Then reveal a handful, check the fill rate on the fields you actually need, and size the run from that. Begin at ",[18,29620,725],{"href":723,"rel":29621},[124,125],[27,29623,729],{"id":728},[731,29625,29627],{"q":29626},"Is scraping Apollo.io safe?",[11,29628,29629,29630,29633],{},"A browser extension that drives your logged-in Apollo session to bypass export caps is the risky version, because it violates Apollo's terms and can get the account flagged. Pulling the same data through Apollo's licensed Data API, which is what runs behind the ",[18,29631,864],{"href":723,"rel":29632},[124,125]," endpoint, is the sanctioned path and carries no account-ban risk.",[731,29635,29637],{"q":29636},"Do I need an Apollo account to use the API?",[11,29638,29639],{},"To go direct, yes, you need an Apollo plan with API access. Metered on Monid you do not: you integrate once, fund one pay-as-you-go balance, and the Apollo search and enrich calls run behind the endpoint with no separate Apollo seat or credit block.",[731,29641,29643],{"q":29642},"Is Apollo people search really free?",[11,29644,29645,29646,29648,29649,29651],{},"Yes. The ",[47,29647,29525],{}," call filters Apollo's people database and returns previews with a person id at no cost and no Apollo credit. You only pay at ",[47,29650,29540],{},", when you reveal a verified email or phone for a person you have chosen.",[731,29653,29655],{"q":29654},"How is it billed?",[11,29656,29657,29658,260],{},"Search is free. Enrichment bills per person and is shown before anything runs. Personal emails add a premium, a revealed mobile number adds a larger one and only when a number is actually found. Discovering and inspecting an endpoint on Monid are free, only the run bills your balance, and current magnitudes are at ",[18,29659,1233],{"href":5582,"rel":29660},[124,125],[11,29662,29663],{},[758,29664,760],{},[762,29666,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":29668},[29669,29670,29671,29672,29673,29674,29675],{"id":29180,"depth":166,"text":29181},{"id":29278,"depth":166,"text":29279},{"id":29406,"depth":166,"text":29407},{"id":29479,"depth":166,"text":29480},{"id":479,"depth":166,"text":480},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fapollo-scraper.png","An Apollo scraper extension can get your account flagged. How to pull the same Apollo.io people and company data by metered API, with search free.","\u002Fimg\u002Fblog\u002Fapollo-scraper-card.png",{},"2026-08-10",{"title":29160,"description":29677},"blog\u002Fguides\u002Fapollo-scraper",[29684,29685,29585,29686],"apollo scraper","apollo.io","b2b-data","eEEoLN8h560hUuM_Bf3SqHn4Fc55xAbIyPTHostpoLQ",{"id":29689,"title":29690,"author":6,"body":29691,"category":8203,"cover":30201,"description":30202,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":30203,"meta":30204,"navigation":790,"ogImage":787,"path":3271,"publishedAt":29680,"readTime":793,"seo":30205,"stem":30206,"tags":30207,"toolCategory":787,"updatedAt":792,"__hash__":30210},"blogGuides\u002Fblog\u002Fguides\u002Freddit-scraper.md","Reddit Scraper: How to Get Reddit Data After the API Lockdown",{"type":8,"value":29692,"toc":30192},[29693,29696,29703,29708,29712,29715,29718,29724,29804,29807,29811,29818,29824,29852,29863,29866,29912,29942,29948,29978,29984,29988,30011,30017,30020,30032,30036,30039,30046,30049,30068,30074,30110,30114,30130,30132,30135,30146,30154,30156,30162,30168,30177,30186,30190],[11,29694,29695],{},"We watch a lot of subreddits. Product feedback in the niche communities, launch reactions, the slow drift of what a market complains about before it churns, and for a stretch this year the way we pulled it broke. In November 2025 Reddit closed self-service access to its public Data API under a \"Responsible Builder Policy,\" and the free token most builders had wired into a script stopped being something you could just grab. The official Data API is still there, but it now sits behind an approval process and licensing terms, and OAuth was capped at one token per account in mid-2025. That is why \"reddit scraper\" started trending: a whole layer of casual access disappeared, and everyone who relied on it went looking for what replaced it.",[11,29697,29698,29699,29702],{},"So the real question behind \"reddit scraper\" is not \"which tool,\" it is \"how do I get Reddit posts and comments out now, at the volume I need, without pretending the terms do not exist.\" There are two honest routes, they land in different places on the compliance-and-effort curve, and you are on the ",[18,29700,864],{"href":723,"rel":29701},[124,125]," blog, so one of them is ours. We will be straight about when the other one is what you actually want.",[320,29704,29705],{},[11,29706,29707],{},"Reddit did not delete its Data API in late 2025. It gated it. The honest choice now is between the licensed API you apply for and a scraper that reads only public, logged-out pages, and the right pick depends entirely on scale and intent.",[27,29709,29711],{"id":29710},"what-changed-with-reddits-api-and-why-it-matters","What changed with Reddit's API, and why it matters?",[11,29713,29714],{},"For years the pattern was simple: register an app, get a token, call the JSON API. That casual on-ramp is what closed. Under the Responsible Builder Policy the official Reddit Data API now requires an approval step, and commercial or AI use in particular runs through a licensing conversation rather than a signup form. This is Reddit deciding who gets programmatic access to its data and on what terms, and it is a defensible position for them to take.",[11,29716,29717],{},"The knock-on effect is that the two remaining routes are genuinely different tools, not two brands of the same thing. One is the sanctioned channel with a gate in front of it. The other reads the same public pages your logged-out browser sees, with no gate and no license, which buys speed at the cost of sitting in a Terms-of-Service gray area. Neither is strictly better. They serve different jobs.",[11,29719,29720],{},[5252,29721],{"alt":29722,"src":29723},"Two routes to Reddit data after November 2025: the official Reddit Data API, gated behind an approval process and licensing, which is compliant for scale and AI use; and an unofficial scraper that reads public logged-out pages, fast and bursty but sitting in a Terms-of-Service gray area","\u002Fimg\u002Fblog\u002Freddit-scraper-fig-two-routes.png",[482,29725,29726,29738],{},[485,29727,29728],{},[488,29729,29730,29732,29735],{},[491,29731],{},[491,29733,29734],{},"Official Reddit Data API",[491,29736,29737],{},"Public-page scraper (metered on Monid)",[504,29739,29740,29751,29762,29773,29784,29794],{},[488,29741,29742,29745,29748],{},[509,29743,29744],{},"Access",[509,29746,29747],{},"Approval process, licensing for commercial\u002FAI use",[509,29749,29750],{},"None, reads logged-out public pages",[488,29752,29753,29756,29759],{},[509,29754,29755],{},"Time to first pull",[509,29757,29758],{},"Days to weeks, gated on review",[509,29760,29761],{},"Minutes",[488,29763,29764,29767,29770],{},[509,29765,29766],{},"Data scope",[509,29768,29769],{},"What Reddit licenses you",[509,29771,29772],{},"Only public, logged-out-visible content",[488,29774,29775,29778,29781],{},[509,29776,29777],{},"Compliance posture",[509,29779,29780],{},"Defensible, licensed",[509,29782,29783],{},"ToS gray area, terms and robots still apply",[488,29785,29786,29788,29791],{},[509,29787,3531],{},[509,29789,29790],{},"Large-scale, commercial, AI-training use",[509,29792,29793],{},"Research, monitoring, bursty pulls",[488,29795,29796,29798,29801],{},[509,29797,29260],{},[509,29799,29800],{},"Negotiated license",[509,29802,29803],{},"Pay per result, zero when idle",[11,29805,29806],{},"The honest read: if you are training a model on Reddit data, building a product on top of it, or pulling at sustained industrial scale, the licensed API is the route that holds up, and the approval friction is the price of a defensible position. If you are a researcher, an analyst, or an agent that needs a burst of public posts for monitoring or a one-time study, the scraper route gets you there today without an application, as long as you treat \"public\" as a real limit and not a loophole.",[27,29808,29810],{"id":29809},"what-can-a-public-reddit-scraper-actually-pull","What can a public Reddit scraper actually pull?",[11,29812,29813,29814,29817],{},"The scraper Monid resells is the Apify actor ",[47,29815,29816],{},"trudax\u002Freddit-scraper-lite",". It reads Reddit without logging in, which is the whole point and also the whole boundary: it sees exactly what an anonymous visitor sees, and nothing that requires an account. Within that boundary it is broad. One actor covers two different ways in.",[11,29819,29820],{},[5252,29821],{"alt":29822,"src":29823},"One Reddit actor, two entry modes: search by keyword across posts, comments, communities, and users, or start from subreddit and post URLs; both feed into reddit-scraper-lite running without login and return structured items","\u002Fimg\u002Fblog\u002Freddit-scraper-fig-search-modes.png",[11,29825,29826,29827,29830,29831,98,29834,98,29837,3933,29840,29843,29844,29847,29848,29851],{},"The first entry mode is search. You hand it an array of ",[47,29828,29829],{},"searches"," terms and it queries across Reddit, with ",[47,29832,29833],{},"searchPosts",[47,29835,29836],{},"searchComments",[47,29838,29839],{},"searchCommunities",[47,29841,29842],{},"searchUsers"," as booleans that decide which of those four object types come back (posts are on by default). You steer the result set with ",[47,29845,29846],{},"sort"," (relevance, hot, top, new, rising, comments) and, for posts, ",[47,29849,29850],{},"time"," (all, hour, day, week, month, year). This is the mode for \"what is being said about X right now.\"",[11,29853,29854,29855,29858,29859,29862],{},"The second entry mode is start-from-URL. Instead of searching, you pass ",[47,29856,29857],{},"startUrls"," as an array of ",[47,29860,29861],{},"{url}"," objects pointing at reddit.com: a subreddit, a specific post, a user page. The actor crawls from there. This is the mode for \"give me the last 25 posts from r\u002Fwebscraping\" when you already know exactly where to look.",[11,29864,29865],{},"Verify the schema first, which is free, then run a search:",[131,29867,29869],{"className":133,"code":29868,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Ftrudax\u002Freddit-scraper-lite\nmonid run -p apify -e \u002Ftrudax\u002Freddit-scraper-lite -i '{\"searches\":[\"ai agents\"],\"searchPosts\":true,\"sort\":\"top\",\"time\":\"week\",\"maxItems\":25,\"includeMediaLinks\":true}' -w\n",[47,29870,29871,29886],{"__ignoreMap":136},[140,29872,29873,29875,29877,29879,29881,29883],{"class":142,"line":143},[140,29874,147],{"class":146},[140,29876,151],{"class":150},[140,29878,154],{"class":150},[140,29880,157],{"class":150},[140,29882,160],{"class":150},[140,29884,29885],{"class":150}," \u002Ftrudax\u002Freddit-scraper-lite\n",[140,29887,29888,29890,29892,29894,29896,29898,29901,29903,29905,29908,29910],{"class":142,"line":166},[140,29889,147],{"class":146},[140,29891,171],{"class":150},[140,29893,154],{"class":150},[140,29895,157],{"class":150},[140,29897,160],{"class":150},[140,29899,29900],{"class":150}," \u002Ftrudax\u002Freddit-scraper-lite",[140,29902,7819],{"class":150},[140,29904,194],{"class":193},[140,29906,29907],{"class":150},"{\"searches\":[\"ai agents\"],\"searchPosts\":true,\"sort\":\"top\",\"time\":\"week\",\"maxItems\":25,\"includeMediaLinks\":true}",[140,29909,2045],{"class":193},[140,29911,1190],{"class":150},[11,29913,29914,29915,29917,29918,29921,29922,29917,29924,29927,29928,29930,29931,102,29934,29937,29938,29941],{},"That call pulls the top AI-agents posts from the past week, capped at 25 items. Swap ",[47,29916,29846],{}," to ",[47,29919,29920],{},"new"," for a monitoring feed, or widen ",[47,29923,29850],{},[47,29925,29926],{},"month"," for a research sweep. The ",[47,29929,14461],{}," cap is your spend governor, and there are finer knobs, ",[47,29932,29933],{},"maxPostCount",[47,29935,29936],{},"maxComments",", when you want to bound posts and comment depth separately. ",[47,29939,29940],{},"includeNSFW"," is a boolean that stays off unless you turn it on.",[11,29943,29944,29945,29947],{},"To scrape a subreddit directly and skip the comment threads entirely, start from its URL and set ",[47,29946,29936],{}," to zero:",[131,29949,29951],{"className":133,"code":29950,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Ftrudax\u002Freddit-scraper-lite -i '{\"startUrls\":[{\"url\":\"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fwebscraping\u002F\"}],\"maxPostCount\":25,\"maxComments\":0,\"includeMediaLinks\":true}' -w\n",[47,29952,29953],{"__ignoreMap":136},[140,29954,29955,29957,29959,29961,29963,29965,29967,29969,29971,29974,29976],{"class":142,"line":143},[140,29956,147],{"class":146},[140,29958,171],{"class":150},[140,29960,154],{"class":150},[140,29962,157],{"class":150},[140,29964,160],{"class":150},[140,29966,29900],{"class":150},[140,29968,7819],{"class":150},[140,29970,194],{"class":193},[140,29972,29973],{"class":150},"{\"startUrls\":[{\"url\":\"https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fwebscraping\u002F\"}],\"maxPostCount\":25,\"maxComments\":0,\"includeMediaLinks\":true}",[140,29975,2045],{"class":193},[140,29977,1190],{"class":150},[11,29979,29980,29981,29983],{},"Setting ",[47,29982,29936],{}," to zero is the move that keeps a subreddit sweep cheap when all you want is post-level signal. Turn it up when the discussion under a post is the thing you are actually studying.",[27,29985,29987],{"id":29986},"what-does-one-scraped-reddit-record-contain","What does one scraped Reddit record contain?",[11,29989,29990,29991,29994,29995,98,29998,98,30001,98,30004,3933,30007,30010],{},"The value is in the fields, and this actor extracts more than a title and a link. Each post record carries the body text and its HTML, the author and their flair, the timestamp, the permalink, and the score. Flip ",[47,29992,29993],{},"includeMediaLinks"," on and the record fills out with ",[47,29996,29997],{},"upVotes",[47,29999,30000],{},"upVoteRatio",[47,30002,30003],{},"imageUrls",[47,30005,30006],{},"videoUrls",[47,30008,30009],{},"numberOfComments",", which is the block you want whenever engagement is the signal you are ranking on.",[11,30012,30013],{},[5252,30014],{"alt":30015,"src":30016},"One scraped Reddit post record fans out into title and body or HTML, score and upvote ratio, comment count, media URLs for images and video, author and flair, and timestamp with permalink","\u002Fimg\u002Fblog\u002Freddit-scraper-fig-post-fields.png",[11,30018,30019],{},"The upvote ratio is the quietly useful one. Raw score tells you a post got attention; the ratio tells you whether the community agreed with it or fought about it, which is a different and often more interesting question when you are reading sentiment. Comment counts and timestamps let you find the threads that are heating up rather than the ones that already peaked. Body and HTML content go straight to an LLM for topic, claim, or complaint extraction without touching a page. And because comments come through the same actor, you can walk from a post into the discussion under it, author flair and all, when the replies are where the real information lives.",[11,30021,30022,30023,30028,30029,30031],{},"This is the same shape of work we have written up for other platforms: pulling social comments at the record level is the subject of our ",[18,30024,30027],{"href":30025,"rel":30026},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fbuy-vs-build-tiktok-comment-scraper",[124,125],"buy-versus-build teardown on the TikTok comment scraper",", and the tradeoffs rhyme. If your Reddit job is specifically deep comment-thread extraction, Monid also carries a dedicated ",[47,30030,27750],{}," actor tuned for that, worth a look when threads, not posts, are the unit you care about.",[27,30033,30035],{"id":30034},"should-i-run-the-licensed-api-or-the-public-scraper","Should I run the licensed API, or the public scraper?",[11,30037,30038],{},"This is the honest fork, and it is the real reason this page exists.",[11,30040,30041,30042,30045],{},"If your use is commercial, sits inside a product, or feeds model training, the official Reddit Data API is the route that survives scrutiny. Yes, it means the approval process and a licensing conversation, and yes, that is slower than running a scraper this afternoon. But a license is exactly what you want when the data underpins something you are shipping or selling, because it puts you on the right side of Reddit's terms by design rather than by hoping nobody looks. For that route, Monid carries an official-OAuth Reddit actor, ",[47,30043,30044],{},"practicaltools\u002Fapify-reddit-api",", so you can run the licensed channel through the same balance as everything else.",[11,30047,30048],{},"The public scraper earns its place at the other end of the curve: speed and access for work that is bursty, exploratory, or non-commercial. A researcher pulling a week of posts for a study, an analyst monitoring how a subreddit reacts to a launch, an agent that needs a fast public sample: none of that justifies a licensing cycle, and all of it is served by reading public pages you could open in a browser anyway. The line we will not cross in describing it: this is not a license to ignore Reddit's terms. It reads only public, logged-out data, Reddit's terms and robots directives still apply, you must respect rate and avoid misusing anyone's personal data, and for large-scale or commercial or AI-training use the licensed API is the defensible answer. The scraper's value is the burst, not a blank check.",[11,30050,30051,30052,30055,30056,30058,30059,30063,30064,260],{},"Where the scraper is the right tool, ",[18,30053,864],{"href":723,"rel":30054},[124,125]," is what makes it painless. Monid is ",[18,30057,21],{"href":20},": one key and one balance reach over a thousand tools, the Apify Reddit actors among them, with the price shown before anything runs and zero cost when idle. You do not hold an Apify account, a plan, or a proxy pool. Discovering an endpoint and reading its schema are free, so you can inspect the actor, confirm the exact fields, and only pay when a run fires. The full Apify catalog lives on the ",[18,30060,30062],{"href":16581,"rel":30061},[124,125],"Apify tools page",", and the reasoning for picking one provider over another for a given platform is the whole subject of our ",[18,30065,30067],{"href":25338,"rel":30066},[124,125],"Apify-versus-TikHub comparison",[11,30069,30070,30071,30073],{},"Point an agent at it and it self-onboards from ",[47,30072,26040],{},", learning the discover, inspect, run loop on its own. For a human, setup is two lines:",[131,30075,30076],{"className":133,"code":8536,"language":135,"meta":136,"style":136},[47,30077,30078,30088],{"__ignoreMap":136},[140,30079,30080,30082,30084,30086],{"class":142,"line":143},[140,30081,274],{"class":146},[140,30083,277],{"class":150},[140,30085,280],{"class":150},[140,30087,283],{"class":150},[140,30089,30090,30092,30094,30096,30098,30100,30102,30104,30106,30108],{"class":142,"line":166},[140,30091,147],{"class":146},[140,30093,290],{"class":150},[140,30095,293],{"class":150},[140,30097,8559],{"class":150},[140,30099,8562],{"class":150},[140,30101,8565],{"class":150},[140,30103,299],{"class":193},[140,30105,1114],{"class":150},[140,30107,305],{"class":183},[140,30109,8574],{"class":193},[27,30111,30113],{"id":30112},"what-does-a-reddit-scraper-cost","What does a Reddit scraper cost?",[11,30115,30116,30117,30120,30121,30123,30124,30129],{},"We do not print rates, because the number that matters is cost per usable record and live magnitudes sit at ",[18,30118,1233],{"href":5582,"rel":30119},[124,125],". The shape that survives any price change: ",[47,30122,29816],{}," bills per result, a fraction of a cent per item, plus a tiny flat fee per run. Pull a few thousand posts for a research sweep and you are in low single-digit dollars for that job, dropping to zero the moment it finishes. There is no monthly floor to idle against between pulls, which is the entire advantage for work that comes in bursts. When your usage is spiky enough that a standing plan would sit unused most of the month, metered wins, and the same logic we walked through when we ",[18,30125,30128],{"href":30126,"rel":30127},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fpulled-10k-tiktok-profiles-no-scraper",[124,125],"pulled 10k social profiles with no scraper subscription"," applies here unchanged.",[27,30131,696],{"id":695},[11,30133,30134],{},"The best Reddit scraper is the one that matches your intent: the licensed Data API when the data feeds a product or a model, and the public-page actor metered per call when you need a fast, honest burst of public posts for research or monitoring and nothing standing between pulls.",[11,30136,30137,30138,30141,30142,30145],{},"Two things matter more than which actor you run. ",[38,30139,30140],{},"The fork is about intent, not about volume",", so a small commercial pull sits on the licensed side and a large research sweep can sit on the public side, and getting that backwards is the mistake that costs you later rather than today. And ",[38,30143,30144],{},"a public-page read is narrow by design",": it returns what a logged-out visitor sees, which excludes quarantined and private communities, removed content, and anything gated behind a login, so an empty result is a statement about visibility rather than about Reddit.",[11,30147,713,30148,30150,30151,260],{},[47,30149,607],{}," prints the actor's full field list before you spend, so you can confirm the fields your analysis needs exist at all. Then pull one subreddit, read ten records properly, and size the sweep from what you find. Begin at ",[18,30152,725],{"href":723,"rel":30153},[124,125],[27,30155,729],{"id":728},[731,30157,30159],{"q":30158},"Is it legal to scrape Reddit?",[11,30160,30161],{},"The public-page scraper reads only what a logged-out visitor can see, which is a narrower and more defensible thing than automating a logged-in account, but it is not a blanket permission. Reddit's Terms of Service and robots directives still apply, you must respect rate and avoid misusing personal data, and for commercial or AI-training use the licensed Reddit Data API is the route that holds up. Treat the scraper as a fast lane for research and monitoring, not as a way around the terms.",[731,30163,30165],{"q":30164},"Can I still use the official Reddit Data API?",[11,30166,30167],{},"Yes, but access changed. Since November 2025 the official Data API runs under a Responsible Builder Policy with an approval process, and commercial or AI use goes through licensing. OAuth was also limited to one token per account in mid-2025. It is the right route for anything commercial or at scale, and Monid carries an official-OAuth Reddit actor for it.",[731,30169,30171],{"q":30170},"Do I need a Reddit account or login to scrape public posts?",[11,30172,30173,30174,30176],{},"Not for the public-page actor. ",[47,30175,29816],{}," reads logged-out Reddit, so it needs no account, no OAuth token, and no proxy setup on your end. It returns only content visible without login, which is the boundary that keeps it clean.",[731,30178,30180],{"q":30179},"How is the scraper billed?",[11,30181,30182,30183,260],{},"Per result plus a small flat fee per run, and always shown before anything executes. Discovering and inspecting the endpoint on Monid are free; only the run bills your balance. The flat fee is the part worth planning around: many small runs pay it many times, so batching subreddits into fewer, larger runs costs less. Current magnitudes are at ",[18,30184,1233],{"href":5582,"rel":30185},[124,125],[11,30187,30188],{},[758,30189,760],{},[762,30191,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":30193},[30194,30195,30196,30197,30198,30199,30200],{"id":29710,"depth":166,"text":29711},{"id":29809,"depth":166,"text":29810},{"id":29986,"depth":166,"text":29987},{"id":30034,"depth":166,"text":30035},{"id":30112,"depth":166,"text":30113},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Freddit-scraper.png","Reddit closed self-service API access in 2025. The honest split between the licensed Data API and a public-page scraper you run metered per call.","\u002Fimg\u002Fblog\u002Freddit-scraper-card.png",{},{"title":29690,"description":30202},"blog\u002Fguides\u002Freddit-scraper",[28235,30208,30209,8212],"reddit data api","web-scraping","1UQRUgCKYkZ-0V8F9Zl5OqnWXjLjdkhxSNIEtFM8L2U",{"id":30212,"title":30213,"author":6,"body":30214,"category":782,"cover":30678,"description":30679,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":30680,"meta":30681,"navigation":790,"ogImage":787,"path":24916,"publishedAt":29680,"readTime":27074,"seo":30682,"stem":30683,"tags":30684,"toolCategory":787,"updatedAt":792,"__hash__":30687},"blogGuides\u002Fblog\u002Fguides\u002Ftechnographic-data-api.md","Technographic Data API: Detect Any Website's Tech Stack in One Call",{"type":8,"value":30215,"toc":30669},[30216,30219,30226,30231,30235,30242,30248,30251,30275,30321,30325,30328,30418,30424,30427,30430,30434,30437,30443,30453,30482,30485,30500,30504,30513,30518,30554,30562,30566,30573,30576,30578,30581,30603,30611,30613,30624,30639,30651,30657,30663,30667],[11,30217,30218],{},"We enrich a lot of prospect lists, and the question that keeps coming back is smaller than the platforms selling the answer would like it to be. Not \"give me an install-base dataset of ten million companies,\" just \"does this one domain run Shopify, or HubSpot, or Stripe, right now.\" That is technographic data: the map of which technologies a company runs, its CMS, framework, analytics, CDN, payment providers, and marketing tags. The industry packages it as a seat on an enterprise platform. A large share of real jobs only need one lookup per domain, on demand.",[11,30220,30221,30222,30225],{},"So the real question behind \"technographic data API\" is where your need actually sits. If you want historical adoption trends, install-base market sizing, and intent signals joined to firmographics, an enterprise platform is built for that and this guide will not talk you out of it. If you want to score a list of accounts by what they run today, one domain at a time, that is a single metered API call, not a platform contract. This is the ",[18,30223,864],{"href":723,"rel":30224},[124,125]," blog, so we will show you the per-call version, and we will be straight about the fork where the platform wins.",[320,30227,30228],{},[11,30229,30230],{},"Most technographic questions are not \"what is the entire market running,\" they are \"what is this one domain running, right now.\" The first needs a managed dataset. The second needs one metered API call.",[27,30232,30234],{"id":30233},"what-does-a-technographic-data-api-return","What does a technographic data API return?",[11,30236,30237,30238,30241],{},"A technographic lookup takes a domain and reads what that site's public surface exposes: HTTP response headers, and the HTML the server sends back, including script tags, meta tags, and the patterns that give a technology away. From that it names the stack. One input, ",[47,30239,30240],{},"stripe.com",", fans out into a labeled inventory: the CMS behind the pages, the JavaScript framework rendering them, the analytics and tag managers loading on the client, the CDN in front of the origin, the payment provider on the checkout, and the marketing and advertising tools riding along.",[11,30243,30244],{},[5252,30245],{"alt":30246,"src":30247},"One domain, stripe.com, fans out from a single technographic API call into six labeled technology groups: CMS, JavaScript framework, analytics and tag managers, CDN, payment providers, and marketing tools","\u002Fimg\u002Fblog\u002Ftechnographic-data-api-fig-fanout.png",[11,30249,30250],{},"That fan-out is the whole value. A single call turns one bare domain into a set of typed signals you can filter on, and each signal maps to a real qualification question. A framework tells you how modern the front end is. A payment provider tells you whether they sell online and how. An analytics or tag-manager footprint tells you how instrumented their marketing is. A CMS tells you who builds their site and how much they can change. You are not reading a homepage, you are reading a company's technology posture in one structured response.",[11,30252,30253,30254,30257,30258,30261,30262,30265,30266,30268,30269,30265,30271,30274],{},"The endpoint we use for this on Monid is ",[47,30255,30256],{},"api.strale.io",", at ",[47,30259,30260],{},"\u002Fx402\u002Ftech-stack-detect",". It is a GET call that takes either a ",[47,30263,30264],{},"domain"," (like ",[47,30267,30240],{},") or a full ",[47,30270,2063],{},[47,30272,30273],{},"https:\u002F\u002Fstripe.com","), and it bills per call: one detection, one price, no base fee. Inspect the schema first, which is free, then run one:",[131,30276,30278],{"className":133,"code":30277,"language":135,"meta":136,"style":136},"monid inspect -p api.strale.io -e \u002Fx402\u002Ftech-stack-detect\nmonid run -p api.strale.io -e \u002Fx402\u002Ftech-stack-detect --query '{\"domain\":\"stripe.com\"}' -w\n",[47,30279,30280,30295],{"__ignoreMap":136},[140,30281,30282,30284,30286,30288,30290,30292],{"class":142,"line":143},[140,30283,147],{"class":146},[140,30285,151],{"class":150},[140,30287,154],{"class":150},[140,30289,3762],{"class":150},[140,30291,160],{"class":150},[140,30293,30294],{"class":150}," \u002Fx402\u002Ftech-stack-detect\n",[140,30296,30297,30299,30301,30303,30305,30307,30310,30312,30314,30317,30319],{"class":142,"line":166},[140,30298,147],{"class":146},[140,30300,171],{"class":150},[140,30302,154],{"class":150},[140,30304,3762],{"class":150},[140,30306,160],{"class":150},[140,30308,30309],{"class":150}," \u002Fx402\u002Ftech-stack-detect",[140,30311,409],{"class":150},[140,30313,194],{"class":193},[140,30315,30316],{"class":150},"{\"domain\":\"stripe.com\"}",[140,30318,2045],{"class":193},[140,30320,1190],{"class":150},[27,30322,30324],{"id":30323},"enterprise-technographic-platform-or-per-domain-api-call","Enterprise technographic platform, or per-domain API call?",[11,30326,30327],{},"Here is the honest fork, and it is the real reason this page exists. The names most people know, ZoomInfo, HG Insights, BuiltWith, Wappalyzer, Cognism, are not just \"detection.\" They are managed datasets: millions of companies profiled, technology adoption tracked over years, intent signals layered on top, and the whole thing joined to firmographics like headcount, revenue, and industry. That is a genuinely different product from reading one live domain, and for a genuinely different job.",[482,30329,30330,30342],{},[485,30331,30332],{},[488,30333,30334,30336,30339],{},[491,30335],{},[491,30337,30338],{},"Enterprise technographic platform",[491,30340,30341],{},"Per-domain API (strale on Monid)",[504,30343,30344,30355,30365,30376,30387,30398,30407],{},[488,30345,30346,30349,30352],{},[509,30347,30348],{},"Core shape",[509,30350,30351],{},"Managed dataset of millions of companies",[509,30353,30354],{},"One live detection per domain, on demand",[488,30356,30357,30359,30362],{},[509,30358,3531],{},[509,30360,30361],{},"Market sizing, install-base trends, intent",[509,30363,30364],{},"\"What is this account running, right now\"",[488,30366,30367,30370,30373],{},[509,30368,30369],{},"History",[509,30371,30372],{},"Years of adoption trend data",[509,30374,30375],{},"Point-in-time snapshot, no back history",[488,30377,30378,30381,30384],{},[509,30379,30380],{},"Firmographic join",[509,30382,30383],{},"Built in (headcount, revenue, industry)",[509,30385,30386],{},"Pair it yourself with an enrichment call",[488,30388,30389,30392,30395],{},[509,30390,30391],{},"Coverage model",[509,30393,30394],{},"Pre-crawled database you query",[509,30396,30397],{},"Live read of the domain you pass",[488,30399,30400,30402,30405],{},[509,30401,29260],{},[509,30403,30404],{},"Annual seat or platform contract",[509,30406,29266],{},[488,30408,30409,30412,30415],{},[509,30410,30411],{},"Fits usage that is",[509,30413,30414],{},"Steady, broad, analyst-driven",[509,30416,30417],{},"Live, bursty, per-account, agent-driven",[11,30419,30420],{},[5252,30421],{"alt":30422,"src":30423},"Choosing a technographic source: for historical trends, intent signals, and install-base market sizing pick an enterprise platform like ZoomInfo, HG Insights, or BuiltWith; for live, per-account, bursty, or agent-driven scoring pick an on-demand per-domain detection call, the strale endpoint on Monid","\u002Fimg\u002Fblog\u002Ftechnographic-data-api-fig-platform-vs-call.png",[11,30425,30426],{},"Read that table as a decision, not a scoreboard. If your question is \"how many companies in this segment adopted a given tool over the last three years, and which of them are showing buying intent,\" you want the platform, and no per-call endpoint will fake a historical database you can query in bulk. That is what the annual contract buys, and it is worth it when that is the job.",[11,30428,30429],{},"The per-domain call wins on the other axis: when the need is live, bursty, per-account, or driven by an agent. Score an inbound signup by whether the company runs Shopify before routing it. Qualify an ICP list by whether targets are on HubSpot or Stripe. Enrich a CRM row the moment a domain lands, with the stack it runs today rather than whatever a dataset last crawled. Those jobs do not want a seat you pay for between campaigns. They want one endpoint that answers now and costs nothing while idle.",[27,30431,30433],{"id":30432},"how-do-you-score-a-prospect-list-by-tech-stack","How do you score a prospect list by tech stack?",[11,30435,30436],{},"The common shape is this: you already have a list of prospect domains, and you want to keep only the accounts whose stack signals fit. Feed the domains in one at a time, detect each stack, then filter or score on the technologies that matter to you. If you sell a Shopify app, presence of Shopify is a hard qualifier. If you integrate with HubSpot, a HubSpot footprint moves an account up the queue. If a target runs Stripe, they sell online and your checkout pitch has a hook.",[11,30438,30439],{},[5252,30440],{"alt":30441,"src":30442},"Scoring a prospect list by tech stack: a list of prospect domains from ICP search feeds a per-domain detection call, results are filtered by fit technologies such as Shopify, HubSpot, or Stripe, and what passes becomes a qualified account list","\u002Fimg\u002Fblog\u002Ftechnographic-data-api-fig-score-loop.png",[11,30444,30445,30446,30449,30450,30452],{},"The list itself can come from anywhere, and if you do not have one yet, our ",[18,30447,29289],{"href":27270,"rel":30448},[124,125]," covers building the domain set before you score it. Once you have domains, the loop is one call per domain against the same endpoint, swapping the ",[47,30451,30264],{}," value each time:",[131,30454,30456],{"className":133,"code":30455,"language":135,"meta":136,"style":136},"monid run -p api.strale.io -e \u002Fx402\u002Ftech-stack-detect --query '{\"domain\":\"stripe.com\"}' -w\n",[47,30457,30458],{"__ignoreMap":136},[140,30459,30460,30462,30464,30466,30468,30470,30472,30474,30476,30478,30480],{"class":142,"line":143},[140,30461,147],{"class":146},[140,30463,171],{"class":150},[140,30465,154],{"class":150},[140,30467,3762],{"class":150},[140,30469,160],{"class":150},[140,30471,30309],{"class":150},[140,30473,409],{"class":150},[140,30475,194],{"class":193},[140,30477,30316],{"class":150},[140,30479,2045],{"class":193},[140,30481,1190],{"class":150},[11,30483,30484],{},"Because detection bills per call with no base fee, the economics track the list exactly. A few hundred domains is a few hundred cheap calls, and a run that scores a thousand accounts costs what a thousand calls cost and nothing the week after. You are not amortizing a platform seat across a campaign, you are paying for the domains you actually check.",[11,30486,30487,30488,30492,30493,102,30496,30499],{},"Tech signals get sharper when you pair them with who the company is. A detection tells you they run HubSpot and Stripe; a firmographic enrichment tells you they are a 200-person company doing business in your target region. We walk through joining a domain to that firmographic layer in ",[18,30489,30491],{"href":22825,"rel":30490},[124,125],"turn a domain into full firmographics",", and the same balance reaches the ",[18,30494,24283],{"href":569,"rel":30495},[124,125],[18,30497,12700],{"href":17223,"rel":30498},[124,125]," endpoints, so stack plus firmographics plus a contact is three metered calls, not three vendor contracts.",[27,30501,30503],{"id":30502},"where-does-per-domain-detection-fit-an-agent-or-a-signup-flow","Where does per-domain detection fit an agent or a signup flow?",[11,30505,30506,30507,30512],{},"The per-call shape earns its keep most in two places: an automated flow and an agent. On signup, a new domain arrives and you want to react to its stack before the user finishes onboarding, route the Shopify merchants one way and the enterprise accounts another, or pre-fill a CRM field. That is a single detection call wired into the flow, and we show the pattern end to end in ",[18,30508,30511],{"href":30509,"rel":30510},"https:\u002F\u002Fmonid.ai\u002Fblog\u002Fwire-domain-to-firmographics-signup-flow",[124,125],"wire a domain to firmographics on signup",". The tech-stack call slots into the same spot.",[11,30514,30515,30516,29431],{},"The agent case is where a marketplace beats a vendor account outright. An agent qualifying inbound or building a target list would rather call one endpoint than hold logins to five technographic vendors and juggle their credit balances. Point it at Monid and it learns the whole discover, inspect, run loop on its own from ",[47,30517,26040],{},[131,30519,30520],{"className":133,"code":8536,"language":135,"meta":136,"style":136},[47,30521,30522,30532],{"__ignoreMap":136},[140,30523,30524,30526,30528,30530],{"class":142,"line":143},[140,30525,274],{"class":146},[140,30527,277],{"class":150},[140,30529,280],{"class":150},[140,30531,283],{"class":150},[140,30533,30534,30536,30538,30540,30542,30544,30546,30548,30550,30552],{"class":142,"line":166},[140,30535,147],{"class":146},[140,30537,290],{"class":150},[140,30539,293],{"class":150},[140,30541,8559],{"class":150},[140,30543,8562],{"class":150},[140,30545,8565],{"class":150},[140,30547,299],{"class":193},[140,30549,1114],{"class":150},[140,30551,305],{"class":183},[140,30553,8574],{"class":193},[11,30555,30556,30557,102,30559,30561],{},"From there the agent inspects the schema for free, confirms that ",[47,30558,30264],{},[47,30560,2063],{}," are the inputs, and only spends when it runs a detection on a real domain. No seat, no minimum, no vendor console to manage between bursts.",[27,30563,30565],{"id":30564},"what-does-this-cost-and-what-can-it-not-see","What does this cost, and what can it not see?",[11,30567,30568,30569,30572],{},"We do not print rates, because the number that matters is cost per domain checked, and live magnitudes sit at ",[18,30570,1233],{"href":5582,"rel":30571},[124,125],". The reasoning that survives any price change: detection bills per call with no base fee, so it lands in the fraction-of-a-cent range per domain, and scoring a few thousand domains for a campaign sits in the low single-digit dollars, dropping to zero the moment the run ends. An enterprise platform can be the better deal when you need its dataset and use it heavily every day, because the contract buys history and intent and bulk that a per-call read does not. Below that, and especially when usage is bursty, per-call wins on the total you actually pay.",[11,30574,30575],{},"Now the caveat that matters more than price. Detection reads what a public HTTP response and its HTML reveal: headers, script tags, meta tags, and recognizable patterns. That means it catches client-visible and header-visible technology well, the CMS, the front-end framework, the analytics and tag managers, the CDN, the payment and marketing tags that load in the browser. It cannot see a private backend a site does not expose, the database, the internal services, the tools that never touch the public response. And it is a point-in-time snapshot of what the domain serves when you call, not a historical record of what it ran last year. If your job needs the hidden backend or the multi-year adoption trend, that is exactly the job the enterprise dataset is for. If your job is \"what is this domain visibly running, right now,\" the public surface is the right surface, and one call reads it.",[27,30577,696],{"id":695},[11,30579,30580],{},"The best technographic data API for scoring accounts is not a platform seat at all: it is one metered detection per domain, cast across the list you actually care about, paid for by the call and free the moment you stop.",[11,30582,30583,30584,30587,30588,30590,30591,30594,30595,30598,30599,30602],{},"Two things matter more than the endpoint you pick. ",[38,30585,30586],{},"A null is not a negative."," Detection is high-precision and low-recall, so an empty ",[47,30589,24858],{}," field says the detector did not find analytics on the page it read, not that the company runs none, and any scoring rule that treats empty as \"does not use\" will be confidently wrong. And ",[38,30592,30593],{},"what comes back skews toward infrastructure",": when we ran the deeper ",[47,30596,30597],{},"\u002Fx402\u002Fcompany-tech-stack"," endpoint on a large SaaS domain, half its fields came back empty and everything it did detect sat at the CDN, hosting and email layer. We wrote that measurement up in ",[18,30600,30601],{"href":633},"platforms versus one call",", and it is the honest counterweight to this page.",[11,30604,713,30605,30607,30608,260],{},[47,30606,607],{}," prints the schema and price for either endpoint without spending. Then run twenty domains whose stack you already know and count the fill rate on the fields you actually care about. That number is your real coverage rate, and it is the one no vendor page publishes. Begin at ",[18,30609,725],{"href":723,"rel":30610},[124,125],[27,30612,729],{"id":728},[731,30614,30616],{"q":30615},"What is a technographic data API?",[11,30617,30618,30619,30623],{},"It is an endpoint that takes a domain and returns the technologies that company runs: CMS, framework, analytics, CDN, payment providers, and marketing tools. The ",[18,30620,30622],{"href":5582,"rel":30621},[124,125],"strale endpoint on Monid"," does this per call by reading the domain's public HTTP headers and HTML, returning a structured stack for one domain at a time.",[731,30625,30627],{"q":30626},"How do I detect a website's tech stack from a list of domains?",[11,30628,30629,30630,30632,30633,30635,30636,30638],{},"Call ",[47,30631,30260],{}," on ",[47,30634,30256],{}," once per domain, passing each ",[47,30637,30264],{}," in the query, then filter or score the results by the technologies that signal fit. Detection bills per call with no base fee, so the cost tracks the size of your list rather than a platform seat.",[731,30640,30642],{"q":30641},"What is the difference between tech-stack-detect and company-tech-stack?",[11,30643,30644,30645,30647,30648,30650],{},"They are two endpoints from the same provider at different depths. ",[47,30646,30260],{}," is the light read described on this page: headers, tags, recognizable patterns, priced for scoring a long list. ",[47,30649,30597],{}," is a deeper analysis at a substantially higher price per call, and in our measured run it still left half its fields empty. Inspect both before committing a batch to either.",[731,30652,30654],{"q":30653},"Is this the same as ZoomInfo or BuiltWith?",[11,30655,30656],{},"No, and that is the point. Those are managed datasets built for historical trends, install-base market sizing, and intent signals across millions of companies. The per-domain API answers \"what is this one domain running, right now\", live and metered, which is a different job that does not need a dataset or a contract.",[731,30658,30660],{"q":30659},"What can tech stack detection not see?",[11,30661,30662],{},"Anything the public response does not expose. It reads client-visible and header-visible technology, so it cannot detect a private backend, an internal database, or services that never appear in the HTML or headers. In practice it also misses much of the application layer, because tag managers hide analytics, checkout-only scripts hide payment processors, and compiled bundles hide frameworks. It is a point-in-time snapshot, not a record of what the site ran in the past.",[11,30664,30665],{},[758,30666,760],{},[762,30668,17798],{},{"title":136,"searchDepth":166,"depth":166,"links":30670},[30671,30672,30673,30674,30675,30676,30677],{"id":30233,"depth":166,"text":30234},{"id":30323,"depth":166,"text":30324},{"id":30432,"depth":166,"text":30433},{"id":30502,"depth":166,"text":30503},{"id":30564,"depth":166,"text":30565},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Ftechnographic-data-api.png","Skip the enterprise technographic platform for one domain. Detect a site's CMS, framework, analytics, CDN and payments by metered API call.","\u002Fimg\u002Fblog\u002Ftechnographic-data-api-card.png",{},{"title":30213,"description":30679},"blog\u002Fguides\u002Ftechnographic-data-api",[30685,30686,9684,29686],"technographic data api","tech stack","_--i1sf8DeRDB-gdLlNw0Oj5s7cb9R4dNjMdjIFgBBI",{"id":30689,"title":30690,"author":6,"body":30691,"category":8203,"cover":31235,"description":31236,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":31237,"meta":31238,"navigation":790,"ogImage":787,"path":8173,"publishedAt":31239,"readTime":793,"seo":31240,"stem":31241,"tags":31242,"toolCategory":8103,"updatedAt":29152,"__hash__":31244},"blogGuides\u002Fblog\u002Fguides\u002Fapify-instagram-scraper.md","The Apify Instagram Scraper: Which Actor to Use in 2026",{"type":8,"value":30692,"toc":31219},[30693,30696,30702,30707,30710,30713,30716,30719,30722,30728,30740,30744,30747,30860,30866,30869,30873,30880,30927,30931,30941,30974,30984,30988,30991,30993,30996,30999,31002,31005,31008,31012,31018,31021,31024,31026,31029,31032,31035,31038,31042,31045,31055,31093,31099,31106,31117,31123,31125,31137,31143,31148,31154,31156,31159,31162,31174,31176,31192,31198,31204,31213,31217],[11,30694,30695],{},"We pull a lot of Instagram data. Reels for trend tracking, profiles for creator scouting, hashtag feeds for campaign monitoring. Every time someone says \"just use the Apify Instagram scraper,\" the same small confusion follows: there is no single Apify Instagram scraper. There are five, they take different inputs, they return different records, and reaching for the wrong one means paying for fields you never read.",[11,30697,30698,30699,30701],{},"This guide answers which actor fits which job, how to run them without tripping a block, and what they cost. That last part we measured rather than quoted, and the measurement disagreed with the listed price. Monid is ",[18,30700,21],{"href":20},", so we resell these actors; the section on cost is the one where that arrangement looks worst, and it is staying in.",[320,30703,30704],{},[11,30705,30706],{},"\"The Apify Instagram scraper\" is not one tool. It is a family of five actors, and the fastest way to overpay is to reach for the wrong member.",[27,30708,8167],{"id":30709},"how-do-i-automate-scraping-public-instagram-data-without-getting-blocked",[11,30711,30712],{},"By not being the one making the requests.",[11,30714,30715],{},"This is the question underneath most of the others, and the answer is structural rather than clever. Blocks land on whoever holds the session and the IP. If you drive a logged-in browser or run a script from your own address, then rate limits, challenges and bans arrive at your account and your infrastructure. Rotating user agents and adding sleeps postpones that; it does not change who is exposed.",[11,30717,30718],{},"A managed actor moves the exposure. It reads public pages from the provider's own pool, handles retries and layout changes on their side, and hands you structured JSON. You never authenticate, so there is no session of yours to restrict.",[11,30720,30721],{},"Two limits come with that, and both are correct behaviour rather than gaps:",[11,30723,30724,30727],{},[38,30725,30726],{},"Private accounts return nothing."," Every scraper here reads what a logged-out visitor sees. If a profile is private, that is the whole answer, and a tool claiming otherwise is worth distrusting.",[11,30729,30730,30733,30734,30739],{},[38,30731,30732],{},"Public counts are not the owner's analytics."," Reel view and play counts are the numbers Instagram exposes publicly. They can lag or differ from a creator's private insights. For accounts you own, the ",[18,30735,30738],{"href":30736,"rel":30737},"https:\u002F\u002Fdevelopers.facebook.com\u002Fdocs\u002Finstagram-platform",[124,125],"Instagram Graph API"," returns first-party insights after app review, and it is the right tool for your own dashboard and the wrong one for competitors, because it cannot return an account that never connected to your app.",[27,30741,30743],{"id":30742},"which-apify-instagram-scraper-do-you-actually-need","Which Apify Instagram scraper do you actually need?",[11,30745,30746],{},"Start from the unit you already hold. A username points at the post or profile scraper. A hashtag or a sound points at the hashtag scraper. A vague \"who even posts about this\" points at the search scraper, to find handles first.",[482,30748,30749,30763],{},[485,30750,30751],{},[488,30752,30753,30755,30757,30760],{},[491,30754,14239],{},[491,30756,499],{},[491,30758,30759],{},"Returns",[491,30761,30762],{},"Reach for it when",[504,30764,30765,30784,30803,30822,30841],{},[488,30766,30767,30775,30778,30781],{},[509,30768,30769],{},[18,30770,30772],{"href":25590,"rel":30771},[124,125],[47,30773,30774],{},"apify\u002Finstagram-post-scraper",[509,30776,30777],{},"usernames or post URLs",[509,30779,30780],{},"posts and reels with engagement, captions, audio, comments",[509,30782,30783],{},"you want a profile's recent reels and posts",[488,30785,30786,30794,30797,30800],{},[509,30787,30788],{},[18,30789,30791],{"href":25590,"rel":30790},[124,125],[47,30792,30793],{},"apify\u002Finstagram-hashtag-scraper",[509,30795,30796],{},"hashtags or keywords",[509,30798,30799],{},"posts or reels for a tag, with engagement",[509,30801,30802],{},"you track a trend or a sound, not one account",[488,30804,30805,30813,30816,30819],{},[509,30806,30807],{},[18,30808,30810],{"href":25590,"rel":30809},[124,125],[47,30811,30812],{},"apify\u002Finstagram-profile-scraper",[509,30814,30815],{},"usernames, IDs, or URLs",[509,30817,30818],{},"profile bio, follower counts, recent media",[509,30820,30821],{},"you need the account itself, not every post",[488,30823,30824,30832,30835,30838],{},[509,30825,30826],{},[18,30827,30829],{"href":25590,"rel":30828},[124,125],[47,30830,30831],{},"apify\u002Finstagram-search-scraper",[509,30833,30834],{},"a search term",[509,30836,30837],{},"matching profiles, places, and hashtags",[509,30839,30840],{},"you are discovering accounts to scrape next",[488,30842,30843,30851,30854,30857],{},[509,30844,30845],{},[18,30846,30848],{"href":25590,"rel":30847},[124,125],[47,30849,30850],{},"apify\u002Finstagram-api-scraper",[509,30852,30853],{},"URLs or a query, no login",[509,30855,30856],{},"posts, profiles, places, and hashtags",[509,30858,30859],{},"one endpoint that covers several shapes",[11,30861,30862],{},[5252,30863],{"alt":30864,"src":30865},"The Apify Instagram scraper family mapped to jobs: post-scraper for posts and reels from a profile, hashtag-scraper for reels by hashtag or keyword, profile-scraper for a bio and recent media, search-scraper to find profiles and places and hashtags, and api-scraper for URL or query lookups with no login","\u002Fimg\u002Fblog\u002Fapify-instagram-scraper-fig-family.png",[11,30867,30868],{},"All five verified present on 2026-08-12. Inspecting an actor's exact fields and price is free, so when two look close, read both schemas before spending anything.",[232,30870,30872],{"id":30871},"the-post-scraper-is-the-default-for-reels-and-posts","The post scraper is the default for reels and posts",[11,30874,30875,30876,30879],{},"If you have a handle and want its recent reels and posts, this is the one. It takes an array of usernames, profile URLs, or exact post URLs, so account sweeps and single-post lookups share one call shape, and ",[47,30877,30878],{},"resultsLimit"," caps how many posts come back per profile. Reels arrive inside the same post stream, tagged by type, with video view and play counts on the reel records.",[131,30881,30883],{"className":133,"code":30882,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Fapify\u002Finstagram-post-scraper\nmonid run -p apify -e \u002Fapify\u002Finstagram-post-scraper \\\n  -i '{\"username\":[\"natgeo\"],\"resultsLimit\":20}'\n",[47,30884,30885,30900,30916],{"__ignoreMap":136},[140,30886,30887,30889,30891,30893,30895,30897],{"class":142,"line":143},[140,30888,147],{"class":146},[140,30890,151],{"class":150},[140,30892,154],{"class":150},[140,30894,157],{"class":150},[140,30896,160],{"class":150},[140,30898,30899],{"class":150}," \u002Fapify\u002Finstagram-post-scraper\n",[140,30901,30902,30904,30906,30908,30910,30912,30914],{"class":142,"line":166},[140,30903,147],{"class":146},[140,30905,171],{"class":150},[140,30907,154],{"class":150},[140,30909,157],{"class":150},[140,30911,160],{"class":150},[140,30913,7816],{"class":150},[140,30915,184],{"class":183},[140,30917,30918,30920,30922,30925],{"class":142,"line":187},[140,30919,190],{"class":150},[140,30921,194],{"class":193},[140,30923,30924],{"class":150},"{\"username\":[\"natgeo\"],\"resultsLimit\":20}",[140,30926,200],{"class":193},[232,30928,30930],{"id":30929},"the-hashtag-scraper-starts-from-a-tag-not-an-account","The hashtag scraper starts from a tag, not an account",[11,30932,30933,30934,29917,30937,30940],{},"Some jobs are not about a known account at all: every reel riding a sound, a branded hashtag, a campaign tag, whoever posts it. Set ",[47,30935,30936],{},"resultsType",[47,30938,30939],{},"reels"," so you get video records rather than a mixed feed.",[131,30942,30944],{"className":133,"code":30943,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Fapify\u002Finstagram-hashtag-scraper \\\n  -i '{\"hashtags\":[\"cleantok\"],\"resultsType\":\"reels\",\"resultsLimit\":20}'\n",[47,30945,30946,30963],{"__ignoreMap":136},[140,30947,30948,30950,30952,30954,30956,30958,30961],{"class":142,"line":143},[140,30949,147],{"class":146},[140,30951,171],{"class":150},[140,30953,154],{"class":150},[140,30955,157],{"class":150},[140,30957,160],{"class":150},[140,30959,30960],{"class":150}," \u002Fapify\u002Finstagram-hashtag-scraper",[140,30962,184],{"class":183},[140,30964,30965,30967,30969,30972],{"class":142,"line":166},[140,30966,190],{"class":150},[140,30968,194],{"class":193},[140,30970,30971],{"class":150},"{\"hashtags\":[\"cleantok\"],\"resultsType\":\"reels\",\"resultsLimit\":20}",[140,30973,200],{"class":193},[11,30975,30976,30977,30979,30980,30983],{},"Each entry in ",[47,30978,14495],{}," is one search term, so add tags as separate array items rather than stringing words onto one line. Flip ",[47,30981,30982],{},"keywordSearch"," to true for a multi-word phrase instead of a single tag, which is how you catch content that never bothered to hashtag the thing it is about.",[232,30985,30987],{"id":30986},"profile-search-and-api-cover-the-rest","Profile, search and api cover the rest",[11,30989,30990],{},"The profile scraper returns the account itself, bio, counts and a slice of recent media, when you need the profile and not every post it ever made. The search scraper turns a plain term into matching profiles, places and hashtags, which is the step before scraping when you do not yet know the handles. The api scraper is the generalist: posts, profiles, places or hashtags by URL or query, useful when one endpoint beats wiring up four.",[316,30992],{"category":8103},[27,30994,8155],{"id":30995},"how-do-i-build-an-api-that-scrapes-instagram-creator-profiles",[11,30997,30998],{},"Do not build the scraping. Build the part that is yours.",[11,31000,31001],{},"The question usually means \"how do I stand up an endpoint my product can call\", and the trap is answering it with infrastructure. The scraping layer is a solved, commoditised problem with several vendors, and rebuilding it buys you a parser to maintain on Instagram's schedule rather than your own.",[11,31003,31004],{},"What is worth building is everything after the record arrives: the creator scoring, the deduplication against people you already track, the storage, and the judgement about which accounts are worth a second look. Call a managed actor for the raw records and spend your engineering on the layer that differentiates you.",[11,31006,31007],{},"The practical shape is one HTTP call to a marketplace endpoint with the provider and actor as parameters, rather than an SDK integration per vendor. When an actor is removed or degrades, you change two strings instead of rewriting an integration.",[232,31009,31011],{"id":31010},"what-the-records-give-you","What the records give you",[11,31013,31014],{},[5252,31015],{"alt":31016,"src":31017},"One Instagram record fans out into the fields that matter: like and comment counts, video view and play counts, caption and hashtags and mentions, audio track and author, thumbnail and media URLs, a sample of recent comments, and pinned or sponsored or paid-partnership flags","\u002Fimg\u002Fblog\u002Fapify-instagram-scraper-fig-fields.png",[11,31019,31020],{},"The engagement block earns its keep: like and comment counts, and for reels the video view and play counts, which let you rank by median views instead of follower count, the single best filter against a bought audience. Captions, hashtags and mentions are text you feed straight to a model for topic and claim analysis without touching a video file. Audio track and author are how you catch a sound breaking out before the videos riding it do. Thumbnails, media URLs and duration cover the reels you decide to pull down, a sample of recent comments surfaces objections and copycats, and pinned, sponsored and paid-partnership flags separate organic reach from promoted.",[11,31022,31023],{},"Note the detail-level control on the post scraper. Basic data is faster and cheaper; the detailed package adds alt text, latest comments, music info and video play count, so you pay for depth only when a record earns it.",[27,31025,22150],{"id":22149},[11,31027,31028],{},"One HTTP node against a marketplace, not a vendor node per platform.",[11,31030,31031],{},"This comes up constantly, and the version of the question we found named Instagram and X in the same breath, which is the whole point: an automation rarely needs one platform. Wire in a dedicated node per source and you have four integrations, four accounts and four things that break independently.",[11,31033,31034],{},"The failure that keeps happening is an actor being removed or a vendor losing access to a source, at which point every workflow hardcoded to it stops at once. Pointing at a catalog with the provider and endpoint as parameters turns that from a rebuild into an edit.",[421,31036],{"category":8103,"title":31037},"Browse the Instagram endpoints, with live pricing",[27,31039,31041],{"id":31040},"what-do-these-actors-actually-cost","What do these actors actually cost?",[11,31043,31044],{},"Less than you would guess, and not in the shape the listing says. This is the part where we contradict our own catalogue.",[11,31046,31047,31049,31050,31052,31053,21534],{},[47,31048,30774],{}," is listed as billing ",[38,31051,1471],{},". If that were literally true, one call would cost the same whether it returned five posts or five hundred. We ran it twice against the same account on 2026-08-12, changing only ",[47,31054,30878],{},[482,31056,31057,31071],{},[485,31058,31059],{},[488,31060,31061,31065,31068],{},[491,31062,31063],{},[47,31064,30878],{},[491,31066,31067],{},"Records returned",[491,31069,31070],{},"Charged",[504,31072,31073,31083],{},[488,31074,31075,31078,31080],{},[509,31076,31077],{},"5",[509,31079,31077],{},[509,31081,31082],{},"baseline",[488,31084,31085,31088,31090],{},[509,31086,31087],{},"20",[509,31089,31087],{},[509,31091,31092],{},"roughly 4.75x the baseline",[11,31094,31095,31096],{},"Twenty posts cost roughly 4.75 times what five posts cost. ",[38,31097,31098],{},"It is not a flat per-call charge; the bill tracks how many records come back.",[11,31100,31101,31102,31105],{},"This is the second endpoint where we have found that. The Amazon reviews scraper is described as returning one result per input query, and a ",[18,31103,31104],{"href":5548},"measured run billed per review instead",". Two endpoints, two different stated shapes, and in both cases the charge scaled with volume returned.",[11,31107,31108,31109,119,31112,102,31114,31116],{},"So the working rule, which costs us the convenience of a simple price table: ",[38,31110,31111],{},"treat the listed billing shape as the vendor's description and a small real run as the measurement.",[47,31113,603],{},[47,31115,607],{}," are free and tell you what exists and what it claims. A five-record run costs under a cent and tells you what it charges. Do that before you size a batch of two hundred creators.",[11,31118,31119,31120,260],{},"With that caveat, the magnitudes: a sweep of a few hundred creators lands in low single-digit dollars and costs nothing in a month you do not run it. Live per-endpoint figures are at ",[18,31121,1233],{"href":5582,"rel":31122},[124,125],[27,31124,657],{"id":656},[11,31126,31127,31130,31131,31136],{},[38,31128,31129],{},"Instagram data is a daily fixture of your product."," These are Apify's actors, maintained by Apify's own scraping specialists, and running them ",[18,31132,31135],{"href":31133,"rel":31134},"https:\u002F\u002Fapify.com",[124,125],"direct on Apify"," gets you a console, scheduling, storage and their integrations. Past a high, steady daily load the plan floor divided across records dips below metered pricing. If you live in that platform every day, live in it.",[11,31138,31139,31142],{},[38,31140,31141],{},"You need your own accounts' real analytics."," That is the Graph API, not a scraper, as above.",[11,31144,31145,25845],{},[38,31146,31147],{},"You need a contractual guarantee.",[11,31149,31150,31153],{},[38,31151,31152],{},"And the caution about us:"," our price metadata did not predict the bill on either endpoint we measured. That is a real defect in the catalogue, not a presentation choice, and until it is fixed the honest instruction is to verify with a small run rather than to trust the listing. We would rather you read that here than discover it on an invoice.",[27,31155,696],{"id":695},[11,31157,31158],{},"There is no \"the Apify Instagram scraper\". There is a family of five, and picking correctly is mostly a matter of naming the unit you already hold: a handle goes to the post scraper, a tag or sound to the hashtag scraper, a bare search term to the search scraper first.",[11,31160,31161],{},"Two things matter more than the pick. Getting blocked is a question of who makes the request, not how cleverly you disguise it, so the durable answer is to not be the one holding the session. And the cost of these actors scales with records returned regardless of what the billing shape is called, which we know because two runs five minutes apart disagreed with the listing.",[11,31163,713,31164,31167,31168,31170,31171,260],{},[47,31165,31166],{},"monid discover -q \"instagram\""," lists the family and ",[47,31169,607],{}," prints each schema without spending anything. Then run one five-record call and read the charge. Begin at ",[18,31172,725],{"href":723,"rel":31173},[124,125],[27,31175,729],{"id":728},[731,31177,31179],{"q":31178},"Which Apify Instagram scraper is best for reels?",[11,31180,31181,31182,31184,31185,18689,31187,28960,31189,31191],{},"For reels from a specific account, ",[47,31183,30774],{}," returns them inside the post stream with video view and play counts attached. For reels across a hashtag, sound or keyword, ",[47,31186,30793],{},[47,31188,30936],{},[47,31190,30939],{}," is the right member of the family.",[731,31193,31195],{"q":31194},"Do I need an Apify account to use an Apify Instagram scraper?",[11,31196,31197],{},"Only if you run direct on the Apify platform. Metered through Monid you integrate once against one balance, and the same Apify actors run behind the endpoint with no separate Apify account or plan.",[731,31199,31201],{"q":31200},"Can these scrapers pull private profiles?",[11,31202,31203],{},"No. Every Instagram scraper reads only what a public, logged-out view can see. A private account returns nothing, which is correct behaviour rather than a coverage gap.",[731,31205,31207],{"q":31206},"How are the actors billed?",[11,31208,31209,31210,260],{},"Nominally per call or per result depending on the actor, but as measured above the charge tracks records returned in both cases. Discovering and inspecting are free; only a run bills. Check a small run before sizing a large one, and read current figures at ",[18,31211,1233],{"href":5582,"rel":31212},[124,125],[11,31214,31215],{},[758,31216,760],{},[762,31218,764],{},{"title":136,"searchDepth":166,"depth":166,"links":31220},[31221,31222,31227,31230,31231,31232,31233,31234],{"id":30709,"depth":166,"text":8167},{"id":30742,"depth":166,"text":30743,"children":31223},[31224,31225,31226],{"id":30871,"depth":187,"text":30872},{"id":30929,"depth":187,"text":30930},{"id":30986,"depth":187,"text":30987},{"id":30995,"depth":166,"text":8155,"children":31228},[31229],{"id":31010,"depth":187,"text":31011},{"id":22149,"depth":166,"text":22150},{"id":31040,"depth":166,"text":31041},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fapify-instagram-scraper.png","Apify has five Instagram scrapers, not one. Which actor fits which job, how to run them without getting blocked, and what two measured runs actually cost.","\u002Fimg\u002Fblog\u002Fapify-instagram-scraper-card.png",{},"2026-08-04",{"title":30690,"description":31236},"blog\u002Fguides\u002Fapify-instagram-scraper",[31243,8103,30209,1638],"apify instagram scraper","FhmthyYGlx9lUqZWpDk1Zo6g7aukKnsx46ZLAdz7Rv4",{"id":31246,"title":31247,"author":6,"body":31248,"category":782,"cover":31769,"description":31770,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":31771,"meta":31772,"navigation":790,"ogImage":787,"path":31773,"publishedAt":31774,"readTime":1681,"seo":31775,"stem":31776,"tags":31777,"toolCategory":787,"updatedAt":792,"__hash__":31779},"blogGuides\u002Fblog\u002Fguides\u002Fbest-linkedin-outreach-tools-2026.md","The Best LinkedIn Outreach Tools in 2026",{"type":8,"value":31249,"toc":31748},[31250,31253,31256,31261,31267,31271,31277,31283,31286,31290,31293,31454,31457,31461,31465,31471,31474,31480,31486,31490,31493,31497,31500,31504,31507,31511,31514,31518,31521,31527,31530,31534,31537,31547,31550,31552,31557,31562,31568,31570,31575,31581,31585,31597,31645,31648,31651,31655,31658,31664,31667,31670,31676,31680,31689,31691,31694,31705,31711,31713,31719,31729,31735,31741,31745],[11,31251,31252],{},"LinkedIn outreach in 2026 is two layers, not one tool. There is a DATA layer that finds, enriches, and verifies the right people, and there is a SENDING layer that sequences messages across accounts safely and lands the replies in one inbox. Most \"best LinkedIn outreach tools\" lists blur the two together, which is why teams end up with a great sequencer firing perfect messages at a stale, unverified list.",[11,31254,31255],{},"Fair disclosure before we go further: you're on the Monid blog, so here's where we stand. Monid is the data layer in this stack, the part that enriches your list before you reach out. We are not a sender, and we'll be straight about the sending tools below, including where each one wins over the others. The honest takeaway of the whole guide is that the best \"tool\" is really the right pairing: a solid data layer feeding a sender that fits how you run campaigns.",[320,31257,31258],{},[11,31259,31260],{},"The best LinkedIn outreach setup is a data layer that verifies who you contact, wired into a sending layer that sequences the message safely. Pick one of each, not one tool that half-does both.",[11,31262,31263],{},[5252,31264],{"alt":31265,"src":31266},"LinkedIn outreach in two layers: a data layer that finds, enriches, and verifies the right people, feeding a sending layer that sequences messages with account safety and one inbox, which drives replies","\u002Fimg\u002Fblog\u002Fbest-linkedin-outreach-tools-2026-fig-two-layer-stack.png",[27,31268,31270],{"id":31269},"what-are-the-two-layers-and-why-keep-them-separate","What are the two layers, and why keep them separate?",[11,31272,17468,31273,31276],{},[38,31274,31275],{},"data layer"," answers \"who am I contacting, and is this even a real, reachable person?\" It pulls a LinkedIn profile, the current role and company, and a verified email so you have a fallback channel and a way to dedupe. You do this work once, up front, before a single message goes out.",[11,31278,17468,31279,31282],{},[38,31280,31281],{},"sending layer"," answers \"how do I contact them without getting my accounts flagged?\" It rotates across multiple LinkedIn seats, throttles to human-looking limits, branches a sequence across connection requests, messages, voice notes, and InMail, and drops every reply into a single shared inbox.",[11,31284,31285],{},"Keep them separate in your head and the market stops looking confusing. Sequencers are cheap to swap. The list quality underneath them is what actually moves reply rates, and it's the part teams skimp on.",[27,31287,31289],{"id":31288},"which-linkedin-outreach-tools-should-i-compare","Which LinkedIn outreach tools should I compare?",[11,31291,31292],{},"Here is the whole stack in one table. The first row is the data layer (Monid, the part we build) that preps and verifies your list; every row below it is a sending tool. The table sticks to the axes that decide it fastest: multi-account rotation, how far a sequence can branch, and whether the tool ships its own B2B data. Account safety, the unified inbox, and agent (MCP) control matter too, and they come up in the writeups below.",[482,31294,31295,31313],{},[485,31296,31297],{},[488,31298,31299,31302,31305,31308,31311],{},[491,31300,31301],{},"Tool",[491,31303,31304],{},"Multi-account",[491,31306,31307],{},"Sequence branching",[491,31309,31310],{},"Built-in B2B data",[491,31312,3531],{},[504,31314,31315,31335,31357,31377,31397,31416,31435],{},[488,31316,31317,31323,31326,31329,31332],{},[509,31318,31319,31322],{},[18,31320,864],{"href":723,"rel":31321},[124,125]," (data layer)",[509,31324,31325],{},"Data layer, not a sender",[509,31327,31328],{},"Data layer",[509,31330,31331],{},"Yes, pay-per-call enrichment plus verified email",[509,31333,31334],{},"Enriching and verifying the list before any sender",[488,31336,31337,31345,31348,31351,31354],{},[509,31338,31339],{},[18,31340,31344],{"href":31341,"rel":31342},"https:\u002F\u002Fswarmhit.com",[31343],"follow","Swarmhit",[509,31346,31347],{},"Yes, native",[509,31349,31350],{},"Requests, messages, voice notes, InMail",[509,31352,31353],{},"Yes, large, NL search",[509,31355,31356],{},"Agencies and agent-driven multi-sender campaigns",[488,31358,31359,31366,31368,31371,31374],{},[509,31360,31361],{},[18,31362,31365],{"href":31363,"rel":31364},"https:\u002F\u002Fheyreach.io",[124,125],"HeyReach",[509,31367,31347],{},[509,31369,31370],{},"Requests, messages, InMail",[509,31372,31373],{},"Partial",[509,31375,31376],{},"Agencies running many seats",[488,31378,31379,31386,31389,31392,31394],{},[509,31380,31381],{},[18,31382,31385],{"href":31383,"rel":31384},"https:\u002F\u002Fexpandi.io",[124,125],"Expandi",[509,31387,31388],{},"Per-seat",[509,31390,31391],{},"Smart branching",[509,31393,1837],{},[509,31395,31396],{},"Safety-first solo and small teams",[488,31398,31399,31406,31408,31411,31413],{},[509,31400,31401],{},[18,31402,31405],{"href":31403,"rel":31404},"https:\u002F\u002Fdripify.io",[124,125],"Dripify",[509,31407,31388],{},[509,31409,31410],{},"Drip steps",[509,31412,1837],{},[509,31414,31415],{},"Simple solo drip campaigns",[488,31417,31418,31425,31427,31430,31432],{},[509,31419,31420],{},[18,31421,31424],{"href":31422,"rel":31423},"https:\u002F\u002Fwaalaxy.com",[124,125],"Waalaxy",[509,31426,31388],{},[509,31428,31429],{},"LinkedIn + email steps",[509,31431,31373],{},[509,31433,31434],{},"Beginners, low-friction start",[488,31436,31437,31444,31446,31449,31451],{},[509,31438,31439],{},[18,31440,31443],{"href":31441,"rel":31442},"https:\u002F\u002Flemlist.com",[124,125],"lemlist",[509,31445,31388],{},[509,31447,31448],{},"Multichannel (email-led)",[509,31450,1834],{},[509,31452,31453],{},"Email-first multichannel with LinkedIn steps",[11,31455,31456],{},"A note on that table: \"Partial\" and \"Per-seat\" are category descriptions, not knocks. Tools built around a single operator's account do rotation differently from tools built for an agency running dozens of seats, and neither is wrong for the job it was designed for. We're deliberately not printing seat counts or prices for any of these, because those change and we can't verify them for you. Check each vendor's own pricing page.",[27,31458,31460],{"id":31459},"how-do-the-sending-tools-actually-differ","How do the sending tools actually differ?",[232,31462,31464],{"id":31463},"swarmhit-best-for-agencies-and-agent-driven-campaigns","Swarmhit (best for agencies and agent-driven campaigns)",[11,31466,31467,31470],{},[18,31468,31344],{"href":31341,"rel":31469},[31343]," is built for the case most sequencers treat as an afterthought: running many sender accounts at once, safely, and increasingly letting an AI agent do the running. Its multi-sender sequences branch across the full LinkedIn surface, connection requests, direct messages, voice notes, and InMail, so a campaign can escalate the way a human would rather than firing the same template at everyone. Replies from every connected account collect in one unified cross-account inbox, which is the feature that keeps an agency from drowning when it's operating twenty seats.",[11,31472,31473],{},"Two things set it apart. First, it ships a large built-in B2B database you can search in natural language, so you can assemble a target audience inside the same tool that sends. Second, it runs account-health and LinkedIn-safety automation continuously, watching per-account limits and warm-up so seats don't trip protections. And because Swarmhit exposes an MCP server, an AI agent can build a list, spin up a campaign, and manage the inbox programmatically, which is why it lands first for teams moving toward agent-run outreach.",[11,31475,31476,31479],{},[38,31477,31478],{},"Pros:"," native multi-account rotation, the widest sequence branching in this list (voice notes and InMail included), a unified cross-account inbox, its own searchable B2B data, and an MCP server for agents.",[11,31481,31482,31485],{},[38,31483,31484],{},"Cons:"," the depth aimed at agencies and multi-sender setups is more than a single operator sending a handful of messages a week needs.",[232,31487,31489],{"id":31488},"heyreach-best-for-agencies-running-many-seats","HeyReach (best for agencies running many seats)",[11,31491,31492],{},"HeyReach is squarely an agency tool, built around operating a large pool of LinkedIn seats with a shared inbox and rotation across them. If your model is \"many client accounts, one operating team,\" it's designed for exactly that shape of work. It leans on connected LinkedIn accounts rather than a large built-in data product, so you pair it with a data layer for targeting.",[232,31494,31496],{"id":31495},"expandi-best-for-safety-first-sending","Expandi (best for safety-first sending)",[11,31498,31499],{},"Expandi built its reputation on account safety, with careful behavior emulation and conservative limits, plus smart branching that adjusts steps based on whether someone accepted or replied. It's oriented around per-seat operation more than agency-scale rotation, which suits a solo operator or small team that cares most about not getting a valuable account restricted.",[232,31501,31503],{"id":31502},"dripify-best-for-simple-solo-drips","Dripify (best for simple solo drips)",[11,31505,31506],{},"Dripify keeps things straightforward: build a drip of LinkedIn actions, set your limits, let it run. It's a clean fit for one person running one account who wants a linear sequence without a lot of configuration. You won't find built-in prospect data, so bring your own list.",[232,31508,31510],{"id":31509},"waalaxy-best-for-beginners","Waalaxy (best for beginners)",[11,31512,31513],{},"Waalaxy is the low-friction entry point, easy to start with and comfortable for people new to outreach automation, with LinkedIn and email steps. It's built around per-seat use rather than agency rotation, and it's a reasonable place to learn the mechanics before you outgrow it.",[232,31515,31517],{"id":31516},"lemlist-best-for-email-first-multichannel","lemlist (best for email-first multichannel)",[11,31519,31520],{},"lemlist comes at this from the email side and adds LinkedIn steps into a multichannel sequence, with a unified inbox and its own contact data. If email is your primary channel and LinkedIn is a supporting touch, its sequences are built for that ordering rather than LinkedIn-first sending.",[11,31522,31523],{},[5252,31524],{"alt":31525,"src":31526},"Which sender fits: solo simple drips suit Dripify or Waalaxy, safety-first single accounts suit Expandi, email-led multichannel suits lemlist, agencies running many seats suit HeyReach, and multi-sender sequences with voice notes, InMail, built-in data, and agent MCP control suit Swarmhit","\u002Fimg\u002Fblog\u002Fbest-linkedin-outreach-tools-2026-fig-which-sequencer.png",[11,31528,31529],{},"Notice what none of the sequencers above are: a source of truth on who your prospects actually are today. That's the other layer.",[27,31531,31533],{"id":31532},"where-does-the-data-layer-fit","Where does the data layer fit?",[11,31535,31536],{},"Before you sequence anyone, you enrich your target list so the sender has good inputs. That means turning a pile of LinkedIn profile URLs into structured records, current role, current company, location, and a verified email, and dropping the ones that no longer check out. Do this and your reply rate climbs for a boring reason: you stopped messaging people who left the company eight months ago.",[11,31538,31539,31540,31542,31543,31546],{},"This is where Monid sits. Monid is ",[18,31541,21],{"href":20},": you discover an endpoint, inspect its exact schema and price for free, and only pay when you run it. You are billed per result, a fraction of a cent per profile, with no seat, no monthly plan, and no minimum. Live prices are at ",[18,31544,1233],{"href":5582,"rel":31545},[124,125],". Monid is not a sender and never touches your LinkedIn accounts. It feeds whatever sequencer you pick, including Swarmhit.",[11,31548,31549],{},"Because Monid is agent-native over MCP, an AI agent can run the enrichment step itself as part of a larger workflow. Here's the whole workflow to get set up.",[232,31551,235],{"id":234},[11,31553,238,31554,244],{},[18,31555,243],{"href":241,"rel":31556},[124,125],[131,31558,31560],{"className":31559,"code":249,"language":97},[248],[47,31561,249],{"__ignoreMap":136},[11,31563,31564,31565,260],{},"It learns the whole discover, inspect, run workflow itself. More details in the ",[18,31566,259],{"href":257,"rel":31567},[124,125],[232,31569,264],{"id":263},[131,31571,31573],{"className":31572,"code":8536,"language":97},[248],[47,31574,8536],{"__ignoreMap":136},[11,31576,31577,31578,260],{},"More details in the ",[18,31579,8582],{"href":8580,"rel":31580},[124,125],[232,31582,31584],{"id":31583},"enriching-a-linkedin-profile","Enriching a LinkedIn profile",[11,31586,31587,31588,31593,31594,31596],{},"The endpoint we reach for is the ",[18,31589,31592],{"href":31590,"rel":31591},"https:\u002F\u002Fapify.com\u002Fdev-fusion\u002Flinkedin-profile-scraper",[124,125],"LinkedIn profile scraper",", which extracts and enriches profiles from their URLs, including discovered emails, without needing your LinkedIn cookies. Its input is a single field, ",[47,31595,28599],{},", an array of the profile URLs you want enriched. One profile in, one billed result out.",[131,31598,31600],{"className":133,"code":31599,"language":135,"meta":136,"style":136},"monid run -p apify -e \u002Fdev_fusion\u002Flinkedin-profile-scraper \\\n  -i '{\"profileUrls\":[\"https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fwilliamhgates\"]}' -w\n# -> that profile's name, headline, location, full work history, current\n#    company, plus a discovered email, billed per result, price shown by a\n#    free inspect first\n",[47,31601,31602,31618,31630,31635,31640],{"__ignoreMap":136},[140,31603,31604,31606,31608,31610,31612,31614,31616],{"class":142,"line":143},[140,31605,147],{"class":146},[140,31607,171],{"class":150},[140,31609,154],{"class":150},[140,31611,157],{"class":150},[140,31613,160],{"class":150},[140,31615,12788],{"class":150},[140,31617,184],{"class":183},[140,31619,31620,31622,31624,31626,31628],{"class":142,"line":166},[140,31621,190],{"class":150},[140,31623,194],{"class":193},[140,31625,13056],{"class":150},[140,31627,2045],{"class":193},[140,31629,1190],{"class":150},[140,31631,31632],{"class":142,"line":187},[140,31633,31634],{"class":20883},"# -> that profile's name, headline, location, full work history, current\n",[140,31636,31637],{"class":142,"line":1279},[140,31638,31639],{"class":20883},"#    company, plus a discovered email, billed per result, price shown by a\n",[140,31641,31642],{"class":142,"line":1284},[140,31643,31644],{"class":20883},"#    free inspect first\n",[11,31646,31647],{},"Run that across your list and you get back structured profiles: name, headline, location, the full experience array, current company with its industry and size, and a discovered email where one exists. That's the payload a sequencer wants: a current title so your opener isn't wrong, a company so your personalization is real, and an email as a second channel and a dedupe key.",[11,31649,31650],{},"One more per-call step worth adding: verify the discovered email before you trust it. An email validation endpoint on the same marketplace confirms a mailbox is deliverable, so you don't burn a follow-up channel on an address that bounces. Same wallet, same per-result billing, one more flag in the pipeline. The point of the data layer is that everything downstream inherits its quality, so it's worth the extra cent.",[27,31652,31654],{"id":31653},"how-do-the-two-layers-fit-together","How do the two layers fit together?",[11,31656,31657],{},"The flow is short, and it only runs in one direction. You start with a list of LinkedIn profile URLs, from a search, a Swarmhit database query, an event attendee export, wherever. You send those URLs through Monid to enrich each profile and attach a verified email. You drop the profiles that no longer check out, wrong company, dead email, role that moved on. Then you load the clean list into Swarmhit, or HeyReach, or whichever sequencer you chose, and run the campaign from there.",[11,31659,31660],{},[5252,31661],{"alt":31662,"src":31663},"The stack in order: profile URLs into Monid to enrich and verify emails, a clean list, then a Swarmhit sequence, with replies landing in one unified inbox","\u002Fimg\u002Fblog\u002Fbest-linkedin-outreach-tools-2026-fig-monid-to-sequencer.png",[11,31665,31666],{},"The reason to keep the enrichment separate from the sending, rather than leaning on whatever data a sequencer bundles, is leverage. Your list gets enriched once and can feed any sender, so switching sequencers later costs you nothing on the data side. And a pay-per-call layer means you enrich exactly the profiles you're about to contact, not a subscription tier's worth you hope to use. When a campaign is small, you pay for a small campaign.",[316,31668],{"category":13419,"label":31669},"Try the data layer right now",[421,31671,31673],{"category":13419,"title":31672},"Enrich the list before any sender touches it",[11,31674,31675],{},"Discover the endpoint, read its per-call price, and run it. No seat, no monthly floor.",[27,31677,31679],{"id":31678},"will-automation-get-my-linkedin-account-restricted","Will automation get my LinkedIn account restricted?",[11,31681,31682,31683,31688],{},"Every sequencer in this guide markets \"safety,\" and it matters, because LinkedIn actively restricts accounts that behave like bots. Their ",[18,31684,31687],{"href":31685,"rel":31686},"https:\u002F\u002Fwww.linkedin.com\u002Fhelp\u002Flinkedin\u002Fanswer\u002Fa1341387",[124,125],"Prohibited Software and Extensions policy"," is explicit that automated tools which scrape or send at machine speed can get an account restricted or banned. That's the real reason multi-account rotation, warm-up, and human-looking throttling exist: not as features to upsell, but as the difference between a campaign that runs and a seat that gets locked. It's also an argument for doing your data collection through a data API rather than an unofficial browser automation bolted onto your own logged-in account, since the profile enrichment happens off your LinkedIn seat entirely.",[27,31690,696],{"id":695},[11,31692,31693],{},"The best LinkedIn outreach setup is the one that verifies who you're contacting before it contacts them, and sequences the message with a sender that matches how you actually work. Pick the sending layer by your shape: a solo operator running a simple drip is well served by Dripify or Waalaxy; a single account where safety is everything points to Expandi; an email-first motion with LinkedIn touches points to lemlist; an agency running many seats wants HeyReach; and a multi-sender, voice-note-and-InMail, built-in-data, agent-driven operation points to Swarmhit.",[11,31695,31696,31697,31700,31701,31704],{},"Two things matter more than which sequencer you land on. ",[38,31698,31699],{},"The two layers price and fail differently",", so treating outreach as one purchase is what leads teams to pay for a sender's bundled data they do not trust and skip the enrichment step that actually moves reply rates. And ",[38,31702,31703],{},"a stale list is indistinguishable from a bad sequence from the inside",": both show up as silence, which is why the enrichment pass before the first send is the cheapest diagnostic you will run all quarter.",[11,31706,31707,31708,260],{},"Start with the free part: discovering and inspecting an enrichment endpoint costs nothing, so you can read the exact fields and price before spending. Then enrich a hundred rows from your existing list and count how many people have already changed jobs. That number usually settles the argument. Begin at ",[18,31709,725],{"href":723,"rel":31710},[124,125],[27,31712,729],{"id":728},[731,31714,31716],{"q":31715},"Do I need a data layer if my sequencer ships its own B2B data?",[11,31717,31718],{},"Often yes, and the reason is freshness rather than coverage. Bundled databases are built to make a sender self-sufficient at signup, and their records age at their own pace. Enriching a list against a live source before a campaign catches the people who changed roles since the bundle was last built, which is the group most likely to make your open rate look fine and your reply rate look broken.",[731,31720,31722],{"q":31721},"Will using an outreach tool get my LinkedIn account banned?",[11,31723,31724,31725,31728],{},"It can, and LinkedIn's ",[18,31726,31687],{"href":31685,"rel":31727},[124,125]," says so directly: automation that scrapes or sends at machine speed risks restriction. That is the reason warm-up, throttling and multi-account rotation exist in every tool here. It is also an argument for keeping the data work off your own seat entirely, since an enrichment API runs nowhere near your logged-in account.",[731,31730,31732],{"q":31731},"Is it cheaper to enrich per call or to buy a data seat?",[11,31733,31734],{},"It depends on whether your sending is steady or bursty. A seat divided across a high, constant daily volume eventually beats per-call. Campaign work that runs for two weeks and then stops does not reach that crossover, and the seat keeps billing through the quiet months. Per-call costs nothing while idle, which is the whole argument for the shape rather than the price.",[731,31736,31738],{"q":31737},"Can an AI agent run this whole workflow?",[11,31739,31740],{},"The enrichment half, yes: Monid is agent-native over MCP, so an agent can discover the endpoint, read the schema, and run the pass itself. The sending half depends on your sequencer, and Swarmhit is the one in this list that exposes an MCP server for campaign and inbox control. The two connect through the list, not through a shared integration.",[11,31742,31743],{},[758,31744,760],{},[762,31746,31747],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":136,"searchDepth":166,"depth":166,"links":31749},[31750,31751,31752,31760,31765,31766,31767,31768],{"id":31269,"depth":166,"text":31270},{"id":31288,"depth":166,"text":31289},{"id":31459,"depth":166,"text":31460,"children":31753},[31754,31755,31756,31757,31758,31759],{"id":31463,"depth":187,"text":31464},{"id":31488,"depth":187,"text":31489},{"id":31495,"depth":187,"text":31496},{"id":31502,"depth":187,"text":31503},{"id":31509,"depth":187,"text":31510},{"id":31516,"depth":187,"text":31517},{"id":31532,"depth":166,"text":31533,"children":31761},[31762,31763,31764],{"id":234,"depth":187,"text":235},{"id":263,"depth":187,"text":264},{"id":31583,"depth":187,"text":31584},{"id":31653,"depth":166,"text":31654},{"id":31678,"depth":166,"text":31679},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fbest-linkedin-outreach-tools-2026.png","LinkedIn outreach tools split into two layers in 2026: the data layer that finds and verifies people, and the sending layer that sequences the messages.","\u002Fimg\u002Fblog\u002Fbest-linkedin-outreach-tools-2026-card.png",{},"\u002Fblog\u002Fguides\u002Fbest-linkedin-outreach-tools-2026","2026-07-29",{"title":31247,"description":31770},"blog\u002Fguides\u002Fbest-linkedin-outreach-tools-2026",[31778,13419,13517,9734],"linkedin outreach","GJMkpAsJX0KJO4_2Jcdz6vQmwzDpdrR1jlPvaHgC3Q4",{"id":31781,"title":5892,"author":6,"body":31782,"category":5706,"cover":32310,"description":32311,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":32312,"meta":32313,"navigation":790,"ogImage":787,"path":690,"publishedAt":32314,"readTime":32315,"seo":32316,"stem":32317,"tags":32318,"toolCategory":17111,"updatedAt":29152,"__hash__":32321},"blogGuides\u002Fblog\u002Fguides\u002Famazon-pa-api-alternatives.md",{"type":8,"value":31783,"toc":32295},[31784,31793,31796,31800,31803,31806,31812,31832,31845,31860,31864,31867,31871,31881,31927,31934,31941,31945,31951,31954,31961,31967,31973,31983,31986,31990,32000,32011,32013,32017,32020,32023,32036,32040,32043,32046,32057,32087,32094,32096,32099,32102,32105,32191,32194,32200,32203,32205,32211,32217,32223,32231,32233,32236,32239,32248,32250,32256,32269,32277,32283,32289,32293],[11,31785,31786,31787,31792],{},"Amazon retired ",[18,31788,31791],{"href":31789,"rel":31790},"https:\u002F\u002Fwebservices.amazon.com\u002Fpaapi5\u002Fdocumentation\u002F",[124,125],"PA-API v5"," on May 15, 2026. If your app still signs requests with AWS Signature V4, it stopped returning data months ago. This is how to rebuild those calls, which replacement actually works, and which one we had been recommending that does not.",[11,31794,31795],{},"That last part is the reason this guide was updated. We re-ran every endpoint it recommends on 2026-08-12 and one of them now returns empty prices. We have changed the recommendation and left the evidence in, because a migration guide that sends you to a dead field is worse than no guide.",[27,31797,31799],{"id":31798},"do-i-actually-have-to-migrate","Do I actually have to migrate?",[11,31801,31802],{},"Yes, if your app called PA-API v5 after May 15, 2026. The endpoint is retired and the old auth is rejected, so requests fail regardless of which fields you were reading.",[11,31804,31805],{},"Three dates mattered and they did not arrive together.",[11,31807,31808],{},[5252,31809],{"alt":31810,"src":31811},"Timeline of the Amazon PA-API v5 retirement: Offers V1 cut off January 31, 2026, PA-API v5 deprecated April 30, endpoint retired and old auth rejected May 15, then migrate to the Creators API or Monid","\u002Fimg\u002Fblog\u002Famazon-pa-api-alternatives-fig-1.png",[5222,31813,31814,31820,31826],{},[5225,31815,31816,31819],{},[38,31817,31818],{},"January 31, 2026:"," the Offers V1 resource was cut off first. If you read buy-box prices or offer listings, this was your earliest deadline, months before the rest.",[5225,31821,31822,31825],{},[38,31823,31824],{},"April 30, 2026:"," PA-API v5 was deprecated. Amazon's recommended migration cutoff, after which assume no fixes and no support.",[5225,31827,31828,31831],{},[38,31829,31830],{},"May 15, 2026:"," the v5 endpoint was retired. Requests signed with AWS Signature V4 are rejected, with no grace period.",[11,31833,31834,31835,31839,31840,260],{},"The auth is the part that makes a small dependency expensive to move. PA-API signed every request with AWS Signature V4 against keys tied to an Associates account, so even where every field you read still exists somewhere, the signing path itself is gone. Any migration is at minimum an auth rewrite. Details are in the ",[18,31836,31838],{"href":31789,"rel":31837},[124,125],"PA-API documentation"," and this ",[18,31841,31844],{"href":31842,"rel":31843},"https:\u002F\u002Fdev.to\u002Fth3nate\u002Famazon-pa-api-v5-is-shutting-down-april-30-2026-here-is-what-changes-at-the-auth-layer-22ek",[124,125],"auth-layer writeup",[11,31846,31847,31848,31851,31852,31855,31856,31859],{},"Before migrating anything, list what you actually call. Most integrations lean on three things: ",[38,31849,31850],{},"GetItems"," for titles, prices, images and availability; ",[38,31853,31854],{},"SearchItems"," for keyword-to-product listings; and ",[38,31857,31858],{},"CustomerReviews"," for the star average and rating count, which is all PA-API ever returned about reviews. There was never review text, and the Creators API keeps that limit.",[27,31861,31863],{"id":31862},"what-is-the-best-api-for-amazon-product-data","What is the best API for Amazon product data?",[11,31865,31866],{},"The one that returns populated fields today, which is not always the one whose description reads best. Here is what we measured.",[232,31868,31870],{"id":31869},"the-search-endpoint-works-and-carries-prices","The search endpoint works and carries prices",[11,31872,31873,31880],{},[18,31874,31877],{"href":31875,"rel":31876},"https:\u002F\u002Fmonid.ai\u002Ftools\u002Famazon",[124,125],[47,31878,31879],{},"apify \u002Faxesso_data\u002Famazon-search-scraper"," is the SearchItems replacement, and on 2026-08-12 it was the strongest performer of the set:",[131,31882,31884],{"className":133,"code":31883,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Faxesso_data\u002Famazon-search-scraper\nmonid run -p apify -e \u002Faxesso_data\u002Famazon-search-scraper \\\n  -i '{\"input\":[{\"keyword\":\"macbook pro 16\",\"domainCode\":\"com\",\"page\":1}]}'\n",[47,31885,31886,31900,31916],{"__ignoreMap":136},[140,31887,31888,31890,31892,31894,31896,31898],{"class":142,"line":143},[140,31889,147],{"class":146},[140,31891,151],{"class":150},[140,31893,154],{"class":150},[140,31895,157],{"class":150},[140,31897,160],{"class":150},[140,31899,16910],{"class":150},[140,31901,31902,31904,31906,31908,31910,31912,31914],{"class":142,"line":166},[140,31903,147],{"class":146},[140,31905,171],{"class":150},[140,31907,154],{"class":150},[140,31909,157],{"class":150},[140,31911,160],{"class":150},[140,31913,5282],{"class":150},[140,31915,184],{"class":183},[140,31917,31918,31920,31922,31925],{"class":142,"line":187},[140,31919,190],{"class":150},[140,31921,194],{"class":193},[140,31923,31924],{"class":150},"{\"input\":[{\"keyword\":\"macbook pro 16\",\"domainCode\":\"com\",\"page\":1}]}",[140,31926,200],{"class":193},[11,31928,31929,31930,31933],{},"One keyword returned ",[38,31931,31932],{},"22 product rows, every one of them carrying a price",", plus ASIN, star rating, review count, Prime flag, sponsored flag, delivery message, sales volume and the result position. The charge came to exactly twenty-two times the per-result price, so the billing matched the listing.",[11,31935,31936,31937,31940],{},"Because it returns a price per row, this endpoint doubles as a price source even when you are not really searching: a keyword narrow enough to surface your ASIN gets you its current price and rating in one cheap call. ",[38,31938,31939],{},"Match on the ASIN, never on the position."," More on why in the daily-tracking section below, because getting this wrong stores another product's price under your own.",[232,31942,31944],{"id":31943},"the-product-details-endpoint-is-currently-returning-empty-fields","The product-details endpoint is currently returning empty fields",[11,31946,31947,31948,31950],{},"This is the correction. The previous version of this guide recommended ",[47,31949,22364],{}," as the GetItems replacement, describing it as returning \"pricing, list price, discounts, availability, star rating, rating distribution, best-seller rank, categories, brand, and images.\"",[11,31952,31953],{},"We ran it against two ASINs on 2026-08-12. Both charged the full per-result price. Both came back substantially empty.",[11,31955,31956,31957,31960],{},"On the first ASIN, ",[38,31958,31959],{},"14 of 26 fields were blank",", including every commercially useful one:",[131,31962,31965],{"className":31963,"code":31964,"language":97,"meta":136},[248],"empty:   price, list_price, availability, rating_stars, rating_distribution,\n         best_sellers_rank, seller_name, manufacturer, delivery_date,\n         product_description, customer_review_summary, breadcrumbs,\n         recent_purchases, fastest_delivery_date\npopulated: asin, title, brand_name, rating_count, images, about_item,\n         model_number, default_variant, product_url, brand_page_url,\n         seller_page_url, scrape_time\n",[47,31966,31964],{"__ignoreMap":136},[11,31968,31969,31970,31972],{},"The second ASIN came back with an empty ",[47,31971,2077],{}," as well.",[11,31974,31975,31978,31979,31982],{},[38,31976,31977],{},"You are charged either way."," A result with no price is still a result, and the bill does not know the difference. So: ",[38,31980,31981],{},"do not use this endpoint for price or availability right now."," Use the search endpoint above, which returns both. If you need the richer per-ASIN record, run one call and read the fields before you wire it into anything.",[11,31984,31985],{},"We are naming our own catalogue here because the alternative is leaving a recommendation up that quietly returns nothing for the field most readers came for.",[232,31987,31989],{"id":31988},"reviews-the-upgrade-pa-api-never-gave-you","Reviews: the upgrade PA-API never gave you",[11,31991,31992,31993,31999],{},"Since you were never getting review text from Amazon, moving off PA-API is the moment you can finally read it. ",[18,31994,31996],{"href":31875,"rel":31995},[124,125],[47,31997,31998],{},"apify \u002Faxesso_data\u002Famazon-reviews-scraper"," returns each review's full text, verified-purchase flag, date and helpful votes.",[11,32001,32002,32003,32006,32007,32010],{},"One correction carries over from ",[18,32004,32005],{"href":5548},"the reviews comparison",": that endpoint is described as returning one result per query, and a measured run billed per review instead. Fifty reviews cost fifty results. Set ",[47,32008,32009],{},"maxPages"," deliberately.",[316,32012],{"category":17111},[27,32014,32016],{"id":32015},"how-can-i-scrape-only-price-stock-and-availability-every-day","How can I scrape only price, stock and availability every day?",[11,32018,32019],{},"Pull the narrowest thing that carries the number, and schedule it.",[11,32021,32022],{},"This is one of the most common questions in the category, and it is a different job from a full product record. You do not want the description, the images or the review text. You want three fields to diff against yesterday.",[11,32024,32025,32026,102,32029,32032,32033,260],{},"Given what we measured above, the cheapest reliable route today is the search endpoint with a keyword tight enough to return your ASIN, reading ",[47,32027,32028],{},"price",[47,32030,32031],{},"productRating"," off the matching row. It is the cheapest Amazon call in the catalogue by a wide margin, and a daily check across a hundred tracked products is a rounding error. Current figures at ",[18,32034,1233],{"href":5582,"rel":32035},[124,125],[232,32037,32039],{"id":32038},"match-the-asin-or-you-will-store-the-wrong-products-price","Match the ASIN, or you will store the wrong product's price",[11,32041,32042],{},"This is the part to get right, because the failure is silent and the data looks fine.",[11,32044,32045],{},"A keyword search returns whatever Amazon decides is relevant: sponsored placements, a different capacity or colour of your product, a competitor, a case for the thing rather than the thing. Reading the price off the first row, or off a fixed position, means that the day Amazon reshuffles results your tracker records someone else's price under your ASIN and keeps doing it until a human notices.",[11,32047,32048,32049,32056],{},"So the rule is: ",[38,32050,32051,32052,32055],{},"filter the returned rows to ",[47,32053,32054],{},"asin == \u003Cyour tracked ASIN>",", and if no row matches, record nothing and move on."," A missing data point is honest. An inferred one corrupts the series, and price history is exactly the kind of data nobody re-checks once it is stored.",[131,32058,32060],{"className":1257,"code":32059,"language":1259,"meta":136,"style":136},"row = next((r for r in rows if r[\"asin\"] == tracked_asin), None)\nif row is None:\n    log.warning(\"no exact match for %s on %r, skipping\", tracked_asin, keyword)\nelse:\n    store(tracked_asin, row[\"price\"], row[\"searchResultPosition\"])\n",[47,32061,32062,32067,32072,32077,32082],{"__ignoreMap":136},[140,32063,32064],{"class":142,"line":143},[140,32065,32066],{},"row = next((r for r in rows if r[\"asin\"] == tracked_asin), None)\n",[140,32068,32069],{"class":142,"line":166},[140,32070,32071],{},"if row is None:\n",[140,32073,32074],{"class":142,"line":187},[140,32075,32076],{},"    log.warning(\"no exact match for %s on %r, skipping\", tracked_asin, keyword)\n",[140,32078,32079],{"class":142,"line":1279},[140,32080,32081],{},"else:\n",[140,32083,32084],{"class":142,"line":1284},[140,32085,32086],{},"    store(tracked_asin, row[\"price\"], row[\"searchResultPosition\"])\n",[11,32088,32089,32090,32093],{},"Two smaller notes. Rows carry a ",[47,32091,32092],{},"searchResultPosition",", so once you have matched the ASIN the same call also tells you where your listing ranks for that keyword, which is worth storing alongside the price. And availability is the field most likely to be missing or vague across all these endpoints, so verify it on your own ASINs before building an out-of-stock alert on it.",[27,32095,21640],{"id":21639},[11,32097,32098],{},"Buy it, and the PA-API retirement is itself the argument.",[11,32100,32101],{},"The instinct after a vendor removes an API from under you is to own the pipeline so it cannot happen again. It is the wrong lesson. Building your own Amazon scraper means proxies, CAPTCHAs, a login wall and a parser you rewrite on Amazon's schedule; one developer's post in this space is just the title \"Amazon denied my API access, so I built my own scraper\" and a link to the library they now maintain forever.",[11,32103,32104],{},"The right lesson is about coupling, not ownership. What hurt was that one source was wired directly into your product. A layer with the provider and endpoint as parameters means a dead endpoint is a flag change rather than another migration project, and this guide is an example: the product-details actor degraded, and the fix was to point at a different endpoint on the same balance rather than to rebuild anything.",[482,32106,32107,32118],{},[485,32108,32109],{},[488,32110,32111,32113,32116],{},[491,32112],{},[491,32114,32115],{},"Amazon Creators API",[491,32117,864],{},[504,32119,32120,32130,32140,32150,32161,32171,32181],{},[488,32121,32122,32125,32127],{},[509,32123,32124],{},"Replaces PA-API product data",[509,32126,1834],{},[509,32128,32129],{},"Yes, via the search endpoint",[488,32131,32132,32135,32138],{},[509,32133,32134],{},"Review text",[509,32136,32137],{},"No, ratings only",[509,32139,1834],{},[488,32141,32142,32144,32147],{},[509,32143,9115],{},[509,32145,32146],{},"OAuth 2.0, new setup",[509,32148,32149],{},"One key",[488,32151,32152,32155,32158],{},[509,32153,32154],{},"Amazon account required",[509,32156,32157],{},"Associates account",[509,32159,32160],{},"No Amazon account*",[488,32162,32163,32166,32168],{},[509,32164,32165],{},"Data beyond Amazon",[509,32167,1837],{},[509,32169,32170],{},"Social, search, enrichment, more",[488,32172,32173,32175,32178],{},[509,32174,1449],{},[509,32176,32177],{},"Free, affiliate terms",[509,32179,32180],{},"Metered, pay as you go",[488,32182,32183,32185,32188],{},[509,32184,3531],{},[509,32186,32187],{},"Pure affiliates staying in-platform",[509,32189,32190],{},"Anyone who wants review text or one balance",[11,32192,32193],{},"* You keep an Associates tag only if you still earn commissions, which is separate from where your data comes from.",[11,32195,17468,32196,32199],{},[38,32197,32198],{},"Creators API"," is Amazon's official successor and the natural move for a pure affiliate who only needs prices and ratings inside Amazon's blessed pipeline. Expect real work: OAuth 2.0 client credentials, a new endpoint and a new request shape, not a config flip. And it inherits the same limit: no review text.",[421,32201],{"category":17111,"title":32202},"Browse the Amazon endpoints, with live pricing",[27,32204,657],{"id":656},[11,32206,32207,32210],{},[38,32208,32209],{},"You are a pure affiliate who only needs prices and ratings."," The Creators API is free under affiliate terms and official. Free and official beats metered when the fields overlap.",[11,32212,32213,32216],{},[38,32214,32215],{},"You need a contractual guarantee on a field being present."," Everything above is scraped from public pages, and this guide's own correction is what that risk looks like in practice: an endpoint that worked in July returned empty prices in August, and still billed. A vendor contract with an SLA is a different product, and if a missing price breaks your business, buy that instead.",[11,32218,32219,32222],{},[38,32220,32221],{},"You need Amazon's own numbers."," Sales estimates from any third party are inferred, never Amazon's internal figures, and should be treated as directional.",[11,32224,32225,32227,32228,32230],{},[38,32226,31152],{}," across five endpoints measured on 2026-08-12, two billed in a shape their metadata did not describe and one returned mostly empty records at full price. ",[47,32229,607],{}," is free and tells you what an endpoint claims. Only a run tells you what it delivers. Do one before you wire anything into production, and do another when something that used to work starts looking thin.",[27,32232,696],{"id":695},[11,32234,32235],{},"The migration itself is smaller than it looks: an auth rewrite and a field remap, because you are reading the same underlying Amazon data. The part worth slowing down for is which endpoint you point at, and that cannot be settled by reading descriptions. The endpoint whose description best matched GetItems is the one that returned no price, and the one filed under search is the one carrying prices on every row.",[11,32237,32238],{},"The real lesson from PA-API is not that Amazon removed something. It is that a data source wired directly into a product becomes a migration project the day it changes. Keep the provider and endpoint as parameters and the same event becomes an edit.",[11,32240,32241,32242,32244,32245,260],{},"A working migration is four steps and the first two are free: ",[47,32243,607],{}," the replacements to see fields and prices, run one ASIN and one keyword and diff the output against what you parse today, swap your calls, then add the review text PA-API never gave you. Start at ",[18,32246,725],{"href":723,"rel":32247},[124,125],[27,32249,729],{"id":728},[731,32251,32253],{"q":32252},"Is the Creators API a drop-in replacement?",[11,32254,32255],{},"No. It is a new endpoint with OAuth 2.0 client credentials and a different request and response shape, so plan for an auth rewrite either way. It also keeps PA-API's limit of ratings without review text.",[731,32257,32259],{"q":32258},"Can I finally get Amazon review text?",[11,32260,32261,32262,32265,32266,32268],{},"Not from Amazon. Neither PA-API nor the Creators API returns review bodies, so the text comes from a scraper. ",[47,32263,32264],{},"axesso_data\u002Famazon-reviews-scraper"," returns it, billed per review as measured, with ",[47,32267,32009],{}," controlling how deep it goes.",[731,32270,32271],{"q":16838},[11,32272,32273,32274,32276],{},"Give the agent endpoints it can discover and inspect itself rather than hardcoding a vendor, which is what ",[47,32275,26040],{}," does. Keyword and position data come from the search endpoint. Sales figures from any third party are estimates rather than Amazon's own numbers, and are worth labelling as such wherever they reach a user.",[731,32278,32280],{"q":32279},"Will my parsing code still work?",[11,32281,32282],{},"Mostly. You are reading the same Amazon data, so field mapping is close. Diff one product's output during migration to catch naming differences, and check for empty strings specifically, since a field can be present and blank.",[731,32284,32286],{"q":32285},"Is scraping Amazon data allowed?",[11,32287,32288],{},"Scraping public pages sits in a contested legal area that keeps shifting, and Amazon's terms restrict automated access. Get your own legal read before running it at scale, and prefer verified providers.",[11,32290,32291],{},[758,32292,760],{},[762,32294,764],{},{"title":136,"searchDepth":166,"depth":166,"links":32296},[32297,32298,32303,32306,32307,32308,32309],{"id":31798,"depth":166,"text":31799},{"id":31862,"depth":166,"text":31863,"children":32299},[32300,32301,32302],{"id":31869,"depth":187,"text":31870},{"id":31943,"depth":187,"text":31944},{"id":31988,"depth":187,"text":31989},{"id":32015,"depth":166,"text":32016,"children":32304},[32305],{"id":32038,"depth":187,"text":32039},{"id":21639,"depth":166,"text":21640},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Famazon-pa-api-alternatives.png","PA-API retired in May 2026. Which endpoints actually replace GetItems and SearchItems, tested on the day of writing, including one returning empty prices.","\u002Fimg\u002Fblog\u002Famazon-pa-api-alternatives-card.png",{},"2026-07-21","9 min",{"title":5892,"description":32311},"blog\u002Fguides\u002Famazon-pa-api-alternatives",[32319,32320,9734,5565],"amazon product advertising api","pa-api alternative","JeKQWqt4sDOpSIvuRxg0E_S94NDRrbLA1p-vZP_fAiw",{"id":32323,"title":32324,"author":6,"body":32325,"category":5706,"cover":32844,"description":32845,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":32846,"meta":32847,"navigation":790,"ogImage":787,"path":5548,"publishedAt":32848,"readTime":15530,"seo":32849,"stem":32850,"tags":32851,"toolCategory":17111,"updatedAt":16806,"__hash__":32853},"blogGuides\u002Fblog\u002Fguides\u002Fbest-amazon-reviews-api-2026.md","The Best Amazon Reviews API in 2026 (We Tested Them)",{"type":8,"value":32326,"toc":32828},[32327,32330,32336,32339,32343,32346,32355,32358,32361,32366,32370,32373,32383,32387,32395,32443,32461,32464,32468,32475,32481,32495,32502,32506,32512,32522,32525,32527,32536,32538,32541,32544,32547,32550,32554,32557,32563,32566,32569,32571,32682,32691,32698,32700,32704,32707,32713,32719,32722,32725,32727,32730,32736,32742,32748,32757,32759,32769,32772,32784,32786,32792,32800,32810,32822,32826],[11,32328,32329],{},"We have pulled a lot of Amazon reviews. For competitor research, for sentiment dashboards, for agents that read the one-star reviews before a buyer commits. Every time, the first question is the same, and the second one is the one that actually costs people money.",[11,32331,32332,32333,32335],{},"The first is whether there is an official Amazon reviews API. There is not. The second is how to get all of a product's reviews rather than the first ten, and that one has a specific answer with a specific price, which we measured rather than repeated. Monid is ",[18,32334,21],{"href":20},", so we resell most of the options below rather than being one of them.",[11,32337,32338],{},"Fair disclosure: you are on the Monid blog, and one of the options here is ours. The correction in the pricing section below is to our own previously published claim, which was wrong.",[27,32340,32342],{"id":32341},"why-is-there-no-official-amazon-reviews-api","Why is there no official Amazon reviews API?",[11,32344,32345],{},"Because the official API was built for affiliates, not for anyone who wants to read what buyers wrote.",[11,32347,32348,32349,32351,32352,32354],{},"Amazon's Product Advertising API exposed a ",[47,32350,31858],{}," field that returned the star rating and the review count, then handed you an iframe for the rest. No documented version of it has ever returned review text, and access required an Amazon Associates account with recent qualifying sales. It was ",[18,32353,16827],{"href":690},", which removed even the rating badge.",[11,32356,32357],{},"The frustration this produces is easy to find. One request thread titled simply \"Amazon, Market API please!\" drew 149 comments. Another developer's post is a summary of the whole situation in its title: Amazon denied their API access, so they built their own scraper and published it as a library.",[11,32359,32360],{},"So every option that returns the text of a review is a scraper. The real questions are which one, how you pay, and whether it can reach past the first page.",[320,32362,32363],{},[11,32364,32365],{},"There is no official Amazon reviews API. Everything that returns the actual text of a review is a scraper, so the only real questions are which one, and how you pay.",[27,32367,32369],{"id":32368},"what-is-the-best-api-to-get-all-amazon-reviews-not-just-the-first-ten","What is the best API to get all Amazon reviews, not just the first ten?",[11,32371,32372],{},"Any of them, if you set the page limit. The reason this question keeps getting asked is that the default is one page, and one page is ten reviews.",[11,32374,32375,32376,32378,32379,32382],{},"Here is the mechanic, measured rather than quoted. Amazon paginates reviews at ten per page, and the review endpoints expose a ",[47,32377,32009],{}," parameter that most quickstarts leave at ",[47,32380,32381],{},"1",". Set it and you get the rest.",[232,32384,32386],{"id":32385},"what-one-real-call-returned","What one real call returned",[11,32388,27473,32389,32394],{},[18,32390,32392],{"href":31875,"rel":32391},[124,125],[47,32393,31998],{}," against a MacBook Pro listing on 2026-08-12:",[131,32396,32398],{"className":133,"code":32397,"language":135,"meta":136,"style":136},"monid inspect -p apify -e \u002Faxesso_data\u002Famazon-reviews-scraper\nmonid run -p apify -e \u002Faxesso_data\u002Famazon-reviews-scraper \\\n  -i '{\"input\":[{\"asin\":\"B0BSHF7WHW\",\"domainCode\":\"com\",\"maxPages\":5,\"sortBy\":\"recent\"}]}'\n",[47,32399,32400,32415,32432],{"__ignoreMap":136},[140,32401,32402,32404,32406,32408,32410,32412],{"class":142,"line":143},[140,32403,147],{"class":146},[140,32405,151],{"class":150},[140,32407,154],{"class":150},[140,32409,157],{"class":150},[140,32411,160],{"class":150},[140,32413,32414],{"class":150}," \u002Faxesso_data\u002Famazon-reviews-scraper\n",[140,32416,32417,32419,32421,32423,32425,32427,32430],{"class":142,"line":166},[140,32418,147],{"class":146},[140,32420,171],{"class":150},[140,32422,154],{"class":150},[140,32424,157],{"class":150},[140,32426,160],{"class":150},[140,32428,32429],{"class":150}," \u002Faxesso_data\u002Famazon-reviews-scraper",[140,32431,184],{"class":183},[140,32433,32434,32436,32438,32441],{"class":142,"line":187},[140,32435,190],{"class":150},[140,32437,194],{"class":193},[140,32439,32440],{"class":150},"{\"input\":[{\"asin\":\"B0BSHF7WHW\",\"domainCode\":\"com\",\"maxPages\":5,\"sortBy\":\"recent\"}]}",[140,32442,200],{"class":193},[11,32444,32445,32446,32449,32450,32452,32453,32456,32457,32460],{},"It returned ",[38,32447,32448],{},"50 review records across pages 1 to 5",", ten per page, each carrying the full text, the star rating, the date, the reviewer name, helpful votes, attached media and a ",[47,32451,5967],{}," flag. Of the 50, 47 were verified purchases. The response also carried ",[47,32454,32455],{},"countReviews: 91",", which is how you know when to stop: that product has 91 reviews, so ",[47,32458,32459],{},"maxPages: 10"," would have taken all of them.",[11,32462,32463],{},"That field is the answer to the question. You do not have to guess how deep to go. The first page tells you the total, and you page until you reach it.",[232,32465,32467],{"id":32466},"the-correction","The correction",[11,32469,32470,32471,32474],{},"The previous version of this article said one ASIN query bills as a single result. ",[38,32472,32473],{},"That was wrong, and the measured run is how we found out."," The endpoint's own price metadata says the same thing (\"one result is returned per input query\"), and it is also wrong.",[11,32476,32477,32480],{},[38,32478,32479],{},"The charge came to exactly fifty times the per-result price",", one unit for each review returned rather than one for the query. Billing is per review. Practically:",[5222,32482,32483,32486,32492],{},[5225,32484,32485],{},"Ten reviews cost ten results. Ninety-one reviews cost ninety-one results.",[5225,32487,32488,32489,32491],{},"Raising ",[47,32490,32009],{}," raises the bill proportionally. It is not a free flag.",[5225,32493,32494],{},"Pulling a product's entire review history is still cents, not dollars, but it is not the flat price a single query implies.",[11,32496,32497,32498,32501],{},"We would rather correct this in public than leave a number up that under-quotes what a job costs. It is also a caution about this whole category: ",[38,32499,32500],{},"the price metadata on a marketplace endpoint describes the vendor's intent, and a real run describes the bill."," Run one small call before you size a batch.",[232,32503,32505],{"id":32504},"where-the-ceiling-sits-is-provider-specific","Where the ceiling sits is provider specific",[11,32507,32508,32509,32511],{},"One thing the ",[47,32510,32009],{}," answer hides: not every provider reaches the same depth, and the difference comes from how they read the page rather than from how good they are.",[11,32513,32514,32515,32518,32519,32521],{},"Amazon now requires a logged-in session to load reviews beyond the first page. A provider reading the public product page sees what Amazon shows a logged-out visitor, which is a handful of reviews, and going deeper means carrying a session. ",[18,32516,17047],{"href":17045,"rel":32517},[124,125]," documents this outright: their public reviews endpoint returns the eight reviews Amazon displays without a session, and the deeper endpoints take a ",[47,32520,17058],{}," parameter holding a logged-in one. The Axesso endpoint measured above paginates past that ceiling because it reaches the data differently, which is why the run returned fifty.",[11,32523,32524],{},"The point is not that one is better. It is that \"gets all the reviews\" means different things depending on the route, so check the route before you size a job. A vendor that writes its ceiling into the docs is easier to build against than one that implies there is none, because you find out at design time instead of when a batch quietly comes back short.",[316,32526],{"category":17111},[320,32528,32529],{},[11,32530,324,32531,119,32533],{},[38,32532,327],{},[18,32534,32535],{"href":3261},"pull an ASIN's whole review history in one call",[27,32537,21640],{"id":21639},[11,32539,32540],{},"Buy it, unless scraping is the product you sell.",[11,32542,32543],{},"This is one of the most-asked questions in the category and the honest answer depends on one thing: whether the maintenance lands on someone whose job it is. Amazon is among the hardest scrape targets on the web. Rolling your own means proxies, CAPTCHAs, a login wall, and a parser you rewrite on Amazon's schedule rather than yours. You also build the verified-purchase flag, the star and keyword filters and the regional support yourself, then keep all of them working.",[11,32545,32546],{},"The marginal cost of your own scraper is near zero and its fixed cost is an engineer who gets paged during launches. At the volumes most teams actually run, a few hundred to a few thousand reviews when a project calls for it, the managed route is cheaper across a quarter even when its unit price looks higher on paper.",[11,32548,32549],{},"Build it yourself when scraping infrastructure is your core competency, or when the pipeline is the thing you are learning. Buy it when the reviews are.",[232,32551,32553],{"id":32552},"the-fields-a-review-record-should-return","The fields a review record should return",[11,32555,32556],{},"A star rating tells you a product is a 4.7. The fields below tell you why the one-stars are one-stars, and which of them to trust.",[11,32558,32559],{},[5252,32560],{"alt":32561,"src":32562},"One Amazon review record fanning out into the fields that matter: rating, title, full body text, date, reviewer, verified-purchase flag, helpful votes, attached media, variant, and the aggregated rating distribution","\u002Fimg\u002Fblog\u002Fbest-amazon-reviews-api-2026-fig-fields.png",[11,32564,32565],{},"Full text and rating are the obvious ones. The verified-purchase flag is what separates signal from noise, since a review tied to a real order outweighs an anonymous one. Helpful votes let you sort by what other buyers found useful. Attached media matters more than teams expect: a photo of a cracked unit is a support signal a text-only sentiment model will miss. Variant association tells you whether the complaint was about the blue XL or the red small. The aggregated distribution gives you the shape of sentiment in one number set, so you know whether the one-stars are a rounding error or a pattern.",[11,32567,32568],{},"One texture worth knowing before you build on the text: the most recent review in our run was written in Spanish, on amazon.com. Storefront does not mean language. If you are scoring sentiment, detect the language first or your model will quietly mark what it cannot read.",[27,32570,480],{"id":479},[482,32572,32573,32586],{},[485,32574,32575],{},[488,32576,32577,32580,32582,32584],{},[491,32578,32579],{},"Option",[491,32581,6334],{},[491,32583,3531],{},[491,32585,1449],{},[504,32587,32588,32606,32624,32642,32655,32668],{},[488,32589,32590,32597,32600,32603],{},[509,32591,32592],{},[18,32593,32595],{"href":31875,"rel":32594},[124,125],[47,32596,31998],{},[509,32598,32599],{},"ASIN to full review records, paginated",[509,32601,32602],{},"Most review work",[509,32604,32605],{},"Per review",[488,32607,32608,32616,32619,32622],{},[509,32609,32610],{},[18,32611,32613],{"href":31875,"rel":32612},[124,125],[47,32614,32615],{},"apify \u002Fweb_wanderer\u002Famazon-reviews-extractor",[509,32617,32618],{},"Same job, 20+ regional domains, aspect sentiment",[509,32620,32621],{},"Non-US storefronts",[509,32623,3551],{},[488,32625,32626,32634,32637,32640],{},[509,32627,32628],{},[18,32629,32631],{"href":31875,"rel":32630},[124,125],[47,32632,32633],{},"strale \u002Fproduct-reviews-extract",[509,32635,32636],{},"Any review page, with a ready summary",[509,32638,32639],{},"One-off, mixed sources",[509,32641,542],{},[488,32643,32644,32647,32650,32653],{},[509,32645,32646],{},"Rainforest API",[509,32648,32649],{},"Managed Amazon data at scale",[509,32651,32652],{},"Heavy, steady daily volume",[509,32654,4556],{},[488,32656,32657,32660,32663,32666],{},[509,32658,32659],{},"Oxylabs",[509,32661,32662],{},"Enterprise scraping with SLAs",[509,32664,32665],{},"Contracts and support",[509,32667,4556],{},[488,32669,32670,32673,32676,32679],{},[509,32671,32672],{},"Build your own",[509,32674,32675],{},"Everything, including the pager",[509,32677,32678],{},"Scraping-native teams",[509,32680,32681],{},"Infra plus engineer time",[11,32683,32684,32685,32687,32688,260],{},"Schemas and prices verified 2026-08-12 with ",[47,32686,607],{},", which is free to run and prints the current figure. Live per-endpoint pricing is at ",[18,32689,1233],{"href":5582,"rel":32690},[124,125],[11,32692,32693,32694,32697],{},"The redundancy is worth one line. With a single vendor, a broken scraper is your outage and you wait. Here the same job usually has more than one endpoint, so if Axesso has a bad day the ",[47,32695,32696],{},"web_wanderer"," extractor covers the same ASIN from the same balance with one flag change, no new signup and no new invoice.",[421,32699],{"category":17111,"title":32202},[27,32701,32703],{"id":32702},"what-does-pulling-reviews-actually-cost","What does pulling reviews actually cost?",[11,32705,32706],{},"Cost here is less about a unit price than about which thing gets counted, which is exactly what we got wrong above.",[11,32708,32709],{},[5252,32710],{"alt":32711,"src":32712},"Monthly cost by billing shape: the subscription line stays flat every month regardless of use, while the pay-per-result line rises and falls with usage and drops to zero in an idle month","\u002Fimg\u002Fblog\u002Fbest-amazon-reviews-api-2026-fig-cost.png",[11,32714,32715,32716,260],{},"Work it from the shape rather than a unit price. Fifty reviews bill as fifty results, so one product's full history of about a hundred reviews is a small fraction of a dollar. A competitor teardown across twenty of a rival's best-sellers is single-digit dollars. A sentiment backfill over five hundred products with a hundred reviews each lands in the tens of dollars, not the hundreds, and it is a one-time spend rather than a plan you keep paying for. Current per-endpoint figures are at ",[18,32717,1233],{"href":5582,"rel":32718},[124,125],[11,32720,32721],{},"A subscription is a flat line: you pay it whether you pulled a million reviews or none, which only pencils out if your usage is high and steady enough to fill it. Per-review pricing tracks the work and drops to zero in an idle month. Building your own has almost no marginal cost and a large fixed cost that never appears on an invoice.",[11,32723,32724],{},"For most teams, whose review work arrives in bursts around launches and teardowns, the metered shape is cheaper across a full quarter even when its unit price looks worse. But size it from a real run, not from the endpoint's description.",[27,32726,657],{"id":656},[11,32728,32729],{},"Three honest cases, and one caution about us.",[11,32731,32732,32735],{},[38,32733,32734],{},"You only need a rating and a count."," No scraper is worth it for a star badge, though note that the free official route for this is now gone.",[11,32737,32738,32741],{},[38,32739,32740],{},"Your volume is genuinely enormous and steady."," Millions of reviews a day on a fixed schedule is where a dedicated contract with Rainforest or Oxylabs beats metered pricing on raw unit cost, and where an SLA is worth paying for. Price it out rather than assuming either way.",[11,32743,32744,32747],{},[38,32745,32746],{},"You need a guarantee, not a catalog."," A marketplace optimises for breadth and switching cost. If you need a named account manager and a contractual uptime number, buy direct.",[11,32749,32750,32753,32754,32756],{},[38,32751,32752],{},"And the caution:"," the pricing metadata on these endpoints can be wrong, as this article's own correction shows. ",[47,32755,607],{}," is free and tells you the schema and the stated price, but the stated price is the vendor's description of their billing, not a measurement of it. On any endpoint you are about to run at scale, do one small run first and read the actual charge.",[27,32758,696],{"id":695},[11,32760,32761,32762,32764,32765,32768],{},"The best Amazon reviews API is whichever one you point at the right page depth, because the thing that usually goes wrong is not the vendor, it is the default. ",[47,32763,32009],{}," at 1 gives you ten reviews and the impression that the API is limited. ",[47,32766,32767],{},"countReviews"," in the first response tells you how far to go.",[11,32770,32771],{},"Two things matter more than the choice between vendors. The first is that you are paying per review, not per product, so the page limit is a spending dial and should be set deliberately. The second is that endpoint metadata is a description and a run is a measurement: this article said the wrong thing for a month because we trusted the former, and one call for seven cents settled it.",[11,32773,32774,32775,27639,32778,32780,32781,260],{},"Start with the free part. ",[47,32776,32777],{},"monid discover -q \"amazon reviews\"",[47,32779,607],{}," prints the schema and stated price without spending anything. Then run one small call and read the charge. Begin at ",[18,32782,725],{"href":723,"rel":32783},[124,125],[27,32785,729],{"id":728},[731,32787,32789],{"q":32788},"How can I scrape only price, stock and availability from Amazon every day?",[11,32790,32791],{},"Use a product endpoint rather than a reviews one, and pull only the ASINs you actually track. The reviews scrapers above return the review body, which is the expensive part of the payload and pointless if you only want a number that changed. A daily price and stock check is a small, scheduled job whose cost scales with how many ASINs you watch, not with how much text comes back.",[731,32793,32794],{"q":16838},[11,32795,32796,32797,32799],{},"Give the agent an endpoint it can discover and inspect on its own rather than hardcoding a vendor SDK. That is what the ",[47,32798,26040],{}," line does: the agent lists what exists, reads a schema, sees the price before it spends, and can pick a different endpoint if the first one does not fit. Sales figures specifically are estimates from third-party data, never Amazon's own numbers, and should be treated as directional.",[731,32801,32803],{"q":32802},"What is the best API for Amazon product data, as opposed to reviews?",[11,32804,32805,32806,32809],{},"Different endpoint, same marketplace. Product detail calls return title, price, availability, images and variants, and are usually billed per call rather than per review because the payload is one object rather than a list. Run ",[47,32807,32808],{},"monid discover -q \"amazon product\""," to see the current set.",[731,32811,32813],{"q":32812},"Can I get reviews from Amazon outside the US?",[11,32814,11253,32815,32817,32818,32821],{},[47,32816,17155],{}," selects the storefront, and ",[47,32819,32820],{},"web_wanderer\u002Famazon-reviews-extractor"," reaches 20+ regional domains, so UK, German and Japanese listings come through the same call. Remember the language point above: a storefront's reviews are not all in that storefront's language.",[11,32823,32824],{},[758,32825,760],{},[762,32827,764],{},{"title":136,"searchDepth":166,"depth":166,"links":32829},[32830,32831,32836,32839,32840,32841,32842,32843],{"id":32341,"depth":166,"text":32342},{"id":32368,"depth":166,"text":32369,"children":32832},[32833,32834,32835],{"id":32385,"depth":187,"text":32386},{"id":32466,"depth":187,"text":32467},{"id":32504,"depth":187,"text":32505},{"id":21639,"depth":166,"text":21640,"children":32837},[32838],{"id":32552,"depth":187,"text":32553},{"id":479,"depth":166,"text":480},{"id":32702,"depth":166,"text":32703},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fbest-amazon-reviews-api-2026.png","There is no official Amazon reviews API. Here are the real ways to get review text, what all of them costs, and the pagination limit nobody mentions.","\u002Fimg\u002Fblog\u002Fbest-amazon-reviews-api-2026-card.png",{},"2026-07-09",{"title":32324,"description":32845},"blog\u002Fguides\u002Fbest-amazon-reviews-api-2026",[32852,9734,1638,5565],"amazon reviews api","06I-ghhLF3y3HuwQPbNgRZO6y1gcVucHOHIHvOXRisE",{"id":32855,"title":32856,"author":6,"body":32857,"category":782,"cover":33465,"description":33466,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":33467,"meta":33468,"navigation":790,"ogImage":787,"path":33469,"publishedAt":32848,"readTime":1681,"seo":33470,"stem":33471,"tags":33472,"toolCategory":12584,"updatedAt":29152,"__hash__":33475},"blogGuides\u002Fblog\u002Fguides\u002Fbest-email-verification-api-2026.md","Best Email Verification API in 2026: ZeroBounce, NeverBounce, Kickbox, or One Call on Monid?",{"type":8,"value":32858,"toc":33452},[32859,32862,32865,32869,32872,32878,32888,32891,32904,32908,32911,33050,33053,33057,33062,33067,33072,33081,33084,33088,33091,33094,33098,33106,33154,33157,33277,33289,33295,33297,33308,33311,33314,33317,33332,33335,33338,33342,33348,33351,33357,33363,33369,33375,33377,33383,33389,33395,33400,33402,33405,33408,33419,33421,33427,33433,33439,33445,33449],[11,32860,32861],{},"The best email verification API is the one that matches how your addresses arrive, not the one with the lowest sticker price. Scrubbing a purchased list of millions once a quarter and checking one address the moment an agent finds it are different jobs, and the tools that win at each are different tools.",[11,32863,32864],{},"Disclosure before anything else: you are on the Monid blog, so one of the options below is ours. Several of the others beat it at the job they were built for, and this guide says which and why. If you finish it and buy ZeroBounce, that is a correct outcome.",[27,32866,32868],{"id":32867},"how-do-i-deal-with-high-bounce-rates-and-spam-traps","How do I deal with high bounce rates and spam traps?",[11,32870,32871],{},"Verify before you send, and understand that verification catches bounces but only partly catches traps. Those are two different problems and conflating them is what makes people distrust verifiers.",[11,32873,32874,32877],{},[38,32875,32876],{},"Hard bounces"," are addresses that do not exist: typos, departed employees, dead domains. A verifier catches these well, because they are checkable facts. Syntax parses or it does not. The domain has MX records or it does not.",[11,32879,32880,32883,32884,32887],{},[38,32881,32882],{},"Spam traps"," are addresses that do exist and are monitored to catch senders who did not earn their list. A recycled trap is an abandoned real mailbox reactivated as a trap; a pristine trap was never a real person at all. ",[38,32885,32886],{},"Both accept mail."," A verifier that only checks deliverability will call them valid, because they are.",[11,32889,32890],{},"So verification is necessary and not sufficient. What actually reduces trap hits is list hygiene: never mail a purchased list, drop addresses that have not engaged in months rather than re-mailing them, and gate signups at capture so bad addresses never enter. That last one is where a per-address check earns its keep, and it is the difference between cleaning a list and never dirtying it.",[11,32892,32893,32894,98,32897,102,32900,32903],{},"The one signal a verifier gives you that is genuinely trap-adjacent is the role-address flag. ",[47,32895,32896],{},"info@",[47,32898,32899],{},"sales@",[47,32901,32902],{},"admin@"," are disproportionately represented among traps and are rarely worth mailing anyway.",[27,32905,32907],{"id":32906},"is-there-an-email-lookup-api-that-reduces-bounce-rates","Is there an email lookup API that reduces bounce rates?",[11,32909,32910],{},"Yes, several, and they differ mostly in how you buy them rather than what they check. Here is the field.",[482,32912,32913,32932],{},[485,32914,32915],{},[488,32916,32917,32919,32922,32925,32927,32930],{},[491,32918,32579],{},[491,32920,32921],{},"Full validity + reason code?",[491,32923,32924],{},"Deliverability (SPF\u002FDKIM\u002FDMARC)?",[491,32926,502],{},[491,32928,32929],{},"Setup and upkeep",[491,32931,3531],{},[504,32933,32934,32954,32973,32992,33010,33030],{},[488,32935,32936,32939,32942,32945,32948,32951],{},[509,32937,32938],{},"ZeroBounce",[509,32940,32941],{},"Yes, detailed status codes",[509,32943,32944],{},"Yes, separate domain tools",[509,32946,32947],{},"Subscription or credit packs, minimum purchase",[509,32949,32950],{},"Low, dashboard plus API",[509,32952,32953],{},"Big periodic list cleans, marketers who want a UI",[488,32955,32956,32959,32962,32965,32968,32970],{},[509,32957,32958],{},"NeverBounce",[509,32960,32961],{},"Yes, clear result categories",[509,32963,32964],{},"Limited, mailbox-focused",[509,32966,32967],{},"Pay-as-you-go credits, expiry clock",[509,32969,32950],{},[509,32971,32972],{},"Pre-send bulk cleaning with no commitment",[488,32974,32975,32978,32981,32984,32987,32989],{},[509,32976,32977],{},"Kickbox",[509,32979,32980],{},"Yes, with a sendability score",[509,32982,32983],{},"Partial, deliverability tooling",[509,32985,32986],{},"Credits, volume tiers",[509,32988,32950],{},[509,32990,32991],{},"Deliverability-conscious senders, ESP integrations",[488,32993,32994,32997,33000,33002,33005,33007],{},[509,32995,32996],{},"Bouncer or Emailable",[509,32998,32999],{},"Yes, standard categories",[509,33001,31373],{},[509,33003,33004],{},"Credits or subscription",[509,33006,32950],{},[509,33008,33009],{},"GDPR-conscious EU teams, batch plus API",[488,33011,33012,33015,33018,33021,33024,33027],{},[509,33013,33014],{},"DIY SMTP \u002F MX check",[509,33016,33017],{},"Partial, you build the logic",[509,33019,33020],{},"Only if you write it",[509,33022,33023],{},"Free code, paid in server and IP reputation",[509,33025,33026],{},"High, ongoing",[509,33028,33029],{},"Engineers who want zero vendors and accept the risk",[488,33031,33032,33035,33038,33041,33044,33047],{},[509,33033,33034],{},"Strale on Monid",[509,33036,33037],{},"Yes: syntax, MX, disposable, role, typo",[509,33039,33040],{},"Yes, separate deliverability endpoint",[509,33042,33043],{},"Per call, shared balance, no minimum",[509,33045,33046],{},"Low, one integration",[509,33048,33049],{},"Agents, spiky or low volume, one check inside a bigger pipeline",[11,33051,33052],{},"None of these rows is a loser. They are shaped for different jobs.",[232,33054,33056],{"id":33055},"the-dedicated-verifiers-are-better-at-bulk-than-we-are","The dedicated verifiers are better at bulk than we are",[11,33058,33059,33061],{},[38,33060,32938],{}," is the full-suite option: validation plus domain checks, activity data, a scoring model, and a dashboard where a marketer drags in a CSV and downloads a clean file. Billing is a monthly subscription with a bundled allotment, or pay-as-you-go packs with a minimum purchase that get cheaper as they grow. Purchased pack credits are generous about not expiring; a subscription allotment you do not burn does not fully carry, so over-sizing the plan quietly wastes money.",[11,33063,33064,33066],{},[38,33065,32958],{}," is the lean pay-as-you-go option, no commitment, volume tiers that drop the unit price. The tradeoff runs the other way: credits carry an expiry clock, so stocking up far ahead of a campaign puts a timer on your balance.",[11,33068,33069,33071],{},[38,33070,32977],{}," leans into deliverability and sender reputation, returning a sendability signal rather than only a valid flag. If your pain is inbox placement more than list size, look here.",[11,33073,33074,102,33077,33080],{},[38,33075,33076],{},"Bouncer",[38,33078,33079],{},"Emailable"," are solid API-plus-batch verifiers, with Bouncer leaning into EU data-protection positioning. If GDPR paperwork matters to your buyer, that is a real reason to shortlist it.",[11,33082,33083],{},"The honest shared trait: your money becomes a single-purpose balance that only ever buys email checks. Fine when email cleaning is the whole job, friction when it is one step inside something larger.",[232,33085,33087],{"id":33086},"the-diy-route-costs-more-than-it-looks","The DIY route costs more than it looks",[11,33089,33090],{},"You can skip vendors: parse for RFC 5322 syntax, look up MX records, optionally open an SMTP conversation to probe the mailbox. The libraries are free and the logic is not exotic.",[11,33092,33093],{},"Teams abandon it for upkeep, not difficulty. Live SMTP probing from your own IPs teaches mailbox providers to distrust that IP, quietly poisoning the sender reputation you were protecting. Catch-all domains accept everything, so a naive probe returns false confidence. Disposable-domain lists and role patterns rot. You end up maintaining a small verification product as a side quest.",[232,33095,33097],{"id":33096},"what-one-metered-call-returns","What one metered call returns",[11,33099,33100,33105],{},[18,33101,33103],{"href":17223,"rel":33102},[124,125],[47,33104,17696],{}," is the per-address check. We ran it against a deliberately mistyped address on 2026-08-12:",[131,33107,33109],{"className":133,"code":33108,"language":135,"meta":136,"style":136},"monid inspect -p api.strale.io -e \u002Fx402\u002Femail-validate\nmonid run -p api.strale.io -e \u002Fx402\u002Femail-validate \\\n  --query '{\"email\":\"jane@gmial.com\"}'\n",[47,33110,33111,33126,33143],{"__ignoreMap":136},[140,33112,33113,33115,33117,33119,33121,33123],{"class":142,"line":143},[140,33114,147],{"class":146},[140,33116,151],{"class":150},[140,33118,154],{"class":150},[140,33120,3762],{"class":150},[140,33122,160],{"class":150},[140,33124,33125],{"class":150}," \u002Fx402\u002Femail-validate\n",[140,33127,33128,33130,33132,33134,33136,33138,33141],{"class":142,"line":166},[140,33129,147],{"class":146},[140,33131,171],{"class":150},[140,33133,154],{"class":150},[140,33135,3762],{"class":150},[140,33137,160],{"class":150},[140,33139,33140],{"class":150}," \u002Fx402\u002Femail-validate",[140,33142,184],{"class":183},[140,33144,33145,33147,33149,33152],{"class":142,"line":187},[140,33146,2037],{"class":150},[140,33148,194],{"class":193},[140,33150,33151],{"class":150},"{\"email\":\"jane@gmial.com\"}",[140,33153,200],{"class":193},[11,33155,33156],{},"It came back in 20 milliseconds with the verdict and the reason:",[131,33158,33160],{"className":28967,"code":33159,"language":28969,"meta":136,"style":136},"{\n  \"valid\": false,\n  \"format_valid\": true,\n  \"domain\": \"gmial.com\",\n  \"has_mx_records\": false,\n  \"is_disposable\": true,\n  \"is_role_address\": false,\n  \"did_you_mean\": \"jane@gmail.com\"\n}\n",[47,33161,33162,33167,33182,33196,33215,33228,33241,33254,33272],{"__ignoreMap":136},[140,33163,33164],{"class":142,"line":143},[140,33165,33166],{"class":193},"{\n",[140,33168,33169,33172,33175,33177,33179],{"class":142,"line":166},[140,33170,33171],{"class":193},"  \"",[140,33173,33174],{"class":11481},"valid",[140,33176,21387],{"class":193},[140,33178,21534],{"class":193},[140,33180,33181],{"class":193}," false,\n",[140,33183,33184,33186,33189,33191,33193],{"class":142,"line":187},[140,33185,33171],{"class":193},[140,33187,33188],{"class":11481},"format_valid",[140,33190,21387],{"class":193},[140,33192,21534],{"class":193},[140,33194,33195],{"class":193}," true,\n",[140,33197,33198,33200,33202,33204,33206,33208,33211,33213],{"class":142,"line":1279},[140,33199,33171],{"class":193},[140,33201,30264],{"class":11481},[140,33203,21387],{"class":193},[140,33205,21534],{"class":193},[140,33207,2673],{"class":193},[140,33209,33210],{"class":150},"gmial.com",[140,33212,21387],{"class":193},[140,33214,28989],{"class":193},[140,33216,33217,33219,33222,33224,33226],{"class":142,"line":1284},[140,33218,33171],{"class":193},[140,33220,33221],{"class":11481},"has_mx_records",[140,33223,21387],{"class":193},[140,33225,21534],{"class":193},[140,33227,33181],{"class":193},[140,33229,33230,33232,33235,33237,33239],{"class":142,"line":1290},[140,33231,33171],{"class":193},[140,33233,33234],{"class":11481},"is_disposable",[140,33236,21387],{"class":193},[140,33238,21534],{"class":193},[140,33240,33195],{"class":193},[140,33242,33243,33245,33248,33250,33252],{"class":142,"line":1296},[140,33244,33171],{"class":193},[140,33246,33247],{"class":11481},"is_role_address",[140,33249,21387],{"class":193},[140,33251,21534],{"class":193},[140,33253,33181],{"class":193},[140,33255,33256,33258,33261,33263,33265,33267,33270],{"class":142,"line":1302},[140,33257,33171],{"class":193},[140,33259,33260],{"class":11481},"did_you_mean",[140,33262,21387],{"class":193},[140,33264,21534],{"class":193},[140,33266,2673],{"class":193},[140,33268,33269],{"class":150},"jane@gmail.com",[140,33271,2679],{"class":193},[140,33273,33274],{"class":142,"line":1308},[140,33275,33276],{"class":193},"}\n",[11,33278,33279,18689,33282,33285,33286,33288],{},[47,33280,33281],{},"format_valid: true",[47,33283,33284],{},"valid: false"," is the useful shape: the address is well-formed and still undeliverable, which is exactly the case a regex would wave through. ",[47,33287,33260],{}," is the field that saves real leads, because a typo caught at capture is a prospect you keep rather than a bounce you record.",[11,33290,33291,33292,260],{},"The charge matched the listed price to the fourth decimal. Worth saying plainly, because ",[18,33293,33294],{"href":5548},"two other endpoints we measured the same day did not",[316,33296],{"category":12584},[11,33298,33299,33300,33303,33304,33307],{},"That is the same call behind the capture-time pattern in ",[18,33301,33302],{"href":17370},"verify an email before it hits your list",". When the question is about the domain rather than one mailbox, ",[47,33305,33306],{},"\u002Fx402\u002Femail-deliverability-check"," inspects SPF, DKIM, DMARC, MX and blacklist posture.",[27,33309,27661],{"id":33310},"how-do-i-enrich-a-list-when-all-i-have-is-email-addresses",[11,33312,33313],{},"Different job, different endpoint, and worth separating because \"verify\" and \"enrich\" get conflated constantly.",[11,33315,33316],{},"Verification estimates how likely mail is to arrive. Enrichment answers who is behind the address: name, title, company, seniority, LinkedIn profile. A verifier will not tell you that no matter how good it is, and an enrichment call will happily return a rich profile for an address that bounces.",[11,33318,33319,33320,33325,33326,33331],{},"For email-to-person, ",[18,33321,33323],{"href":17223,"rel":33322},[124,125],[47,33324,17227],{}," takes an email among its identifiers and returns the person record. ",[18,33327,33329],{"href":17223,"rel":33328},[124,125],[47,33330,27398],{}," does the comparable job. Both are billed per call and cost meaningfully more than a verification check, which is the correct signal: you are buying a matched record from a maintained dataset, not a DNS lookup.",[11,33333,33334],{},"The sensible order is verify first, enrich second. Verification is roughly an order of magnitude cheaper, so filtering the dead addresses before you pay for enrichment on them is the single easiest saving in this pipeline. Enriching a list you have not verified means paying premium rates to learn about people you cannot reach.",[421,33336],{"category":12584,"title":33337},"Browse the verification and enrichment endpoints, with live pricing",[27,33339,33341],{"id":33340},"which-one-should-you-actually-use","Which one should you actually use?",[11,33343,33344],{},[5252,33345],{"alt":33346,"src":33347},"Which verifier to use, by how addresses arrive: steady high volume favors a dedicated credit pack (ZeroBounce, NeverBounce, Kickbox), spiky, agent-driven, or low volume favors pay-per-call Strale on Monid, needing SPF, DKIM, and DMARC adds the deliverability-check endpoint, and zero vendors means DIY SMTP and MX you maintain","\u002Fimg\u002Fblog\u002Fbest-email-verification-api-2026-fig-which-verifier.png",[11,33349,33350],{},"Decide on how the addresses arrive, because that is what the billing shape has to match.",[11,33352,33353,33356],{},[38,33354,33355],{},"They arrive in a list."," A quarterly scrub of a purchased or aging database is precisely what the dedicated verifiers were built for. Buy credits, get a lower unit price than any metered endpoint, use the dashboard, done. If this is your shape, stop reading and pick from the four above.",[11,33358,33359,33362],{},[38,33360,33361],{},"They arrive one at a time."," A signup form, a form-fill, an agent that just found a prospect. Here a credit pack is the wrong instrument: you pre-buy a single-purpose balance and hold it against demand you cannot forecast. A per-call endpoint costs nothing in a quiet week.",[11,33364,33365,33368],{},[38,33366,33367],{},"They arrive inside something bigger."," If verification is step three of a pipeline that also pulls company data and enriches a profile, running it on the same balance as those calls removes a vendor account rather than adding one. That is the case where a marketplace wins on operations rather than on price per check.",[11,33370,33371,33374],{},[38,33372,33373],{},"You are an agent."," An agent that can discover an endpoint, read its schema and see the price before spending can add verification to a workflow it was not built for. A credit pack cannot be discovered.",[27,33376,657],{"id":656},[11,33378,33379,33382],{},[38,33380,33381],{},"You clean big lists on a schedule."," Per-unit, a dedicated verifier's volume tier beats a metered call, and it is not close at millions of addresses. Buy the credits.",[11,33384,33385,33388],{},[38,33386,33387],{},"You want a dashboard for a non-engineer."," Every dedicated verifier ships one. We ship an API and a CLI. If the person doing this work drags a CSV, give them the CSV tool.",[11,33390,33391,33394],{},[38,33392,33393],{},"You need contractual accuracy guarantees."," The verifiers publish accuracy rates and will sign paper. A marketplace optimises for breadth and switching cost.",[11,33396,33397,33399],{},[38,33398,31152],{}," the Strale endpoints do not carry the verified badge that the first-party providers in the catalogue do, and the checks are algorithmic and DNS-based rather than an SMTP conversation. That is the right tradeoff for capture-time gating, where speed and not poisoning your IP matter most, and it is a weaker instrument than a full verifier's probe on a list you are about to mail in bulk. Run both against fifty known addresses before you trust either with a send.",[27,33401,696],{"id":695},[11,33403,33404],{},"There is no best email verification API, only a right one for how addresses reach you. Lists want credit packs. Trickles want metered calls. The mistake that costs money is buying the shape that matches your ambitions rather than your traffic.",[11,33406,33407],{},"Two things matter more than the pick. Verification catches bounces but not spam traps, so it is one part of list hygiene rather than a substitute for it. And verification is not enrichment: check deliverability first at a tenth the price, then pay to learn who is behind the addresses that survived.",[11,33409,713,33410,27639,33413,33415,33416,260],{},[47,33411,33412],{},"monid discover -q \"email\"",[47,33414,607],{}," prints each schema and price without spending anything. One real call on an address you already know the answer for tells you more than any comparison table, including this one. Begin at ",[18,33417,725],{"href":723,"rel":33418},[124,125],[27,33420,729],{"id":728},[731,33422,33424],{"q":33423},"Does email verification stop spam traps?",[11,33425,33426],{},"Partly. Pristine traps were never real mailboxes and recycled traps are real ones that still accept mail, so a deliverability check calls both valid. The role-address flag is the closest thing to a trap signal a verifier gives you. Real protection is hygiene: never mail purchased lists, and drop long-unengaged addresses instead of re-mailing them.",[731,33428,33430],{"q":33429},"Can I just write the SMTP check myself?",[11,33431,33432],{},"You can, and the code is the easy part. What you are taking on is the reputation cost of probing from your own IPs, catch-all domains that accept everything and return false confidence, and disposable-domain lists that rot. Do it when you have an engineer who wants zero external dependencies and will own that forever.",[731,33434,33436],{"q":33435},"What is the difference between verification and enrichment?",[11,33437,33438],{},"Verification estimates how likely mail is to arrive; it does not guarantee it. Enrichment asks who the person is. They are separate endpoints at roughly an order of magnitude different price, and running them in that order is the cheapest way to work.",[731,33440,33442],{"q":33441},"How fast is a per-address check?",[11,33443,33444],{},"The one call we measured returned in 20 milliseconds. That is a single observation, not a percentile, and it is not enough to design a signup flow around: you would want a p95 and p99 from your own traffic before deciding. If you do put a check inline at capture, give it a short timeout, around 300ms, and a defined fallback: accept the address unverified and queue it for a background check rather than blocking the signup. A gate that can fail a registration when a vendor is slow is worse than no gate.",[11,33446,33447],{},[758,33448,760],{},[762,33450,33451],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":136,"searchDepth":166,"depth":166,"links":33453},[33454,33455,33460,33461,33462,33463,33464],{"id":32867,"depth":166,"text":32868},{"id":32906,"depth":166,"text":32907,"children":33456},[33457,33458,33459],{"id":33055,"depth":187,"text":33056},{"id":33086,"depth":187,"text":33087},{"id":33096,"depth":187,"text":33097},{"id":33310,"depth":166,"text":27661},{"id":33340,"depth":166,"text":33341},{"id":656,"depth":166,"text":657},{"id":695,"depth":166,"text":696},{"id":728,"depth":166,"text":729},"\u002Fimg\u002Fblog\u002Fbest-email-verification-api-2026.png","ZeroBounce, NeverBounce, Kickbox, Bouncer, a DIY SMTP check and Strale compared: credit packs versus one metered per-call endpoint.","\u002Fimg\u002Fblog\u002Fbest-email-verification-api-2026-card.png",{},"\u002Fblog\u002Fguides\u002Fbest-email-verification-api-2026",{"title":32856,"description":33466},"blog\u002Fguides\u002Fbest-email-verification-api-2026",[33473,9734,1638,33474],"email verification api","email","yzmybc2v-_PjirEP8VmxmQE7KAKVpE9Tciz3OKXQDpw",{"id":33477,"title":33478,"author":787,"body":33479,"category":1674,"cover":33523,"description":136,"draft":785,"extension":786,"image":787,"launchCta":33524,"listingCover":787,"meta":33527,"navigation":790,"ogImage":787,"path":33528,"publishedAt":33529,"readTime":787,"seo":33530,"stem":33531,"tags":33532,"toolCategory":787,"updatedAt":787,"__hash__":33535},"blog\u002Fblog\u002Fakta-pro-is-now-available-on-monid.md","Akta Pro Is Now Available On Monid",{"type":8,"value":33480,"toc":33519},[33481,33485,33493,33496,33500,33506,33513,33516],[27,33482,33484],{"id":33483},"what-is-aktapro","What is akta.pro",[11,33486,33487,33492],{},[18,33488,33491],{"href":33489,"rel":33490},"https:\u002F\u002Fwww.akta.pro\u002F",[124,125],"akta.pro"," is a private company data and signals API for\nAI agents. Company Database covers 20M+ companies with 75+ structured fields\neach. News Signals delivers deduplicated, entity-resolved company news,\nindustry news, and signals on open-ended topics, all scored for impact and\nsentiment.",[11,33494,33495],{},"Private-company research is usually scattered across databases, news feeds,\nreview sites, and web search. akta.pro turns that into structured API calls, so\nan agent gets the right company context and keeps moving.",[27,33497,33499],{"id":33498},"what-is-monid","What is Monid",[11,33501,33502,33505],{},[18,33503,864],{"href":723,"rel":33504},[124,125]," is the tool layer for agents. It lets agents connect\nto all the tools and APIs they need, without managing signups, API keys, or\nsubscriptions.",[11,33507,33508,33509,260],{},"Today, Monid provides tools for social media scraping, web search, image and\nmusic generation, people data search, weather APIs, ",[18,33510,33512],{"href":5582,"rel":33511},[124,125],"and more",[33514,33515],"hr",{},[11,33517,33518],{},"On Monid, akta.pro becomes available as part of that same layer. Your agent can\nrequest private-company context, call akta.pro through Monid, receive structured\nmarket data, and continue the task. Private markets research should feel like\nany other tool call: describe the company or sector, get the signal, keep\nbuilding.",{"title":136,"searchDepth":166,"depth":166,"links":33520},[33521,33522],{"id":33483,"depth":166,"text":33484},{"id":33498,"depth":166,"text":33499},"\u002Fimg\u002Fblog\u002Fakta-pro-is-now-available-on-monid-v2.png",{"label":33525,"command":33526},"Give your agent this line to get started.","set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use akta.pro to research recent news, company enrichment, and alternative signals for Databricks",{"Introducing private markets data for agents":787},"\u002Fblog\u002Fakta-pro-is-now-available-on-monid","2026-07-07",{"description":136},"blog\u002Fakta-pro-is-now-available-on-monid",[1638,33533,33534,9734],"partner-tools","private-markets","PnTj95h3JP-jvhNCHtHkAUo-ihfg9IdhcguBJisMdqw",{"id":33537,"title":33538,"author":787,"body":33539,"category":1674,"cover":33593,"description":33594,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":787,"meta":33595,"navigation":790,"ogImage":787,"path":33596,"publishedAt":33597,"readTime":787,"seo":33598,"stem":33599,"tags":33600,"toolCategory":787,"updatedAt":787,"__hash__":33603},"blog\u002Fblog\u002Fyour-claude-code-can-now-make-phone-calls.md","Your Claude Code can now make phone calls",{"type":8,"value":33540,"toc":33589},[33541,33544,33553,33557,33565,33568,33570,33575,33581,33583,33586],[11,33542,33543],{"style":810},"Copy this line to your agent to make your first phone call.",[131,33545,33547],{"className":814,"code":33546,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and use Saperly to call my phone number to confirm the connection works\n",[47,33548,33549],{"__ignoreMap":136},[140,33550,33551],{"class":142,"line":143},[140,33552,33546],{},[27,33554,33556],{"id":33555},"what-is-saperly","What is Saperly",[11,33558,33559,33564],{},[18,33560,33563],{"href":33561,"rel":33562},"https:\u002F\u002Fsaperly.com\u002F",[124,125],"Saperly"," is phone infrastructure for AI agents. It gives\nan agent a real phone number with voice, SMS, routing, spend controls, and\ncompliance built in, without making the builder manage carrier accounts or\ntelephony paperwork.",[11,33566,33567],{},"Your agent can confirm an appointment, follow up on a lead, check availability,\nor route a conversation without leaving the workflow it is already running.",[27,33569,33499],{"id":33498},[11,33571,33572,33505],{},[18,33573,864],{"href":723,"rel":33574},[124,125],[11,33576,33577,33578,260],{},"Today, Monid provides tools for social media scraping, web search, image \u002F\nmusic \u002F 3d model generation, people data search, weather APIs, ",[18,33579,33512],{"href":5582,"rel":33580},[124,125],[33514,33582],{},[11,33584,33585],{},"On Monid, Saperly becomes available as part of that same layer. Your agent can\nrequest a phone call, use Saperly through Monid, receive the result, and keep\ngoing. Calling should feel like any other tool call: describe the outcome, let\nthe agent handle the phone work, and continue the task.",[762,33587,33588],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":136,"searchDepth":166,"depth":166,"links":33590},[33591,33592],{"id":33555,"depth":166,"text":33556},{"id":33498,"depth":166,"text":33499},"\u002Fimg\u002Fblog\u002Fyour-claude-code-can-now-make-phone-calls.png","Saperly is now available on Monid. Your agent can now make phone calls for you.",{},"\u002Fblog\u002Fyour-claude-code-can-now-make-phone-calls","2026-07-05",{"title":33538,"description":33594},"blog\u002Fyour-claude-code-can-now-make-phone-calls",[1638,33533,33601,33602],"voice","phone","csYPncZSMNkfzJEk1j2VKkzaAYzm9-PS7yNoJEj48Fw",{"id":33605,"title":33606,"author":787,"body":33607,"category":1674,"cover":33659,"description":33660,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":787,"meta":33661,"navigation":790,"ogImage":787,"path":33662,"publishedAt":33663,"readTime":787,"seo":33664,"stem":33665,"tags":33666,"toolCategory":787,"updatedAt":787,"__hash__":33669},"blog\u002Fblog\u002Fintroducing-suzanne-chatgpt-for-3d-models.md","Introducing\nClaude for 3D models",{"type":8,"value":33608,"toc":33655},[33609,33612,33621,33625,33633,33636,33638,33643,33648,33650,33653],[11,33610,33611],{"style":810},"Copy this line to your agent to generate your 3D model.",[131,33613,33615],{"className":814,"code":33614,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and create a 3D model for a rabbit\n",[47,33616,33617],{"__ignoreMap":136},[140,33618,33619],{"class":142,"line":143},[140,33620,33614],{},[27,33622,33624],{"id":33623},"what-is-suzanne","What is Suzanne",[11,33626,33627,33632],{},[18,33628,33631],{"href":33629,"rel":33630},"https:\u002F\u002Fwww.suzanne3d.com",[124,125],"Suzanne"," is an AI-native 3D modeling tool that turns a prompt into a\nusable 3D asset. Instead of opening a modeling tool, blocking out forms,\nadding details, and exporting by hand, you describe what you want and let\nSuzanne generate the model for you.",[11,33634,33635],{},"That changes who can create 3D objects. Product teams can prototype visual\nideas faster. Game builders can rough out props and characters without\nwaiting on a full art pass. Agents can generate assets as part of a larger\nworkflow, then hand those files to downstream tools for rendering, testing,\nor iteration.",[27,33637,33499],{"id":33498},[11,33639,33640,33505],{},[18,33641,864],{"href":723,"rel":33642},[124,125],[11,33644,33508,33645,260],{},[18,33646,33512],{"href":5582,"rel":33647},[124,125],[33514,33649],{},[11,33651,33652],{},"On Monid, Suzanne becomes available as part of that same layer. Your agent can\nask for the 3D asset it needs, call Suzanne through Monid, and continue the task.\n3D creation should feel as direct as text generation: describe the thing, get\nthe artifact, keep building.",[762,33654,33588],{},{"title":136,"searchDepth":166,"depth":166,"links":33656},[33657,33658],{"id":33623,"depth":166,"text":33624},{"id":33498,"depth":166,"text":33499},"\u002Fimg\u002Fblog\u002Fintroducing-suzanne-chatgpt-for-3d-models.png","Suzanne is now available on Monid. Turn any idea into a production-ready 3D model in one prompt.",{},"\u002Fblog\u002Fintroducing-suzanne-chatgpt-for-3d-models","2026-06-25",{"title":33606,"description":33660},"blog\u002Fintroducing-suzanne-chatgpt-for-3d-models",[33667,1638,33668],"3d","creative-tools","kYcmMQIaqjfL65PuYMzsNQuGQHAjX98Lf0JmtJ5Evdk",{"id":33671,"title":33672,"author":787,"body":33673,"category":1674,"cover":33732,"description":33733,"draft":785,"extension":786,"image":787,"launchCta":787,"listingCover":787,"meta":33734,"navigation":790,"ogImage":787,"path":33735,"publishedAt":33736,"readTime":787,"seo":33737,"stem":33738,"tags":33739,"toolCategory":787,"updatedAt":787,"__hash__":33742},"blog\u002Fblog\u002Fminimax-is-now-available-on-monid.md","MiniMax is now available on Monid",{"type":8,"value":33674,"toc":33727},[33675,33678,33687,33691,33699,33703,33706,33708,33714,33720,33722,33725],[11,33676,33677],{"style":810},"Copy this line to your agent to create music.",[131,33679,33681],{"className":814,"code":33680,"language":816,"meta":136,"style":136},"set up https:\u002F\u002Fmonid.ai\u002FSKILL.md and create a song with MiniMax Music 2.6\n",[47,33682,33683],{"__ignoreMap":136},[140,33684,33685],{"class":142,"line":143},[140,33686,33680],{},[27,33688,33690],{"id":33689},"minimax-music-26","MiniMax Music 2.6",[11,33692,33693,33698],{},[18,33694,33697],{"href":33695,"rel":33696},"https:\u002F\u002Fwww.minimax.io",[124,125],"MiniMax"," Music 2.6 turns a prompt into music your agent can use right away. Describe the style, mood, lyrics, or use case, and generate a track inside the same workflow.",[27,33700,33702],{"id":33701},"minimax-text-to-image-image-01","MiniMax Text-to-Image image-01",[11,33704,33705],{},"MiniMax image-01 turns text prompts into images. Ask for a concept, scene, product visual, or creative asset, and let your agent generate it through Monid.",[27,33707,33499],{"id":33498},[11,33709,33710,33713],{},[18,33711,864],{"href":723,"rel":33712},[124,125]," is the tool layer for agents. It lets agents connect to all the tools and APIs they need, without managing signups, API keys, or subscriptions.",[11,33715,33716,33717,260],{},"Today, Monid provides tools for social media scraping, web search, image and music generation, people data search, weather APIs, ",[18,33718,33512],{"href":5582,"rel":33719},[124,125],[33514,33721],{},[11,33723,33724],{},"On Monid, MiniMax becomes part of the same tool layer your agent already uses. Describe what you need, generate the image or music, and keep building.",[762,33726,33588],{},{"title":136,"searchDepth":166,"depth":166,"links":33728},[33729,33730,33731],{"id":33689,"depth":166,"text":33690},{"id":33701,"depth":166,"text":33702},{"id":33498,"depth":166,"text":33499},"\u002Fimg\u002Fblog\u002Fminimax-is-now-available-on-monid.png","Create images and music with MiniMax models through Monid.",{},"\u002Fblog\u002Fminimax-is-now-available-on-monid","2026-06-24",{"title":33672,"description":33733},"blog\u002Fminimax-is-now-available-on-monid",[1638,33668,33740,33741],"image-generation","music-generation","5UuKGAmhBzgZhlBHiMaknxJibanxzR9XtPGcrGA7oQI",1787369518745]