<?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: locaihost data</title>
    <description>The latest articles on DEV Community by locaihost data (@locaihost_data).</description>
    <link>https://dev.to/locaihost_data</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%2F4175321%2F5eda2421-ae2c-4ac1-9c9b-b0d056b0eb42.png</url>
      <title>DEV Community: locaihost data</title>
      <link>https://dev.to/locaihost_data</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/locaihost_data"/>
    <language>en</language>
    <item>
      <title>A tech-stack signal: 500 Shopify stores checked for $0.48, and the 36 on Klaviyo with no review app</title>
      <dc:creator>locaihost data</dc:creator>
      <pubDate>Mon, 19 Oct 2026 13:38:20 +0000</pubDate>
      <link>https://dev.to/locaihost_data/a-tech-stack-signal-500-shopify-stores-checked-for-048-and-the-36-on-klaviyo-with-no-review-app-2nl2</link>
      <guid>https://dev.to/locaihost_data/a-tech-stack-signal-500-shopify-stores-checked-for-048-and-the-36-on-klaviyo-with-no-review-app-2nl2</guid>
      <description>&lt;p&gt;If you sell a Shopify app, run an e-commerce agency or sell anything that plugs into an online store, the best prospect list is defined by what a store already uses and what it doesn't. A store that pays for Klaviyo already spends on retention, so a review app or an SMS tool is an easy next conversation. A store still on Mailchimp is a migration project for a Klaviyo agency. A store with no email tool at all is a different pitch again.&lt;/p&gt;

&lt;p&gt;The usual tool for this is a technology database like BuiltWith, which indexes the whole web. That is the right tool when you need every site that uses something. Its Basic plan is $295 a month for two technologies, with a one-month minimum. If you already have the list of domains (a CRM export, a lead list, a public ranking), you don't need the database. You need each domain checked once, and you can pay for that per domain.&lt;/p&gt;

&lt;p&gt;We did that for 500 Shopify stores on 14 October 2026 with our &lt;strong&gt;&lt;a href="https://apify.com/locaihost/domain-intel" rel="noopener noreferrer"&gt;domain-intel&lt;/a&gt;&lt;/strong&gt; Actor on Apify. It reads each domain's public DNS records and one page, the homepage, and recognises 3,111 technologies. It costs $1 per 1,000 domains, so 0.1 cents a store. Every number below is from that run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: a list of Shopify stores, for free
&lt;/h2&gt;

&lt;p&gt;You can bring your own list. We wanted one anyone can rebuild, so we started from the &lt;a href="https://tranco-list.eu/" rel="noopener noreferrer"&gt;Tranco list&lt;/a&gt;, a research ranking of the most visited sites, in its 13 October 2026 edition (&lt;code&gt;N26LW&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Shopify serves stores on custom domains from one address block, &lt;code&gt;23.227.38.0/24&lt;/code&gt;, the address its help pages tell merchants to point their domain at. So a DNS lookup sorts a domain list for free: if the domain's A record is in that block, it is a Shopify storefront. We looked up the top 100,000 domains, found 921 on that block (Shopify's own domains left out), and took the 500 highest ranked, from rank 2,175 (barnesandnoble.com) to 75,938.&lt;/p&gt;

&lt;p&gt;The method misses stores that put their own CDN in front of Shopify, but it doesn't add wrong ones: of the 470 homepages the Actor could read, 469 showed Shopify. The script is &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-list.mjs" rel="noopener noreferrer"&gt;recipe-2-list.mjs&lt;/a&gt;; it reads DNS only and visits no website.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 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;"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;"barnesandnoble.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;"nanit.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;"wyze.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;"daisonet.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;"chiikawamarket.jp"&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;That is the whole input, with the full 500 in &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-domains.txt" rel="noopener noreferrer"&gt;recipe-2-domains.txt&lt;/a&gt;. Three notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;domains&lt;/code&gt; takes bare domains, full URLs or email addresses. Each is cut down to its registrable domain and duplicates are merged, so a column of work emails from a CRM works as it is.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;checkWebsite&lt;/code&gt;, &lt;code&gt;checkSsl&lt;/code&gt; and &lt;code&gt;checkRegistration&lt;/code&gt; are all on by default. The tech stack needs &lt;code&gt;checkWebsite&lt;/code&gt;. Turn the other two off if you only want the stack; the price is the same.&lt;/li&gt;
&lt;li&gt;Each website gets one robots.txt request and one homepage request. The Actor runs no JavaScript, so it sees what the page's HTML and headers name, not what a browser loads later.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What came back
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;484 rows from 500 domains in 7 minutes 12 seconds.&lt;/strong&gt; 16 homepages didn't answer within 120 seconds; they return no row and cost nothing. At $1 per 1,000 domains plus a $0.00005 start fee, the run costs $0.48 on Apify's free or Starter plan, $0.36 on Scale and $0.27 on Business.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;470 homepages were read.&lt;/strong&gt; 10 answered with a bot-protection page and 4 timed out; those rows still have the DNS and email columns, with empty tech columns.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;268 of the 470 stores (57%) show an email or SMS marketing tool. Klaviyo alone is on 218 (46%).&lt;/strong&gt; Mailchimp is on 34, HubSpot 11, Brevo 10.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;140 (30%) show a review app on the homepage&lt;/strong&gt;, led by Yotpo (70) and Trustpilot (22).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email is hosted on Google Workspace at 196 of the 484 domains and Microsoft 365 at 164.&lt;/strong&gt; 30 more receive mail through a filtering service such as Proofpoint or Mimecast, which hides the host behind it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DMARC, the DNS record that tells mailbox providers what to do with mail that fails sender checks: 111 domains reject, 134 quarantine, 215 only monitor (&lt;code&gt;p=none&lt;/code&gt;) and 24 publish no record.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The stack, by category. Counts are stores out of the 470 homepages read; a store can use several tools in one category.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Stores&lt;/th&gt;
&lt;th&gt;Most common tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email and SMS marketing&lt;/td&gt;
&lt;td&gt;268&lt;/td&gt;
&lt;td&gt;Klaviyo 218, Mailchimp 34, HubSpot 11, Brevo 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analytics&lt;/td&gt;
&lt;td&gt;257&lt;/td&gt;
&lt;td&gt;Microsoft Clarity 156, Google Analytics 73, Hotjar 30, TikTok Pixel 25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live chat and support&lt;/td&gt;
&lt;td&gt;208&lt;/td&gt;
&lt;td&gt;Zendesk 122, Gorgias 47, WhatsApp chat 43, Zendesk Chat 26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviews&lt;/td&gt;
&lt;td&gt;140&lt;/td&gt;
&lt;td&gt;Yotpo 70, Trustpilot 22, Loox 13, Stamped 10, PowerReviews 9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cookie consent&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;OneTrust 52, Cookiebot 23, Osano 11, Usercentrics 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advertising&lt;/td&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;Google Ads 60, Microsoft Advertising 31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buy now, pay later&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;Klarna 48, Afterpay 13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A/B testing&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;VWO 12, Optimizely 9, Yottaa 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Sample rows
&lt;/h2&gt;

&lt;p&gt;Ten of the 484, by Tranco rank. The review column is what the homepage shows.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;th&gt;Tranco rank&lt;/th&gt;
&lt;th&gt;Email marketing&lt;/th&gt;
&lt;th&gt;Reviews&lt;/th&gt;
&lt;th&gt;Support&lt;/th&gt;
&lt;th&gt;Email host&lt;/th&gt;
&lt;th&gt;DMARC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;nanit.com&lt;/td&gt;
&lt;td&gt;4,229&lt;/td&gt;
&lt;td&gt;Mailchimp&lt;/td&gt;
&lt;td&gt;Yotpo&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;not identified&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wyze.com&lt;/td&gt;
&lt;td&gt;6,316&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fashionnova.com&lt;/td&gt;
&lt;td&gt;11,897&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;indigo.ca&lt;/td&gt;
&lt;td&gt;14,296&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Yotpo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;reject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stanley1913.com&lt;/td&gt;
&lt;td&gt;14,657&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Yotpo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;reject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;withings.com&lt;/td&gt;
&lt;td&gt;16,586&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;reject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;nanoleaf.me&lt;/td&gt;
&lt;td&gt;18,586&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Judge.me&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;reject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;gooutdoors.co.uk&lt;/td&gt;
&lt;td&gt;18,722&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Trustpilot, Yotpo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;society6.com&lt;/td&gt;
&lt;td&gt;19,636&lt;/td&gt;
&lt;td&gt;Klaviyo, Mailchimp&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Gorgias, Zendesk&lt;/td&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scholl-shoes.com&lt;/td&gt;
&lt;td&gt;19,697&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Yotpo&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each row also carries the DNS host, MX records, SPF record, the full DMARC record (report addresses masked), CDN, hosting, every detected technology with its category and a confidence score, SSL issuer and days to expiry, and the registrar with creation and expiry dates. No registrant or contact details are collected. The flat version of all 484 is &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/stores.csv" rel="noopener noreferrer"&gt;stores.csv&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The segment: Klaviyo, but no review app
&lt;/h2&gt;

&lt;p&gt;The query is one line: Klaviyo in the email column and nothing in the reviews column. On the homepage data that gives &lt;strong&gt;133 of the 218 Klaviyo stores&lt;/strong&gt;. It looks like a great list for a review app. It mostly isn't, and this is the most useful thing we learned from the run.&lt;/p&gt;

&lt;p&gt;Review widgets live on product pages. Many stores never show stars on the homepage. So we ran a free second pass: for each of the 133, open one product page and look for review apps there. It is &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-product-check.py" rel="noopener noreferrer"&gt;recipe-2-product-check.py&lt;/a&gt;, about 140 lines. It uses Shopify's public &lt;code&gt;/products.json&lt;/code&gt; to find one product, respects robots.txt and makes three requests per store.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;125 of the 133 product pages were read. 89 of them had reviews&lt;/strong&gt;: Judge.me on 30, REVIEWS.io on 13, Yotpo 10, Okendo 9, Trustpilot 8, Bazaarvoice 7, other review apps or the theme's own reviews block on the rest. Wyze, August and Lockly use Bazaarvoice; NZXT and Society6 use Okendo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;36 stores have Klaviyo and no reviews on either page.&lt;/strong&gt; That is the real list, a quarter of the first answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Klaviyo itself was on all 125 product pages too.&lt;/strong&gt; Site-wide tools like an email platform, a chat widget or a consent banner load on every page, so the homepage read is right for them. Page-specific tools need the second pass.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first ten of the 36, by Tranco rank:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Store&lt;/th&gt;
&lt;th&gt;Tranco rank&lt;/th&gt;
&lt;th&gt;Email marketing&lt;/th&gt;
&lt;th&gt;Support&lt;/th&gt;
&lt;th&gt;Email host&lt;/th&gt;
&lt;th&gt;DMARC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;mova-tech.com&lt;/td&gt;
&lt;td&gt;11,216&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Lark Mail&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;jbhifi.com.au&lt;/td&gt;
&lt;td&gt;15,545&lt;/td&gt;
&lt;td&gt;Klaviyo, Insider, Mailchimp, Salesforce&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;behind Proofpoint&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;lacrossetechnology.com&lt;/td&gt;
&lt;td&gt;27,623&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mammotion.com&lt;/td&gt;
&lt;td&gt;28,602&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vistaexpert.it&lt;/td&gt;
&lt;td&gt;28,718&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;own mail server&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;benetton.com&lt;/td&gt;
&lt;td&gt;28,766&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fashionphile.com&lt;/td&gt;
&lt;td&gt;29,703&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;reject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forever21.com&lt;/td&gt;
&lt;td&gt;31,843&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Gorgias&lt;/td&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;quarantine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;aldoshoes.com&lt;/td&gt;
&lt;td&gt;35,359&lt;/td&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;none seen&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;phaidon.com&lt;/td&gt;
&lt;td&gt;36,516&lt;/td&gt;
&lt;td&gt;Klaviyo, HubSpot&lt;/td&gt;
&lt;td&gt;Zendesk&lt;/td&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;All 36 are in &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-klaviyo-no-reviews-confirmed.csv" rel="noopener noreferrer"&gt;segment-klaviyo-no-reviews-confirmed.csv&lt;/a&gt;; the homepage-only 133 are in &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-klaviyo-no-reviews.csv" rel="noopener noreferrer"&gt;segment-klaviyo-no-reviews.csv&lt;/a&gt;, with the product-page findings for each in &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/product-check-klaviyo-no-reviews.json" rel="noopener noreferrer"&gt;product-check-klaviyo-no-reviews.json&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Some of the 36 will still have reviews somewhere: a big retailer like JB Hi-Fi may run its own system, and a few stores load widgets in ways a page read can't see. Look at the product page of anyone you plan to contact. The list is short enough for that.&lt;/p&gt;

&lt;h2&gt;
  
  
  More segments from the same run
&lt;/h2&gt;

&lt;p&gt;The same 484 rows answer other questions with a different filter. None of these cost anything beyond the $0.48.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Segment&lt;/th&gt;
&lt;th&gt;Stores&lt;/th&gt;
&lt;th&gt;Who it is for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No email or SMS tool on the homepage&lt;/td&gt;
&lt;td&gt;202&lt;/td&gt;
&lt;td&gt;Email platforms and retention agencies. After the product-page check: 131&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Klaviyo, and DMARC missing or at &lt;code&gt;p=none&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;Email deliverability consultants&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A review app, but no email tool&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;Email platforms: the store already collects customer feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mailchimp, not Klaviyo&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;Klaviyo agencies looking for migration projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Klaviyo, and no DMARC record at all&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Deliverability: Gmail and Yahoo require one from bulk senders&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The lists are in the analysis folder: &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-no-email-platform.csv" rel="noopener noreferrer"&gt;no email tool&lt;/a&gt; and &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-no-email-platform-confirmed.csv" rel="noopener noreferrer"&gt;confirmed on a product page&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-klaviyo-no-dmarc-enforcement.csv" rel="noopener noreferrer"&gt;Klaviyo with DMARC missing or p=none&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/segment-mailchimp-not-klaviyo.csv" rel="noopener noreferrer"&gt;Mailchimp, not Klaviyo&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The DMARC rows come from DNS, so they don't need a second pass. Since 2024, Gmail has required anyone sending more than 5,000 messages a day to Gmail addresses to publish a DMARC record, and Yahoo has the same rule for bulk senders. &lt;code&gt;p=none&lt;/code&gt; meets that rule but only asks for reports; it doesn't stop anyone sending mail in the store's name. Of the 218 Klaviyo stores, 96 are at &lt;code&gt;p=none&lt;/code&gt; and 6 have no record. For a store whose revenue depends on its emails landing in the inbox, that is a concrete reason to talk.&lt;/p&gt;

&lt;p&gt;The "no email tool" segment shrank less than the reviews one, from 202 to 131: 42 of the 173 product pages we could read showed an email tool the homepage didn't (Attentive on 13, Mailchimp 12, Klaviyo 8, Omnisend 8).&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the list once
&lt;/h2&gt;

&lt;p&gt;Three more things to know before you load it anywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What a page read can't see.&lt;/strong&gt; Tools added through a tag manager or Shopify's customer-events pixels load after the page, so a one-page read misses them. That is most likely why Google Analytics, which Shopify's own Google app loads as a pixel, shows on only 73 stores while Microsoft Clarity shows on 156. Treat "none seen" as "not on the page", not "not used".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The sample is big brands.&lt;/strong&gt; Tranco ranks popularity, so these are well-known stores, 360 of them on &lt;code&gt;.com&lt;/code&gt;. A list of small stores from a directory or your own CRM will have a different mix of tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Some sites block automated requests.&lt;/strong&gt; 10 of the 500 answered with a bot-protection page. The DNS and email columns are still right for those; only the tech columns are empty.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The working version: a sheet that fills itself
&lt;/h2&gt;

