<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Nikolas</title>
    <description>The latest articles on DEV Community by Nikolas (@axiora).</description>
    <link>https://dev.to/axiora</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4158134%2F56d45e7d-9e4a-4b12-ab42-33b09b33b2a7.png</url>
      <title>DEV Community: Nikolas</title>
      <link>https://dev.to/axiora</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/axiora"/>
    <language>en</language>
    <item>
      <title>10 no-API-key Apify Actors for data pipelines (the full portfolio)</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:24:06 +0000</pubDate>
      <link>https://dev.to/axiora/10-no-api-key-apify-actors-for-data-pipelines-the-full-portfolio-5ebh</link>
      <guid>https://dev.to/axiora/10-no-api-key-apify-actors-for-data-pipelines-the-full-portfolio-5ebh</guid>
      <description>&lt;p&gt;All ten run on public sources with &lt;strong&gt;no API keys and no logins&lt;/strong&gt;, and all ten are pay-per-result, so a test costs cents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Jobs &amp;amp; recruiting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ATS Job Scraper&lt;/strong&gt; — Greenhouse, Ashby, Lever and SmartRecruiters in one schema, with salary provenance and change hashes.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/ats-job-scraper" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/ats-job-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  E-commerce
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Shopify Variant Scraper&lt;/strong&gt; — one row per variant: SKU, options, price, compare-at price, discount, stock.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/shopify-variant-scraper" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/shopify-variant-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SEO Audit Tool&lt;/strong&gt; — robots/sitemap traversal plus per-URL indexability: canonicals, noindex, hreflang, titles, images, links.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/sitemap-seo-audit" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/sitemap-seo-audit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;URL Status Checker&lt;/strong&gt; — bulk status codes and full redirect chains for broken-link reports and migrations.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/url-status-checker" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/url-status-checker&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  News &amp;amp; content
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;News &amp;amp; RSS Scraper&lt;/strong&gt; — Google News, RSS 2.0/1.0, Atom and JSON Feed in one schema, with optional full text.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/news-feed-scraper" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/news-feed-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Substack Scraper&lt;/strong&gt; — newsletter archives with engagement: reactions, comments, restacks, word counts.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/substack-archive-scraper" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/substack-archive-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;App Store Review Scraper&lt;/strong&gt; — reviews per country storefront + app profile rows.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/app-review-scraper" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/app-review-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ASO Keyword Scraper&lt;/strong&gt; — exact App Store rank per keyword per country, with listing metadata.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/aso-keyword-scraper" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/aso-keyword-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lead-gen &amp;amp; finance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Domain Contact Enricher&lt;/strong&gt; — emails, phones, socials, tech stack, ATS detection and MX/SPF/DMARC per domain, each value traced to its source page.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/domain-contact-enricher" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/domain-contact-enricher&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SEC EDGAR API&lt;/strong&gt; — filings, XBRL financial facts and full-text search by ticker or CIK.&lt;br&gt;
→ &lt;a href="https://apify.com/axiorasolutions/sec-edgar-api" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions/sec-edgar-api&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How they chain
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Domain Contact Enricher → detects a company's ATS → feeds the ATS Job Scraper.&lt;/li&gt;
&lt;li&gt;SEO Audit Tool → URL list → URL Status Checker for a broken-link report.&lt;/li&gt;
&lt;li&gt;News &amp;amp; RSS Scraper + Substack Scraper → the same clean text contract for a RAG index.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Browse all ten: &lt;a href="https://apify.com/axiorasolutions" rel="noopener noreferrer"&gt;https://apify.com/axiorasolutions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>apify</category>
      <category>automation</category>
      <category>tools</category>
    </item>
    <item>
      <title>Export a Substack archive with engagement data (posts, reactions, restacks)</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:18:55 +0000</pubDate>
      <link>https://dev.to/axiora/export-a-substack-archive-with-engagement-data-posts-reactions-restacks-3c0h</link>
      <guid>https://dev.to/axiora/export-a-substack-archive-with-engagement-data-posts-reactions-restacks-3c0h</guid>
      <description>&lt;h2&gt;
  
  
  The archive API nobody documents
&lt;/h2&gt;

