Site Crawler for Links and Tables avatar

Site Crawler for Links and Tables

Pricing

from $5.10 / 1,000 page rows

Go to Apify Store
Site Crawler for Links and Tables

Site Crawler for Links and Tables

Crawl a website from a start address and get every page's links, download links, HTML tables, and lists as structured rows. No code, no AI, no browser, no login. Deterministic output, robots.txt obeyed by default.

Pricing

from $5.10 / 1,000 page rows

Rating

0.0

(0)

Developer

Mamba Labs

Mamba Labs

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Security

Limited permissions

Share

Give a start address and get every page of the site back as a structured row: internal and external links, file download links, every HTML table as rows, and every list. No code to write, no AI, no browser, no login. The same page gives the same output on every run. You pay per page read, and Mamba Labs pays the platform costs.

Features

  • Whole site crawl. Follows links breadth first and also reads /sitemap.xml, which finds pages no link reaches. Stops at Maximum pages and Maximum depth.
  • Download links, external ones included. Every link to a file type you list, as a field on the page row and, with download_links in extract, as one row per file (a small per row price), once per start address, with the first page it was found on and its link text. Files are listed, never downloaded.
  • Tables as rows. Each HTML table comes back with its column names and rows as objects. Merged cells are filled in. The header rule is fixed: the rows in thead; otherwise the leading rows of all th cells; otherwise columns named column_1, column_2. Several header rows join per column. Tables with under 2 rows or 2 columns are treated as layout and left out.
  • Lists as arrays. Each list with 2 or more items, outside nav, header, and footer.
  • robots.txt obeyed by default. Disallowed pages are skipped and counted, and a crawl delay is honored up to 5 seconds.
  • One free summary row per start address. Pages read, failed, refused, skipped, and left in the queue, so you can see what the crawl did not reach.
  • Restart aware. If Apify moves the run to another host, the crawl resumes from its saved state instead of starting over. A restart with no warning can repeat up to the last 10 pages read.
  • Cost guards. Maximum pages and a maximum charge per run.

How the data is read

Plain HTTP requests through the Apify proxy pool, parsed from the HTML the server returns. No login, no key, no AI, and no other developer's actor. With proxy_mode auto or residential, refused pages can use residential addresses at a higher page price.

Input

FieldTypeDefaultWhat it does
start_urlsarrayWeb addresses to start from, up to 100. A bare domain such as example.com is read as https.
max_pagesstring100Pages to read across the whole run, up to 10,000. Default 100.
max_depthstring10How many links to follow from a start address. 0 reads only the start address. Default 10.
same_domain_onlystringyesyes (default): follow links only on the start address's host and its subdomains. no: also follow links to other sites, up to Maximum pages. Links to other sites are listed either way.
extractarrayAny of links, tables, lists, download_links. Default links, tables, lists. download_links adds one separate row per file link, charged as download-link-row; the download_links field on page rows is always filled at no extra charge.
download_extensionsarrayFile extensions that count as download links. Default pdf, zip, xlsx, xls, docx, doc, pptx, csv, mp3, mp4, exe, dmg, msi, pkg, gz, tar, tgz, 7z, rar, iso, apk. Files are listed, never downloaded.
use_sitemapstringyesyes (default): also queue the addresses in /sitemap.xml, which finds pages no link reaches. no: follow links only.
obey_robotsstringyesyes (default): skip pages robots.txt disallows and honor its crawl delay up to 5 seconds. no: read them, only if you have the right to.
max_charge_usdstringOptional. The run stops before a charge that would pass this amount. Summary rows are always returned.
proxy_modestringpoolpool (default): the Apify proxy pool only, charged as page-row; a page that refuses it gets a free blocked row. auto: a refused page is retried on residential addresses, and a page read that way is charged as residential-page-row. residential: every page uses residential addresses and is charged as residential-page-row.

Output