&lt;p&gt;For a list you add to over time, we use an n8n workflow with Google Sheets. You paste domains into a tab, and each morning the new ones get their columns.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schedule Trigger&lt;/strong&gt;, every day at 10:00 (and a manual trigger for the first run).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the Domains tab&lt;/strong&gt; in your Google Sheet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick new domains&lt;/strong&gt;: keeps the rows whose &lt;code&gt;checkedAt&lt;/code&gt; is empty, so a domain is only paid for once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apify, Run actor and get dataset&lt;/strong&gt;: runs domain-intel on them, with a $2 cap on the run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flatten for the sheet&lt;/strong&gt;: one row per domain with &lt;code&gt;emailMarketing&lt;/code&gt;, &lt;code&gt;reviews&lt;/code&gt;, &lt;code&gt;liveChat&lt;/code&gt;, &lt;code&gt;bnpl&lt;/code&gt;, &lt;code&gt;cookieConsent&lt;/code&gt;, &lt;code&gt;analytics&lt;/code&gt;, &lt;code&gt;emailProvider&lt;/code&gt;, &lt;code&gt;dmarcPolicy&lt;/code&gt; and a &lt;code&gt;klaviyoNoReviewApp&lt;/code&gt; flag (true or false).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write results to the sheet&lt;/strong&gt;: updates the same row, matched on &lt;code&gt;domain&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Download &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/files/tech-stack-signal-to-google-sheets.json" rel="noopener noreferrer"&gt;tech-stack-signal-to-google-sheets.json&lt;/a&gt;. It is our standard domains-to-Sheets workflow with this article's columns added, and it leaves &lt;code&gt;checkedAt&lt;/code&gt; empty for a domain that didn't answer, so it is tried again the next day at no charge. The plain version is &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/files/domain-tech-and-email-setup-to-google-sheets.json" rel="noopener noreferrer"&gt;domain-tech-and-email-setup-to-google-sheets.json&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Setup takes about five minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Make a Google Sheet with a tab named &lt;strong&gt;Domains&lt;/strong&gt; and two header cells: &lt;code&gt;domain&lt;/code&gt; and &lt;code&gt;checkedAt&lt;/code&gt;. Paste your domains under &lt;code&gt;domain&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In n8n, open &lt;strong&gt;Workflows &amp;gt; Import from file&lt;/strong&gt; and pick the JSON.&lt;/li&gt;
&lt;li&gt;The workflow uses the verified Apify node (&lt;code&gt;@apify/n8n-nodes-apify&lt;/code&gt;). n8n Cloud installs it from the canvas; on self-hosted n8n, add it under &lt;strong&gt;Settings &amp;gt; Community nodes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the Apify node, create an &lt;strong&gt;Apify API&lt;/strong&gt; credential with your token from the Apify console (&lt;strong&gt;Settings &amp;gt; API &amp;amp; Integrations&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Paste the sheet ID into both Google Sheets nodes and pick your Google credential. Run it once by hand.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then filter the sheet: &lt;code&gt;klaviyoNoReviewApp&lt;/code&gt; is TRUE gives the homepage segment, and &lt;code&gt;dmarcPolicy&lt;/code&gt; is &lt;code&gt;none&lt;/code&gt; or &lt;code&gt;missing&lt;/code&gt; gives the deliverability one.&lt;/p&gt;

&lt;p&gt;Two limits. The $2 cap covers about 2,000 domains per run; for a bigger first batch, raise it in the Apify node ($1 per 1,000). And on Apify's free plan a run checks up to 100 domains, so a 500-row sheet fills over five mornings; any paid plan removes that cap.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you work from Claude Code or another MCP client
&lt;/h2&gt;

&lt;p&gt;With the Apify MCP server connected, this prompt runs the same check on your own list and builds the segments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the Apify Actor locaihost/domain-intel on the domains in domains.txt (one per line).
Before running, tell me how many domains you are sending; the price is $1 per 1,000.
When it finishes, make a table with one row per domain: email marketing tools, review apps,
live chat, buy now pay later, email host and DMARC policy, from techCategories and the DMARC
fields. Mark rows where errors.tech is set as "homepage not read". Then list: stores with
Klaviyo and no review app, stores with no email marketing tool, and stores on Mailchimp but
not Klaviyo. Remind me that review apps usually sit on product pages, so the first list
needs a product-page check before I use it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  More ways to use the tech-stack signal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your own CRM.&lt;/strong&gt; Export the website column of your accounts and run it. You learn which customers use a tool you integrate with, and which use a competitor's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitor customers.&lt;/strong&gt; Gorgias against Zendesk, Yotpo against Okendo, OneTrust against Cookiebot: each is a filter on one column. A list of stores on a competitor's app is a list of switching conversations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partner programmes.&lt;/strong&gt; If you build a Klaviyo or Gorgias integration, the stores already paying for that tool are the ones who can install yours today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IT and email services.&lt;/strong&gt; The email host column splits any list into Google Workspace and Microsoft 365 shops before the first call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agencies.&lt;/strong&gt; Run a prospect's domain and its five closest competitors before a pitch, and open with what they have and the others don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beyond Shopify.&lt;/strong&gt; Nothing here is Shopify-only except the free list in step 1 and the product-page pass. The Actor works on any domain: WordPress, Webflow, SaaS companies, local businesses.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The sample.&lt;/strong&gt; The 500 highest-ranked domains in the Tranco top 100,000 (list &lt;code&gt;N26LW&lt;/code&gt;, 13 October 2026) whose A record is in Shopify's &lt;code&gt;23.227.38.0/24&lt;/code&gt; block: 921 matched, ranks 2,175 to 75,938 were used. It is a list of large, popular stores from many countries, not a random sample of Shopify.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The run.&lt;/strong&gt; Run &lt;code&gt;fWhZBzHIOYeybUw0d&lt;/code&gt; on 14 October 2026 at 16:54 UTC, 1 GB of memory, 431.7 seconds, 484 domains charged. The product-page pass ran on 15 October 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detection is evidence, not certainty.&lt;/strong&gt; A technology counts only when its own script address, header or markup is on the page, never because a word appears in the text. Each item in &lt;code&gt;techStack&lt;/code&gt; carries a confidence score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproduce it.&lt;/strong&gt; The &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-list.mjs" rel="noopener noreferrer"&gt;list script&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-run.mjs" rel="noopener noreferrer"&gt;run script&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-analysis.py" rel="noopener noreferrer"&gt;analysis script&lt;/a&gt; and &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/recipe-2-product-check.py" rel="noopener noreferrer"&gt;product-page check&lt;/a&gt; are next to this post, with the &lt;a href="https://locaihost.org/blog/tech-stack-signal-shopify-klaviyo/analysis/results.json" rel="noopener noreferrer"&gt;computed results&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run this on your own list, post two numbers in the comments: how many domains you checked, and how much your first segment shrank after you looked at the product pages. That tells the next reader how far to trust a homepage read.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source: public DNS records, homepages and product pages of 500 Shopify storefronts from the Tranco top 100,000, read by locaihost data on 14 and 15 October 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>api</category>
      <category>sales</category>
      <category>data</category>
    </item>
    <item>
      <title>A hiring signal: 227 RevOps and sales-leadership jobs at 59 of 100 SaaS companies, in one 49-second run for $0.34</title>
      <dc:creator>locaihost data</dc:creator>
      <pubDate>Fri, 16 Oct 2026 13:37:19 +0000</pubDate>
      <link>https://dev.to/locaihost_data/a-hiring-signal-227-revops-and-sales-leadership-jobs-at-59-of-100-saas-companies-in-one-49-second-472m</link>
      <guid>https://dev.to/locaihost_data/a-hiring-signal-227-revops-and-sales-leadership-jobs-at-59-of-100-saas-companies-in-one-49-second-472m</guid>
      <description>&lt;p&gt;A job ad is the most honest buying signal there is. The company wrote it, dated it and put a budget next to it. When a software company posts for a deal desk analyst, it has more quotes and discount requests than its sales team can handle. When it posts for a sales compensation manager, its commission plans have outgrown a spreadsheet. When it posts for a GTM systems lead, its CRM is about to change. And when it posts six regional sales directors at once, it is opening territories.&lt;/p&gt;

&lt;p&gt;If you sell to sales teams (CPQ, commissions, forecasting, enablement, data), recruit for them, or want to work in one, that is the list you want: which of your target accounts are hiring for these roles right now, and which ones started this week.&lt;/p&gt;

&lt;p&gt;We built it for 100 B2B software companies on 14 October 2026 with our &lt;strong&gt;&lt;a href="https://apify.com/locaihost/careers-jobs" rel="noopener noreferrer"&gt;careers-jobs&lt;/a&gt;&lt;/strong&gt; Actor on Apify. It reads each company's own public job board on Greenhouse, Lever, Ashby, Personio or Teamtailor, so the jobs are the employer's own postings, with the employer's own dates and pay ranges. No job aggregator, no login, no people data: the rows are jobs, not candidates or recruiters. Every number below is from that run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The signal, written as an input
&lt;/h2&gt;

&lt;p&gt;Who we wanted: RevOps and sales operations roles (including deal desk, enablement, sales compensation and GTM systems), plus sales leadership from director up, at 100 B2B software companies. The 100 boards are in &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-companies.txt" rel="noopener noreferrer"&gt;recipe-1-companies.txt&lt;/a&gt;; the first five are shown here.&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;"companies"&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;"ashby:1password"&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:abnormalsecurity"&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: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;"greenhouse:algolia"&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:apolloio"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"titleKeywords"&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;"revenue operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"revops"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rev ops"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales ops"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"gtm operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"go-to-market operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gtm systems"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales systems"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"deal desk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales enablement"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"revenue enablement"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales strategy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales compensation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"head of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vp, sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vice president of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vice president, sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"director of sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sales director"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"director, sales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"regional vice president"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"area vice president"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chief revenue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head of revenue"&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;"includeDescription"&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;"onlyNew"&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;Three notes on the fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;companies&lt;/code&gt; takes a board token with its system (&lt;code&gt;greenhouse:datadog&lt;/code&gt;), a careers-board URL, or just a name (&lt;code&gt;figma&lt;/code&gt;), which the Actor looks up on the five systems in turn. Tokens are faster and never pick the wrong company.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;titleKeywords&lt;/code&gt; keeps a job if its title contains any of the phrases, ignoring case. Phrases match as text, so &lt;code&gt;sales director&lt;/code&gt; also catches "Regional Sales Director" and "Enterprise Sales Director - Majors".&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;includeDescription: false&lt;/code&gt; leaves out the job text. You don't need it for a signal, and the rows stay small enough for a spreadsheet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our first draft also had &lt;code&gt;sales manager&lt;/code&gt; and &lt;code&gt;manager, sales&lt;/code&gt;. That run returned 344 jobs instead of 227, and most of the extra 117 were partner, channel and territory sales managers who carry a quota. They are sellers, not sales leadership, so we dropped the two phrases.&lt;/p&gt;

&lt;h2&gt;
  
  
  What came back
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;227 open jobs at 59 of the 100 companies.&lt;/strong&gt; The run took 48.5 seconds. At $1.50 per 1,000 jobs plus a $0.00005 start fee, a user on the free or Starter plan pays $0.34 for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;114 RevOps and sales operations jobs at 52 companies, and 113 sales-leadership jobs at 30.&lt;/strong&gt; 23 companies are hiring for both, which is the strongest version of the signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;96 of the 227 were posted in the last 30 days, at 42 companies; 26 in the last seven.&lt;/strong&gt; The posting date is the board's own first-published date.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;133 jobs (59%) publish a pay range.&lt;/strong&gt; In US dollars the median published range was $242,500 to $277,500 for sales leadership (50 postings), $125,000 to $164,500 for revenue and sales operations (28) and $110,820 to $147,500 for deal desk (10). Sales ranges are often on-target earnings, base plus commission; the posting says which.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A second run with the same input, started 66 seconds after the first, returned nothing and cost $0.00005.&lt;/strong&gt; That is what &lt;code&gt;onlyNew&lt;/code&gt; is for, and it is how the daily version below stays cheap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sample rows
&lt;/h2&gt;

&lt;p&gt;Ten of the 227, one per company, newest first. These are the employer's own titles and locations, unedited.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;Posted&lt;/th&gt;
&lt;th&gt;Published pay range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;td&gt;Regional Vice President, Enterprise, Growth, UKI&lt;/td&gt;
&lt;td&gt;London&lt;/td&gt;
&lt;td&gt;2026-10-14&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temporal&lt;/td&gt;
&lt;td&gt;Senior Manager, Global Deal Desk&lt;/td&gt;
&lt;td&gt;United States (Remote)&lt;/td&gt;
&lt;td&gt;2026-10-14&lt;/td&gt;
&lt;td&gt;USD 224,000 to 285,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;Senior Deal Desk Analyst, EMEA&lt;/td&gt;
&lt;td&gt;Hybrid - London&lt;/td&gt;
&lt;td&gt;2026-10-14&lt;/td&gt;
&lt;td&gt;GBP 65,000 to 85,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;Sales Operations Planning Analyst&lt;/td&gt;
&lt;td&gt;Remote - US&lt;/td&gt;
&lt;td&gt;2026-10-13&lt;/td&gt;
&lt;td&gt;USD 128,560 to 160,700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sierra&lt;/td&gt;
&lt;td&gt;Sales Compensation Systems&lt;/td&gt;
&lt;td&gt;San Francisco, CA&lt;/td&gt;
&lt;td&gt;2026-10-13&lt;/td&gt;
&lt;td&gt;USD 170,000 to 220,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LaunchDarkly&lt;/td&gt;
&lt;td&gt;Senior Director, GTM Systems&lt;/td&gt;
&lt;td&gt;Remote - US&lt;/td&gt;
&lt;td&gt;2026-10-12&lt;/td&gt;
&lt;td&gt;USD 240,600 to 330,700&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abnormal Security&lt;/td&gt;
&lt;td&gt;Regional Sales Director, US SLED West&lt;/td&gt;
&lt;td&gt;Remote - USA&lt;/td&gt;
&lt;td&gt;2026-10-12&lt;/td&gt;
&lt;td&gt;USD 197,650 to 232,500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starburst&lt;/td&gt;
&lt;td&gt;Director of Sales Enablement&lt;/td&gt;
&lt;td&gt;Boston, MA&lt;/td&gt;
&lt;td&gt;2026-10-08&lt;/td&gt;
&lt;td&gt;USD 185,000 to 225,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webflow&lt;/td&gt;
&lt;td&gt;Senior Manager, Sales Compensation&lt;/td&gt;
&lt;td&gt;U.S. Remote&lt;/td&gt;
&lt;td&gt;2026-09-01&lt;/td&gt;
&lt;td&gt;USD 188,000 to 235,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Klaviyo&lt;/td&gt;
&lt;td&gt;Head of Sales, ANZ&lt;/td&gt;
&lt;td&gt;Sydney, AU&lt;/td&gt;
&lt;td&gt;2026-09-17&lt;/td&gt;
&lt;td&gt;AUD 280,000 to 420,000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each row also carries &lt;code&gt;department&lt;/code&gt;, &lt;code&gt;team&lt;/code&gt;, every listed location, a &lt;code&gt;country&lt;/code&gt; code, &lt;code&gt;workplaceType&lt;/code&gt; (remote, hybrid or onsite when the board says), &lt;code&gt;employmentType&lt;/code&gt;, &lt;code&gt;postedAt&lt;/code&gt;, &lt;code&gt;updatedAt&lt;/code&gt; on Greenhouse boards, the pay fields split into &lt;code&gt;salaryMin&lt;/code&gt;, &lt;code&gt;salaryMax&lt;/code&gt;, &lt;code&gt;salaryCurrency&lt;/code&gt; and &lt;code&gt;salaryPeriod&lt;/code&gt;, and the job and apply URLs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading it as an account list
&lt;/h2&gt;

&lt;p&gt;Grouped by company, the 227 jobs become a ranked account list. These are the twelve with the most matching openings.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;RevOps and sales ops&lt;/th&gt;
&lt;th&gt;Sales leadership&lt;/th&gt;
&lt;th&gt;Newest posting&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sierra&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;2026-10-13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elastic&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;2026-09-30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cato Networks&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2026-10-13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Braze&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2026-10-09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitLab&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2026-10-13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2026-10-14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verkada&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2026-09-02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Airwallex&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2026-09-17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datadog&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2026-09-29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JFrog&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;2026-10-05&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Navan&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2026-10-07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fivetran&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2026-10-09&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The full list of 59 companies, with the ATS board and how many jobs publish pay, is &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/accounts.csv" rel="noopener noreferrer"&gt;accounts.csv&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The two columns mean different things, so read them separately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sales leadership, many at once&lt;/strong&gt; means territories are opening. Sierra had 33 such postings, and 27 of them were "Enterprise Sales Director" roles split by industry (financial services, healthcare, retail, public sector) and region. That is a company building an enterprise sales team from close to nothing, and it will need everything a new team needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RevOps and sales ops&lt;/strong&gt; is the machinery behind the team. Of the 114, 53 were general revenue or sales operations roles, 23 deal desk, 19 enablement, 10 sales compensation and 9 GTM systems. Each one points at a different purchase: deal desk at quoting and contract tools, compensation at commissions software, GTM systems at CRM work and data tools, enablement at training and call-coaching tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both columns at once&lt;/strong&gt; (23 companies, including Datadog, GitLab, MongoDB, Okta and Braze) means the sales team is growing and the company is paying to make it run better at the same time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Read the titles once
&lt;/h2&gt;

&lt;p&gt;Text matching is simple, so look at the titles before you load them anywhere. In this run 3 of the 227 were not what we meant: &lt;code&gt;head of sales&lt;/code&gt; matched Notion's "Head of Sales Recruiting", &lt;code&gt;director, sales&lt;/code&gt; matched "Director, Sales Engineering" at Datadog, and &lt;code&gt;regional vice president&lt;/code&gt; matched a solutions-engineering leader at JFrog. A filter step in n8n, or a glance in the sheet, removes them.&lt;/p&gt;

&lt;p&gt;Two more things to know. The &lt;code&gt;country&lt;/code&gt; field was empty on 27 jobs, mostly postings that list several countries; the full location text is always there. And &lt;code&gt;workplaceType&lt;/code&gt; is only filled in when the board has the field (Ashby does, Greenhouse mostly doesn't), so 119 jobs (112 of them from Greenhouse) say nothing about remote work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The daily version: only new jobs, posted to Slack
&lt;/h2&gt;

&lt;p&gt;The useful form of this signal is a message every morning with the jobs that appeared since yesterday. &lt;code&gt;onlyNew: true&lt;/code&gt; makes that cheap: the Actor remembers which jobs it has already returned for this exact list of companies and keywords, in your own Apify account, and returns only the rest. Our second run returned zero rows. In the seven days before our run, these 100 companies first published 26 matching jobs, about four a day, so a daily run costs about a cent. Change the companies or the keywords and the memory starts fresh.&lt;/p&gt;

&lt;p&gt;We use an n8n workflow with five nodes for it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Schedule Trigger&lt;/strong&gt;, every day at 09:00.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companies and filters&lt;/strong&gt; (a Set node): your boards, one per line, and your title keywords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apify, Run actor and get dataset&lt;/strong&gt;: runs careers-jobs with &lt;code&gt;onlyNew: true&lt;/code&gt;, &lt;code&gt;includeDescription: false&lt;/code&gt; and &lt;code&gt;maxResults: 500&lt;/code&gt;, with a $1 cap on the run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt;: groups the new jobs by company into one message, with location and pay range when the posting has one. A quiet day sends nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack&lt;/strong&gt;: posts it to the channel you pick.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Download &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/files/hiring-signal-to-slack.json" rel="noopener noreferrer"&gt;hiring-signal-to-slack.json&lt;/a&gt;. It is our standard new-jobs workflow with this article's 100 companies and 27 keywords already filled in, one keyword per line (several of them contain commas). The plain version, for your own list, is &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/files/new-company-jobs-to-slack.json" rel="noopener noreferrer"&gt;new-company-jobs-to-slack.json&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Setup takes about five minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In n8n, open &lt;strong&gt;Workflows &amp;gt; Import from file&lt;/strong&gt; and pick the JSON.&lt;/li&gt;
&lt;li&gt;The workflow uses the verified Apify node (&lt;code&gt;@apify/n8n-nodes-apify&lt;/code&gt;). n8n Cloud installs it from the canvas; on self-hosted n8n, add it under &lt;strong&gt;Settings &amp;gt; Community nodes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In the Apify node, create an &lt;strong&gt;Apify API&lt;/strong&gt; credential with your token from the Apify console (&lt;strong&gt;Settings &amp;gt; API &amp;amp; Integrations&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Post to Slack&lt;/strong&gt;, pick your Slack credential and the channel.&lt;/li&gt;
&lt;li&gt;Edit &lt;strong&gt;Companies and filters&lt;/strong&gt; for your own accounts. Run it once by hand: the first run returns every open job that matches and posts the first 40 (the rest are in the run's dataset on Apify). From the next morning you only see new ones.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a list instead of a feed, swap the Slack node for &lt;strong&gt;Google Sheets &amp;gt; Append row&lt;/strong&gt; and map &lt;code&gt;company&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;location&lt;/code&gt;, &lt;code&gt;postedAt&lt;/code&gt;, &lt;code&gt;salaryMin&lt;/code&gt;, &lt;code&gt;salaryMax&lt;/code&gt;, &lt;code&gt;salaryCurrency&lt;/code&gt; and &lt;code&gt;url&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One limit to know: on Apify's free plan a run returns up to 100 jobs, and any paid Apify plan removes the cap. On the free plan the first run of this list would stop at 100 of the 227; the rest arrive with the next runs, because &lt;code&gt;onlyNew&lt;/code&gt; only remembers jobs it has actually returned. After that, a daily run is far below 100.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you work from Claude Code or another MCP client
&lt;/h2&gt;

&lt;p&gt;With the Apify MCP server connected, this prompt does the same job and gives you a table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use the Apify Actor locaihost/careers-jobs. Companies: the boards in recipe-1-companies.txt.
titleKeywords: revenue operations, revops, sales operations, deal desk, sales enablement,
sales compensation, gtm systems, head of sales, vp of sales, sales director, regional vice president,
chief revenue. includeDescription false, onlyNew false. Before running, tell me how many companies
you are sending; the price is $1.50 per 1,000 jobs. After the run, group the jobs by company into two
counts (RevOps and sales ops vs sales leadership), list any title that is clearly not a sales or
revenue role, and give me the 15 companies with the most matching jobs and their newest posting date.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  More ways to use the hiring signal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your own customers.&lt;/strong&gt; Put your customer list in &lt;code&gt;companies&lt;/code&gt;. A new sales compensation or GTM systems hire at a customer means a tool review is coming; be in it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitor displacement.&lt;/strong&gt; Add &lt;code&gt;keywords: ["salesforce cpq"]&lt;/code&gt; or the name of a competitor's product. &lt;code&gt;keywords&lt;/code&gt; searches the job text as well as the title (turn &lt;code&gt;includeDescription&lt;/code&gt; back on to see the line), so you learn which accounts run the tool you replace.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Region launches.&lt;/strong&gt; &lt;code&gt;locations: ["Japan", "Tokyo"]&lt;/code&gt; or &lt;code&gt;["Germany", "DACH"]&lt;/code&gt; on the leadership keywords shows who is opening a country, before the press release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recruiting.&lt;/strong&gt; Agencies: the leadership column is a list of hiring managers about to need a team. Swap the keywords to &lt;code&gt;account executive&lt;/code&gt; and &lt;code&gt;sales development&lt;/code&gt; to see the volume roles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job seekers.&lt;/strong&gt; Drop the company list down to the twenty places you would join, set &lt;code&gt;withSalaryOnly: true&lt;/code&gt;, and run it daily. You get the posting the morning it appears, with the pay range.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Other functions.&lt;/strong&gt; The method is one field. &lt;code&gt;titleKeywords: ["data engineer", "analytics engineer"]&lt;/code&gt; is a list for data tooling, &lt;code&gt;["payroll", "people operations"]&lt;/code&gt; for HR software, &lt;code&gt;["procurement", "sourcing"]&lt;/code&gt; for spend management.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The sample.&lt;/strong&gt; 100 B2B software companies we picked by hand from the 300 tech employers whose job boards we confirmed for an &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/" rel="noopener noreferrer"&gt;earlier analysis&lt;/a&gt;. Big platforms, developer tools, data and security software, HR and finance software. It is not a random sample of SaaS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The run.&lt;/strong&gt; Run &lt;code&gt;wLJP9qnbf3BdkJf3r&lt;/code&gt; on 14 October 2026 at 16:53 UTC, then run &lt;code&gt;shW3oBZWh8Txc6rru&lt;/code&gt; with the same input. Boards answered: Greenhouse 151 jobs, Ashby 74, Lever 1, Teamtailor 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A posting is not a hire.&lt;/strong&gt; One ad can cover several openings, some ads stay up for months, and a few are internships. A Mirakl sales enablement internship first published in October 2025 was still open.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproduce it.&lt;/strong&gt; The &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-companies.txt" rel="noopener noreferrer"&gt;company list&lt;/a&gt;, the &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-run.mjs" rel="noopener noreferrer"&gt;run script&lt;/a&gt; and the &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/recipe-1-analysis.py" rel="noopener noreferrer"&gt;analysis script&lt;/a&gt; are next to this post, with the &lt;a href="https://locaihost.org/blog/hiring-signal-revops-sales-leaders/analysis/results.json" rel="noopener noreferrer"&gt;computed results&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you run this on your own account list, post two numbers in the comments: how many of your accounts had at least one matching job, and how many matches were new after a week. That tells the next reader how often to run it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source: the public job boards of 100 employers on Greenhouse, Ashby, Lever and Teamtailor, read by locaihost data on 14 October 2026.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>api</category>
      <category>sales</category>
      <category>data</category>
    </item>
    <item>
      <title>Which UK public bodies pay their suppliers late? What 675 official payment reports say (2026)</title>
      <dc:creator>locaihost data</dc:creator>
      <pubDate>Thu, 15 Oct 2026 08:37:14 +0000</pubDate>
      <link>https://dev.to/locaihost_data/which-uk-public-bodies-pay-their-suppliers-late-what-675-official-payment-reports-say-2026-1lo</link>
      <guid>https://dev.to/locaihost_data/which-uk-public-bodies-pay-their-suppliers-late-what-675-official-payment-reports-say-2026-1lo</guid>
      <description>&lt;p&gt;The Procurement Act 2023 came into force in England, Wales and Northern Ireland on 24 February 2025. One of its quieter rules (section 69) says a contracting authority must publish a &lt;em&gt;payments compliance notice&lt;/em&gt; for every six-month period. The notice says what share of invoices it paid within 30 days, within 31 to 60 days and after 60 days, its average days to pay, and how much of what fell due it had not paid. The first notices appeared on the government's Find a Tender service in April 2026. By 14 October 2026 there were 714, from 620 authorities. 39 of them were later corrected, which leaves 675 current reports.&lt;/p&gt;

&lt;p&gt;These are the authorities' own figures, published as official notices. We have not audited them, and the notes below explain where they are hard to compare. What follows is what each body reported.&lt;/p&gt;

&lt;p&gt;Five findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The typical public body reported paying 94% of invoices within 30 days.&lt;/strong&gt; Across the 514 reports for October 2025 to March 2026 that give the figure, the median authority paid 94.1% within 30 days and took 17 days on average. 236 (45.9%) reported 95% or more, and 50 reported 100%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One in six paid less than 80% on time.&lt;/strong&gt; 85 of the 514 (16.5%) reported paying fewer than 80% of invoices within 30 days, and 10 reported fewer than half.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Universities and housing associations reported the slowest payment.&lt;/strong&gt; Universities and colleges had a median of 81.5% within 30 days and 26 days on average, and 8 of their 20 reports were below 80%. Housing associations and council housing companies had a median of 87.4% and 24 days, with 27 of 83 below 80%. Central government and national bodies (96.5%, 10 days) and councils (96.0%, 14 days) reported the fastest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;London's councils reported paying more slowly than councils elsewhere in England.&lt;/strong&gt; The median London council paid 92.8% within 30 days. In the East of England the figure was 97.6%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Of the 41 bodies that have now reported twice, 14 got worse and 9 got better.&lt;/strong&gt; The largest falls were at Newlon Housing Trust (down 15 points), Connexus Homes (down 14.3) and the Victoria and Albert Museum (down 10.3). The April to September 2026 reports are due by about 30 October, so most authorities will have a second report within weeks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How the reports are spread
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paid within 30 days&lt;/th&gt;
&lt;th&gt;Reports&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;9.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95% to 99.9%&lt;/td&gt;
&lt;td&gt;186&lt;/td&gt;
&lt;td&gt;36.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90% to 94.9%&lt;/td&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;19.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80% to 89.9%&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;17.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50% to 79.9%&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;14.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Under 50%&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;October 2025 to March 2026, 514 reports that give a within-30-days figure. Every contract scope.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most of what is paid late is paid within two months. The median report put 1.0% of invoices at more than 60 days, and the median share of payments that fell due but were not made was 0.8%.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much gets paid late
&lt;/h2&gt;

&lt;p&gt;We can't put a pound figure on it. A payments compliance notice gives percentages of invoices, and no notice gives the number of invoices or their value, so there is no way to weight a council paying a few thousand invoices against a department paying hundreds of thousands. What the reports do allow is a simple average. Across the 514 reports, an average of 10.8% of invoices were paid after 30 days (the mean on-time share is 89.2%). That treats every authority equally, so it describes the typical public body, not the typical pound.&lt;/p&gt;

&lt;h2&gt;
  
  
  By type of authority
&lt;/h2&gt;

&lt;p&gt;Find a Tender only sorts authorities into three broad types (central government, sub-central government and public undertakings), so we grouped them by name: councils, NHS bodies, housing associations and so on. The groups and the method are in the notes at the end.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type of authority&lt;/th&gt;
&lt;th&gt;Reports&lt;/th&gt;
&lt;th&gt;Median paid within 30 days&lt;/th&gt;
&lt;th&gt;Median average days&lt;/th&gt;
&lt;th&gt;Below 80%&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Central government and national bodies&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;96.5%&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9 (8.6%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Councils&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;td&gt;96.0%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;10 (6.2%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Combined authorities and other local bodies&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;94.6%&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;4 (18.2%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Police and fire&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;94.0%&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;5 (14.3%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NHS bodies&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;91.0%&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;14 (24.1%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Council-owned companies and other bodies&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;89.5%&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;5 (41.7%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport operators&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;89.0%&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;3 (15.8%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Housing associations and council housing companies&lt;/td&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;87.4%&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;27 (32.5%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Universities and colleges&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;81.5%&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;8 (40.0%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;October 2025 to March 2026, 514 reports. Average days rounded to the nearest day.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Housing associations and universities are not government departments. They publish these notices because the Act counts them as contracting authorities, for example where they are mainly publicly funded or under public control. Several of them report only on contracts let under the new Act (see the notes on scope).&lt;/p&gt;

&lt;h2&gt;
  
  
  Lowest and highest reported
&lt;/h2&gt;

&lt;p&gt;These lists use only reports that cover all of an authority's contracts, including those signed before the Act, so that like is compared with like (409 reports for October 2025 to March 2026).&lt;/p&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;Authority&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Paid within 30 days&lt;/th&gt;
&lt;th&gt;Paid after 60 days&lt;/th&gt;
&lt;th&gt;Average days&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Newlon Housing Trust&lt;/td&gt;
&lt;td&gt;Housing&lt;/td&gt;
&lt;td&gt;0%&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;191&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Northern Trains Limited&lt;/td&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;32.3%&lt;/td&gt;
&lt;td&gt;9.4%&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;University of Leicester&lt;/td&gt;
&lt;td&gt;University&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;NPL Management Limited&lt;/td&gt;
&lt;td&gt;National body&lt;/td&gt;
&lt;td&gt;52%&lt;/td&gt;
&lt;td&gt;10%&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;DFT Operator Limited&lt;/td&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;55.2%&lt;/td&gt;
&lt;td&gt;8.3%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;South Bank University Enterprises Ltd&lt;/td&gt;
&lt;td&gt;University&lt;/td&gt;
&lt;td&gt;55.9%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Havant Borough Council&lt;/td&gt;
&lt;td&gt;Council&lt;/td&gt;
&lt;td&gt;57.0%&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Liverpool Experience Campus Ltd&lt;/td&gt;
&lt;td&gt;Central government (as listed)&lt;/td&gt;
&lt;td&gt;57.9%&lt;/td&gt;
&lt;td&gt;2.4%&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Vico Homes Limited&lt;/td&gt;
&lt;td&gt;Housing&lt;/td&gt;
&lt;td&gt;61%&lt;/td&gt;
&lt;td&gt;18%&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Supply Chain Coordination Limited&lt;/td&gt;
&lt;td&gt;NHS&lt;/td&gt;
&lt;td&gt;62%&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Trydan Gwyrdd Cymru Ltd&lt;/td&gt;
&lt;td&gt;National body&lt;/td&gt;
&lt;td&gt;62%&lt;/td&gt;
&lt;td&gt;1%&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Lowest share of invoices paid within 30 days, October 2025 to March 2026, reports covering all contracts. Ties are listed together. Newlon Housing Trust's report for this period was corrected twice, and the first version gave 100% within 30 days. Its separate report for January to March 2026 gives 35%, and its April to September 2026 report gives 20%. All three were published on 30 September 2026.&lt;/em&gt;&lt;/p&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;Authority&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Paid within 30 days&lt;/th&gt;
&lt;th&gt;Average days&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Government Commercial Agency&lt;/td&gt;
&lt;td&gt;Central government&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Restoration and Renewal Delivery Authority Ltd&lt;/td&gt;
&lt;td&gt;Central government&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;3.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;HMRC Valuation Office&lt;/td&gt;
&lt;td&gt;Central government&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;3.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;UK Hydrographic Office&lt;/td&gt;
&lt;td&gt;Central government&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Mid Sussex District Council&lt;/td&gt;
&lt;td&gt;Council&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Lancashire Combined County Authority&lt;/td&gt;
&lt;td&gt;Combined authority&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Folkestone and Hythe District Council&lt;/td&gt;
&lt;td&gt;Council&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;9.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Tunbridge Wells Borough Council&lt;/td&gt;
&lt;td&gt;Council&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;10.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Transport for Wales Rail Ltd&lt;/td&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;23.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;HM Revenue and Customs&lt;/td&gt;
&lt;td&gt;Central government&lt;/td&gt;
&lt;td&gt;99.99%&lt;/td&gt;
&lt;td&gt;3.9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Highest share of invoices paid within 30 days, then fewest average days. October 2025 to March 2026, reports covering all contracts. 41 more reports in this period gave 100%, but they cover only contracts let under the new Act.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The longest average waits, among reports covering all contracts, were at Newlon Housing Trust (191 days), Southwark Council (61 days, with 71.5% paid within 30 days), Notting Hill Genesis (49 days), and Golden Lane Housing and the Royal Borough of Windsor and Maidenhead (48 days each). An average can sit well above the 30-day line while most invoices are paid within it, because a few very old invoices pull it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  London and the rest of England
&lt;/h2&gt;

&lt;p&gt;Councils are the one group where an authority's location says something about the area it serves. Each notice carries the authority's own region code, so we grouped councils by English region. We left out other bodies: a national body's head office says little about where it spends.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Region&lt;/th&gt;
&lt;th&gt;Councils reporting&lt;/th&gt;
&lt;th&gt;Median paid within 30 days&lt;/th&gt;
&lt;th&gt;Median average days&lt;/th&gt;
&lt;th&gt;Below 80%&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;East of England&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;97.6%&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;South East&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;97.0%&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;West Midlands&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;97.0%&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;North East&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;96.9%&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;East Midlands&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;95.7%&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;North West&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;95.2%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;South West&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;95.2%&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Yorkshire and the Humber&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;94.0%&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;London&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;92.8%&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;October 2025 to March 2026, 160 council reports. Some regions have few reports, so small gaps between them mean little. No council in Wales, Scotland or Northern Ireland has published a payments compliance notice so far. Scottish devolved authorities follow their own procurement rules.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Who got better or worse
&lt;/h2&gt;

&lt;p&gt;41 authorities now have two reports for consecutive periods, almost all October 2025 to March 2026 followed by April to September 2026. On the first figure both reports give, 14 got worse, 9 got better and 18 changed by less than one point.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Authority&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;th&gt;Average days, before → after&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Newlon Housing Trust&lt;/td&gt;
&lt;td&gt;35%&lt;/td&gt;
&lt;td&gt;20%&lt;/td&gt;
&lt;td&gt;−15.0 pts&lt;/td&gt;
&lt;td&gt;49 → 63&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connexus Homes Limited&lt;/td&gt;
&lt;td&gt;80.8%&lt;/td&gt;
&lt;td&gt;66.5%&lt;/td&gt;
&lt;td&gt;−14.3 pts&lt;/td&gt;
&lt;td&gt;30 → 51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Victoria and Albert Museum&lt;/td&gt;
&lt;td&gt;87.5%&lt;/td&gt;
&lt;td&gt;77.2%&lt;/td&gt;
&lt;td&gt;−10.3 pts&lt;/td&gt;
&lt;td&gt;15 → 25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lee Valley Regional Park Authority&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;−9.0 pts&lt;/td&gt;
&lt;td&gt;20 → 20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nottingham City Council&lt;/td&gt;
&lt;td&gt;65.9%&lt;/td&gt;
&lt;td&gt;59.3%&lt;/td&gt;
&lt;td&gt;−6.5 pts&lt;/td&gt;
&lt;td&gt;24 → 26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Police and Crime Commissioner for Durham&lt;/td&gt;
&lt;td&gt;95.2%&lt;/td&gt;
&lt;td&gt;90.1%&lt;/td&gt;
&lt;td&gt;−5.2 pts&lt;/td&gt;
&lt;td&gt;16 → 14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Healthcare Quality Improvement Partnership&lt;/td&gt;
&lt;td&gt;95.2%&lt;/td&gt;
&lt;td&gt;99.1%&lt;/td&gt;
&lt;td&gt;+3.9 pts&lt;/td&gt;
&lt;td&gt;21 → 22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corporation of Trinity House&lt;/td&gt;
&lt;td&gt;92.4%&lt;/td&gt;
&lt;td&gt;94.9%&lt;/td&gt;
&lt;td&gt;+2.5 pts&lt;/td&gt;
&lt;td&gt;12 → 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Forest District Council&lt;/td&gt;
&lt;td&gt;94.5%&lt;/td&gt;
&lt;td&gt;96.6%&lt;/td&gt;
&lt;td&gt;+2.1 pts&lt;/td&gt;
&lt;td&gt;15 → 14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sandwell and West Birmingham Hospitals NHS Trust&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;+2.0 pts&lt;/td&gt;
&lt;td&gt;24 → 12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Havebury Homes&lt;/td&gt;
&lt;td&gt;95.6%&lt;/td&gt;
&lt;td&gt;97.2%&lt;/td&gt;
&lt;td&gt;+1.6 pts&lt;/td&gt;
&lt;td&gt;16 → 16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kirklees Council&lt;/td&gt;
&lt;td&gt;92.5%&lt;/td&gt;
&lt;td&gt;94.1%&lt;/td&gt;
&lt;td&gt;+1.6 pts&lt;/td&gt;
&lt;td&gt;19 → 18&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Share of invoices paid within 30 days. Newlon Housing Trust's earlier period is January to March 2026; all the others compare October 2025 to March 2026 with April to September 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Among the first 48 April to September reports, the lowest were Newlon Housing Trust (20%), Hafod Housing Association (56%), Nottingham City Council (59.3%), WM Trains (66%) and Connexus Homes (66.5%).&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology and caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source.&lt;/strong&gt; Every payments compliance notice (form UK17) published on Find a Tender up to 14 October 2026, read through its open organisation release API. That is 714 notices, 39 of them replaced by later corrections, which leaves 675 current reports from 620 authorities. Only the latest version of a corrected report is used. We collected the notices with the uk-procurement-act scraper we maintain on Apify and checked every figure against the raw notices from the API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Periods.&lt;/strong&gt; Most reports (533) cover October 2025 to March 2026. 93 cover only January to March 2026, usually an authority's first, shorter period, and 49 cover April to September 2026. The rankings, the type breakdown and the regional view use October 2025 to March 2026 only, so they compare six-month periods with each other.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope.&lt;/strong&gt; An authority can report on all its contracts (496 reports), only on contracts let under the Procurement Act 2023 above the threshold (142), or on all Procurement Act contracts (37). Reports limited to new-Act contracts can rest on very few invoices, which is how three of them came to report 0% within 30 days. The lowest and highest tables use only all-contract reports; the overall figures use every scope.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What's left out.&lt;/strong&gt; 26 reports contain only zeros, usually because nothing fell due, and 11 give only the on-terms and unpaid figures without a within-30-days share. Neither is ranked. We also don't use the statutory "paid on terms" figure, because 7 current reports give 0% on terms while their own day counts show invoices paid within 30 days.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Types of authority.&lt;/strong&gt; Find a Tender lists only three types, so we grouped authorities by keywords in their names (NHS, council, police, fire, university and so on) and a list of known housing associations and national regulators. Anything we couldn't place by name kept Find a Tender's own type. A few judgement calls are unavoidable. For example, arm's-length housing companies owned by councils count as housing, and council-owned service companies count as other bodies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regions.&lt;/strong&gt; Each notice carries the authority's own ITL (formerly NUTS) region code. We used its first level and only for councils.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change.&lt;/strong&gt; "Before" is the same authority's most recent earlier period that ended before the new one began. A change of under one point counts as unchanged.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People.&lt;/strong&gt; The notices name the officer who approved each report. We never collected those names or the free-text narratives, and this article names organisations only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a judgement.&lt;/strong&gt; These are figures the authorities published about themselves. A low figure can reflect disputed or wrongly addressed invoices, a changeover in finance systems or a data-entry error, and some authorities explain theirs in the notice's narrative. Each notice is on Find a Tender.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Contains public sector information licensed under the Open Government Licence v3.0. Source: Find a Tender service (UK Cabinet Office), payments compliance notices read on 14 October 2026.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>opendata</category>
      <category>uk</category>
      <category>government</category>
      <category>data</category>
    </item>
    <item>
      <title>What 300 tech companies' career pages say about hiring in October 2026: salaries, remote work and which ATS they use</title>
      <dc:creator>locaihost data</dc:creator>
      <pubDate>Tue, 13 Oct 2026 13:33:48 +0000</pubDate>
      <link>https://dev.to/locaihost_data/what-300-tech-companies-career-pages-say-about-hiring-in-october-2026-salaries-remote-work-and-3f1f</link>
      <guid>https://dev.to/locaihost_data/what-300-tech-companies-career-pages-say-about-hiring-in-october-2026-salaries-remote-work-and-3f1f</guid>
      <description>&lt;p&gt;Colorado has required a pay range in job ads since 2021. California and Washington followed in 2023, and so did New York, and since 2024 nine more states and DC have brought in similar rules, the latest (Virginia and Maine) in July 2026. We wanted to see what that looks like on employers' own career pages, so on 10 October 2026 we downloaded every open posting from the public job boards of 300 well-known tech companies. That came to 29,816 postings. Every company uses one of five applicant tracking systems (ATS): Greenhouse, Lever, Ashby, Personio or Teamtailor.&lt;/p&gt;

&lt;p&gt;Five findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;55% of postings show a pay range, and 76% of US postings do.&lt;/strong&gt; 16,469 of the 29,816 postings carried a range. Canada was close to the US at 79%, while postings in the EU (24%), the UK (16%) and India (1%) rarely did.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The law shows up inside the same company.&lt;/strong&gt; 86.5% of US postings that list a California, New York, Washington or Colorado location show a range. Only 30.7% of postings that list other states, and none of those four, do. SpaceX put a range on 86% of its 1,546 postings in the four states and on 0.4% of its 1,120 postings elsewhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The median US software engineering posting offers $165,000 to $235,000.&lt;/strong&gt; That figure comes from 4,333 postings. Machine learning and research roles post $213,000 to $300,000, and customer success and support roles $109,000 to $166,000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-site is the most common arrangement.&lt;/strong&gt; Among the 8,230 postings that state one, 38.3% are on-site, 33.8% hybrid and 27.8% fully remote. US postings are less often remote than the rest (24.4% against 33.5%).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Greenhouse leads, but AI companies pick Ashby.&lt;/strong&gt; 158 of the 300 companies use Greenhouse and 103 use Ashby. Among the 37 AI companies in the sample, 28 use Ashby.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who publishes pay
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where the posting is&lt;/th&gt;
&lt;th&gt;Postings&lt;/th&gt;
&lt;th&gt;With a pay range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;US: lists a CA, NY, WA or CO location&lt;/td&gt;
&lt;td&gt;11,893&lt;/td&gt;
&lt;td&gt;86.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US: lists a state with a newer law, none of the four&lt;/td&gt;
&lt;td&gt;1,407&lt;/td&gt;
&lt;td&gt;83.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US: remote, no state named&lt;/td&gt;
&lt;td&gt;1,544&lt;/td&gt;
&lt;td&gt;82.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US: other states only&lt;/td&gt;
&lt;td&gt;3,212&lt;/td&gt;
&lt;td&gt;30.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US: state not identified&lt;/td&gt;
&lt;td&gt;286&lt;/td&gt;
&lt;td&gt;69.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canada&lt;/td&gt;
&lt;td&gt;866&lt;/td&gt;
&lt;td&gt;78.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EU member states&lt;/td&gt;
&lt;td&gt;3,292&lt;/td&gt;
&lt;td&gt;23.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;United Kingdom&lt;/td&gt;
&lt;td&gt;1,620&lt;/td&gt;
&lt;td&gt;16.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;968&lt;/td&gt;
&lt;td&gt;1.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elsewhere, or several countries&lt;/td&gt;
&lt;td&gt;4,728&lt;/td&gt;
&lt;td&gt;17.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;A posting that lists San Francisco and Austin counts in the first row. "Newer law": Illinois, Massachusetts, New Jersey, Minnesota, Maryland, Hawaii, Vermont, Virginia, Maine or DC.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Remote US postings show a range almost as often as postings in the four states. That fits how the laws work: Colorado's rule, for example, covers remote jobs that a Colorado resident could do. It's simpler to publish the range than to exclude the state.&lt;/p&gt;

&lt;p&gt;SpaceX matters in the "other states" row. It has more postings than any other company in the sample, and a third of the postings in that row are its jobs outside the four states. Without SpaceX, the row rises from 30.7% to 47.0%, still far below every other US row. The pattern isn't SpaceX's alone. We found 53 companies with at least five US postings in the four states and at least five that list only other states. 16 of them publish ranges at least 10 percentage points less often outside the four states, including Rocket Lab (100% against 0%), xAI (87% against 4%) and Navan (90% against 10%). The other 37 don't.&lt;/p&gt;

&lt;p&gt;Most employers treat pay transparency as a company policy, not a per-posting choice. Of the 205 companies with at least five US postings, 134 put a range on 90% or more of them. Eleven put a range on none. Counting each company once, the average company shows a range on 76.9% of its US postings, close to the 75.9% for all US postings pooled.&lt;/p&gt;

&lt;p&gt;Outside the US, Canada stands out. British Columbia has required pay in public job postings since November 2023, and Ontario since January 2026. 81.9% of postings in Ontario and 83.3% in British Columbia show a range. The EU's pay-transparency directive was due in national law by June 2026. It lets employers give the range before the interview instead of in the ad, and only 23.8% of the EU postings we saw include one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the ranges say
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role family&lt;/th&gt;
&lt;th&gt;Share of postings&lt;/th&gt;
&lt;th&gt;US, with range&lt;/th&gt;
&lt;th&gt;Median range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Software engineering&lt;/td&gt;
&lt;td&gt;28.6%&lt;/td&gt;
&lt;td&gt;4,333&lt;/td&gt;
&lt;td&gt;$165–235k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sales&lt;/td&gt;
&lt;td&gt;12.5%&lt;/td&gt;
&lt;td&gt;1,430&lt;/td&gt;
&lt;td&gt;$145–205k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product management&lt;/td&gt;
&lt;td&gt;4.9%&lt;/td&gt;
&lt;td&gt;838&lt;/td&gt;
&lt;td&gt;$179–240k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data science and analytics&lt;/td&gt;
&lt;td&gt;4.4%&lt;/td&gt;
&lt;td&gt;676&lt;/td&gt;
&lt;td&gt;$135–190k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketing and communications&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;td&gt;620&lt;/td&gt;
&lt;td&gt;$146–195k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Customer success and support&lt;/td&gt;
&lt;td&gt;5.0%&lt;/td&gt;
&lt;td&gt;507&lt;/td&gt;
&lt;td&gt;$109–166k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine learning and research&lt;/td&gt;
&lt;td&gt;2.7%&lt;/td&gt;
&lt;td&gt;487&lt;/td&gt;
&lt;td&gt;$213–300k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Solutions and sales engineering&lt;/td&gt;
&lt;td&gt;4.2%&lt;/td&gt;
&lt;td&gt;482&lt;/td&gt;
&lt;td&gt;$180–247k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engineering management&lt;/td&gt;
&lt;td&gt;2.3%&lt;/td&gt;
&lt;td&gt;347&lt;/td&gt;
&lt;td&gt;$217–299k&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Design&lt;/td&gt;
&lt;td&gt;1.7%&lt;/td&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;td&gt;$167–220k&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Role families come from job titles. "Share of postings" is of all 29,816. "Median range" covers annual US-dollar ranges on US postings, internships excluded: the median of the posted minimums and the median of the posted maximums, across all seniority levels.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A typical range is wide. The median maximum is 33% above the minimum, and 5% of ranges have a top figure at least double the bottom one. Only 1.2% state a single figure instead of a range.&lt;/p&gt;

&lt;p&gt;Location moves the number. For software engineering, the median midpoint is $205,000 for postings that list one of the four states and $151,000 for postings that list only other states. The second group is small (117 postings), so treat that gap as a rough guide.&lt;/p&gt;

&lt;p&gt;Software engineering is the largest family by far, at 28.6% of all postings. Recruiting is one of the smallest, at 1.6%. 6.8% of postings are hands-on jobs, such as technicians, warehouse staff and retail crews, and nearly half of those are at SpaceX and Gopuff. They show a range least often of any group (21.8% in the US).&lt;/p&gt;

&lt;h2&gt;
  
  
  Remote, hybrid or on-site
&lt;/h2&gt;

&lt;p&gt;Lever, Ashby and Teamtailor have a structured field for the work arrangement, and 88.8% of their 9,273 postings fill it in. Greenhouse and Personio don't have one. On those boards, we can only see "remote" when the location says so, which 18.3% of their postings do.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Arrangement&lt;/th&gt;
&lt;th&gt;All stated&lt;/th&gt;
&lt;th&gt;US&lt;/th&gt;
&lt;th&gt;Outside the US&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;On-site&lt;/td&gt;
&lt;td&gt;38.3%&lt;/td&gt;
&lt;td&gt;42.8%&lt;/td&gt;
&lt;td&gt;31.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid&lt;/td&gt;
&lt;td&gt;33.8%&lt;/td&gt;
&lt;td&gt;32.9%&lt;/td&gt;
&lt;td&gt;35.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fully remote&lt;/td&gt;
&lt;td&gt;27.8%&lt;/td&gt;
&lt;td&gt;24.4%&lt;/td&gt;
&lt;td&gt;33.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postings&lt;/td&gt;
&lt;td&gt;8,230&lt;/td&gt;
&lt;td&gt;5,100&lt;/td&gt;
&lt;td&gt;3,130&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Lever, Ashby and Teamtailor postings only. Each column adds up to 100%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Remote is a function of the job. 58.2% of customer success and support postings are remote, and so are 41.0% of product management postings. That falls to 24.2% for software engineering and 22.8% for machine learning and research, where hybrid is more common (40.8% and 50.3%). Production, field and retail jobs are almost never remote (2.4%).&lt;/p&gt;

&lt;h2&gt;
  
  
  Which ATS, and how much they're hiring
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ATS&lt;/th&gt;
&lt;th&gt;Companies&lt;/th&gt;
&lt;th&gt;Postings&lt;/th&gt;
&lt;th&gt;With a pay range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Greenhouse&lt;/td&gt;
&lt;td&gt;158&lt;/td&gt;
&lt;td&gt;20,528&lt;/td&gt;
&lt;td&gt;57.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ashby&lt;/td&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;6,480&lt;/td&gt;
&lt;td&gt;53.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lever&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;2,628&lt;/td&gt;
&lt;td&gt;46.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teamtailor&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;165&lt;/td&gt;
&lt;td&gt;5.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personio&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Shares of our sample, not of the ATS market: we only chose companies whose boards we could find on these five systems.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ashby is the newer system, and it shows. 28 of the 37 AI companies use it, including OpenAI, Perplexity, Cohere and ElevenLabs. Greenhouse dominates older platforms and developer-tool companies (29 of 40 consumer platforms, 48 of 71 developer-tool and data companies). A few companies had identical boards live on two systems the day we looked, Webflow on Greenhouse and Ashby and Qonto on Lever and Ashby. That looks like a switch in progress, and we counted each company once. Differences in pay disclosure between the systems mostly reflect which companies use them. Lever's lower rate, for example, comes largely from Gopuff's store jobs. Without them, Lever's rate would be 61.1%.&lt;/p&gt;

&lt;p&gt;Hiring is concentrated. The median company had 42 open postings, and the middle half had between 17 and 99. Eight companies had 500 or more and held 26.2% of all postings. SpaceX alone had 2,725 (9.1%), followed by Veeva (938), Databricks (892), Gopuff (796), Stripe (728) and Anthropic (645). At the other end, 49 companies (16.3%) had fewer than ten. Postings stay up a while: the median posting was 53 days old, and 16.5% were more than six months old.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology and caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sample.&lt;/strong&gt; We wrote a list of 587 well-known tech companies and startups, then looked each one up on the five ATSs' public job-board APIs. 379 had a board with at least one open job that we could confirm belonged to that company. 20 tokens led to a different organisation's board and were rejected by hand. We then picked 300 of the 379 in a fixed pseudo-random order. This is a convenience sample, so it is not representative of tech or of the job market. It leaves out every company on Workday or an in-house system, which includes most of the largest employers, and it leans towards US venture-backed companies. The &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-companies.txt" rel="noopener noreferrer"&gt;company list&lt;/a&gt;, the &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-candidates.txt" rel="noopener noreferrer"&gt;candidates&lt;/a&gt; and the &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-rejected.txt" rel="noopener noreferrer"&gt;rejections&lt;/a&gt; are published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot.&lt;/strong&gt; All 300 boards were read on 10 October 2026, 17:13–17:14 UTC. A posting is an open ad, not a hire. One ad can cover several openings or locations, and some are evergreen.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay.&lt;/strong&gt; We use the ATS's structured pay field when there is one (Ashby, Lever) and otherwise the first pay range in the posting text. Multi-zone postings often list the highest-cost zone first. Sales ranges may be base or on-target earnings. These are posted ranges, not pay. In a hand check of 40 US Greenhouse postings, all 20 extracted ranges matched the posting. 1 of the 20 postings recorded as having no range stated a single salary figure we missed, so disclosure may be slightly understated.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Location and role.&lt;/strong&gt; US states come from the location text. Role families come from job-title keywords, and 9.4% of postings fit none. The ATS department field is filled in on 99.8% of postings, but it is free text: "Engineering" next to cost-centre codes and store brands. That is why we classified titles instead.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weighting.&lt;/strong&gt; Figures are per posting unless stated, so big employers count more. Counting each company once, the average company shows a range on 51.2% of its postings (55.2% pooled).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible.&lt;/strong&gt; Node.js scripts &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-companies.mjs" rel="noopener noreferrer"&gt;find the boards&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-run.mjs" rel="noopener noreferrer"&gt;run the collection&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026.mjs" rel="noopener noreferrer"&gt;compute every figure&lt;/a&gt; (&lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/results.json" rel="noopener noreferrer"&gt;results.json&lt;/a&gt;) and &lt;a href="https://locaihost.org/blog/careers-pages-oct-2026/analysis/careers-2026-check.mjs" rel="noopener noreferrer"&gt;run the hand check&lt;/a&gt;. The data is company-level only, with no recruiter or other personal names.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Source: public job boards of 300 employers on Greenhouse, Lever, Ashby, Personio and Teamtailor, read by locaihost data on 10 October 2026.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>hiring</category>
      <category>salary</category>
      <category>remotework</category>
      <category>data</category>
    </item>
    <item>
      <title>How the top 1,000 websites handle email security in 2026: DMARC, SPF, BIMI and who hosts their email</title>
      <dc:creator>locaihost data</dc:creator>
      <pubDate>Sat, 10 Oct 2026 14:47:39 +0000</pubDate>
      <link>https://dev.to/locaihost_data/how-the-top-1000-websites-handle-email-security-in-2026-dmarc-spf-bimi-and-who-hosts-their-email-4g59</link>
      <guid>https://dev.to/locaihost_data/how-the-top-1000-websites-handle-email-security-in-2026-dmarc-spf-bimi-and-who-hosts-their-email-4g59</guid>
      <description>&lt;p&gt;Anyone can put any domain in the From line of an email. Three DNS records decide whether the receiving server believes it. SPF lists the servers allowed to send for a domain. DMARC tells receivers what to do when a message fails those checks: nothing (&lt;code&gt;p=none&lt;/code&gt;), send it to spam (&lt;code&gt;p=quarantine&lt;/code&gt;) or refuse it (&lt;code&gt;p=reject&lt;/code&gt;). BIMI then lets a domain that enforces DMARC show its logo in the inbox.&lt;/p&gt;

&lt;p&gt;Since February 2024, Google and Yahoo have required DMARC from anyone sending them bulk mail, so most large senders have published something. We wanted to know what they published. On 10 October 2026 we looked up the email DNS of the 1,000 most popular websites on the Tranco list (list &lt;code&gt;8PX5V&lt;/code&gt;) and recorded their policies and their mail hosts.&lt;/p&gt;

&lt;p&gt;Five findings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;85% publish DMARC, but only 69% enforce it.&lt;/strong&gt; 84.5% of the 1,000 domains have a DMARC record. 69.4% set it to quarantine or reject for all mail, and 47.4% reject outright. The other 13.6% publish &lt;code&gt;p=none&lt;/code&gt;, which only monitors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rank matters a little.&lt;/strong&gt; 62% of the top 100 reject spoofed mail, against 46% of domains ranked 101–1,000.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SPF is almost universal and usually strict.&lt;/strong&gt; 89.6% publish SPF. Of those, 53.8% end it with &lt;code&gt;-all&lt;/code&gt; (hard fail) and 40.4% with &lt;code&gt;~all&lt;/code&gt; (soft fail).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BIMI has taken off; MTA-STS hasn't.&lt;/strong&gt; 21.3% publish a BIMI record, against only 4.5% for MTA-STS, which forces encrypted delivery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google hosts more of this mail than anyone.&lt;/strong&gt; Of the 875 domains that accept mail, 37.3% use Google Workspace and 17.4% Microsoft 365. Proofpoint filters 9.0% before the mail reaches the mailbox.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DMARC and SPF by rank
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;Top 100&lt;/th&gt;
&lt;th&gt;101–1,000&lt;/th&gt;
&lt;th&gt;All&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DMARC record&lt;/td&gt;
&lt;td&gt;87.0%&lt;/td&gt;
&lt;td&gt;84.2%&lt;/td&gt;
&lt;td&gt;84.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC enforced&lt;/td&gt;
&lt;td&gt;76.0%&lt;/td&gt;
&lt;td&gt;68.7%&lt;/td&gt;
&lt;td&gt;69.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DMARC &lt;code&gt;p=reject&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;62.0%&lt;/td&gt;
&lt;td&gt;45.8%&lt;/td&gt;
&lt;td&gt;47.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPF record&lt;/td&gt;
&lt;td&gt;93.0%&lt;/td&gt;
&lt;td&gt;89.2%&lt;/td&gt;
&lt;td&gt;89.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BIMI record&lt;/td&gt;
&lt;td&gt;27.0%&lt;/td&gt;
&lt;td&gt;20.7%&lt;/td&gt;
&lt;td&gt;21.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MTA-STS policy&lt;/td&gt;
&lt;td&gt;11.0%&lt;/td&gt;
&lt;td&gt;3.8%&lt;/td&gt;
&lt;td&gt;4.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;"Enforced" means quarantine or reject, applied to 100% of mail. Rank is the position among the 1,000 domains we kept, in Tranco order.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Across all 1,000 domains, the DMARC policy split was 474 at reject, 235 at quarantine and 136 at &lt;code&gt;none&lt;/code&gt;. 155 had no record. Few hedged: only 15 of the 845 records (1.8%) applied their policy to less than 100% of mail. 24 (2.8%) rejected spoofs of the main domain but used a weaker policy for its subdomains.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;p=none&lt;/code&gt; record is usually a first step. A domain watches the reports, finds its legitimate senders, then tightens the policy. Most of the 136 &lt;code&gt;p=none&lt;/code&gt; domains are doing that: 85% of them ask for aggregate reports. Some very large names are still there, though, including &lt;code&gt;samsung.com&lt;/code&gt; and &lt;code&gt;yandex.ru&lt;/code&gt;, and Microsoft's consumer mail domains &lt;code&gt;outlook.com&lt;/code&gt;, &lt;code&gt;live.com&lt;/code&gt; and &lt;code&gt;msn.com&lt;/code&gt;. For consumer mailbox domains, &lt;code&gt;p=none&lt;/code&gt; is often deliberate. Mailing lists and forwarding break authentication, and a strict policy would bounce real mail. A company domain doesn't have that excuse.&lt;/p&gt;

&lt;p&gt;The SPF split matters less than it looks. Under DMARC, a receiver judges a message by the DMARC result, so &lt;code&gt;-all&lt;/code&gt; versus &lt;code&gt;~all&lt;/code&gt; mostly matters to receivers that don't check DMARC. 37 domains (4.1% of those with SPF) have no &lt;code&gt;all&lt;/code&gt; of their own and hand over to another record with &lt;code&gt;redirect=&lt;/code&gt;, and 15 use the neutral &lt;code&gt;?all&lt;/code&gt;. None of the 1,000 used &lt;code&gt;+all&lt;/code&gt;, which would let any server send as the domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who hosts the mail
&lt;/h2&gt;

&lt;p&gt;Of the 1,000 domains, 875 have an MX record, so they accept mail. The rest are mostly link shorteners, download hosts and developer infrastructure.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mailbox host&lt;/th&gt;
&lt;th&gt;Domains&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;326&lt;/td&gt;
&lt;td&gt;37.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;152&lt;/td&gt;
&lt;td&gt;17.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Own mail servers&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;16.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unrecognised MX host&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;12.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway, mailbox hidden&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;9.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon WorkMail / SES&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;1.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tencent Exmail&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;0.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alibaba Mail, Yandex 360&lt;/td&gt;
&lt;td&gt;6 each&lt;/td&gt;
&lt;td&gt;0.7% each&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Zoho Mail&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other named providers (12)&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Base: the 875 domains that accept mail. "Own mail servers" means MX hosts under the domain's own name. Google's and Microsoft's own domains count under their own services.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The rows that are not Google or Microsoft deserve a closer look. "Own mail servers" means the MX host is under the domain's own name, as with &lt;code&gt;apple.com&lt;/code&gt; and &lt;code&gt;paypal.com&lt;/code&gt;. Most of the "unrecognised" group is the same thing one step removed. &lt;code&gt;imdb.com&lt;/code&gt; receives mail on &lt;code&gt;amazon.com&lt;/code&gt; servers, &lt;code&gt;webex.com&lt;/code&gt; on &lt;code&gt;cisco.com&lt;/code&gt; servers and &lt;code&gt;vk.com&lt;/code&gt; on &lt;code&gt;mail.ru&lt;/code&gt; servers. Together, the two groups make up 28.8% of the domains that accept mail.&lt;/p&gt;

&lt;p&gt;In front of the mailbox, 124 domains (14.2% of those accepting mail) use a security gateway that filters inbound mail first:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Inbound gateway&lt;/th&gt;
&lt;th&gt;Domains&lt;/th&gt;
&lt;th&gt;Share of the 875&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Proofpoint&lt;/td&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;9.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mimecast&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;2.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cisco Secure Email&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;1.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Five others&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;1.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;None detected&lt;/td&gt;
&lt;td&gt;751&lt;/td&gt;
&lt;td&gt;85.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;The five others: Broadcom and Trend Micro (3 each), Barracuda (2), Sophos and Hornetsecurity (1 each).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Behind those gateways, SPF identifies the mailbox in 43 of the 124 cases: 24 use Microsoft 365 and 19 Google Workspace. The rest list only the gateway or their own servers in SPF, so the mailbox host stays hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who enforces DMARC
&lt;/h2&gt;

&lt;p&gt;Enforcement differs by mail host. Domains on Google Workspace enforce DMARC more often than those on Microsoft 365. Domains behind a gateway enforce it most often. This is a correlation, not a cause: buying Proofpoint and setting &lt;code&gt;p=reject&lt;/code&gt; both point to a company with a dedicated email-security team.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mail host&lt;/th&gt;
&lt;th&gt;Domains&lt;/th&gt;
&lt;th&gt;DMARC enforced&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gateway, mailbox hidden&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;86.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Workspace&lt;/td&gt;
&lt;td&gt;326&lt;/td&gt;
&lt;td&gt;82.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft 365&lt;/td&gt;
&lt;td&gt;152&lt;/td&gt;
&lt;td&gt;72.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unrecognised MX host&lt;/td&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;67.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Own mail servers&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;td&gt;66.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No MX (accepts no mail)&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;td&gt;37.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the weakest point. A domain that never sends mail can still be forged, and attackers like such domains because nobody watches them. The standard lock-down is two records: &lt;code&gt;v=spf1 -all&lt;/code&gt; (no server may send) and DMARC &lt;code&gt;p=reject&lt;/code&gt;. Only 31 of the 125 non-mail domains (24.8%) have both. 76 (60.8%) have either no DMARC record or &lt;code&gt;p=none&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;By top-level domain, &lt;code&gt;.com&lt;/code&gt; led: 75.0% of its 596 domains enforce DMARC and 51.0% reject. Country-code domains followed at 63.5% (159 domains), then government, education and international bodies at 60.0% (35), and &lt;code&gt;.org&lt;/code&gt; and &lt;code&gt;.net&lt;/code&gt; at 57.0% (128).&lt;/p&gt;

&lt;h2&gt;
  
  
  Who reads the reports
&lt;/h2&gt;

&lt;p&gt;DMARC lets a domain ask receivers for daily aggregate reports (the &lt;code&gt;rua&lt;/code&gt; tag). 91.5% of DMARC records ask for them. 63.6% send them to an outside service, usually a vendor that turns the XML into dashboards. Counting each domain once per vendor:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Report receiver&lt;/th&gt;
&lt;th&gt;Domains&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Valimail (&lt;code&gt;vali.email&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proofpoint&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dmarcian&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agari (Fortra)&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mimecast DMARC Analyzer&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Red Sift OnDMARC&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Postmark&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;13 domains send their reports to &lt;code&gt;dhs.gov&lt;/code&gt;, the collection point used by US federal civilian agencies. 11 of them are agencies such as &lt;code&gt;nasa.gov&lt;/code&gt; and &lt;code&gt;whitehouse.gov&lt;/code&gt;, and the other two are the companies Box and Dynatrace. Another 22 report to &lt;code&gt;google.com&lt;/code&gt;, all of them Google properties such as &lt;code&gt;youtube.com&lt;/code&gt; and &lt;code&gt;android.com&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  DNS and CDN
&lt;/h2&gt;

&lt;p&gt;The same lookups show who runs the infrastructure. AWS Route 53 answers DNS for 24.6% of the 1,000 domains. Cloudflare answers for 16.3%, and 15.7% run their own name servers. Akamai answers for 9.4% and NS1 for 4.4%. 31.2% publish a CAA record that limits which certificate authorities may issue for them. Of the 902 domains with a homepage, Cloudflare serves 25.7%, Akamai and Amazon CloudFront 14.1% each, and Fastly 9.0%. We detected no CDN for the other 33.8%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology and caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domains.&lt;/strong&gt; Tranco list &lt;a href="https://tranco-list.eu/list/8PX5V/1000000" rel="noopener noreferrer"&gt;&lt;code&gt;8PX5V&lt;/code&gt;&lt;/a&gt;, generated 9 October 2026 from 30 days (10 September to 9 October) of Chrome UX Report, Farsight, Majestic, Cloudflare Radar and Cisco Umbrella data, as registrable domains. We removed 73 infrastructure host names listed by hand (CDN, API and telemetry domains such as &lt;code&gt;gstatic.com&lt;/code&gt; and &lt;code&gt;akamaiedge.net&lt;/code&gt;). We then dropped any domain that neither served a homepage nor had an MX record: 197 more, mostly CDN and device-telemetry hosts. A homepage behind a bot wall (HTTP 401, 403 or 429) counts as served. The first 1,000 remaining domains, down to Tranco rank 1,272, are the sample. The script lists every exclusion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot.&lt;/strong&gt; All lookups ran on 10 October 2026, 14:03–14:40 UTC, from Apify's cloud. DNS records change, so this is one day's picture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What "detected" means.&lt;/strong&gt; A record counts if it exists in public DNS and parses: SPF is a &lt;code&gt;v=spf1&lt;/code&gt; TXT record at the domain, DMARC a &lt;code&gt;v=DMARC1&lt;/code&gt; record at &lt;code&gt;_dmarc&lt;/code&gt;, BIMI a &lt;code&gt;v=BIMI1&lt;/code&gt; record at &lt;code&gt;default._bimi&lt;/code&gt;, MTA-STS a &lt;code&gt;v=STSv1&lt;/code&gt; record at &lt;code&gt;_mta-sts&lt;/code&gt;. We didn't check BIMI logos or certificates, and we didn't fetch MTA-STS policy files. Mail hosts and gateways are matched from MX host names, and from SPF includes when a gateway hides the mailbox. A host we have no rule for is reported as unrecognised, not guessed. Domains with a null MX (RFC 7505) count as having no MX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-check.&lt;/strong&gt; About an hour after the run, we re-resolved MX, SPF, DMARC and BIMI for all 1,298 domains through public resolvers. The results disagreed on 7 MX answers (all of them null MX, which the two tools count differently), 2 SPF records, 2 DMARC policies and no BIMI records. One domain, &lt;code&gt;indeed.com&lt;/code&gt;, answered our cloud resolver with &lt;code&gt;0.0.0.0&lt;/code&gt; and no MX. It was therefore dropped from the sample, though it does accept mail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible.&lt;/strong&gt; Four Node.js scripts &lt;a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026-fetch.mjs" rel="noopener noreferrer"&gt;fetch the list&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026-run.mjs" rel="noopener noreferrer"&gt;run the lookups&lt;/a&gt;, &lt;a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026.mjs" rel="noopener noreferrer"&gt;compute every figure&lt;/a&gt; (&lt;a href="https://locaihost.org/blog/email-security-top-1000/analysis/results.json" rel="noopener noreferrer"&gt;results.json&lt;/a&gt;) and &lt;a href="https://locaihost.org/blog/email-security-top-1000/analysis/email-security-2026-check.mjs" rel="noopener noreferrer"&gt;run the cross-check&lt;/a&gt;. We use only company domains, and we collect no personal data. Report addresses are reduced to the receiving domain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Source: Tranco list 8PX5V (tranco-list.eu); DNS, HTTP and TLS lookups by locaihost data, 10 October 2026.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;The data came from our &lt;a href="https://apify.com/locaihost/domain-intel" rel="noopener noreferrer"&gt;Domain Intel Actor&lt;/a&gt; on Apify, which returns these fields (email host, gateway, SPF, DMARC, BIMI, MTA-STS, DNS, CDN, TLS) for any list of domains. To check your own suppliers, customers or portfolio the same way, it costs $3 per 1,000 domains.&lt;/p&gt;

</description>
      <category>security</category>
      <category>email</category>
      <category>dns</category>
      <category>data</category>
    </item>
    <item>
      <title>Who actually sponsors H-1B workers in 2026, and what they offer to pay</title>
      <dc:creator>locaihost data</dc:creator>
      <pubDate>Sat, 10 Oct 2026 13:56:26 +0000</pubDate>
      <link>https://dev.to/locaihost_data/who-actually-sponsors-h-1b-workers-in-2026-and-what-they-offer-to-pay-591e</link>
      <guid>https://dev.to/locaihost_data/who-actually-sponsors-h-1b-workers-in-2026-and-what-they-offer-to-pay-591e</guid>
      <description>&lt;p&gt;Every H-1B petition starts with a Labor Condition Application (LCA) filed with the US Department of Labor. On it, the employer gives the job title, the worksite and the wage it will pay. The Labor Department publishes these forms every quarter. We combined all of them from 1 October 2023 to 30 June 2026 (fiscal year 2024 to the third quarter of FY2026), along with the PERM green-card filings for the same period. That comes to 1.57 million LCA cases and 374,000 PERM cases from 153,000 employers.&lt;/p&gt;

&lt;p&gt;Five findings stand out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The largest filers are cutting back, and most of the cut comes from outsourcing firms.&lt;/strong&gt; Comparing like with like (October to June of each year), certified LCAs fell 8.1% in FY2026. Twenty large IT-services firms filed 31.9% fewer and account for a third of the drop, though they filed only 8.7% of FY2025's applications.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most sponsors file one application a year.&lt;/strong&gt; Of the 63,545 employers with a certified LCA in FY2025, 51.6% had exactly one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who you work for affects the wage more than the visa does.&lt;/strong&gt; The median offered wage for software-engineer titles was $203,350 at Meta and $112,986 at Tata Consultancy Services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Green-card sponsorship varies widely.&lt;/strong&gt; Intel had 32 PERM certifications for every 100 LCAs. Infosys had fewer than one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Denials are rare: 0.68%.&lt;/strong&gt; That figure says very little, and the reason is explained below.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who files the most
&lt;/h2&gt;

&lt;p&gt;In FY2025, the last complete year, the Labor Department certified 541,597 LCAs, 8.2% more than the 500,329 in FY2024. Of these, 529,432 were for H-1B. The rest were for the country-specific versions: 8,858 E-3 (Australia), 1,940 H-1B1 (Chile) and 1,367 H-1B1 (Singapore).&lt;/p&gt;

&lt;p&gt;The table ranks employers as they appear on the forms. These are legal entities, not corporate groups, so Amazon's four main filing entities are counted separately. Combined, the four filed 22,914 in FY2025.&lt;/p&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;Employer (legal entity)&lt;/th&gt;
&lt;th&gt;FY2024&lt;/th&gt;
&lt;th&gt;FY2025&lt;/th&gt;
&lt;th&gt;Oct–Jun FY25&lt;/th&gt;
&lt;th&gt;Oct–Jun FY26&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;th&gt;Median offered wage, FY2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Amazon.com Services&lt;/td&gt;
&lt;td&gt;14,584&lt;/td&gt;
&lt;td&gt;15,493&lt;/td&gt;
&lt;td&gt;12,630&lt;/td&gt;
&lt;td&gt;13,922&lt;/td&gt;
&lt;td&gt;+10.2%&lt;/td&gt;
&lt;td&gt;$154,600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Cognizant Technology Solutions US&lt;/td&gt;
&lt;td&gt;11,226&lt;/td&gt;
&lt;td&gt;11,090&lt;/td&gt;
&lt;td&gt;8,600&lt;/td&gt;
&lt;td&gt;5,774&lt;/td&gt;
&lt;td&gt;−32.9%&lt;/td&gt;
&lt;td&gt;$109,782&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Ernst &amp;amp; Young U.S.&lt;/td&gt;
&lt;td&gt;9,828&lt;/td&gt;
&lt;td&gt;9,601&lt;/td&gt;
&lt;td&gt;8,161&lt;/td&gt;
&lt;td&gt;5,168&lt;/td&gt;
&lt;td&gt;−36.7%&lt;/td&gt;
&lt;td&gt;$143,517&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;9,491&lt;/td&gt;
&lt;td&gt;9,215&lt;/td&gt;
&lt;td&gt;7,417&lt;/td&gt;
&lt;td&gt;5,159&lt;/td&gt;
&lt;td&gt;−30.4%&lt;/td&gt;
&lt;td&gt;$170,766&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;8,815&lt;/td&gt;
&lt;td&gt;8,800&lt;/td&gt;
&lt;td&gt;7,861&lt;/td&gt;
&lt;td&gt;7,423&lt;/td&gt;
&lt;td&gt;−5.6%&lt;/td&gt;
&lt;td&gt;$184,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Tata Consultancy Services&lt;/td&gt;
&lt;td&gt;9,611&lt;/td&gt;
&lt;td&gt;7,796&lt;/td&gt;
&lt;td&gt;6,491&lt;/td&gt;
&lt;td&gt;2,880&lt;/td&gt;
&lt;td&gt;−55.6%&lt;/td&gt;
&lt;td&gt;$85,634&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Meta Platforms&lt;/td&gt;
&lt;td&gt;5,911&lt;/td&gt;
&lt;td&gt;6,627&lt;/td&gt;
&lt;td&gt;5,717&lt;/td&gt;
&lt;td&gt;5,278&lt;/td&gt;
&lt;td&gt;−7.7%&lt;/td&gt;
&lt;td&gt;$203,350&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;3,460&lt;/td&gt;
&lt;td&gt;6,283&lt;/td&gt;
&lt;td&gt;4,822&lt;/td&gt;
&lt;td&gt;4,870&lt;/td&gt;
&lt;td&gt;+1.0%&lt;/td&gt;
&lt;td&gt;$175,800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Infosys&lt;/td&gt;
&lt;td&gt;5,896&lt;/td&gt;
&lt;td&gt;5,757&lt;/td&gt;
&lt;td&gt;3,876&lt;/td&gt;
&lt;td&gt;4,568&lt;/td&gt;
&lt;td&gt;+17.9%&lt;/td&gt;
&lt;td&gt;$92,581&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Deloitte Consulting&lt;/td&gt;
&lt;td&gt;2,693&lt;/td&gt;
&lt;td&gt;4,255&lt;/td&gt;
&lt;td&gt;3,215&lt;/td&gt;
&lt;td&gt;2,622&lt;/td&gt;
&lt;td&gt;−18.4%&lt;/td&gt;
&lt;td&gt;$138,423&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Certified LCAs by decision date. "Oct–Jun" compares the same nine months of each fiscal year, because the FY2026 data ends on 30 June 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Like-for-like, total certified LCAs fell from 436,875 to 401,397. Most of the drop came early in the year. Compared with a year before, the October–December 2025 quarter was down 22.2%, January–March was down 7.7% and April–June was down 2.3%. A presidential proclamation of 19 September 2025 added a $100,000 payment to certain new H-1B petitions just before that first quarter. (A federal court vacated the guidance implementing that payment on 8 June 2026, and the litigation is ongoing.) The data shows when filings fell but not why, and an LCA is filed before the petition, so these figures can't separate the petitions the payment applied to from those it didn't.&lt;/p&gt;

&lt;p&gt;Change wasn't spread evenly. Of the 68 employers with at least 500 certified LCAs in October–June FY2025, 44 filed fewer in the same months of FY2026. The largest falls were IBM (−63.8%), &lt;a href="https://locaihost.org/visa-sponsors/tata-consultancy-services/" rel="noopener noreferrer"&gt;Tata Consultancy Services&lt;/a&gt; (−55.6%), Qualcomm (−51.8%), LTIMindtree (−47.6%) and HCL America (−44.0%). &lt;a href="https://locaihost.org/visa-sponsors/infosys/" rel="noopener noreferrer"&gt;Infosys&lt;/a&gt; went the other way, up 17.9%. The largest rise was at &lt;a href="https://locaihost.org/visa-sponsors/nvidia/" rel="noopener noreferrer"&gt;Nvidia&lt;/a&gt;, up 71.2% to 2,390, making it the 15th-largest filer so far this year. Grandison Management rose 37.4%. More than half of its FY2025 filings (54.2%) were for physical therapists, with a median offered wage of $77,480. The big filers aren't all in tech.&lt;/p&gt;

&lt;h2&gt;
  
  
  Most sponsors are small
&lt;/h2&gt;

&lt;p&gt;The ten largest filers accounted for 15.7% of certified LCAs in FY2025. The top 100 accounted for 34.0%, and the top 1,000 for 55.5%. At the other end, 32,765 employers filed exactly one certified LCA. Including those that filed two, that's 43,454 employers, or 68.4% of all sponsors, together accounting for 10.0% of filings. The median sponsor filed one.&lt;/p&gt;

&lt;p&gt;For job seekers, this means a company's absence from the top-100 lists doesn't show it won't sponsor. Most sponsors have never been on those lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Volume and pay by type of employer
&lt;/h2&gt;

&lt;p&gt;To compare kinds of employer, we sorted them into groups. Four groups are lists of named employers we chose by hand. The other two are matched by name: any employer with "university" or "college" in its name, and any with "hospital", "medical center", "health system", "clinic" or "children's". Both methods are crude, and the full lists are in the analysis script.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group (FY2025)&lt;/th&gt;
&lt;th&gt;Employers&lt;/th&gt;
&lt;th&gt;Certified LCAs&lt;/th&gt;
&lt;th&gt;Share&lt;/th&gt;
&lt;th&gt;Median offered wage&lt;/th&gt;
&lt;th&gt;Oct–Jun change FY25→FY26&lt;/th&gt;
&lt;th&gt;PERM per 100 LCAs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Big tech (named list)&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;73,351&lt;/td&gt;
&lt;td&gt;13.5%&lt;/td&gt;
&lt;td&gt;$169,000&lt;/td&gt;
&lt;td&gt;−6.3%&lt;/td&gt;
&lt;td&gt;17.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IT services &amp;amp; outsourcing (named list)&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;47,274&lt;/td&gt;
&lt;td&gt;8.7%&lt;/td&gt;
&lt;td&gt;$104,728&lt;/td&gt;
&lt;td&gt;−31.9%&lt;/td&gt;
&lt;td&gt;8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Universities &amp;amp; colleges (by name)&lt;/td&gt;
&lt;td&gt;1,325&lt;/td&gt;
&lt;td&gt;25,953&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;td&gt;$81,100&lt;/td&gt;
&lt;td&gt;−5.4%&lt;/td&gt;
&lt;td&gt;9.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Big Four &amp;amp; strategy consulting (named list)&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;18,899&lt;/td&gt;
&lt;td&gt;3.5%&lt;/td&gt;
&lt;td&gt;$141,000&lt;/td&gt;
&lt;td&gt;−27.7%&lt;/td&gt;
&lt;td&gt;6.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Banks &amp;amp; card issuers (named list)&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11,949&lt;/td&gt;
&lt;td&gt;2.2%&lt;/td&gt;
&lt;td&gt;$150,000&lt;/td&gt;
&lt;td&gt;−4.3%&lt;/td&gt;
&lt;td&gt;15.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hospitals &amp;amp; clinics (by name)&lt;/td&gt;
&lt;td&gt;1,152&lt;/td&gt;
&lt;td&gt;9,099&lt;/td&gt;
&lt;td&gt;1.7%&lt;/td&gt;
&lt;td&gt;$86,080&lt;/td&gt;
&lt;td&gt;−6.8%&lt;/td&gt;
&lt;td&gt;11.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everyone else&lt;/td&gt;
&lt;td&gt;61,006&lt;/td&gt;
&lt;td&gt;355,072&lt;/td&gt;
&lt;td&gt;65.6%&lt;/td&gt;
&lt;td&gt;$114,213&lt;/td&gt;
&lt;td&gt;−4.7%&lt;/td&gt;
&lt;td&gt;28.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;PERM per 100 LCAs uses FY2024 + FY2025 for both counts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two groups account for most of this year's fall. The 20 IT-services firms filed 11,776 fewer certified LCAs in October–June than a year earlier, 33.2% of the total decline. The Big Four and two strategy firms filed 4,356 fewer, 12.3% of the decline. Both shares are far larger than the groups' share of filings. The 61,006 employers in "everyone else" fell by 4.7%.&lt;/p&gt;

&lt;p&gt;Universities filed 18.7% more LCAs in FY2025 than in FY2024. Their median offered wage, $81,100, is the lowest of any group, because their most common titles are assistant professor and postdoctoral researcher. Most universities, and the non-profit research bodies linked to them, are exempt from the annual H-1B cap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the wages say
&lt;/h2&gt;

&lt;p&gt;These are offered wages: the lower end of the range written on the form, converted to a yearly figure. The job title "Software Engineer" alone had 28,123 certified LCAs from 4,588 employers in FY2025, with a median of $139,000. Across all software-engineer and software-developer titles, there were 105,098 filings with a median of $137,500. The median at each large filer varies far more than that single figure suggests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Employer&lt;/th&gt;
&lt;th&gt;Software-engineer filings&lt;/th&gt;
&lt;th&gt;25th pct&lt;/th&gt;
&lt;th&gt;Median&lt;/th&gt;
&lt;th&gt;75th pct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Salesforce&lt;/td&gt;
&lt;td&gt;1,082&lt;/td&gt;
&lt;td&gt;$178,743&lt;/td&gt;
&lt;td&gt;$211,686&lt;/td&gt;
&lt;td&gt;$243,862&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://locaihost.org/visa-sponsors/meta-platforms/" rel="noopener noreferrer"&gt;Meta Platforms&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;3,670&lt;/td&gt;
&lt;td&gt;$182,000&lt;/td&gt;
&lt;td&gt;$203,350&lt;/td&gt;
&lt;td&gt;$226,485&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://locaihost.org/visa-sponsors/google/" rel="noopener noreferrer"&gt;Google&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5,604&lt;/td&gt;
&lt;td&gt;$162,000&lt;/td&gt;
&lt;td&gt;$186,000&lt;/td&gt;
&lt;td&gt;$200,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://locaihost.org/visa-sponsors/microsoft/" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;5,700&lt;/td&gt;
&lt;td&gt;$153,700&lt;/td&gt;
&lt;td&gt;$171,258&lt;/td&gt;
&lt;td&gt;$191,461&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon.com Services&lt;/td&gt;
&lt;td&gt;3,632&lt;/td&gt;
&lt;td&gt;$137,259&lt;/td&gt;
&lt;td&gt;$160,000&lt;/td&gt;
&lt;td&gt;$180,710&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPMorgan Chase&lt;/td&gt;
&lt;td&gt;1,886&lt;/td&gt;
&lt;td&gt;$140,650&lt;/td&gt;
&lt;td&gt;$156,200&lt;/td&gt;
&lt;td&gt;$175,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Walmart Associates&lt;/td&gt;
&lt;td&gt;2,366&lt;/td&gt;
&lt;td&gt;$120,000&lt;/td&gt;
&lt;td&gt;$141,751&lt;/td&gt;
&lt;td&gt;$153,301&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tata Consultancy Services&lt;/td&gt;
&lt;td&gt;320&lt;/td&gt;
&lt;td&gt;$105,997&lt;/td&gt;
&lt;td&gt;$112,986&lt;/td&gt;
&lt;td&gt;$127,504&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UST Global&lt;/td&gt;
&lt;td&gt;394&lt;/td&gt;
&lt;td&gt;$95,040&lt;/td&gt;
&lt;td&gt;$106,866&lt;/td&gt;
&lt;td&gt;$121,541&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;FY2025 certified LCAs whose title contains "software engineer", "software developer", "software development engineer" or "software engineering", or "SDE". Employers with at least 300 such filings with a wage; the full list of 38 is in the script output.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Titles are less useful than they look at the largest outsourcing firms. At Cognizant, 35.2% of FY2025 filings carry one internal job code, "Manager JC50 - Computer Systems Engineers/Architects". At TCS, 40.9% are simply "Architect", with a median of $84,115. Comparing roles across those firms is close to impossible.&lt;/p&gt;

&lt;p&gt;To find the best-paid jobs that many employers sponsor, we kept only titles with at least 500 FY2025 filings from at least 25 different employers. The top title wasn't in tech:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job title&lt;/th&gt;
&lt;th&gt;Certified LCAs&lt;/th&gt;
&lt;th&gt;Employers&lt;/th&gt;
&lt;th&gt;Median offered wage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hospitalist&lt;/td&gt;
&lt;td&gt;673&lt;/td&gt;
&lt;td&gt;216&lt;/td&gt;
&lt;td&gt;$275,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Senior Manager&lt;/td&gt;
&lt;td&gt;814&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;$198,511&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Software Development Engineer III&lt;/td&gt;
&lt;td&gt;769&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;$198,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engineering Manager&lt;/td&gt;
&lt;td&gt;561&lt;/td&gt;
&lt;td&gt;292&lt;/td&gt;
&lt;td&gt;$196,888&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staff Software Engineer&lt;/td&gt;
&lt;td&gt;1,901&lt;/td&gt;
&lt;td&gt;443&lt;/td&gt;
&lt;td&gt;$177,437&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The lowest-paid common titles were teacher ($53,600), market research analyst ($62,900), medical technologist ($63,149) and the various postdoctoral titles ($65,000–$69,926).&lt;/p&gt;

&lt;h2&gt;
  
  
  Who also sponsors green cards
&lt;/h2&gt;

&lt;p&gt;An LCA supports a temporary visa. PERM labor certification is usually the first step toward an employer-sponsored green card. Dividing PERM certifications by LCAs gives a rough measure of how often an employer takes that second step. Across all employers in FY2024–FY2025, the figure was 23 per 100. For the biggest filers (at least 3,000 certified LCAs), it ranged from 32 down to almost none:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Employer&lt;/th&gt;
&lt;th&gt;Certified LCAs FY24–25&lt;/th&gt;
&lt;th&gt;PERM certified FY24–25&lt;/th&gt;
&lt;th&gt;PERM per 100 LCAs&lt;/th&gt;
&lt;th&gt;PERM by year: FY24 / FY25 / FY26 to June&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Intel&lt;/td&gt;
&lt;td&gt;6,524&lt;/td&gt;
&lt;td&gt;2,083&lt;/td&gt;
&lt;td&gt;31.9&lt;/td&gt;
&lt;td&gt;1,148 / 935 / 326&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple&lt;/td&gt;
&lt;td&gt;9,743&lt;/td&gt;
&lt;td&gt;2,645&lt;/td&gt;
&lt;td&gt;27.1&lt;/td&gt;
&lt;td&gt;1,421 / 1,224 / 33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nvidia&lt;/td&gt;
&lt;td&gt;3,185&lt;/td&gt;
&lt;td&gt;853&lt;/td&gt;
&lt;td&gt;26.8&lt;/td&gt;
&lt;td&gt;280 / 573 / 722&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft&lt;/td&gt;
&lt;td&gt;18,706&lt;/td&gt;
&lt;td&gt;4,660&lt;/td&gt;
&lt;td&gt;24.9&lt;/td&gt;
&lt;td&gt;1,734 / 2,926 / 1,600&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;17,615&lt;/td&gt;
&lt;td&gt;1,607&lt;/td&gt;
&lt;td&gt;9.1&lt;/td&gt;
&lt;td&gt;1,607 / 0 / 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Amazon.com Services&lt;/td&gt;
&lt;td&gt;30,077&lt;/td&gt;
&lt;td&gt;2,130&lt;/td&gt;
&lt;td&gt;7.1&lt;/td&gt;
&lt;td&gt;2,129 / 1 / 56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cognizant Technology Solutions US&lt;/td&gt;
&lt;td&gt;22,316&lt;/td&gt;
&lt;td&gt;1,235&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;1,235 / 0 / 0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ernst &amp;amp; Young U.S.&lt;/td&gt;
&lt;td&gt;19,429&lt;/td&gt;
&lt;td&gt;281&lt;/td&gt;
&lt;td&gt;1.4&lt;/td&gt;
&lt;td&gt;1 / 280 / 568&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infosys&lt;/td&gt;
&lt;td&gt;11,653&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;0.7&lt;/td&gt;
&lt;td&gt;87 / 0 / 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The yearly column shows something the ratio hides. Monthly certifications stopped at several large filers. Google's last month with 50 or more was February 2024, and it has had three in the 28 months since. Amazon.com Services fell below five a month from May 2024 to February 2026 and has risen slowly since (56 in October–June). Cognizant has had none since July 2024 and &lt;a href="https://locaihost.org/visa-sponsors/infosys/" rel="noopener noreferrer"&gt;Infosys&lt;/a&gt; none since January 2024. Because PERM cases take more than a year to decide, a decision gap from 2024 points to a pause in filings around 2023, which matches what Google and Amazon were widely reported to have done that year. The data shows only the gap, not its cause.&lt;/p&gt;

&lt;p&gt;One warning about this measure: a company may file its LCAs under one legal entity and its PERM cases under another. Fidelity Technology Group has 3,847 LCAs and no PERM cases, while FMR LLC, another Fidelity entity, has 778 PERM certifications in FY2024–FY2025. Check every entity a company uses before concluding that it doesn't sponsor green cards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the jobs are
&lt;/h2&gt;

&lt;p&gt;California accounted for 18.7% of FY2025 certified LCAs by worksite, followed by Texas (15.3%), New York (8.3%), Washington (6.3%) and New Jersey (5.0%). Together those five states had 53.6% of filings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why denials tell you nothing
&lt;/h2&gt;

&lt;p&gt;In FY2025, 3,918 LCAs were denied, against 541,597 certified and 31,083 certified then withdrawn. That's a denial rate of 0.68%, and it has been under 1% in each year of the data. An LCA is a statement by the employer: that it will pay at least the required wage, and that hiring the worker won't harm the working conditions of other employees at the site. The Labor Department mostly checks that the form is complete and free of obvious errors. It doesn't decide whether the worker qualifies or whether the job is real. United States Citizenship and Immigration Services (USCIS) decides that later, when it reviews the petition. PERM is checked more closely, and its denial rate was 1.78% in FY2025. Neither rate tells you about visa approvals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Methodology and caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source.&lt;/strong&gt; US Department of Labor, Office of Foreign Labor Certification (OFLC), LCA and PERM disclosure files for FY2024 to FY2026 Q3 (1 October 2023 to 30 June 2026). The data is public domain. We are not affiliated with the Labor Department.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Counting.&lt;/strong&gt; Every file was loaded and de-duplicated by case number, keeping the latest decision. Cases are counted in the fiscal year of the decision date. "Certified" excludes certified-then-withdrawn cases. FY2026 covers only nine months, so it is compared only with the same nine months of earlier years.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A certified LCA is not a visa.&lt;/strong&gt; One worker can have several LCAs (for example, for a new worksite or an extension), and many LCAs never lead to a petition. LCA counts measure employer filing activity, not people hired or visas approved.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Offered wage is not pay.&lt;/strong&gt; We use the lower end of any wage range on the form, converted to a yearly figure (2,080 hours a year for hourly wages), and drop values below $10,000 or above $2 million. Bonuses and equity aren't included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Employers are legal entities.&lt;/strong&gt; Names are normalised, so "Google LLC" and "GOOGLE LLC" count as one employer. Separate entities of the same company are not merged, apart from the Amazon total we give above. Groups are our own choices, and the lists are in the script.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy.&lt;/strong&gt; Only business fields are read: status, dates, visa class, employer, job title, wage, worksite state and number of positions. No information about workers, employer contacts, attorneys or form preparers is read or published, and employers that file under a person's own name are excluded.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reproducible.&lt;/strong&gt; Two Node.js scripts produce every figure here: &lt;a href="https://locaihost.org/blog/h1b-sponsors-2026/analysis/h1b-2026-extract.mjs" rel="noopener noreferrer"&gt;one re-reads the DOL files&lt;/a&gt; and &lt;a href="https://locaihost.org/blog/h1b-sponsors-2026/analysis/h1b-2026.mjs" rel="noopener noreferrer"&gt;the other computes the results&lt;/a&gt; (&lt;a href="https://locaihost.org/blog/h1b-sponsors-2026/analysis/results.json" rel="noopener noreferrer"&gt;results.json&lt;/a&gt;). Their case counts match our published employer index exactly (1,570,055 LCA and 373,878 PERM cases).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing here is legal or immigration advice. For your own case, talk to a qualified immigration attorney.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Source: US Department of Labor, Office of Foreign Labor Certification, LCA and PERM disclosure data (public domain).&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Each of the 2,000 largest sponsors has a free page at &lt;a href="https://locaihost.org/visa-sponsors/employers/" rel="noopener noreferrer"&gt;locaihost.org/visa-sponsors/employers/&lt;/a&gt; showing its filings by year, the titles it sponsors and the wages it filed. For example, see &lt;a href="https://locaihost.org/visa-sponsors/cognizant-technology-solutions/" rel="noopener noreferrer"&gt;Cognizant&lt;/a&gt; or &lt;a href="https://locaihost.org/visa-sponsors/google/" rel="noopener noreferrer"&gt;Google&lt;/a&gt;. To look up many companies at once, or to check live job listings for sponsorship evidence, the same data is available through an &lt;a href="https://apify.com/locaihost/visa-sponsors" rel="noopener noreferrer"&gt;Apify Actor&lt;/a&gt; at $2.50 per 1,000 results.&lt;/p&gt;

</description>
      <category>h1b</category>
      <category>data</category>
      <category>immigration</category>
      <category>career</category>
    </item>
    <item>
      <title>Designing Apify Actors that AI agents actually pick (and can afford)</title>
      <dc:creator>locaihost data</dc:creator>
      <pubDate>Sat, 10 Oct 2026 13:21:05 +0000</pubDate>
      <link>https://dev.to/locaihost_data/designing-apify-actors-that-ai-agents-actually-pick-and-can-afford-55m7</link>
      <guid>https://dev.to/locaihost_data/designing-apify-actors-that-ai-agents-actually-pick-and-can-afford-55m7</guid>
      <description>&lt;p&gt;Most Apify Actors are built for a person who opens the Store page, reads the README, fills in a form and clicks &lt;strong&gt;Start&lt;/strong&gt;. That person can scroll, guess and retry when something goes wrong.&lt;/p&gt;

&lt;p&gt;More and more callers are no longer people. An agent in Claude, Cursor or a custom loop connects to the Apify MCP server, searches the Store, reads one short card about your Actor, builds a JSON input from your input schema and runs it with a spending cap. It never sees your README screenshots. It can't ask what "Max results" means. If the run fails, it may simply move on to someone else's Actor.&lt;/p&gt;

&lt;p&gt;I publish pay-per-event Actors on the Apify Store as &lt;strong&gt;locaihost&lt;/strong&gt;: SEC EDGAR financials and insider trades, careers-page jobs from Greenhouse/Lever/Ashby/Personio/Teamtailor, UK/EU/Canada government tenders, and a couple of others. This post walks through one real agent call against my SEC EDGAR Actor, then the design decisions that make an Actor usable (and affordable) for an agent. All the code below is from the Actors as they ship. I've left out anything I haven't measured myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Setup: one command
&lt;/h2&gt;

&lt;p&gt;Apify hosts an MCP server. In Claude Code you add it with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add apify https://mcp.apify.com/ &lt;span class="nt"&gt;-t&lt;/span&gt; http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first time you use it, a browser OAuth flow opens and asks you to sign in to Apify, so there is no token to paste. After that the agent has tools such as &lt;code&gt;search-actors&lt;/code&gt;, &lt;code&gt;fetch-actor-details&lt;/code&gt;, &lt;code&gt;call-actor&lt;/code&gt; and &lt;code&gt;get-dataset-items&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To pin an agent to specific Actors, you can pass them in the URL instead (&lt;code&gt;https://mcp.apify.com?tools=locaihost/sec-edgar,...&lt;/code&gt;). Each listed Actor then appears as its own tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What the agent actually sees
&lt;/h2&gt;

&lt;p&gt;Before writing anything for agents, I read the source of &lt;a href="https://github.com/apify/apify-mcp-server" rel="noopener noreferrer"&gt;apify-mcp-server&lt;/a&gt;. Three findings shaped everything else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;search-actors&lt;/code&gt; is a thin wrapper over the Store search API&lt;/strong&gt; (&lt;code&gt;GET /v2/store?search=...&lt;/code&gt;). The MCP server does no re-ranking of its own, so agent ranking &lt;em&gt;is&lt;/em&gt; Store ranking: relevance plus the quality and popularity signals Apify uses for the Store (reliability, usage, reviews and so on).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The default &lt;code&gt;limit&lt;/code&gt; is 5.&lt;/strong&gt; Agents are told to search with 1–3 keywords like "SEC filings" or "insider trades". Only five cards come back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The card is built from your Actor's description, verbatim&lt;/strong&gt;, plus the input field list. Whatever you wrote in &lt;code&gt;description&lt;/code&gt; in &lt;code&gt;.actor/actor.json&lt;/code&gt; is the pitch an agent reads.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I need to be honest about the first two points. My Actors are a few weeks old, with almost no usage. When I ran agent-style queries against the Store API, &lt;strong&gt;none of them appeared in the top 5 for any query I tested.&lt;/strong&gt; A brand-new Actor will not get picked through &lt;code&gt;search-actors&lt;/code&gt; no matter how clean its schema is. Usage builds rank, and rank builds usage, and there's no shortcut I've found.&lt;/p&gt;

&lt;p&gt;So why bother? Because search is only one way in. An agent can still reach a new Actor when:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the user names it ("use locaihost/sec-edgar"),&lt;/li&gt;
&lt;li&gt;it is pinned in the MCP URL with &lt;code&gt;?tools=&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;it shows up in a README, a blog post or a published task that the user or agent has already read.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In all three cases the agent skips the search and goes straight to &lt;code&gt;fetch-actor-details&lt;/code&gt; and &lt;code&gt;call-actor&lt;/code&gt;. From there, the input schema, the failure modes and the charge floor decide whether the call works. That part you control on day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A real call
&lt;/h2&gt;

&lt;p&gt;Here is the call Claude made against &lt;a href="https://apify.com/locaihost/sec-edgar" rel="noopener noreferrer"&gt;locaihost/sec-edgar&lt;/a&gt;, via the MCP &lt;code&gt;call-actor&lt;/code&gt; tool, when I asked for NVIDIA's recent insider trades:&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;"actor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"locaihost/sec-edgar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"input"&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;"companies"&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;"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;"modes"&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;"insiderTrades"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;"onlyNew"&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="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;"callOptions"&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;"maxTotalChargeUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.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;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1024&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 agent made two good choices on its own. It set &lt;code&gt;maxResults&lt;/code&gt; to the number of rows it actually needed, and it capped the run's total spend at ten cents with &lt;code&gt;maxTotalChargeUsd&lt;/code&gt;. Both of those only work if the Actor respects them, which I come back to below.&lt;/p&gt;

&lt;p&gt;The result, abridged:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;status:        SUCCEEDED
runtime:       4.24 s
compute units: 0.0012
items:         5
fields (29):   recordType, cik, ticker, companyName, form, filingDate,
               accessionNumber, insiderName, insiderCik, insiderType,
               insiderRole, isDirector, isOfficer, isTenPercentOwner,
               officerTitle, is10b51Plan, securityTitle, transactionDate,
               transactionCode, transactionLabel, acquiredDisposed, shares,
               pricePerShare, value, sharesOwnedAfter, directOrIndirect,
               ownershipNature, filingUrl, scrapedAt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Five rows, each one a Form 4 transaction, in about four seconds. The field names do most of the explaining. An agent working out "who sold, and how much" filters on &lt;code&gt;acquiredDisposed: "D"&lt;/code&gt; with &lt;code&gt;transactionCode: "S"&lt;/code&gt; and sums &lt;code&gt;value&lt;/code&gt;. It doesn't need a README for that.&lt;/p&gt;

&lt;p&gt;One field deserves a closer look: &lt;strong&gt;&lt;code&gt;insiderName&lt;/code&gt; is null for people.&lt;/strong&gt; Form 4 filings name the individual filer, but the Actor deliberately never outputs a natural person's name. An insider is identified by role (&lt;code&gt;insiderRole: "Officer (CFO)"&lt;/code&gt;, &lt;code&gt;isDirector&lt;/code&gt;, &lt;code&gt;isTenPercentOwner&lt;/code&gt;). Names are output only for organisations such as funds, LLCs and holding companies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Legal-entity markers. A name matching none of these is treated as a person and is never output.&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isEntityName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;ENTITY&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\b(&lt;/span&gt;&lt;span class="sr"&gt;FAMILY|REVOCABLE|IRREVOCABLE|LIVING&lt;/span&gt;&lt;span class="se"&gt;)\b&lt;/span&gt;&lt;span class="sr"&gt;/i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ...inside toTradeRecords():&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;entities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;owners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;isEntityName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nl"&gt;insiderName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;insiderType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;owners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;owners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;entity&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mixed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;individual&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="nx"&gt;insiderRole&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;owners&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;roleLabel&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Family and revocable trusts count as people. Reporting-owner addresses are never read at all. For agents this matters more than for human users: an agent will happily copy whatever you return into a CRM, an email or a report. If personal data is never in the dataset, it can never leak from there. I made "business data only" a hard rule for all my Actors (I'm in Singapore, and PDPA is the obvious concern). For insider trading analysis, role and size are what you need anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Input schema: one obvious required field
&lt;/h2&gt;

&lt;p&gt;The input schema becomes the agent's tool definition. Mine has eleven fields, but an agent only has to understand one:&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="nl"&gt;"companies"&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;"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;"Companies"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"array"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"One per line: a US ticker (AAPL, BRK.B), an SEC CIK number (320193) or a company name (Microsoft). Any company that files with the SEC. Up to 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;"editor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stringList"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prefill"&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="s2"&gt;"MSFT"&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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"required"&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;"companies"&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;Every other field has a sensible &lt;code&gt;default&lt;/code&gt;: all three modes, the last 90 days, 8 periods, newest filings first. A minimal valid call is &lt;code&gt;{"companies": ["NVDA"]}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Note the &lt;strong&gt;&lt;code&gt;prefill&lt;/code&gt;, not &lt;code&gt;default&lt;/code&gt;&lt;/strong&gt;, on the required field. This is the easiest trap to fall into. A required field that also has a &lt;code&gt;default&lt;/code&gt; silently loses its &lt;code&gt;required&lt;/code&gt; flag in the tool schema the agent receives. To the agent, the field looks optional. It then calls the Actor without it, the platform fills in your default, and the agent gets data for AAPL, MSFT and NVDA when it asked about something else. &lt;code&gt;prefill&lt;/code&gt; fills in the form for humans in the console and still shows an example value, but &lt;code&gt;required&lt;/code&gt; survives. &lt;a href="https://blog.apify.com/fixing-actors-invisible-to-agents/" rel="noopener noreferrer"&gt;Apify's own write-up on making Actors visible to agents&lt;/a&gt; puts it bluntly: a required field with a default is always a bug.&lt;/p&gt;

&lt;p&gt;A few smaller rules I follow in every schema:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descriptions under 500 characters.&lt;/strong&gt; Field and Actor descriptions end up in the tool definition and the search card. Long ones get truncated or eat the agent's context. Put the essentials first: what to type, in what format, with one example.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept what a model is likely to send.&lt;/strong&gt; &lt;code&gt;companies&lt;/code&gt; takes tickers, CIKs &lt;em&gt;or&lt;/em&gt; names. &lt;code&gt;sinceDate&lt;/code&gt; takes &lt;code&gt;2026-07-01&lt;/code&gt; &lt;em&gt;or&lt;/em&gt; &lt;code&gt;"90 days"&lt;/code&gt; &lt;em&gt;or&lt;/em&gt; &lt;code&gt;"6 months"&lt;/code&gt;. A model will try the natural phrasing first, so treat it as valid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arrays stay arrays.&lt;/strong&gt; &lt;code&gt;modes&lt;/code&gt; is an enum array with &lt;code&gt;enumTitles&lt;/code&gt;, not a comma-separated string the agent has to guess the format of.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Bad input should not mean FAILED
&lt;/h2&gt;

&lt;p&gt;What should happen when an agent sends &lt;code&gt;{"companies": ["NVIDIAA"]}&lt;/code&gt;, or a list where every entry is junk?&lt;/p&gt;

&lt;p&gt;My first versions called &lt;code&gt;Actor.fail()&lt;/code&gt; with a clear message. That seemed right until I ran a robustness pass and noticed two problems. A FAILED run counts against the Actor's success rate, which feeds the quality score, which feeds search rank (the same rank agents see). And to an agent, FAILED looks like "this tool is broken", not "you sent a bad ticker".&lt;/p&gt;

&lt;p&gt;So invalid input now ends &lt;strong&gt;SUCCEEDED, with nothing charged and a message that says how to fix it&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;unresolved&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Not found on EDGAR (use the ticker or CIK): &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;unresolved&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;refs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Unknown tickers are an input problem, not a crash: exit SUCCEEDED with nothing charged.&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SUMMARY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;since&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;modes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;modes&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="na"&gt;pushed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;notFound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;unresolved&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`No companies to look up&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;unresolved&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;` — not found on EDGAR: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;unresolved&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;, &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. Add tickers (AAPL), CIKs (320193) or company names (Microsoft).`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exit message becomes the run's status message, which is part of the run details an agent can read back. An agent that reads "not found on EDGAR: NVIDIAA. Add tickers (AAPL)…" corrects itself on the next call. &lt;code&gt;Actor.fail()&lt;/code&gt; is kept for real failures only: if &lt;em&gt;every&lt;/em&gt; company lookup hit an upstream error, the run fails, because then something really is broken.&lt;/p&gt;

&lt;p&gt;The careers-jobs Actor goes one step further and rejects junk before fetching anything (sentences, markup, 300-character pastes), so prompt-injected garbage in the &lt;code&gt;companies&lt;/code&gt; array never turns into outbound requests or charges.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Pay-per-event charging you can trust
&lt;/h2&gt;

&lt;p&gt;All my Actors use pay-per-event pricing: a tiny start fee plus one event per record. For sec-edgar that's $2 per 1,000 records at the base tier, so the five-row NVIDIA call above cost about a cent. Agents work well with this model: they pay for exactly what they used, and &lt;code&gt;maxTotalChargeUsd&lt;/code&gt; gives them a hard ceiling.&lt;/p&gt;

&lt;p&gt;There is a catch in the SDK. Under pay-per-event, &lt;code&gt;Actor.pushData(items, eventName)&lt;/code&gt; returns a &lt;code&gt;ChargeResult&lt;/code&gt; telling you how many items were charged, and therefore stored. When the user's charge limit is reached mid-batch, the SDK drops the rest. My Actors batch pushes (100 items per API call), and for batches &lt;strong&gt;the returned ChargeResult can undercount or overcount&lt;/strong&gt;. I don't fully understand why, though the client chunking requests internally is the likely cause. That matters because my "only new since last run" mode remembers which items were delivered. Trust a wrong count, and a user either pays for an item they never got or never sees it again.&lt;/p&gt;

&lt;p&gt;The fix is to stop trusting the return value and measure the charging manager's counter before and after. This is the actual push function from the careers-jobs Actor (sec-edgar uses the same one with &lt;code&gt;EVENT = 'record'&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Measure the charged-event counter delta; the per-call ChargeResult is unreliable for batches.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;charging&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getChargingManager&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isPpe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;charging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPricingInfo&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;isPayPerEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;BatchEmitter&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Job&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isPpe&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;charging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getChargedEventCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EVENT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EVENT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;chargedCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;charging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getChargedEventCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EVENT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;eventChargeLimitReached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;charging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculateMaxEventChargeCountWithinLimit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;EVENT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;seenList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;BatchEmitter&lt;/code&gt; then treats &lt;code&gt;chargedCount&lt;/code&gt; as the truth: only that many items are counted as emitted, only their keys go into the "seen" list, and the run stops cleanly once the limit is hit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chargedCount&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emitted&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onStored&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;eventChargeLimitReached&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;stored&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;batch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stopped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So an item dropped by an agent's ten-cent cap is not marked as seen, and it comes back on the next run. Note that the &lt;code&gt;!isPpe&lt;/code&gt; branch matters too: outside pay-per-event (local runs, for example) the ChargeResult reports zero charged even though everything was stored.&lt;/p&gt;

&lt;p&gt;One more thing to know while testing: a run's &lt;code&gt;chargedEventCounts&lt;/code&gt; and the dataset &lt;code&gt;itemCount&lt;/code&gt; lag a few seconds behind the end of the run. Re-fetch before deciding you've found a billing bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Let small budgets in
&lt;/h2&gt;

&lt;p&gt;Pay-per-event Actors have a pricing setting called &lt;code&gt;minimalMaxTotalChargeUsd&lt;/code&gt;. It's the lowest &lt;code&gt;maxTotalChargeUsd&lt;/code&gt; a caller may set when starting a run. If an agent's budget is below your floor, the run doesn't start.&lt;/p&gt;

&lt;p&gt;Agents tend to use small budgets on purpose. Claude chose $0.10 for a five-row lookup, which is a sensible thing for an agent to do. A floor of a dollar would have blocked that call. When I repriced my Actors I lowered the floor to &lt;strong&gt;$0.05&lt;/strong&gt; on all of them.&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="nl"&gt;"minimalMaxTotalChargeUsd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two related details. First, when changing pay-per-event pricing through the API, you &lt;strong&gt;append&lt;/strong&gt; a new &lt;code&gt;pricingInfos&lt;/code&gt; entry; replacing the existing ones fails. Second, the default run memory is set to 1 GB in &lt;code&gt;actor.json&lt;/code&gt;, because the Actor-start event is charged per GB of memory. Agents rarely override memory, so whatever default you pick is what they pay.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Other guardrails worth having
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A free-plan cap that's documented.&lt;/strong&gt; On Apify's free plan my Actors return at most 100 records per run, and the run log says so. An agent that sees 100 rows and a warning can explain the reason to the user instead of guessing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect upstream limits.&lt;/strong&gt; sec-edgar sends every request through one global rate limiter (8 requests per second, under SEC's fair-access limit), with a declared User-Agent and backoff when SEC throttles. Agents run in loops; your Actor should not let a loop hammer the source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Official, public sources.&lt;/strong&gt; EDGAR data is public domain. That's one less thing an agent (or its user) has to worry about before using the output.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A SUMMARY record.&lt;/strong&gt; Every run writes a &lt;code&gt;SUMMARY&lt;/code&gt; key-value record with per-company counts, notes and "not found" lists. An agent that gets zero rows can read &lt;em&gt;why&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Checklist
&lt;/h2&gt;

&lt;p&gt;If you want an agent to be able to use your Actor, and afford it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Actor &lt;code&gt;description&lt;/code&gt; starts with a verb, says what comes back, and stays under 500 characters. It is the agent's tool card.&lt;/li&gt;
&lt;li&gt;[ ] One obvious required field, with &lt;code&gt;prefill&lt;/code&gt; and &lt;strong&gt;no &lt;code&gt;default&lt;/code&gt;&lt;/strong&gt;. Everything else optional with sensible defaults.&lt;/li&gt;
&lt;li&gt;[ ] Field descriptions under 500 characters, essentials first, one example each.&lt;/li&gt;
&lt;li&gt;[ ] Accept the natural formats a model will try (tickers &lt;em&gt;and&lt;/em&gt; names, &lt;code&gt;"90 days"&lt;/code&gt; &lt;em&gt;and&lt;/em&gt; ISO dates).&lt;/li&gt;
&lt;li&gt;[ ] Invalid input ends SUCCEEDED, charges nothing and says how to fix it. &lt;code&gt;Actor.fail()&lt;/code&gt; only for real outages.&lt;/li&gt;
&lt;li&gt;[ ] Honour &lt;code&gt;maxResults&lt;/code&gt; and the caller's &lt;code&gt;maxTotalChargeUsd&lt;/code&gt;, and stop cleanly when either is reached.&lt;/li&gt;
&lt;li&gt;[ ] Count charges with &lt;code&gt;getChargedEventCount()&lt;/code&gt; deltas, not the batched &lt;code&gt;pushData&lt;/code&gt; ChargeResult.&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;minimalMaxTotalChargeUsd&lt;/code&gt; low enough for small agent budgets (I use $0.05).&lt;/li&gt;
&lt;li&gt;[ ] No personal data in the output. Identify people by role, not name.&lt;/li&gt;
&lt;li&gt;[ ] Expect &lt;code&gt;search-actors&lt;/code&gt; to ignore you at first. Get in front of agents through names, &lt;code&gt;?tools=&lt;/code&gt; URLs, READMEs and published tasks while usage builds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this makes a new Actor show up in an agent's top five. That takes usage, and I don't have much yet. What it does is make sure that when an agent does reach your Actor, the first call works, costs what it should, and gives the agent something it can use.&lt;/p&gt;

&lt;p&gt;More about what I'm building is at &lt;a href="https://locaihost.org" rel="noopener noreferrer"&gt;locaihost.org&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>apify</category>
      <category>ai</category>
      <category>mcp</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