&lt;p&gt;Substack publications expose their archive at &lt;code&gt;/{publication}/api/v1/archive?sort=new&amp;amp;limit=12&amp;amp;offset=0&lt;/code&gt; — the same endpoint the site uses to render its own archive page. It works on &lt;code&gt;*.substack.com&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; on custom domains like &lt;code&gt;www.noahpinion.blog&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/substack-archive-scraper" rel="noopener noreferrer"&gt;Substack Scraper&lt;/a&gt; pages through it and returns one row per post:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"218257713"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"The second Trump presidency is a world-historic failure"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subtitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"How did Trump fumble so badly?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"canonicalUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.noahpinion.blog/p/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publishedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-03T08:47:17.615Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"audience"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"only_paid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isFree"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isPodcast"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"wordCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2933&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commentCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"restackCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reactions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"❤"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;179&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reactionTotal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;179&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"firstAuthorName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Noah Smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"noahpinion.blog"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What people use it for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Creator research&lt;/strong&gt; — which topics drive reactions and restacks across a niche.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content archiving&lt;/strong&gt; — a durable, structured copy of your own publication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive analysis&lt;/strong&gt; — posting cadence, free/paid mix, average length per publication.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"astralcodexten.substack.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"newsletter.pragmaticengineer.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPostsPerPublication"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"audienceFilter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Optional &lt;code&gt;includePostText&lt;/code&gt; fetches each free post's page and extracts the body as clean text — paywalled posts return the same truncated preview a non-subscriber sees, which is the honest limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/substack-archive-scraper" rel="noopener noreferrer"&gt;Substack Scraper: Newsletter Posts &amp;amp; Stats&lt;/a&gt;&lt;/strong&gt; — no login needed for public posts.&lt;/p&gt;

</description>
      <category>newsletter</category>
      <category>webscraping</category>
      <category>api</category>
      <category>creators</category>
    </item>
    <item>
      <title>SEC EDGAR without an API key: filings, XBRL financials, full-text search</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:13:45 +0000</pubDate>
      <link>https://dev.to/axiora/sec-edgar-without-an-api-key-filings-xbrl-financials-full-text-search-43b5</link>
      <guid>https://dev.to/axiora/sec-edgar-without-an-api-key-filings-xbrl-financials-full-text-search-43b5</guid>
      <description>&lt;h2&gt;
  
  
  EDGAR is free, but it isn't one API
&lt;/h2&gt;

&lt;p&gt;The SEC publishes three useful surfaces, each with its own shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Submissions&lt;/strong&gt; — a company's full filing history (&lt;code&gt;data.sec.gov/submissions/CIK##########.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Company facts&lt;/strong&gt; — XBRL financial values (&lt;code&gt;companyfacts&lt;/code&gt;), per concept.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full-text search&lt;/strong&gt; — &lt;code&gt;efts.sec.gov&lt;/code&gt; across all filings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/sec-edgar-api" rel="noopener noreferrer"&gt;SEC EDGAR API Actor&lt;/a&gt; wraps all three behind one input and emits one row schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three modes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"AAPL"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"filings"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"formTypes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10-K"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxFilingsPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"TSLA"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"facts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"concepts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Revenues"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NetIncomeLoss"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"unitsFilter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"queries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;generative AI&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"search"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"searchForms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"10-K"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxSearchHits"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A filing row
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recordType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"filing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"cik"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0001045810"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"entityName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NVIDIA CORP"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ticker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NVDA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accessionNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0001045810-26-000021"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"formType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10-K"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filingDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-02-25"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reportDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-25"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"primaryDocument"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nvda-20260125.htm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filingUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.sec.gov/Archives/edgar/data/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isXBRL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isInlineXBRL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Facts rows carry the concept, unit, value, period and the accession that reported it — so a number is always traceable to a filing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use an Actor for this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Polite by default&lt;/strong&gt;: the Actor sends a declared user agent with contact info, as the SEC requires.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joins the tedious bits&lt;/strong&gt;: ticker → CIK lookup, pagination, concept filtering, unit filtering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error rows, not failures&lt;/strong&gt;: an unknown ticker becomes an &lt;code&gt;ok:false&lt;/code&gt; row with a hint instead of killing the run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/sec-edgar-api" rel="noopener noreferrer"&gt;SEC EDGAR API: Filings &amp;amp; XBRL Financials&lt;/a&gt;&lt;/strong&gt; — no API key.&lt;/p&gt;

</description>
      <category>finance</category>
      <category>api</category>
      <category>data</category>
      <category>investing</category>
    </item>
    <item>
      <title>Google News + RSS + Atom + JSON Feed: one schema for RAG pipelines</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:08:33 +0000</pubDate>
      <link>https://dev.to/axiora/google-news-rss-atom-json-feed-one-schema-for-rag-pipelines-37no</link>
      <guid>https://dev.to/axiora/google-news-rss-atom-json-feed-one-schema-for-rag-pipelines-37no</guid>
      <description>&lt;h2&gt;
  
  
  Feeds are the cheapest fresh data on the web
&lt;/h2&gt;

