<?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: Rowcraft</title>
    <description>The latest articles on DEV Community by Rowcraft (@rowcraft).</description>
    <link>https://dev.to/rowcraft</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%2F4201212%2F7c15db00-eff0-4973-a0be-6f9e8e74318f.png</url>
      <title>DEV Community: Rowcraft</title>
      <link>https://dev.to/rowcraft</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rowcraft"/>
    <language>en</language>
    <item>
      <title>UK company directors as clean JSON from Companies House: current or full history, no dates of birth</title>
      <dc:creator>Rowcraft</dc:creator>
      <pubDate>Thu, 29 Oct 2026 20:00:36 +0000</pubDate>
      <link>https://dev.to/rowcraft/uk-company-directors-as-clean-json-from-companies-house-current-or-full-history-no-dates-of-birth-3b36</link>
      <guid>https://dev.to/rowcraft/uk-company-directors-as-clean-json-from-companies-house-current-or-full-history-no-dates-of-birth-3b36</guid>
      <description>&lt;p&gt;Companies House has a good free API, but getting the directors of a list of companies means paging the officers endpoint 100 at a time, separating current from resigned officers, and dropping fields you probably should not store, such as dates of birth.&lt;/p&gt;

&lt;p&gt;I added directors to my Apify tool for Companies House. You search companies by number, name, SIC code, status, location or incorporation date, switch on "Include officers", and each company row comes back with its officers. Disclosure: it is mine and it is paid, 3 USD per 1,000 companies; the officers are fields of the company row and cost nothing extra. It runs on your own free Companies House API key, which takes a few minutes to get on the Companies House developer hub.&lt;/p&gt;

&lt;p&gt;What you get per company when officers are on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;officersActiveCount, officersResignedCount and officersTotal (Tesco PLC: 11 active, 63 resigned, 74 in total)&lt;/li&gt;
&lt;li&gt;officers: name, role (director, secretary, LLP member, corporate director and the other roles), appointment and resignation dates, nationality, country of residence, occupation, and whether the officer is itself a company&lt;/li&gt;
&lt;li&gt;current officers only (the default) or the full history, up to 500 officers per company&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What is never returned: dates of birth (not even month and year), addresses, identity verification details and links to a person's other appointments. Persons with significant control and disqualifications are not requested at all. The register is public by law; the tool is meant for B2B work such as KYB checks, supplier due diligence and sales research, and any officer can ask for removal through the tool's Issues tab (handled within 14 days).&lt;/p&gt;

&lt;p&gt;Example input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"apiKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_COMPANIES_HOUSE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyNumbers"&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;"00445790"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeOfficers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"officersStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxOfficersPerCompany"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One officer as it comes back:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"BETHELL, Melissa"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"role"&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"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"roleCode"&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"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"appointedOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2018-09-24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"resignedOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"nationality"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"British"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"countryOfResidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"United Kingdom"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"occupation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"isCorporate"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without officers, each row still has the company profile: status, type, incorporation date, SIC codes, registered office, and on request filing history, charges and insolvency. "Only new rows" plus a daily schedule gives you just the companies incorporated since the last run.&lt;/p&gt;

&lt;p&gt;The tool: &lt;a href="https://apify.com/rowcraft/uk-companies-house-scraper" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/uk-companies-house-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Which other register would you want with directors in the same format?&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>data</category>
      <category>api</category>
      <category>uk</category>
    </item>
    <item>
      <title>Get the open jobs of any company from its website: Greenhouse, Lever, Ashby or Workday detected for you</title>
      <dc:creator>Rowcraft</dc:creator>
      <pubDate>Thu, 29 Oct 2026 19:59:55 +0000</pubDate>
      <link>https://dev.to/rowcraft/get-the-open-jobs-of-any-company-from-its-website-greenhouse-lever-ashby-or-workday-detected-for-103i</link>
      <guid>https://dev.to/rowcraft/get-the-open-jobs-of-any-company-from-its-website-greenhouse-lever-ashby-or-workday-detected-for-103i</guid>
      <description>&lt;p&gt;If you track hiring at a list of companies (for sales signals, market research or a niche job board), the hard part is not scraping. It is finding where each company keeps its jobs. Stripe is on Greenhouse, Ramp on Ashby, Palantir on Lever, Nvidia on Workday, and the board name is rarely the company name you have in your CRM.&lt;/p&gt;