FieldTypeWhat it holds
row_typestringOne of: page, download_link, crawl_summary, run_summary. run_summary is the one free row written when the input is refused.
start_urlstringThe start address this row came from.
urlstringThe page address that was requested.
final_urlstringThe address after redirects.
http_statusintegerThe status the page answered with.
depthintegerLinks followed from the start address. Pages found in the sitemap read 1.
found_fromstringThe page that linked here, or sitemap.
titlestringThe page title.
internal_linksarrayLinks to the same site, with duplicates removed, up to 5,000.
external_linksarrayLinks to other sites, with duplicates removed, up to 5,000.
download_linksarrayLinks whose file extension is in download_extensions, internal and external.
tablesarrayEach HTML table: caption, header_detected, columns, row_count, and rows as objects keyed by column name, up to 2,000 rows a table.
listsarrayEach list outside nav, header, and footer with 2 or more items, as an array of strings.
likely_needs_javascriptbooleanTrue when the page has under 200 characters of text and has scripts. This actor does not run a browser.
link_urlstringdownload_link rows: the file address.
link_textstringdownload_link rows: the text of the link.
file_extensionstringdownload_link rows: the file extension.
link_scopestringdownload_link rows: internal or external to the site.
pages_requestedintegercrawl_summary: pages requested for this start address.
pages_chargedintegercrawl_summary: page rows charged.
pages_failedintegercrawl_summary: free rows for an HTTP error or a response that is not HTML.
pages_blockedintegercrawl_summary: free rows for pages the site refused.
pages_skipped_robotsintegercrawl_summary: pages not requested because robots.txt disallows them.
pages_from_sitemapintegercrawl_summary: addresses added from the sitemap.
pages_left_in_queueintegercrawl_summary: pages found but not read when the run stopped.
download_links_foundintegercrawl_summary: download_link rows written.
row_statusstringok, or why this row carries no data: no_results, no_change, partial, blocked, or error.
error_reasonstringWhy the row is not ok. A refused input reads input_invalid: followed by what to fix.
billable_events_jsonstringWhat this row was billed as, for example {"page-row":1}. {} means free.
scraped_atstringWhen the row was written, UTC.

Pricing

Pay per event. You pay for pages read, separate download link rows if you ask for them, and the run start. Pages that failed or refused, summary rows, pages skipped by robots.txt, and a refused input are free.

EventFree planBronzeSilverGold
page-row, one page read on the proxy pool$0.006$0.0057$0.0054$0.0051
residential-page-row, one page read on residential addresses, only with proxy_mode auto or residential$0.02$0.019$0.018$0.017
download-link-row, one separate file link row, only when extract includes download_links$0.0001$0.000095$0.00009$0.000085
apify-actor-start, once per run (one per GB of memory; the default 256 MB is one)$0.0055$0.0055$0.0055$0.0055

Per 1,000 rows of page-row: $6.00 on the free plan, $5.10 on Gold.

Free plan cap: 1.50 USD of evaluation a month, about 250 rows. Any paid Apify plan removes the cap, and it resets on the 1st. The run stops before a charge that passes your maximum charge per run in Apify or your max_charge_usd input.

Mamba Labs pays the platform costs of your run, Apify proxy traffic included.

Usage examples

All external download links on a site.

{
"start_urls": ["https://www.python.org/downloads/"],
"extract": ["download_links"],
"max_pages": "200"
}

Open the Downloads view of the dataset, and filter link_scope to external if you want only files on other hosts.

Tables and lists from a few pages.

{
"start_urls": ["https://webscraper.io/test-sites/tables"],
"extract": ["tables", "lists"],
"max_depth": "1",
"max_pages": "10"
}

Read the rows with GET https://api.apify.com/v2/datasets/{datasetId}/items.

Clay. Number and on or off inputs are text fields, which is what Clay sends. A list input takes a JSON list, so put the column inside a one item list.

MCP. The Mamba Labs MCP server @mambalabsdev/mcp-site-crawler-links-tables exposes this actor to Claude and other MCP clients.

Error handling

CaseWhat you get
Missing or unreadable inputOne free row, row_type run_summary, error_reason starting input_invalid: with what to fix. The run ends successfully and charges nothing but the run start
An HTTP error or a response that is not HTMLA free page row with row_status error or no_results
A page refuses the requestRetried on a new address, then a free page row with row_status blocked. After 10 refused pages in a row the crawl of that site stops
robots.txt disallows the start addressA free summary row with row_status blocked that says so
The run is close to its timeoutThe actor stops starting new work 90 seconds before the timeout and delivers what it has