&lt;p&gt;For RAG, monitoring or research, feeds beat scraping: they are small, structured and published for exactly this. The problem is there are at least four formats, plus Google News, and each returns different field names.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/news-feed-scraper" rel="noopener noreferrer"&gt;News &amp;amp; RSS Scraper&lt;/a&gt; normalises all of them into one row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"articleUid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"07aff4e08a2282d9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"feedTitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BBC News"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rss-2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenAI fires workers for mishandling sensitive information"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleWithoutPublisher"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OpenAI fires workers for mishandling sensitive information"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.bbc.co.uk/news/articles/..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publisherDomain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bbc.co.uk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publishedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-02T08:20:32.000Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ageHours"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"categories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"imageUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"d6dbba40b2d3507d"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Mix Google News and plain feeds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sources"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"gnews:artificial intelligence"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"gnews-topic:TECHNOLOGY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://techcrunch.com/feed/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"https://daringfireball.net/feeds/json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"theverge.com"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxItemsPerSource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gnews:&lt;/code&gt; runs a Google News search (quotes and &lt;code&gt;when:7d&lt;/code&gt; work).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gnews-topic:&lt;/code&gt; pulls a Google News topic.&lt;/li&gt;
&lt;li&gt;a plain feed URL is read directly; a &lt;strong&gt;website URL is auto-discovered&lt;/strong&gt; to its feed.&lt;/li&gt;
&lt;li&gt;Feed types are detected automatically: RSS 2.0, RSS 1.0/RDF, Atom 1.0, JSON Feed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Built for pipelines
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dedup strategies:&lt;/strong&gt; by URL, normalised title, feed GUID, or none.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Date filters&lt;/strong&gt; relative (&lt;code&gt;24 hours&lt;/code&gt;, &lt;code&gt;7 days&lt;/code&gt;) or absolute.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optional full text&lt;/strong&gt; — fetches each article and extracts the body as clean plain text, with the page's own &lt;code&gt;contentHash&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canonical URLs&lt;/strong&gt;, so Google News redirects don't poison your index.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/news-feed-scraper" rel="noopener noreferrer"&gt;News &amp;amp; RSS Scraper: Google News to JSON&lt;/a&gt;&lt;/strong&gt; — no API key, no login.&lt;/p&gt;

</description>
      <category>rag</category>
      <category>webscraping</category>
      <category>ai</category>
      <category>api</category>
    </item>
    <item>
      <title>A sitemap SEO audit that actually checks indexability (not just URLs)</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:03:22 +0000</pubDate>
      <link>https://dev.to/axiora/a-sitemap-seo-audit-that-actually-checks-indexability-not-just-urls-2gc6</link>
      <guid>https://dev.to/axiora/a-sitemap-seo-audit-that-actually-checks-indexability-not-just-urls-2gc6</guid>
      <description>&lt;h2&gt;
  
  
  Extracting URLs is the easy part
&lt;/h2&gt;

&lt;p&gt;A sitemap gives you a list. What you actually need to know is whether those pages &lt;strong&gt;can rank&lt;/strong&gt;: do they return 200, do they self-canonical, are they accidentally noindexed, do they have a title of a sane length, is the hreflang cluster reciprocal?&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/sitemap-seo-audit" rel="noopener noreferrer"&gt;SEO Audit Tool&lt;/a&gt; does the full pass, bounded:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fetches &lt;code&gt;robots.txt&lt;/code&gt; and follows every declared &lt;code&gt;Sitemap:&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Walks nested sitemap &lt;strong&gt;index&lt;/strong&gt; files up to your cap.&lt;/li&gt;
&lt;li&gt;Fetches each URL (robots-aware by default) and reports.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What each audited URL carries
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recordType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"httpStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"finalUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"redirectCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"contentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text/html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pricing — Example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metaDescription"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"h1Count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"canonicalUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/pricing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isNoindex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isIndexable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hreflang"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"lang"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"imagesMissingAlt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"internalLinks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"findings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"title-too-short"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"severity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Title is 14 characters."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"evidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pricing — Example"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Findings are severity-ranked, so the dataset sorts into a to-do list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two modes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;extract-urls&lt;/strong&gt; — cheap, returns the URL inventory with lastmod/changefreq/priority. Use it to size a site before paying for a full audit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;audit&lt;/strong&gt; — fetches and analyses every URL.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sites"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"example.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"audit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxUrlsPerSite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxSitemapsPerSite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The honest limit
&lt;/h2&gt;

&lt;p&gt;If a site has no sitemap, there is nothing to audit. The Actor tells you so (&lt;code&gt;EMPTY_RESULT&lt;/code&gt;) instead of silently crawling the whole domain, because that would blow your budget without warning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/sitemap-seo-audit" rel="noopener noreferrer"&gt;SEO Audit Tool: Sitemap &amp;amp; Indexability&lt;/a&gt;&lt;/strong&gt; — point it at a domain or a direct sitemap URL.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>automation</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Scrape any Shopify store's variants (price, SKU, stock) without an API key</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sun, 04 Oct 2026 16:58:12 +0000</pubDate>
      <link>https://dev.to/axiora/scrape-any-shopify-stores-variants-price-sku-stock-without-an-api-key-2jle</link>
      <guid>https://dev.to/axiora/scrape-any-shopify-stores-variants-price-sku-stock-without-an-api-key-2jle</guid>
      <description>&lt;h2&gt;
  
  
  The public feed most people forget