&lt;p&gt;I built an Apify tool that takes the list the way you already have it (websites, careers pages or plain company names) and returns every open job in one table. Disclosure: it is mine and it is paid, 3 USD per 1,000 job ads; the free monthly credit of an Apify account covers about 1,600.&lt;/p&gt;

&lt;p&gt;How the detection works, the part I spent most time on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A website: the tool reads at most 4 public pages of the site (the home page, the careers link it finds there, then /careers and /jobs), looks for links and embeds of nine career systems (Greenhouse, Lever, Ashby, Workday, Workable, Personio, Recruitee, Teamtailor, Gem) and reads the board it finds through that system's public job API. robots.txt is respected. A site behind an anti-bot wall is skipped, not forced, and the tool falls back to the company name.&lt;/li&gt;
&lt;li&gt;A name: legal suffixes are dropped ("Stripe, Inc." becomes stripe), accents are normalised, and the joined and hyphenated forms are tried on each system.&lt;/li&gt;
&lt;li&gt;Every input line ends up in a coverage report: matched by website, by name, or not found, with the reason and the names tried. Duplicates (stripe and stripe.com) are read once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my test on 12 real companies, 5 were found directly from their website (Notion, Linear, Figma, Palantir, bunq) and the rest by name (Stripe, Ramp, Deezer, Airbnb, Databricks, and GitLab after its site's bot wall). example.com was correctly reported as not found.&lt;/p&gt;

&lt;p&gt;Example input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"https://www.notion.so"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"figma.com/careers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linear.app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Stripe, Inc."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hugging Face"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row has the same columns whatever the system: title, company, locations, department, employment type, workplace type (remote, hybrid, on-site), salary range when the company publishes it, posting date, description and apply link. Turn on "only new rows" and schedule it daily to get just the jobs that appeared since the last run.&lt;/p&gt;

&lt;p&gt;Real results, no account needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/rowcraft/career-site-jobs-scraper/examples/jobs-from-company-websites" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/career-site-jobs-scraper/examples/jobs-from-company-websites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/rowcraft/career-site-jobs-scraper/examples/jobs-by-company-name" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/career-site-jobs-scraper/examples/jobs-by-company-name&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tool: &lt;a href="https://apify.com/rowcraft/career-site-jobs-scraper" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/career-site-jobs-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What it does not do: LinkedIn, Indeed or other job boards (only the companies' own career systems), and no contact details: e-mails and phone numbers inside job texts are removed.&lt;/p&gt;

&lt;p&gt;Which career system is missing for you? I add the ones that publish a public job API.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>jobs</category>
      <category>api</category>
      <category>automation</category>
    </item>
    <item>
      <title>Look up companies across France, Norway, Poland and the UK in one run, with LEI and parent companies</title>
      <dc:creator>Rowcraft</dc:creator>
      <pubDate>Sun, 25 Oct 2026 04:09:37 +0000</pubDate>
      <link>https://dev.to/rowcraft/look-up-companies-across-france-norway-poland-and-the-uk-in-one-run-with-lei-and-parent-companies-4n7i</link>
      <guid>https://dev.to/rowcraft/look-up-companies-across-france-norway-poland-and-the-uk-in-one-run-with-lei-and-parent-companies-4n7i</guid>
      <description>&lt;p&gt;Company data in Europe is split across national registers that each speak their own format: Sirene in France, Brønnøysund in Norway, KRS in Poland, Companies House in the UK. If you have a list of suppliers or prospects from several countries, you end up with four lookups and four different column layouts.&lt;/p&gt;

&lt;p&gt;I built an Apify tool that takes one list (names, websites, registry numbers or LEIs, one per line) and returns one flat row per company with the same columns whatever the country: legal form, status, founding date, activity code, registered office, website and VAT number when the register publishes them, plus the LEI and the direct and ultimate parent company from the GLEIF index. Disclosure: it is mine and it is paid, 1 USD per 1,000 profiles; the free monthly credit on Apify covers test runs.&lt;/p&gt;

&lt;p&gt;How matching works, the part I spent most time on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A registry number is recognised by its length and check digits (SIREN, Norwegian organisation number, KRS, Companies House number) and read directly. A number that fails its check digits is reported as invalid without a request.&lt;/li&gt;
&lt;li&gt;A name is delivered only when a register name equals what you typed (legal-form words such as SA, ASA or Ltd are ignored). Close matches are delivered only if you ask for them, and the row says it is close.&lt;/li&gt;
&lt;li&gt;A LEI leads back to the national register that holds the company and brings the parent companies with it.&lt;/li&gt;
&lt;li&gt;Lines that match nothing, or only a person, are not charged and are listed with the reason in the run's coverage report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example input, five lines of four kinds:&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;"542051180"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"923 609 016"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"KRS 0000028860"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Equinor ASA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.orange.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"countries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"FR"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"NO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GB"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matchMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact"&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;Each row has about 40 fields: identity (name, country, registry number and its type, the register, a row ID such as FR:542051180), legal form and status, the activity code with its classification (NAF, SN2007, PKD, UK SIC), employees and latest revenue where accounts are filed, registered office, website, VAT number, LEI and parents, and optionally a website profile (CMS, analytics, social profile links, SSL, name servers, mail provider). Real rows are on the example pages, no account needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/rowcraft/company-intelligence-europe/examples/company-profiles-from-registry-numbers" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/company-intelligence-europe/examples/company-profiles-from-registry-numbers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/rowcraft/company-intelligence-europe/examples/lei-to-company-profile-with-parents" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/company-intelligence-europe/examples/lei-to-company-profile-with-parents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Privacy by design: companies only. Sole traders and other natural persons are dropped at the source; directors, shareholders, e-mail addresses and phone numbers are never read.&lt;/p&gt;

&lt;p&gt;Two limits worth knowing: the UK needs your own free Companies House API key, otherwise the UK is covered through the LEI index only; and the public APIs are called at one request per second per host, so a list of 10,000 lines takes a while.&lt;/p&gt;

&lt;p&gt;Which other registers would make this useful for you? Germany and Spain are on my list, but I only add sources that publish company data openly, without a login or a paid contract.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>data</category>
      <category>api</category>
      <category>europe</category>
    </item>
    <item>
      <title>Look up Brazilian companies by CNPJ, or find them by state, city and CNAE code</title>
      <dc:creator>Rowcraft</dc:creator>
      <pubDate>Thu, 22 Oct 2026 21:19:20 +0000</pubDate>
      <link>https://dev.to/rowcraft/look-up-brazilian-companies-by-cnpj-or-find-them-by-state-city-and-cnae-code-3m4</link>
      <guid>https://dev.to/rowcraft/look-up-brazilian-companies-by-cnpj-or-find-them-by-state-city-and-cnae-code-3m4</guid>
      <description>&lt;p&gt;Brazil has one of the richest public company registers, but getting it into a spreadsheet is awkward: the Receita Federal publishes monthly dumps of several gigabytes, and web lookups work one CNPJ at a time.&lt;/p&gt;

&lt;p&gt;I built an Apify tool on top of the free community service minhareceita.org (with OpenCNPJ as a fallback for lookups). Disclosure: I made it and it is paid, 1 USD per 1,000 companies on the free plan, and the free monthly credit covers your first runs.&lt;/p&gt;

&lt;p&gt;Two modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lookup: paste CNPJ numbers (with or without dots) and get the register data back. A number with wrong check digits is reported without a request, and numbers that do not exist are not charged.&lt;/li&gt;
&lt;li&gt;Search: states (UF), 7-digit CNAE activity codes, IBGE city codes, legal nature codes, opening date, active companies only, head offices only.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example: listed software companies in São Paulo.&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;"states"&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;"SP"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"activityCodes"&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;"6201501"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6202300"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6209100"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6311900"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"legalNatureCodes"&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;"2054"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2046"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row: CNPJ, legal name, trade name, status and reason, main and secondary CNAE, legal nature, capital, size, address of the establishment, opening date. Real rows are on the example page, no account needed.&lt;/p&gt;

&lt;p&gt;Privacy by design: no partners, no e-mail, no phone. Sole traders (MEI, "Empresário Individual") and other legal forms named after a person are skipped and never charged, because their register entry can carry the person's tax number.&lt;/p&gt;

&lt;p&gt;Tip: name a legal nature such as 2054 (closed corporation) or 2046 (open corporation) in a search. Without it the tool also reads many sole-trader records only to skip them, which is slower.&lt;/p&gt;

&lt;p&gt;Example page: &lt;a href="https://apify.com/rowcraft/brazil-cnpj-companies-scraper/examples/listed-software-companies-sao-paulo-cnpj" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/brazil-cnpj-companies-scraper/examples/listed-software-companies-sao-paulo-cnpj&lt;/a&gt;&lt;br&gt;
Tool page: &lt;a href="https://apify.com/rowcraft/brazil-cnpj-companies-scraper" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/brazil-cnpj-companies-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback and missing filters: the Issues tab of the tool, I answer within a day.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>brazil</category>
      <category>data</category>
      <category>api</category>
    </item>
    <item>
      <title>Get US federal contract opportunities as clean JSON, without a SAM.gov API key</title>
      <dc:creator>Rowcraft</dc:creator>
      <pubDate>Thu, 22 Oct 2026 21:18:13 +0000</pubDate>
      <link>https://dev.to/rowcraft/get-us-federal-contract-opportunities-as-clean-json-without-a-samgov-api-key-3fcc</link>
      <guid>https://dev.to/rowcraft/get-us-federal-contract-opportunities-as-clean-json-without-a-samgov-api-key-3fcc</guid>
      <description>&lt;p&gt;If you sell to the US government, you probably watch SAM.gov for new solicitations. The website is fine for browsing, but if you want the notices in a spreadsheet, a CRM or an alert script, you hit two walls: the official API needs a registered key with strict rate limits, and the daily extract is a 200 MB CSV with columns you have to decode.&lt;/p&gt;

&lt;p&gt;I built a small tool that reads the official GSA Contract Opportunities extract (the one published on open.gsa.gov) and returns only the notices you filter for, as JSON or CSV. Disclosure: I made it and it is a paid tool on the Apify Store, 2 USD per 1,000 notices on the free plan, and the free monthly credit covers your first test runs.&lt;/p&gt;

&lt;p&gt;What you can filter by: keywords (and keywords to exclude), NAICS and PSC codes, set-asides (small business, 8(a), HUBZone, SDVOSB and others), notice types, agencies, states, posting date, open notices only, award date and amount.&lt;/p&gt;

&lt;p&gt;Example: open IT solicitations posted in the last 14 days.&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;"naics"&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;"5415"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"noticeTypes"&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;"solicitation"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"combined-synopsis-solicitation"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"openOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"publishedAfter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"14 days"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each row has the title, notice type, agency, NAICS, set-aside, response deadline, posted date, place of performance, description and the link to the notice on SAM.gov. The first rows of a real run are on the example page, you can open it without an account.&lt;/p&gt;

&lt;p&gt;What it does not do, on purpose: it does not return contact names, e-mails or phone numbers (the contact columns are never read, and e-mails and phones inside the description text are removed). It is for finding opportunities, not for building a contact list.&lt;/p&gt;

&lt;p&gt;Try the example: &lt;a href="https://apify.com/rowcraft/sam-gov-contract-opportunities-scraper/examples/open-it-solicitations-last-14-days" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/sam-gov-contract-opportunities-scraper/examples/open-it-solicitations-last-14-days&lt;/a&gt;&lt;br&gt;
Tool page: &lt;a href="https://apify.com/rowcraft/sam-gov-contract-opportunities-scraper" rel="noopener noreferrer"&gt;https://apify.com/rowcraft/sam-gov-contract-opportunities-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If a filter you need is missing, tell me in the comments or in the tool's Issues tab and I will look at it.&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>data</category>
      <category>government</category>
    </item>
  </channel>
</rss>