Limitations

  • No browser. A page built by JavaScript in the visitor's browser comes back with little or nothing, marked likely_needs_javascript true. Use a browser based crawler for those sites.
  • Sites behind an anti bot wall (for example a Cloudflare challenge) can refuse the proxy pool. They return free blocked rows; proxy_mode auto may get through at the residential price, and may not.
  • Forms, logins, and pages reached only through a site's search box are not crawled.
  • Limits per page row: 5,000 links in each link field, 50 tables, 2,000 rows a table (row_count gives the real count), and 100 lists of 500 items. A row near the Apify 9 MB limit drops lists first, then tables, then links, and says so in error_reason.
  • A run queues up to 5 times Maximum pages plus 1,000 addresses, at most 50,000.
  • Subdomains of the start host count as the same site.
  • A link is called a download by its file extension. A file served from an address with no extension is not listed as a download.

Mamba Labs actor suite

ActorActor ID
Account Hiring WatchgRAZA5WBi1r6L0gy7
Agent Accessibility AuditoranxbRv0lKrpQ1pnua
Agent to Brokerage ResolverePRRGLxOGyaVHO4dI
AI Answer Visibility TrackerRJZvzKniYK4nswcMg
AI Tooling DetectorEwkHhmqiuJgRoVEbE
API Deprecation and Breaking Change MonitorpHsbS3xXUK8Jqutz5
App Store and Google Play Review MonitorMaCMEhGrbchxQZ92G
B2B Reddit Conversation MonitorSoDryzzsjmY3SsiyG
Bluesky Brand Presence MappereLpxzP4IuXznlFVND
Brand Sponsor FinderPPgK6xrgOmvL7Nrys
Bulk WHOIS and RDAP Domain Age LookupMTrkG5FLU6SjqLdJY
Career Change Signal EnginevX2Yga1a6wGaXaP14
Company Careers Page Jobs, 17 ATS BoardsizP0rfIgf5YaRZfIh
Company Change Event FeedoX44rS0fkEJ3rXLWe
Company Discovery List Builderjch0HdaZnpbMqlcGS
Company Firmographic EnricherYlUtLWjfPpqykmB8g
Company Funding RecordOFS4Mt1gyYNtGfUbE
Company Headcount EstimatoraHC4GROnNt6kfZe5r
Company Identity Resolverlr8fTRAmZCBZmuwwh
Company Role Email, Phone and Address Finder4mMncKaJykiq94grz
Company Social Presence Mapper4k6CCemkgBDz18m2h
Competitor Price, Stock, and Changelog MonitoryxdgCbUQ4PYQWwRNU
Contact Classifier0lGSeYJmniXhGANnO
Contractor License Search, CA, TX, WA, OR, LAWBYK3CPI2kdeq4bP1
CRM Contact Job Change CheckerL8UbEmMJC1XYPSZOb
Domain Deliverability Checker0tVgxI7A6o9jMlxmc
Domain to LinkedIn URL Resolver3HtnSaqPHOg1Qg5gx
Ecommerce Platform Profiler5G2NeYjBbQTjaTn9L
Ecommerce Store DiscoveryPeHu4sLyFvQHXUUrX
Email List Verifier, Bring Your Own KeyCzVJ4NlaCKk80xpgE
Event Presence IndexWLhMy8fMDgsxdYxv5
Expert Witness Finder, US and AustraliaLIpwlgfE3LaQBaXd4
Funding and Press Signal ScannerFS13X6dhQVgX3XOM6
GDPR Cookie Banner and Consent CheckerTrKyOS0KBoGC35nbr
GitHub Organization Signal ScannerahF8RRpv5mzPao5CN
Google Ads Transparency Center Scraper by Domain1eOwxhBVxzvOXAm4s
GTM Hiring Signal ScraperD7O1SA2EqwHGsGr1P
GTM Signals AggregatorxKdRfnfFNkdMpFuNs
ICP Fit ScorerW161DT8W4kW55dMFh
Influencer Change Monitord2VVgahNL6UmcLkhg
Influencer Lead List BuilderKnmByszcv135yM30G
Influencer Profile ScraperEqEnklDVMIcB1V499
Influencer Search Across TikTok, Instagram and YouTubetpkedmloIIWtXx6sg
Influencer Talent Agency LookupzCuX4Mgyg6JvXgGzd
Instagram Facebook Brand Presence MapperHXh65I0JBjPsunbY8
Integration and Marketplace Presence MapperV0guNuvM85Q61f2gj
Job Board Keyword Signal Scanner4DvqpvhMR74NLcDDY
Job Posting MonitorQCfICD9kOPiOdj5iI
Journalist and Media List BuildermAfizsZC8qRoR0ecS
Launch Directory List BuildercRq3bmvEZxZtioQ7U
Lead File Import CheckerRwlGVXTf46LqZdUgt
Legal Entity ResolverKHFyPCDIx7CyqULYm
Link in Bio Scraper and Newsletter DetectorOorucdheTIgu7RFzK
LinkedIn Company Page MapperzOPm6A9JEhUGcIdFW
LinkedIn Jobs FeedSH6N0d8cz46BhCC8B
LinkedIn Post TrackeroiGLNPuaf5BRaz9K5
Local Business Lead BuilderqMN97aoHhsAS5bznV
Local Rank and Map Pack Trackergv0kyHGDIg8XscclB
Lookalike Companies from Seed Domainse2O426WBAbLLQL4Z2
Manufacturer and Supplier FinderQcsdmd0lUfPzVkonh
Meta Ad Library Ads by Company, Graph APIJ1GWlSXfSGU3u8Wng
Mobile Phone Waterfall6OOgPktf7RIa5XCOP
New Hire FindercKuc38p4nYHNF3IW8
Newly Registered Companies, UK, Norway, Finland, Franceg2WfZhWvCtc57g2Jo
News and Media Mention Monitorgol1PPUKrsIk4QLBd
Newsletter Sponsor TrackerqSwpqxD1TiPZpLQHv
Open Tender and RFP FinderkPTGz6t6TFoUUyfaO
Outbound Stack Detectorv43UJC8r7qW7cBSTG
Page Finder and ExtractorTpurgcOZbVnknlaiC
Partner and Member Directory ExtractorZX0XJPPUvnFJxeC1a
People Finder & Email VerifierLEgloG7tWgQl4o6TD
Person LinkedIn URL ResolverssuyPV8LnEsL8qbnb
Person Social Footprint MapperjfQXa2zW9FHCJot9K
Personal Email to Company ResolverAefT5Ye6YNPFQwJBf
Pinterest Brand Presence Mapperd1HvjZfKhgvWsoEwn
Podcast Guest and Host Findero2MGSvgbSLeeXOsIo
Product Hunt Daily Launches with Maker DomainsO4VX63drWK9Y9x641
Prospect Engineq9rT6v64nUJdPexOQ
Public Feature Board and Roadmap MonitorrcHF5gj5r2Vqnry35
Publishing Frequency TrackerTbLwaUUATdYb6wp4N
Recent Funding Rounds FeedKueVp9MOz7iOoAgDp
Reddit Brand Presence MapperpKQZmDaT70SEb54bZ
Reddit Search and Thread Scraper4Gsth5cP2Xt9V2xDN
Reporting Window FinderuINxR7a1IW8qUTRUX
Sequencer Event PollerS6s8Rjd61tGdrMRk4
Sequencer Lead Push0Jv27VeWM5tSZQs9x
Shopify App Store and Chrome Web Store ListingsgaY0BzkLyN77mD3wI
Substack Newsletter and Posts ScraperUEFsdwiPLmPNVy9xd
Team Page People Extractorj8a9zX0k4mNbvDbWK
Tech Stack Signal Detectorqyd7nNyqFPelQViBx
Threads Posts by Keyword, Exact Match2OT8K8RiEEWtaj2MW
TikTok Brand Presence Mapperfco8FvoJcSafbeyd1
Trustpilot Reputation Enricher3lIqfCt61j4hqE1xz
US and UK Contract Award Winners by CompanyzhEtllASykOcx9hJ8
VC and Accelerator Portfolio List BuilderchH8hrfuoqqolW06m
Website Accessibility Checker, WCAG 2.2 AAP3jBj3FRghKEhX52z
Website Phrase and Business Model ClassifierCBuZ9k7sRwBeiKiCS
Website Traffic Rank EstimatorGnOFUzlNVIoXgeJjH
Work Email WaterfallOT6xqTFThC0Rjf7Zj
Workplace Program DetectorLi6pPDhqbdzFz3h7G
X Brand Presence MapperoLOgadhHUkNAyDA3w
YouTube Channel from Company Domain6hSpD3kd2s2IQ4VSs

Built by Mamba Labs.