&lt;/h2&gt;

&lt;p&gt;Every Shopify store exposes its catalogue at &lt;code&gt;/{store}/products.json&lt;/code&gt; — the same feed the storefront's own JavaScript uses. No API key, no app install, no OAuth. You just need to treat it like the fragile public endpoint it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  One row per variant, not per product
&lt;/h2&gt;

&lt;p&gt;Price, SKU and stock live on the &lt;strong&gt;variant&lt;/strong&gt;, so a shirt in five sizes is five rows. The &lt;a href="https://apify.com/axiorasolutions/shopify-variant-scraper" rel="noopener noreferrer"&gt;Shopify Variant Scraper&lt;/a&gt; returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"store"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allbirds.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"productTitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wool Runner Go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variantTitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US 10 / Natural Black"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sku"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"WRG-NB-10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;140&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"compareAtPrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"discountPercent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;12.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isOnSale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"available"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"option1"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US 10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"option2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Natural Black"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vendor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allbirds"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"productType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Shoes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sale"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"images"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://cdn.shopify.com/..."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"variantUid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"allbirds.com:123456:789012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"productHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b41c9d2e77f0a183"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;productHash&lt;/code&gt; is a change-detection key: diff two scheduled runs to see exactly which variants changed price or stock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filters that cut the bill
&lt;/h2&gt;

&lt;p&gt;The input lets you narrow before rows are written, so filters reduce both the dataset and the number of billed variants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stores"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"allbirds.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kith.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"collections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"sale"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"onSaleOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxProductsPerStore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxVariantsTotal"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Handle the failure modes
&lt;/h2&gt;

&lt;p&gt;The public feed is not always friendly, and the Actor reports each case as an error row instead of failing the run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;404&lt;/strong&gt; → the store is not Shopify (or the feed is disabled) → &lt;code&gt;UNSUPPORTED_SOURCE&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;429&lt;/strong&gt; → the store rate-limited you → &lt;code&gt;RATE_LIMITED&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty&lt;/strong&gt; → feed exists but the catalogue is private → &lt;code&gt;EMPTY_RESULT&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means a mixed list of 500 domains gives you data for the real Shopify stores and a clear reason for every miss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/shopify-variant-scraper" rel="noopener noreferrer"&gt;Shopify Variant Scraper: Price, SKU &amp;amp; Stock&lt;/a&gt;&lt;/strong&gt; — no API key, one row per variant.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>webscraping</category>
      <category>api</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A hiring-signal pipeline in 15 minutes: domains ATS job postings</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:53:09 +0000</pubDate>
      <link>https://dev.to/axiora/a-hiring-signal-pipeline-in-15-minutes-domains-ats-job-postings-3l1n</link>
      <guid>https://dev.to/axiora/a-hiring-signal-pipeline-in-15-minutes-domains-ats-job-postings-3l1n</guid>
      <description>&lt;h2&gt;
  
  
  The goal
&lt;/h2&gt;

&lt;p&gt;You have a list of company domains — prospects, competitors, a market map. You want a feed of their open roles, refreshed weekly, with a diff of what changed. No vendors, no servers, no keys.&lt;/p&gt;

&lt;p&gt;Two Actors do it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — domain in, hiring board out
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/domain-contact-enricher" rel="noopener noreferrer"&gt;Domain Contact Enricher&lt;/a&gt; reads a company's site and detects which ATS it uses. It emits a ready-to-use input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"atsProvider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"greenhouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"atsJobScraperInput"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"greenhouse:example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"technologyIds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"nextjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cloudflare"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailInfrastructure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mailProvider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Workspace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hasSpf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hasDmarc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it over your whole list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"stripe.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shopify.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tesla.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxPagesPerDomain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Collect the &lt;code&gt;atsJobScraperInput&lt;/code&gt; values that are not null.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — boards in, job rows out
&lt;/h2&gt;

&lt;p&gt;Feed those strings into the &lt;a href="https://apify.com/axiorasolutions/ats-job-scraper" rel="noopener noreferrer"&gt;ATS Job Scraper&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"boards"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"greenhouse:stripe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ashby:linear"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxJobsPerBoard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14 days"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get one normalised row per job with &lt;code&gt;salary.evidence&lt;/code&gt;, &lt;code&gt;workplaceType&lt;/code&gt;, &lt;code&gt;postedAt&lt;/code&gt; and two change-detection keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;jobUid&lt;/code&gt; — stable identity → spot &lt;strong&gt;new and removed&lt;/strong&gt; roles,&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;recordHash&lt;/code&gt; — content hash → spot &lt;strong&gt;edited&lt;/strong&gt; postings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3 — schedule and diff
&lt;/h2&gt;

&lt;p&gt;Add an Apify &lt;strong&gt;Schedule&lt;/strong&gt; (weekly), then diff consecutive runs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;postedAfter: "14 days"&lt;/code&gt; keeps each run small and current.&lt;/li&gt;
&lt;li&gt;New &lt;code&gt;jobUid&lt;/code&gt; = new role = a sales or talent signal.&lt;/li&gt;
&lt;li&gt;Changed &lt;code&gt;recordHash&lt;/code&gt; on an old role = the description or salary moved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want emails alongside the jobs, the Domain Enricher already returned contacts with their source page, so the same run gives you "who to talk to" and "what they are hiring for".&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this beats a scraping stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No API keys and no logins anywhere in the chain.&lt;/li&gt;
&lt;li&gt;The actors report per-domain and per-board failures as error rows, so one dead board never fails the run.&lt;/li&gt;
&lt;li&gt;Both are pay-per-result: a 50-domain, 500-job refresh costs cents.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Start with the &lt;a href="https://apify.com/axiorasolutions/domain-contact-enricher" rel="noopener noreferrer"&gt;Domain Contact Enricher&lt;/a&gt;, then chain the &lt;a href="https://apify.com/axiorasolutions/ats-job-scraper" rel="noopener noreferrer"&gt;ATS Job Scraper&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>leadgen</category>
      <category>api</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Greenhouse vs Ashby vs Lever vs SmartRecruiters: which job API should you scrape?</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:47:53 +0000</pubDate>
      <link>https://dev.to/axiora/greenhouse-vs-ashby-vs-lever-vs-smartrecruiters-which-job-api-should-you-scrape-56a1</link>
      <guid>https://dev.to/axiora/greenhouse-vs-ashby-vs-lever-vs-smartrecruiters-which-job-api-should-you-scrape-56a1</guid>
      <description>&lt;p&gt;If you scrape job boards, these four cover a huge share of tech employers. They are also four different APIs with four different conventions. Here is the honest comparison I wish I had before writing my fourth parser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Greenhouse
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;boards-api.greenhouse.io/v1/boards/{token}/jobs&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One request returns every job. Add &lt;code&gt;?content=true&lt;/code&gt; for descriptions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trap:&lt;/strong&gt; &lt;code&gt;content=true&lt;/code&gt; roughly 12×'s the payload (5.4 MB vs 436 KB for a 715-job board). If you only need N jobs, fetch the list first and then per-job &lt;code&gt;/jobs/{id}&lt;/code&gt; (8 KB each).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;content&lt;/code&gt; is &lt;strong&gt;double-encoded HTML&lt;/strong&gt; — entities then tags.&lt;/li&gt;
&lt;li&gt;Salary is sometimes in &lt;code&gt;metadata&lt;/code&gt;, a label/value array ("Salary Range" → "$180k–$230k"), and often nowhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ashby
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;api.ashbyhq.com/posting-api/job-board/{token}?includeCompensation=true&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;only one of the four with structured compensation&lt;/strong&gt;: numbers live on &lt;code&gt;compensation.summaryComponents[]&lt;/code&gt; where &lt;code&gt;compensationType === "Salary"&lt;/code&gt;, not on the tier object most code reads first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trap:&lt;/strong&gt; &lt;code&gt;isRemote: true&lt;/code&gt; is set for &lt;strong&gt;Hybrid&lt;/strong&gt; roles. Trust the &lt;code&gt;workplaceType&lt;/code&gt; string ("Remote" / "Hybrid" / "OnSite"), or your "remote only" filter silently returns hybrid jobs.&lt;/li&gt;
&lt;li&gt;Board tokens are case-sensitive, and no server-side limit exists — a board like OpenAI is ~14 MB.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lever
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;api.lever.co/v0/postings/{token}?mode=json&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports &lt;code&gt;&amp;amp;limit=N&lt;/code&gt;, which is genuinely useful for large boards (19 KB for 2 postings vs 775 KB for all).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trap:&lt;/strong&gt; the public endpoint has &lt;strong&gt;no &lt;code&gt;salaryRange&lt;/code&gt; field at all&lt;/strong&gt;. Any tool that reports &lt;code&gt;ats-field&lt;/code&gt; salary evidence for Lever is inventing it.&lt;/li&gt;
&lt;li&gt;Locations hide in &lt;code&gt;categories.allLocations&lt;/code&gt;; workplace type is a hyphenated string.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  SmartRecruiters
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;api.smartrecruiters.com/v1/companies/{token}/postings?limit=100&amp;amp;offset=N&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean pagination with &lt;code&gt;limit&lt;/code&gt;/&lt;code&gt;offset&lt;/code&gt; and a &lt;code&gt;totalFound&lt;/code&gt; count.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Trap:&lt;/strong&gt; the public API is &lt;strong&gt;off by default&lt;/strong&gt;. Of twenty well-known companies I tested, only a handful returned anything. Document that or users will read empty boards as your bug.&lt;/li&gt;
&lt;li&gt;Descriptions require a second request per posting (&lt;code&gt;/postings/{id}&lt;/code&gt;) and live inside &lt;code&gt;jobAd.sections&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The summary table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Greenhouse&lt;/th&gt;
&lt;th&gt;Ashby&lt;/th&gt;
&lt;th&gt;Lever&lt;/th&gt;
&lt;th&gt;SmartRecruiters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pagination / limit&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;&lt;code&gt;limit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;limit&lt;/code&gt;+&lt;code&gt;offset&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured salary&lt;/td&gt;
&lt;td&gt;sometimes (metadata)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Description in list&lt;/td&gt;
&lt;td&gt;with &lt;code&gt;content=true&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;per-posting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workplace type&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;&lt;code&gt;workplaceType&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;remote&lt;/code&gt; + &lt;code&gt;hybrid&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company name in payload&lt;/td&gt;
&lt;td&gt;via board metadata&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;from first posting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What to build instead of four parsers
&lt;/h2&gt;

&lt;p&gt;I put the four behind one schema — one row per job with title, locations, workplace type, salary with &lt;code&gt;evidence&lt;/code&gt; provenance, apply URL, and stable &lt;code&gt;jobUid&lt;/code&gt;/&lt;code&gt;recordHash&lt;/code&gt; for change detection. It is an Apify Actor, so there is nothing to host:&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/ats-job-scraper" rel="noopener noreferrer"&gt;ATS Job Scraper: Greenhouse, Ashby &amp;amp; Lever&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"boards"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"greenhouse:airtable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ashby:Linear"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"lever:spotify"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxJobsPerBoard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key, and a 5-job test costs a fraction of a cent.&lt;/p&gt;

</description>
      <category>api</category>
      <category>webscraping</category>
      <category>career</category>
      <category>comparison</category>
    </item>
    <item>
      <title>ASO keyword tracking: get the exact App Store rank per country (with code)</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:39:30 +0000</pubDate>
      <link>https://dev.to/axiora/aso-keyword-tracking-get-the-exact-app-store-rank-per-country-with-code-3im6</link>
      <guid>https://dev.to/axiora/aso-keyword-tracking-get-the-exact-app-store-rank-per-country-with-code-3im6</guid>
      <description>&lt;h2&gt;
  
  
  Exact rank, not a computed score
&lt;/h2&gt;

&lt;p&gt;Most "ASO tools" show you a made-up difficulty number. What you actually want is the boring truth: for the keyword &lt;code&gt;habit tracker&lt;/code&gt; in the US storefront, which apps are at positions 1–50 today, and what does each listing look like?&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/aso-keyword-scraper" rel="noopener noreferrer"&gt;ASO Keyword Scraper&lt;/a&gt; returns exactly that — one row per app per keyword per storefront, using Apple's own relevance order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recordType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ranking"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keyword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"habit tracker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"storefront"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rank"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"appName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Habit Tracker - Daily Goals"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"developerName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Labs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"averageUserRating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"userRatingCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;128411&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"primaryGenre"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Health &amp;amp; Fitness"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"formattedPrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Free"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywordMatchInTitle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currentVersionReleaseDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-24T10:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"appStoreUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://apps.apple.com/us/app/..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Signals that matter more than a difficulty score
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;userRatingCount&lt;/code&gt;&lt;/strong&gt; — a rank-3 app with 400 ratings is a weak incumbent. A rank-3 app with 900k ratings is a wall.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;keywordMatchInTitle&lt;/code&gt;&lt;/strong&gt; — the strongest ranking input Apple exposes. If none of the top 10 use your keyword, that is an opening.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;currentVersionReleaseDate&lt;/code&gt;&lt;/strong&gt; — an app not updated in two years is decaying.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Track rivals across storefronts
&lt;/h2&gt;

&lt;p&gt;The same app can rank 3rd in the US and 40th in Germany. Add both countries and compare:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"habit tracker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"budget app"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"de"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resultsPerKeyword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also pass &lt;code&gt;apps&lt;/code&gt; to resolve listing metadata directly (rank stays null), which is handy for a competitor dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it from code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/axiorasolutions~aso-keyword-scraper/runs?token=YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"keywords":["habit tracker"],"countries":["us","de"],"resultsPerKeyword":25}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schedule it weekly and diff on &lt;code&gt;recordHash&lt;/code&gt; to catch rank moves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/aso-keyword-scraper" rel="noopener noreferrer"&gt;ASO Keyword Scraper&lt;/a&gt;&lt;/strong&gt; — no API key, and it handles the storefront/language details for you.&lt;/p&gt;

</description>
      <category>aso</category>
      <category>mobile</category>
      <category>webscraping</category>
      <category>marketing</category>
    </item>
    <item>
      <title>5 no-API-key data Actors for recruiting, ASO, lead-gen and SEO</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:33:40 +0000</pubDate>
      <link>https://dev.to/axiora/5-no-api-key-data-actors-for-recruiting-aso-lead-gen-and-seo-1i59</link>
      <guid>https://dev.to/axiora/5-no-api-key-data-actors-for-recruiting-aso-lead-gen-and-seo-1i59</guid>
      <description>&lt;p&gt;A lot of "data APIs" want a credit card, a sales call and a rate limit before you see a single row. These five run on public sources with &lt;strong&gt;no API key&lt;/strong&gt;, so you can test them in minutes and schedule them when they earn their place.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. ATS Job Scraper — Greenhouse, Ashby, Lever, SmartRecruiters
&lt;/h2&gt;

&lt;p&gt;One row per open role, four providers, one schema. Salary carries an &lt;code&gt;evidence&lt;/code&gt; field so you know whether a number came from the ATS itself, the description text, or nowhere. &lt;code&gt;recordHash&lt;/code&gt; gives you change detection for free.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://apify.com/axiorasolutions/ats-job-scraper" rel="noopener noreferrer"&gt;apify.com/axiorasolutions/ats-job-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. App Store Review Scraper — reviews per country
&lt;/h2&gt;

&lt;p&gt;Apple stores reviews per storefront, so this targets the countries you care about. Rating, body, version and helpful votes per review, plus an app profile row.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://apify.com/axiorasolutions/app-review-scraper" rel="noopener noreferrer"&gt;apify.com/axiorasolutions/app-review-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. ASO Keyword Scraper — exact rank per keyword and country
&lt;/h2&gt;

&lt;p&gt;The honest version of ASO data: Apple's exact order, with rating counts and "keyword in title" flags so you can tell a weak incumbent from a wall.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://apify.com/axiorasolutions/aso-keyword-scraper" rel="noopener noreferrer"&gt;apify.com/axiorasolutions/aso-keyword-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Domain Contact Enricher — domains into contactable records
&lt;/h2&gt;

&lt;p&gt;Emails, phones, socials, tech stack, ATS detection and MX/SPF/DMARC — one row per domain, every value traced to its source page.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://apify.com/axiorasolutions/domain-contact-enricher" rel="noopener noreferrer"&gt;apify.com/axiorasolutions/domain-contact-enricher&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. URL Status Checker — bulk status and redirect chains
&lt;/h2&gt;

&lt;p&gt;Feed it a URL list (or the output of a sitemap crawl) and get status codes, full redirect chains, timing and page facts. The broken-link report you run before every migration.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://apify.com/axiorasolutions/url-status-checker" rel="noopener noreferrer"&gt;apify.com/axiorasolutions/url-status-checker&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why they chain together
&lt;/h2&gt;

&lt;p&gt;The Domain Enricher detects the ATS a company uses and emits an input string for the Jobs Actor. The Sitemap Audit emits URLs for the Status Checker. Each is useful alone and better as a pipeline.&lt;/p&gt;

&lt;p&gt;All five are pay-per-result, so a small test costs cents and a full run is predictable. No keys, no logins, no browser.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>automation</category>
      <category>tools</category>
    </item>
    <item>
      <title>Bulk URL and redirect-chain audits: a 2-minute safety net before a migration</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:28:29 +0000</pubDate>
      <link>https://dev.to/axiora/bulk-url-and-redirect-chain-audits-a-2-minute-safety-net-before-a-migration-29io</link>
      <guid>https://dev.to/axiora/bulk-url-and-redirect-chain-audits-a-2-minute-safety-net-before-a-migration-29io</guid>
      <description>&lt;h2&gt;
  
  
  The five minutes before you ship a migration
&lt;/h2&gt;

&lt;p&gt;You changed your URL structure, added a trailing slash policy, or moved a domain. The only thing standing between you and a traffic cliff is a redirect map that actually works. Testing 500 URLs by hand is not a plan.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/url-status-checker" rel="noopener noreferrer"&gt;URL Status Checker&lt;/a&gt; takes a list of URLs and returns, per row:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP status and status category,&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;full redirect chain&lt;/strong&gt;, hop by hop,&lt;/li&gt;
&lt;li&gt;the final URL and whether the redirect crossed domains,&lt;/li&gt;
&lt;li&gt;response time and content type,&lt;/li&gt;
&lt;li&gt;and for HTML responses: title, h1, canonical, meta robots.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requestedUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://example.com/old-page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"httpStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isRedirect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"redirectCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"redirectChain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/old-page"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;301&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/new-page"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isCrossDomainRedirect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"finalUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/new-page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"responseMs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"New page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metaRobots"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index,follow"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Recipes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Broken-link report&lt;/strong&gt; — set &lt;code&gt;filterByStatus: ["404","410","500"]&lt;/code&gt; and you get only the pages that are actually dead, and you are only billed for those.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redirect QA&lt;/strong&gt; — feed the old URL list in, sort by &lt;code&gt;redirectCount&lt;/code&gt; and look for chains longer than one hop or unexpected cross-domain hops. Both hurt SEO.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Crawl audit handoff&lt;/strong&gt; — the &lt;a href="https://apify.com/axiorasolutions/sitemap-seo-audit" rel="noopener noreferrer"&gt;Sitemap SEO Audit&lt;/a&gt; dataset's URL column pastes straight into this Actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"urls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"https://example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://example.com/old-page"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"followRedirects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A non-2xx response is a &lt;strong&gt;result&lt;/strong&gt;, not a failed run — you get a row for every URL you asked about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/url-status-checker" rel="noopener noreferrer"&gt;URL Status Checker&lt;/a&gt;&lt;/strong&gt; — no API key, and HEAD mode roughly halves the time for very large sweeps.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>automation</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Company enrichment without a data vendor: domains to emails, tech stack and MX</title>
      <dc:creator>Nikolas</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:23:18 +0000</pubDate>
      <link>https://dev.to/axiora/company-enrichment-without-a-data-vendor-domains-to-emails-tech-stack-and-mx-2532</link>
      <guid>https://dev.to/axiora/company-enrichment-without-a-data-vendor-domains-to-emails-tech-stack-and-mx-2532</guid>
      <description>&lt;h2&gt;
  
  
  What a lead list actually needs
&lt;/h2&gt;

&lt;p&gt;You have a list of company domains. You want, per company:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;contact emails and phone numbers,&lt;/li&gt;
&lt;li&gt;social profiles,&lt;/li&gt;
&lt;li&gt;the technology stack they run,&lt;/li&gt;
&lt;li&gt;the ATS they use for hiring,&lt;/li&gt;
&lt;li&gt;and their email infrastructure (MX provider, SPF, DMARC).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hard requirement is not volume. It is &lt;strong&gt;provenance&lt;/strong&gt; — knowing which page each value came from, so you can defend a contact when someone asks "where did you get this?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Every value carries its source
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/axiorasolutions/domain-contact-enricher" rel="noopener noreferrer"&gt;Domain Contact Enricher&lt;/a&gt; returns one row per domain. Contacts are ranked by confidence, and each carries the URL where it was found:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Inc."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello@example.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"isRoleAccount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sourceUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example.com/contact"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"socialProfiles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"linkedin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/company/example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/example"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"technologyIds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"nextjs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"cloudflare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hubspot"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"atsProvider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"greenhouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"atsJobScraperInput"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"greenhouse:example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emailInfrastructure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mailProvider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Google Workspace"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hasSpf"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"hasDmarc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;atsJobScraperInput&lt;/code&gt; field chains directly into the &lt;a href="https://apify.com/axiorasolutions/ats-job-scraper" rel="noopener noreferrer"&gt;ATS Job Scraper&lt;/a&gt; — domain in, hiring board out.&lt;/p&gt;

&lt;h2&gt;
  
  
  An honest coverage note
&lt;/h2&gt;

&lt;p&gt;Modern companies increasingly hide behind contact forms. This actor returns contacts &lt;strong&gt;when the site publishes them&lt;/strong&gt; on its home, contact, about, team or imprint pages — it does not invent addresses or scrape private data. If it finds none, you get a profile row with the technology and email infrastructure, not a fabricated email. That is the correct behaviour for a list you intend to email.&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"stripe.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shopify.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tesla.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPagesPerDomain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeTechnologies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeDnsSignals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also respects &lt;code&gt;robots.txt&lt;/code&gt; by default and reports unreachable domains as unbilled error rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/axiorasolutions/domain-contact-enricher" rel="noopener noreferrer"&gt;Domain Contact Enricher&lt;/a&gt;&lt;/strong&gt; — bulk mode, no API key, every value traceable.&lt;/p&gt;

</description>
      <category>leadgen</category>
      <category>webscraping</category>
      <category>b2b</category>
      <category>api</category>
    </item>
  </channel>
</rss>
