<?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: link</title>
    <description>The latest articles on DEV Community by link (@saber3188).</description>
    <link>https://dev.to/saber3188</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%2F4189971%2Fde620752-8904-42a4-80c4-716b64a8a9cd.png</url>
      <title>DEV Community: link</title>
      <link>https://dev.to/saber3188</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saber3188"/>
    <language>en</language>
    <item>
      <title>How to Get a List of Companies in a French Department or Postcode</title>
      <dc:creator>link</dc:creator>
      <pubDate>Sat, 17 Oct 2026 10:17:18 +0000</pubDate>
      <link>https://dev.to/saber3188/how-to-get-a-list-of-companies-in-a-french-department-or-postcode-b1h</link>
      <guid>https://dev.to/saber3188/how-to-get-a-list-of-companies-in-a-french-department-or-postcode-b1h</guid>
      <description>&lt;p&gt;You want a list of companies in a French department: every business in Lozère, in Paris, or in one postcode, as a spreadsheet. For single lookups by SIREN or SIRET, see the &lt;a href="https://dev.to/saber3188/siren-lookup-api-tutorial-search-french-companies-by-siren-siret-naf-code-or-department-no-api-3560"&gt;SIREN lookup API tutorial&lt;/a&gt;; for lists by activity, see the companion guide on &lt;a href="https://dev.to/saber3188/how-to-get-a-list-of-french-companies-by-naf-code-and-prepare-for-naf-2025-j1h"&gt;French companies by NAF code&lt;/a&gt;. This page covers lists by place with &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE)&lt;/a&gt;, an Apify Actor, with no API key. Location search has two traps, and our real runs show both.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Department codes in 10 seconds:&lt;/strong&gt; mainland departments use two characters, for example &lt;code&gt;48&lt;/code&gt; (Lozère) or &lt;code&gt;75&lt;/code&gt; (Paris). Corsica uses &lt;code&gt;2A&lt;/code&gt; and &lt;code&gt;2B&lt;/code&gt;. Overseas departments use &lt;code&gt;971&lt;/code&gt;, &lt;code&gt;972&lt;/code&gt;, &lt;code&gt;973&lt;/code&gt;, &lt;code&gt;974&lt;/code&gt; and &lt;code&gt;976&lt;/code&gt; (there is no department &lt;code&gt;975&lt;/code&gt;). See INSEE's &lt;a href="https://www.insee.fr/fr/information/8740222" rel="noopener noreferrer"&gt;geographic code list for 2026&lt;/a&gt; (in French). Postcodes have 5 digits, and one postcode can cover several communes: according to La Poste's &lt;a href="https://data.laposte.fr/datasets/laposte-hexasmal" rel="noopener noreferrer"&gt;postcode database&lt;/a&gt;, &lt;code&gt;48100&lt;/code&gt; covers 15 communes, including Marvejols.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step-by-step: companies in one department
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE)&lt;/a&gt;, click &lt;strong&gt;Try for free&lt;/strong&gt; and sign in. Clear the pre-filled SIREN numbers.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Departments&lt;/strong&gt; (&lt;code&gt;departments&lt;/code&gt;), add one or more codes, for example &lt;code&gt;["48"]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Optional: add &lt;strong&gt;NAF codes&lt;/strong&gt; (&lt;code&gt;nafCodes&lt;/code&gt;, current NAF rév. 2 codes such as &lt;code&gt;62.01Z&lt;/code&gt;) to narrow by activity, and set &lt;strong&gt;Status&lt;/strong&gt; (&lt;code&gt;status&lt;/code&gt;) to &lt;code&gt;"active"&lt;/code&gt;. The default is &lt;code&gt;"any"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Max companies&lt;/strong&gt; (&lt;code&gt;maxItems&lt;/code&gt;, 1 to 10,000) to cap how many companies are output and charged.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;, then open the dataset and click &lt;strong&gt;Export&lt;/strong&gt; for CSV or JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Which address matches? Head office vs establishments
&lt;/h2&gt;

&lt;p&gt;A French company (legal unit, SIREN) can have several establishments (sites, SIRET). The department and postcode filters match &lt;strong&gt;any establishment&lt;/strong&gt;, not only the head office (siège). &lt;code&gt;matchedEstablishmentSirets&lt;/code&gt; lists the sites that matched.&lt;/p&gt;

&lt;p&gt;In a live run on 15 October 2026 at 16:07 (UTC+8) with &lt;code&gt;{"nafCodes": ["62.01Z"], "departments": ["48"], "maxItems": 5}&lt;/code&gt;, 2 of the 5 companies had their head office in another department and matched through an establishment in Lozère. Both are sole traders, so they are not shown. In other words, a "Lozère list" also includes companies that only have a site there.&lt;/p&gt;

&lt;p&gt;The other 3 have their head office in department 48. Here is one, shortened, with the street address removed:&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;"siren"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"892371139"&lt;/span&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;"SOLARIS BI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isIndividualEntrepreneur"&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;"headOffice"&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="nl"&gt;"siret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"89237113900015"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MARVEJOLS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"department"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"48"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matchedEstablishmentSirets"&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;"89237113900015"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"89237113900023"&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;Both of its establishments matched, including the head office itself (&lt;code&gt;89237113900015&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;To keep only companies &lt;strong&gt;based&lt;/strong&gt; in the area, filter on the head office after the run. Load the JSON export and flatten &lt;code&gt;headOffice&lt;/code&gt;; codes stay strings, so leading zeros and &lt;code&gt;2A&lt;/code&gt; survive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataset.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;based&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;headOffice.department&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;48&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# or: df["headOffice.postalCode"] == "48100"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the run above, this keeps 3 of 5 rows. In a CSV export, Apify names nested columns with a slash (&lt;code&gt;headOffice/department&lt;/code&gt;). Read it with &lt;code&gt;pd.read_csv("dataset.csv", dtype=str)&lt;/code&gt;, or &lt;code&gt;"48"&lt;/code&gt; becomes the number &lt;code&gt;48&lt;/code&gt; and the filter keeps 0 rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step: companies in one postcode
&lt;/h2&gt;

&lt;p&gt;Use &lt;strong&gt;Postal codes&lt;/strong&gt; (&lt;code&gt;postalCodes&lt;/code&gt;) instead of departments. It takes 5-digit codes and, like departments, matches any establishment. If you fill in both, each department is combined with each postcode, so one of the two is usually enough. This is the input of a live run on 17 October 2026 at 17:22 (UTC+8):&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="nl"&gt;"postalCodes"&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;"48100"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;"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;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It returned 5 companies, all large companies (&lt;code&gt;companyCategory&lt;/code&gt; &lt;code&gt;GE&lt;/code&gt;) with head offices outside Lozère: three in Paris (75), one in Créteil (94) and one in Saint-Denis (93). Each matched through one or two local establishments. One record, shortened, with the street address removed:&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;"siren"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"412280737"&lt;/span&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;"SNCF RESEAU"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;"nafCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"52.21Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"establishmentsCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2250&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headOffice"&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="nl"&gt;"siret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"41228073720375"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SAINT-DENIS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"department"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"93"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matchedEstablishmentSirets"&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;"41228073712067"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"41228073712091"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"diffusionStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"O"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceUpdatedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-16T08:04:58"&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;If you searched "companies in 48100", you probably want companies based there, not national groups with a local branch. Two fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filter on the head office&lt;/strong&gt; with the snippet above, using &lt;code&gt;headOffice.postalCode == "48100"&lt;/code&gt;. On this 5-row sample it returns &lt;strong&gt;0 rows&lt;/strong&gt;, because none of the 5 has its head office in 48100. The filter runs after the export, so set a larger &lt;code&gt;maxItems&lt;/code&gt; to reach the locally based companies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a NAF code&lt;/strong&gt; (&lt;code&gt;nafCodes&lt;/code&gt;) so the search itself only returns companies in your activity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Big cities: splitting Paris by postcode
&lt;/h2&gt;

&lt;p&gt;Each query to the upstream API returns at most 10,000 results, and &lt;code&gt;total_results&lt;/code&gt; never goes above 10,000. A live run on 15 October 2026 at 16:21 (UTC+8) used &lt;code&gt;{"nafCodes": ["62.01Z"], "departments": ["75"], "incorporatedFrom": "2026-01-01", "maxItems": 10000}&lt;/code&gt;. Its log shows these warnings, verbatim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RESULT_CAP_REACHED {'activite_principale': '62.01Z', 'departement': '75'} total_results=10000
DATE_FILTER_MAY_BE_INCOMPLETE: results may be incomplete, narrow the query with postal codes or NAF codes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actor applies the creation date filter itself, so it only sees those first 10,000 matches. The run scanned 6,800 results, filtered 5,677 out by creation date, and output 1,123 companies before it stopped on its time budget (&lt;code&gt;stoppedReason: "time_budget"&lt;/code&gt;). Even here, 18 of the 1,123 had their head office outside Paris, 6 of them abroad.&lt;/p&gt;

&lt;p&gt;For Paris and other dense departments, split by postcode. The Actor searches each postcode as a separate slice, so each one gets its own 10,000-result scan. La Poste's postcode database lists 21 postcodes for Paris: &lt;code&gt;75001&lt;/code&gt; to &lt;code&gt;75020&lt;/code&gt;, plus &lt;code&gt;75116&lt;/code&gt; (the 16th arrondissement has both &lt;code&gt;75016&lt;/code&gt; and &lt;code&gt;75116&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nafCodes"&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;"62.01Z"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postalCodes"&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;"75001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75002"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75003"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75004"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75005"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75006"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75007"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="s2"&gt;"75008"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75009"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75010"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75011"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75012"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75013"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75014"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                  &lt;/span&gt;&lt;span class="s2"&gt;"75015"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75016"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75116"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75017"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75018"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75019"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75020"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"incorporatedFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-01-01"&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;10000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A company found in several postcodes is output and charged only once per run. Check &lt;code&gt;RUN-STATS&lt;/code&gt; after each run: if a warning still appears, add a NAF code, narrow the date range, or raise the run timeout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local market sizing:&lt;/strong&gt; count companies in a department or postcode, optionally by activity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Territory planning (company-level):&lt;/strong&gt; split a region into sales territories by postcode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supplier sourcing:&lt;/strong&gt; find companies based in a region, filtering on the head office.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYB address checks:&lt;/strong&gt; compare a supplier's stated location with its head office and establishments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sole traders' company names are personal names, and units with &lt;code&gt;diffusionStatus = "P"&lt;/code&gt; must not be used for marketing or prospecting. You are the data controller, and B2B prospecting must follow GDPR and CNIL rules (see the CNIL's guidance on &lt;a href="https://www.cnil.fr/fr/la-prospection-commerciale-par-courrier-electronique-sms-mms-et-automate-dappel" rel="noopener noreferrer"&gt;electronic commercial prospecting&lt;/a&gt;, in French). This is not legal advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;$0.003 per company written to the dataset ($3 per 1,000 companies). Example: 500 companies = 500 x $0.003 = $1.50.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do I get a list of all companies in a French department?&lt;/strong&gt;&lt;br&gt;
In France Company Search, put the code (e.g. 48, 2A or 971) in &lt;code&gt;departments&lt;/code&gt; and export the results as CSV or JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I search French companies by postcode?&lt;/strong&gt;&lt;br&gt;
Yes. Use &lt;code&gt;postalCodes&lt;/code&gt; with one or more 5-digit codes, alone or combined with a NAF code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the department filter use the head office address?&lt;/strong&gt;&lt;br&gt;
No. It matches any establishment, so a company based elsewhere is included if it has a site there. &lt;code&gt;matchedEstablishmentSirets&lt;/code&gt; shows which site matched; filter on &lt;code&gt;headOffice.department&lt;/code&gt; to keep locally based companies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is my Paris list incomplete?&lt;/strong&gt;&lt;br&gt;
Each query returns at most 10,000 results. Split by postcode or add a NAF code or creation-date range. The run statistics warn when the cap is reached.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What are the department codes for Corsica and overseas France?&lt;/strong&gt;&lt;br&gt;
Corsica uses 2A and 2B; the overseas departments use 971, 972, 973, 974 and 976.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need an API key?&lt;/strong&gt;&lt;br&gt;
No. The tool reads the public API Recherche d'entreprises, which needs no key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does it cost?&lt;/strong&gt;&lt;br&gt;
$0.003 per company, $3 per 1,000.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;Pick a department or postcode, add a NAF code if the area is dense, run, export, and filter on the head office if you want companies based there. Try &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE) on Apify&lt;/a&gt;. For number lookups and API calls, read the &lt;a href="https://dev.to/saber3188/siren-lookup-api-tutorial-search-french-companies-by-siren-siret-naf-code-or-department-no-api-3560"&gt;SIREN lookup API tutorial&lt;/a&gt;; for activity lists and NAF 2025, see &lt;a href="https://dev.to/saber3188/how-to-get-a-list-of-french-companies-by-naf-code-and-prepare-for-naf-2025-j1h"&gt;French companies by NAF code&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data: Annuaire des Entreprises / API Recherche d'entreprises (DINUM), INSEE Sirene and other French public registers, reused under Licence Ouverte 2.0.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>webscraping</category>
      <category>opendata</category>
    </item>
    <item>
      <title>How to Get a List of French Companies by NAF Code (and Prepare for NAF 2025)</title>
      <dc:creator>link</dc:creator>
      <pubDate>Sat, 17 Oct 2026 09:15:49 +0000</pubDate>
      <link>https://dev.to/saber3188/how-to-get-a-list-of-french-companies-by-naf-code-and-prepare-for-naf-2025-j1h</link>
      <guid>https://dev.to/saber3188/how-to-get-a-list-of-french-companies-by-naf-code-and-prepare-for-naf-2025-j1h</guid>
      <description>&lt;p&gt;You need a list of French companies by NAF code: every company in one activity, maybe in one department, as a spreadsheet. But the portals are mostly in French, INSEE's Sirene API needs an account and its own query syntax, and the bulk files hold the whole register. For single lookups by SIREN or SIRET, see the related guide, the &lt;a href="https://dev.to/saber3188/siren-lookup-api-tutorial-search-french-companies-by-siren-siret-naf-code-or-department-no-api-3560"&gt;SIREN lookup API tutorial&lt;/a&gt;. This page covers exporting French companies by industry with &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE)&lt;/a&gt;, an Apify Actor, with no API key.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  NAF codes in 30 seconds
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NAF&lt;/strong&gt; (Nomenclature d'activités française) is the French classification of economic activities, built on the European NACE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APE code&lt;/strong&gt; (activité principale exercée) is the code INSEE assigns to a company or establishment by reference to the NAF.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Format:&lt;/strong&gt; for example &lt;code&gt;62.01Z&lt;/code&gt; (computer programming).&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Find your code:&lt;/strong&gt; search the NAF by keyword on INSEE's &lt;a href="https://www.insee.fr/fr/information/2406147" rel="noopener noreferrer"&gt;Nomenclature d'activités française&lt;/a&gt; page (in French).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  NAF 2025: what changes on 1 January 2027
&lt;/h2&gt;

&lt;p&gt;NAF 2025, nested in the European NACE Rev. 2.1, replaces NAF rév. 2. According to INSEE's &lt;a href="https://www.insee.fr/fr/information/8181066" rel="noopener noreferrer"&gt;NAF 2025 page&lt;/a&gt; and its &lt;a href="https://www.insee.fr/fr/information/9019311" rel="noopener noreferrer"&gt;Sirene open data newsletter&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New reference from 1 January 2027.&lt;/strong&gt; NAF 2025 becomes the reference nomenclature for assigning APE codes. It was approved by Décret n° 2025-736 du 31 juillet 2025.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All active units are recoded.&lt;/strong&gt; Every active legal unit in Sirene (companies, associations, local authorities) and its establishments gets a modified APE code. The format stays 4 digits and a letter, but no code is shared between the two versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A correspondence table exists.&lt;/strong&gt; INSEE's NAF rév. 2 to NAF 2025 table (January 2026 edition) marks each link "Unique" or "Multiple", so some old codes split. &lt;code&gt;62.01Z&lt;/code&gt; has a "Unique" correspondence: it maps only to &lt;code&gt;62.10Y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Businesses can check their future code&lt;/strong&gt; on &lt;a href="https://sirene.gouv.fr" rel="noopener noreferrer"&gt;sirene.gouv.fr&lt;/a&gt; during 2026 with their SIREN and ask for a correction if needed (see also &lt;a href="https://entreprendre.service-public.gouv.fr/vosdroits/R75416" rel="noopener noreferrer"&gt;service-public R75416&lt;/a&gt;, in French).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CRM fields, segments and saved searches built on NAF codes will need remapping, and where an old code splits, you want each company's own future code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How France Company Search handles this:&lt;/strong&gt; the &lt;code&gt;nafCodes&lt;/code&gt; filter takes current NAF rév. 2 codes only, such as &lt;code&gt;62.01Z&lt;/code&gt; (&lt;code&gt;6201Z&lt;/code&gt; is also accepted). Each record carries &lt;code&gt;nafCode&lt;/code&gt; (the current rév. 2 code) and &lt;code&gt;nafCode2025&lt;/code&gt; (the company's future NAF 2025 code) side by side. You filter with today's code and read the 2027 code from the output, so one export gives you the old to new mapping for your own list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step: list companies by NAF code
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE)&lt;/a&gt;, click &lt;strong&gt;Try for free&lt;/strong&gt; and sign in. No French API key is needed. Clear the pre-filled SIREN numbers.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;NAF codes&lt;/strong&gt; (&lt;code&gt;nafCodes&lt;/code&gt;), add your current code, for example &lt;code&gt;["62.01Z"]&lt;/code&gt;. The filter applies to the legal unit's main activity.&lt;/li&gt;
&lt;li&gt;Optional: in &lt;strong&gt;Departments&lt;/strong&gt; (&lt;code&gt;departments&lt;/code&gt;), add a code, for example &lt;code&gt;["48"]&lt;/code&gt; (Lozère). It matches any establishment, not only the head office; &lt;code&gt;matchedEstablishmentSirets&lt;/code&gt; shows which matched.&lt;/li&gt;
&lt;li&gt;Optional: set &lt;strong&gt;Status&lt;/strong&gt; (&lt;code&gt;status&lt;/code&gt;) to &lt;code&gt;"active"&lt;/code&gt; to leave out ceased companies. The default is &lt;code&gt;"any"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Max companies&lt;/strong&gt; (&lt;code&gt;maxItems&lt;/code&gt;, 1 to 10,000) to cap how many companies are output and charged.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;, then open the dataset and click &lt;strong&gt;Export&lt;/strong&gt; for CSV or JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sample input and output
&lt;/h2&gt;

&lt;p&gt;This is the input of a live run on 15 October 2026 at 16:07 (UTC+8):&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="nl"&gt;"nafCodes"&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;"62.01Z"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"departments"&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;"48"&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;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;status&lt;/code&gt; was left at its default (&lt;code&gt;"any"&lt;/code&gt;). The run returned 5 companies. Two were sole traders (&lt;code&gt;isIndividualEntrepreneur: true&lt;/code&gt;), whose company names are personal names, so they are not shown. Both had their head office outside Lozère and matched through an establishment in department 48. The other 3 had their head office in department 48.&lt;/p&gt;

&lt;p&gt;Here is one of those 3 records, shortened, with the street address removed (town kept); other shown values are unchanged:&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;"siren"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"892371139"&lt;/span&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;"SOLARIS BI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;"creationDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2021-01-02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nafCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"62.01Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nafCode2025"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"62.10Y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"legalFormCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5710"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PME"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headOffice"&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="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MARVEJOLS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"department"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"48"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"matchedEstablishmentSirets"&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;"89237113900015"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"89237113900023"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isIndividualEntrepreneur"&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;"diffusionStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"O"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"annuaireUrl"&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://annuaire-entreprises.data.gouv.fr/entreprise/892371139"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sourceUpdatedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-14T08:09:07"&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;Note the pair &lt;code&gt;"nafCode": "62.01Z"&lt;/code&gt; and &lt;code&gt;"nafCode2025": "62.10Y"&lt;/code&gt;. All 5 records in this run carry it, matching INSEE's correspondence table. Both of this company's establishments in department 48 appear in &lt;code&gt;matchedEstablishmentSirets&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To drop sole traders and build your old to new mapping, load the JSON export with pandas, keeping IDs and codes as strings so leading zeros survive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataset.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;siren&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;legalFormCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;isIndividualEntrepreneur&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;mapping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nafCode&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nafCode2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;size&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;reset_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companies&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mapping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dirigeants&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;to_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companies.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orient&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;records&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;force_ascii&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On this run's export, &lt;code&gt;mapping&lt;/code&gt; has one row: &lt;code&gt;62.01Z&lt;/code&gt;, &lt;code&gt;62.10Y&lt;/code&gt;, 3 companies. &lt;code&gt;companies.json&lt;/code&gt; keeps the 3 non sole trader records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Narrowing big segments
&lt;/h2&gt;

&lt;p&gt;Each query scans at most 10,000 results. For a large code such as &lt;code&gt;62.01Z&lt;/code&gt; across France, split the job by department or postcode (&lt;code&gt;postalCodes&lt;/code&gt;), or use a more specific code. When a query hits the cap, &lt;code&gt;RUN-STATS&lt;/code&gt; warns you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Market sizing:&lt;/strong&gt; count companies by activity and region, optionally by creation date (&lt;code&gt;incorporatedFrom&lt;/code&gt;, &lt;code&gt;incorporatedTo&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYB and supplier vetting:&lt;/strong&gt; check status and legal form across a sector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remapping before NAF 2025:&lt;/strong&gt; export your current segments and rebuild them with &lt;code&gt;nafCode2025&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Company-level lead lists, within the rules:&lt;/strong&gt; sole traders' names are personal data, and units with &lt;code&gt;diffusionStatus = "P"&lt;/code&gt; must not be used for marketing or prospecting. You are the data controller and B2B prospecting must follow GDPR and CNIL rules (see the CNIL's guidance on &lt;a href="https://www.cnil.fr/fr/la-prospection-commerciale-par-courrier-electronique-sms-mms-et-automate-dappel" rel="noopener noreferrer"&gt;electronic commercial prospecting&lt;/a&gt;, in French). This is not legal advice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;p&gt;$0.003 per company written to the dataset ($3 per 1,000 companies). Worked example: 2,000 companies = 2,000 x $0.003 = $6.00.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do I get a list of all companies with a given NAF code in France?&lt;/strong&gt;&lt;br&gt;
In France Company Search, put the code (e.g. 62.01Z) in &lt;code&gt;nafCodes&lt;/code&gt;, optionally add a department, and export CSV or JSON.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between a NAF code and an APE code?&lt;/strong&gt;&lt;br&gt;
NAF is the French classification of activities; the APE code is the NAF code INSEE assigns to a company or establishment for its main activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is NAF 2025?&lt;/strong&gt;&lt;br&gt;
The new French activity classification. From 1 January 2027 it becomes the reference for APE codes, and all active units in Sirene get an updated code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I find a company's new NAF 2025 code?&lt;/strong&gt;&lt;br&gt;
During 2026, a business can check its future code on sirene.gouv.fr with its SIREN. For a list, France Company Search returns &lt;code&gt;nafCode2025&lt;/code&gt; next to the current &lt;code&gt;nafCode&lt;/code&gt; in each record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I search by NAF 2025 codes?&lt;/strong&gt;&lt;br&gt;
No. Filter with the current rév. 2 code and read the new code from &lt;code&gt;nafCode2025&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I filter by department and NAF code together?&lt;/strong&gt;&lt;br&gt;
Yes. Combine &lt;code&gt;nafCodes&lt;/code&gt; and &lt;code&gt;departments&lt;/code&gt;. The department filter matches any establishment, so the head office can be elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need an INSEE API key?&lt;/strong&gt;&lt;br&gt;
No. The tool reads the keyless public API Recherche d'entreprises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does it cost?&lt;/strong&gt;&lt;br&gt;
$0.003 per company returned, i.e. $3 per 1,000 companies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;Enter the current NAF code, add a department if needed, run and export; each record already shows its NAF 2025 code. Try &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE) on Apify&lt;/a&gt;, and for SIREN and SIRET lookups and API calls, read the &lt;a href="https://dev.to/saber3188/siren-lookup-api-tutorial-search-french-companies-by-siren-siret-naf-code-or-department-no-api-3560"&gt;SIREN lookup API tutorial&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data: Annuaire des Entreprises / API Recherche d'entreprises (DINUM), INSEE Sirene and other French public registers, reused under Licence Ouverte 2.0.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>webscraping</category>
      <category>opendata</category>
    </item>
    <item>
      <title>How to Get a List of Directors for UK Companies in Any Industry (SIC Code)</title>
      <dc:creator>link</dc:creator>
      <pubDate>Sat, 17 Oct 2026 09:15:22 +0000</pubDate>
      <link>https://dev.to/saber3188/how-to-get-a-list-of-directors-for-uk-companies-in-any-industry-sic-code-29la</link>
      <guid>https://dev.to/saber3188/how-to-get-a-list-of-directors-for-uk-companies-in-any-industry-sic-code-29la</guid>
      <description>&lt;p&gt;Building a UK company directors list for a whole industry looks easy until you try it: the free Companies House bulk download has SIC codes but no directors, and the API needs a separate officers call for every company. For the full API tutorial, see &lt;a href="https://dev.to/saber3188/how-to-use-the-companies-house-api-without-writing-the-plumbing-uk-company-officers-and-psc-data-31ip"&gt;How to Use the Companies House API Without Writing the Plumbing&lt;/a&gt;. This guide covers one job: a spreadsheet of directors for every company in one SIC code and area, using the &lt;a href="https://apify.com/kingly_apple/companies-house-scraper" rel="noopener noreferrer"&gt;Companies House Scraper on Apify&lt;/a&gt;, with no code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Only need one company?&lt;/strong&gt; You don't need a tool. Open the company on GOV.UK &lt;a href="https://find-and-update.company-information.service.gov.uk/" rel="noopener noreferrer"&gt;Find and update company information&lt;/a&gt; and select "People" to see its directors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why the free bulk download isn't enough
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The bulk snapshot is company data only.&lt;/strong&gt; The free monthly CSV of live companies includes SIC codes but no directors. See &lt;a href="https://www.gov.uk/guidance/companies-house-data-products" rel="noopener noreferrer"&gt;Companies House data products&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Officers come one company at a time.&lt;/strong&gt; Directors live behind the API endpoint &lt;code&gt;/company/{company_number}/officers&lt;/code&gt;, one call per company.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limits turn it into a chore.&lt;/strong&gt; The API allows 600 requests per 5 minutes per key. At scale you handle pauses, retries and pagination.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the job has two steps: search companies by SIC code with the &lt;a href="https://developer-specs.company-information.service.gov.uk/companies-house-public-data-api/reference/search/advanced-company-search" rel="noopener noreferrer"&gt;advanced company search&lt;/a&gt;, then fetch officers for each result. The scraper does both in one run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A free Companies House API key.&lt;/strong&gt; See &lt;a href="https://dev.to/saber3188/how-to-use-the-companies-house-api-without-writing-the-plumbing-uk-company-officers-and-psc-data-31ip#how-to-get-a-free-companies-house-api-key"&gt;getting a free Companies House API key&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An Apify account&lt;/strong&gt; to run it and download results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your SIC code or codes.&lt;/strong&gt; These are five-digit SIC 2007 codes.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Find your SIC code:&lt;/strong&gt; search the &lt;a href="https://resources.companieshouse.gov.uk/sic/" rel="noopener noreferrer"&gt;Companies House SIC 2007 list&lt;/a&gt; by keyword. For example, 62012 is "Business and domestic software development".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step-by-step: export directors for one industry
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/kingly_apple/companies-house-scraper" rel="noopener noreferrer"&gt;Companies House Scraper&lt;/a&gt;, click &lt;strong&gt;Try for free&lt;/strong&gt; and sign in. Paste your key into &lt;strong&gt;Companies House API key&lt;/strong&gt; (&lt;code&gt;apiKey&lt;/code&gt;). It is stored as a secret and never logged.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;SIC codes&lt;/strong&gt; (&lt;code&gt;sicCodes&lt;/code&gt;), add your code, for example &lt;code&gt;62012&lt;/code&gt;. Clear the pre-filled Tesco company number so the run only uses your search.&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Registered office location&lt;/strong&gt; (&lt;code&gt;location&lt;/code&gt;), enter a town, region or postcode fragment, for example &lt;code&gt;Manchester&lt;/code&gt; for the Greater Manchester area. It is a fuzzy match on the registered office address, not an exact town filter (see the FAQ).&lt;/li&gt;
&lt;li&gt;In &lt;strong&gt;Company status&lt;/strong&gt; (&lt;code&gt;companyStatus&lt;/code&gt;), choose &lt;code&gt;active&lt;/code&gt; so dissolved companies stay out.&lt;/li&gt;
&lt;li&gt;Switch on &lt;strong&gt;Include officers&lt;/strong&gt; (&lt;code&gt;includeOfficers&lt;/code&gt;). Leave &lt;strong&gt;Include persons with significant control&lt;/strong&gt; (&lt;code&gt;includePsc&lt;/code&gt;) off; ownership data is covered in the &lt;a href="https://dev.to/saber3188/how-to-use-the-companies-house-api-without-writing-the-plumbing-uk-company-officers-and-psc-data-31ip"&gt;parent article&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Max companies&lt;/strong&gt; (&lt;code&gt;maxItems&lt;/code&gt;) to cap how many companies are returned and charged. Start small to test, then raise it (1 to 10,000) for a full list.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;. When the run finishes, open its dataset in the Storage tab and click &lt;strong&gt;Export&lt;/strong&gt;. Choose CSV or JSON.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Sample input
&lt;/h2&gt;

&lt;p&gt;This is the input of the live run that produced the record below, with the API key replaced by a placeholder:&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;"sicCodes"&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;"62012"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Manchester"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyStatus"&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;"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;"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;"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;5&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;includePsc&lt;/code&gt; and &lt;code&gt;onlyNew&lt;/code&gt; were left at their defaults (off). &lt;code&gt;companyStatus&lt;/code&gt; takes a list, so &lt;code&gt;["active"]&lt;/code&gt; returns active companies only. Leave it empty for any status.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Need the full list?&lt;/strong&gt; &lt;code&gt;maxItems&lt;/code&gt; 5 keeps a test run cheap. Raise &lt;code&gt;maxItems&lt;/code&gt; (it accepts 1 to 10,000) to export every matching company.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What a director record looks like
&lt;/h2&gt;

&lt;p&gt;This record comes from a live run on 17 October 2026 at 14:58 (UTC+8) using the input above (&lt;code&gt;sicCodes&lt;/code&gt; &lt;code&gt;["62012"]&lt;/code&gt;, &lt;code&gt;location&lt;/code&gt; &lt;code&gt;"Manchester"&lt;/code&gt;, &lt;code&gt;companyStatus&lt;/code&gt; &lt;code&gt;["active"]&lt;/code&gt;, &lt;code&gt;includeOfficers&lt;/code&gt; &lt;code&gt;true&lt;/code&gt;, &lt;code&gt;maxItems&lt;/code&gt; &lt;code&gt;5&lt;/code&gt;). It is truncated, and officers' personal fields (name, date of birth, nationality, residence, occupation, appointment ID) are removed. The street part of the registered office address is shortened; other shown values are unchanged.&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;"companyNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"06575832"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ZIMAL CONSULTING LTD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyStatus"&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;"companyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ltd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dateOfCreation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2008-04-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;"sicCodes"&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;"62012"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"registeredOfficeAddressText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Stockport, Greater Manchester, England"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accountsNextDue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-01-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confirmationStatementNextDue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-05-08"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"officers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"officerRole"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"secretary"&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;"2022-05-01"&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="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"officerRole"&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;"2016-05-01"&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="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"officerRole"&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;"2008-04-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="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"officerRole"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"secretary"&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;"2008-04-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="s2"&gt;"2016-05-01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"officerRole"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"secretary"&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;"2016-05-01"&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="s2"&gt;"2022-05-01"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"officerRole"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"corporate-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;"2008-04-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="s2"&gt;"2008-04-28"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"officersActiveCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"officersResignedCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyUrl"&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://find-and-update.company-information.service.gov.uk/company/06575832"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"licence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Contains public sector information licensed under the Open Government Licence v3.0."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fetchedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-17T06:58:31Z"&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;Officers include secretaries, corporate directors and leavers. Of these 6 entries, 3 have resigned (two secretaries and the corporate director). The 3 active officers in &lt;code&gt;officersActiveCount&lt;/code&gt; are 2 current directors and 1 current secretary. &lt;strong&gt;Tip:&lt;/strong&gt; to get current directors only, keep rows where &lt;code&gt;officerRole&lt;/code&gt; is &lt;code&gt;director&lt;/code&gt; and &lt;code&gt;resignedOn&lt;/code&gt; is empty. Review &lt;code&gt;corporate-director&lt;/code&gt; rows separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning it into one row per director
&lt;/h2&gt;

&lt;p&gt;The CSV export has one row per company. Apify flattens nested fields into numbered columns, for example &lt;code&gt;sicCodes/0&lt;/code&gt;, &lt;code&gt;registeredOfficeAddress/postalCode&lt;/code&gt;, &lt;code&gt;officers/0/officerRole&lt;/code&gt;, &lt;code&gt;officers/0/appointedOn&lt;/code&gt;, &lt;code&gt;officers/0/resignedOn&lt;/code&gt;, then &lt;code&gt;officers/1/...&lt;/code&gt; for the next officer. Each officer slot has 11 columns, including &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;nationality&lt;/code&gt; and three for date of birth (&lt;code&gt;dateOfBirth&lt;/code&gt;, &lt;code&gt;dateOfBirth/month&lt;/code&gt;, &lt;code&gt;dateOfBirth/year&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;So the column count depends on the most officers and SIC codes any company in the batch has. The run above returned 5 companies and 101 columns, because one company has 6 officers (&lt;code&gt;officers/0&lt;/code&gt; to &lt;code&gt;officers/5&lt;/code&gt;) and another has 4 SIC codes (&lt;code&gt;sicCodes/0&lt;/code&gt; to &lt;code&gt;sicCodes/3&lt;/code&gt;). If you don't need these personal fields, delete the &lt;code&gt;officers/N/dateOfBirth...&lt;/code&gt;, &lt;code&gt;officers/N/nationality&lt;/code&gt;, &lt;code&gt;officers/N/countryOfResidence&lt;/code&gt; and &lt;code&gt;officers/N/appointmentId&lt;/code&gt; columns before you share the file.&lt;/p&gt;

&lt;p&gt;For one row per director, use Power Query in Excel on the JSON export (expand the &lt;code&gt;officers&lt;/code&gt; list into rows) or these lines of Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;

&lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dataset.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dtype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyNumber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;officers&lt;/span&gt;&lt;span class="sh"&gt;"&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="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
&lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json_normalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_dict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;records&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;record_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;officers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyNumber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;officerRole&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;director&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;resignedOn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;isna&lt;/span&gt;&lt;span class="p"&gt;())]&lt;/span&gt;
&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current_directors.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use cases (and what's off limits)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Due diligence:&lt;/strong&gt; see who runs every competitor or acquisition target in a sector, with appointment dates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYB and supplier vetting:&lt;/strong&gt; check the directors of a supplier pool, how long they have been in post and who has resigned recently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market mapping and research:&lt;/strong&gt; map director networks in an industry by region.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Off limits: cold email and other unsolicited marketing.&lt;/strong&gt; Officer data is personal data under UK GDPR. The tool's own guidance says you are the controller, you need a lawful basis (for example KYB, AML or due diligence) and you must not use it for unsolicited marketing. UK GDPR and PECR apply to any direct marketing. Don't use this list to email, call or message directors. See the ICO's &lt;a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/lawful-basis/" rel="noopener noreferrer"&gt;guidance on lawful basis&lt;/a&gt;. This is not legal advice.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cost
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;$0.003 per company&lt;/li&gt;
&lt;li&gt;+$0.001 per company with officers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worked example: 200 companies with officers = 200 x $0.004 = $0.80.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How do I get a list of directors for a UK company?&lt;/strong&gt;&lt;br&gt;
For one company, open its page on Find and update company information (GOV.UK) and select "People". For many companies, use the Companies House API's officers endpoint per company, or a tool that runs it for you in batch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I download all UK company directors in one file?&lt;/strong&gt;&lt;br&gt;
Not from the free monthly bulk snapshot: it contains company details and SIC codes but not directors. Director data comes from the API, one company at a time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I find directors of companies by SIC code?&lt;/strong&gt;&lt;br&gt;
Search companies by SIC code with the Companies House advanced search, then fetch each company's officers. The Companies House Scraper does both in one run when &lt;code&gt;includeOfficers&lt;/code&gt; is on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is there a Companies House officers search across all companies?&lt;/strong&gt;&lt;br&gt;
GOV.UK searches officers by name only. For an industry, search by SIC code, then fetch officers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the location filter match an exact town?&lt;/strong&gt;&lt;br&gt;
No. It is a fuzzy match on the registered office address, so &lt;code&gt;Manchester&lt;/code&gt; covers the Greater Manchester area rather than one exact town. In our run, &lt;code&gt;Manchester&lt;/code&gt; also returned companies in Altrincham, Salford and Stockport. Check &lt;code&gt;registeredOfficeAddressText&lt;/code&gt; and remove rows outside your area.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the director list include home addresses or full dates of birth?&lt;/strong&gt;&lt;br&gt;
No. Home and correspondence addresses are not returned, and dates of birth show month and year only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I use this list for cold email to directors?&lt;/strong&gt;&lt;br&gt;
No. Officer data is personal data under UK GDPR, and the tool's guidance rules out unsolicited marketing. Use it for research, due diligence and KYB; take legal advice for anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does it cost?&lt;/strong&gt;&lt;br&gt;
$0.003 per company plus $0.001 per company for officers, so $4 per 1,000 companies with directors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need an API key?&lt;/strong&gt;&lt;br&gt;
Yes, a free Companies House API key for SIC and location searches. Only the built-in Tesco demo runs without one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;Recap: to build a UK company directors list for one industry, pick a SIC code and area, switch on officers, run, export, then filter to current directors. Use the list for due diligence, KYB or research, not outreach. Try the &lt;a href="https://apify.com/kingly_apple/companies-house-scraper" rel="noopener noreferrer"&gt;Companies House Scraper on Apify&lt;/a&gt;, and for keys, code examples and PSC data, read the &lt;a href="https://dev.to/saber3188/how-to-use-the-companies-house-api-without-writing-the-plumbing-uk-company-officers-and-psc-data-31ip"&gt;full API tutorial&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Contains public sector information licensed under the &lt;a href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" rel="noopener noreferrer"&gt;Open Government Licence v3.0&lt;/a&gt;. Source: Companies House. The scraper uses the Companies House public data API and is independent; it is not endorsed by Companies House.&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>webscraping</category>
      <category>opendata</category>
    </item>
    <item>
      <title>SIREN Lookup API Tutorial: Search French Companies by SIREN, SIRET, NAF Code or Department (No API Key)</title>
      <dc:creator>link</dc:creator>
      <pubDate>Sat, 17 Oct 2026 06:43:32 +0000</pubDate>
      <link>https://dev.to/saber3188/siren-lookup-api-tutorial-search-french-companies-by-siren-siret-naf-code-or-department-no-api-3560</link>
      <guid>https://dev.to/saber3188/siren-lookup-api-tutorial-search-french-companies-by-siren-siret-naf-code-or-department-no-api-3560</guid>
      <description>&lt;p&gt;French company data is open but awkward to use: the portals are mostly in French, INSEE's Sirene API needs an account, and the bulk files hold the whole register. This tutorial shows how to use &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE)&lt;/a&gt;, an Apify Actor, as a SIREN lookup API: paste SIREN or SIRET numbers, or search by name, NAF code, department or postcode, and export JSON or CSV with legal form, status, head office and VAT number. No API key is needed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  SIREN, SIRET and NAF codes explained (30-second primer)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SIREN:&lt;/strong&gt; a 9-digit number that identifies a French legal unit (the company).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SIRET:&lt;/strong&gt; a 14-digit number that identifies one establishment of that company: the SIREN plus a 5-digit suffix. Pass it when you need a &lt;strong&gt;SIRET API&lt;/strong&gt; lookup for one site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAF code:&lt;/strong&gt; the activity code, for example &lt;code&gt;62.01Z&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Actor accepts SIRENs and SIRETs in the same list and strips spaces, dots and dashes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where French company data comes from (and which source to use)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Comparison table
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Key needed&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Annuaire des Entreprises website&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Free single lookups by hand&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INSEE Sirene API&lt;/td&gt;
&lt;td&gt;Yes, an account&lt;/td&gt;
&lt;td&gt;Full register with history&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sirene bulk files on data.gouv.fr&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Downloading the whole register&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API Recherche d'entreprises&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Developers who will handle rate limits themselves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;France Company Search (SIRENE) on Apify&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Filtered lists, JSON/CSV export, pay per company&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a one-off &lt;strong&gt;SIREN number lookup&lt;/strong&gt;, the free &lt;a href="https://annuaire-entreprises.data.gouv.fr/" rel="noopener noreferrer"&gt;Annuaire des Entreprises&lt;/a&gt; website is the fastest way to find a SIREN number. For lists and automation, use the Actor.&lt;/p&gt;

&lt;p&gt;A note on the &lt;strong&gt;Sirene API&lt;/strong&gt; name: INSEE's Sirene API is a separate government service with its own account. This Actor does not use it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data source and licence
&lt;/h3&gt;

&lt;p&gt;The Actor reads public open data from the &lt;a href="https://recherche-entreprises.api.gouv.fr/docs/" rel="noopener noreferrer"&gt;API Recherche d'entreprises&lt;/a&gt;, the &lt;strong&gt;Annuaire des Entreprises API&lt;/strong&gt; run by DINUM. That API covers INSEE Sirene and other French public registers, and the data is reused under &lt;a href="https://www.etalab.gouv.fr/licence-ouverte-open-licence/" rel="noopener noreferrer"&gt;Licence Ouverte 2.0&lt;/a&gt;. The upstream API allows 7 requests per second per IP and scans at most 10,000 results per query; the Actor handles the rate limit and slicing. Every record carries a &lt;code&gt;sourceUpdatedAt&lt;/code&gt; date.&lt;/p&gt;

&lt;p&gt;This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What data you get
&lt;/h2&gt;

&lt;p&gt;You get one record per legal unit. The &lt;strong&gt;French company data&lt;/strong&gt; fields include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identity: &lt;code&gt;siren&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;legalName&lt;/code&gt;, &lt;code&gt;legalFormCode&lt;/code&gt;, &lt;code&gt;companyCategory&lt;/code&gt;, &lt;code&gt;isIndividualEntrepreneur&lt;/code&gt;, &lt;code&gt;diffusionStatus&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Status and dates: &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;creationDate&lt;/code&gt;, &lt;code&gt;closureDate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Activity and size: &lt;code&gt;nafCode&lt;/code&gt;, &lt;code&gt;employeeRange&lt;/code&gt;, establishment counts&lt;/li&gt;
&lt;li&gt;Head office: &lt;code&gt;headOffice{siret, address, postalCode, city, department}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tax: &lt;code&gt;vatNumber&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Optional directors: &lt;code&gt;dirigeants&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Provenance: &lt;code&gt;annuaireUrl&lt;/code&gt;, &lt;code&gt;licence&lt;/code&gt;, &lt;code&gt;sourceUpdatedAt&lt;/code&gt;, &lt;code&gt;fetchedAt&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The codes are passed through as the source provides them. &lt;code&gt;legalFormCode&lt;/code&gt; is the 4-digit INSEE legal category code (see INSEE's &lt;a href="https://www.insee.fr/fr/information/2028129" rel="noopener noreferrer"&gt;catégories juridiques&lt;/a&gt; list), &lt;code&gt;companyCategory&lt;/code&gt; is &lt;code&gt;PME&lt;/code&gt;, &lt;code&gt;ETI&lt;/code&gt; or &lt;code&gt;GE&lt;/code&gt;, and &lt;code&gt;nafCode&lt;/code&gt; follows NAF rev.2 (see INSEE's &lt;a href="https://www.insee.fr/fr/information/2406147" rel="noopener noreferrer"&gt;NAF nomenclature&lt;/a&gt;). &lt;code&gt;employeeRange&lt;/code&gt; holds the raw INSEE headcount-band code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data limitations:&lt;/strong&gt; this is not the complete Sirene database. Non-diffusible units and units that refused RCS registration are absent, and establishment predecessor/successor links are not included.&lt;/p&gt;

&lt;p&gt;Here is a record from the Actor's example output, shortened:&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;"siren"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"552032534"&lt;/span&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;"DANONE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="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;"creationDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1955-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nafCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"70.10Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"legalFormCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5599"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyCategory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"headOffice"&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="nl"&gt;"siret"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"55203253400703"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"59-61 RUE LA FAYETTE 75009 PARIS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"postalCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75009"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PARIS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"department"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"75"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vatNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FR27552032534"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dirigeants"&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;"sourceUpdatedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-14T08:01:59"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"annuaireUrl"&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://annuaire-entreprises.data.gouv.fr/entreprise/552032534"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"licence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Source: API Recherche d'entreprises (DINUM, recherche-entreprises.api.gouv.fr), data from INSEE Sirene and other French public registers. Licence Ouverte / Open Licence 2.0 (https://www.etalab.gouv.fr/licence-ouverte-open-licence/). Last update of each record: see sourceUpdatedAt."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step-by-step: search French companies in the Apify console
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE) page&lt;/a&gt; and click &lt;strong&gt;Try for free&lt;/strong&gt;. Sign in to Apify. No French API key is needed.&lt;/li&gt;
&lt;li&gt;The Input tab is pre-filled with three SIRENs (552032534, 542051180, 552120222), &lt;code&gt;status: any&lt;/code&gt; and &lt;code&gt;maxItems: 10&lt;/code&gt;. Run it as-is to see sample records.&lt;/li&gt;
&lt;li&gt;Choose your search: paste SIRENs or SIRETs into &lt;strong&gt;sirenOrSiret&lt;/strong&gt;, or use &lt;strong&gt;companyNames&lt;/strong&gt;, &lt;strong&gt;nafCodes&lt;/strong&gt;, &lt;strong&gt;departments&lt;/strong&gt; or &lt;strong&gt;postalCodes&lt;/strong&gt;. At least one is required.&lt;/li&gt;
&lt;li&gt;Optional: set &lt;strong&gt;incorporatedFrom&lt;/strong&gt; / &lt;strong&gt;incorporatedTo&lt;/strong&gt; (creation date, inclusive) and &lt;strong&gt;status&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Optional: enable &lt;strong&gt;includeDirigeants&lt;/strong&gt; (directors). Read the GDPR section first.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;maxItems&lt;/strong&gt;, the maximum number of companies output and charged.&lt;/li&gt;
&lt;li&gt;Optional: enable &lt;strong&gt;onlyNew&lt;/strong&gt; for scheduled runs. It tracks SIRENs already output.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;. Open the dataset to &lt;strong&gt;export French companies to CSV&lt;/strong&gt; or JSON; Apify datasets also export to Excel, XML, HTML table, RSS and JSONL. The &lt;code&gt;RUN-STATS&lt;/code&gt; and &lt;code&gt;ERRORS&lt;/code&gt; key-value records show counts and invalid inputs.&lt;/li&gt;
&lt;li&gt;Optional: schedule the run, for example a weekly NAF + department search with &lt;code&gt;onlyNew&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A mixed SIREN and SIRET lookup looks like this:&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="nl"&gt;"sirenOrSiret"&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;"552032534"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"13002526500013"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step-by-step: call it via API
&lt;/h2&gt;

&lt;p&gt;Use the Apify Python client. You need only your Apify token, no French API key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nafCodes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;62.01Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;departments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;48&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incorporatedFrom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incorporatedTo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025-12-31&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kingly_apple/sirene-company-search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_dataset_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or from a terminal with the Apify CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"sirenOrSiret":["552032534"]}'&lt;/span&gt; | apify call kingly_apple/sirene-company-search &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--output-dataset&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actor page also shows an Apify MCP server configuration if you want an AI agent to call it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filtering tips: NAF code, department, postcode and creation date
&lt;/h2&gt;

&lt;p&gt;To &lt;strong&gt;search French companies by NAF code&lt;/strong&gt; in a region, combine &lt;code&gt;nafCodes&lt;/code&gt; with &lt;code&gt;departments&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nafCodes"&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;"62.01Z"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"departments"&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;"48"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"incorporatedFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"incorporatedTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-12-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"any"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"includeDirigeants"&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;"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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;status&lt;/code&gt; takes &lt;code&gt;"any"&lt;/code&gt; (the default), &lt;code&gt;"active"&lt;/code&gt; or &lt;code&gt;"ceased"&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At least one of &lt;code&gt;sirenOrSiret&lt;/code&gt;, &lt;code&gt;companyNames&lt;/code&gt;, &lt;code&gt;nafCodes&lt;/code&gt;, &lt;code&gt;departments&lt;/code&gt; or &lt;code&gt;postalCodes&lt;/code&gt; is required.&lt;/li&gt;
&lt;li&gt;Number lookups ignore the status and date filters.&lt;/li&gt;
&lt;li&gt;Name search keeps only name matches (case- and accent-insensitive).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;French company search by department or postcode&lt;/strong&gt; matches any establishment, not only the head office; &lt;code&gt;matchedEstablishmentSirets&lt;/code&gt; lists the matches.&lt;/li&gt;
&lt;li&gt;The Actor applies date filters and &lt;code&gt;onlyNew&lt;/code&gt; itself (the upstream API has no date filter).&lt;/li&gt;
&lt;li&gt;Each query scans at most 10,000 results, so narrow large segments. Warnings appear in &lt;code&gt;RUN-STATS&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Want a full export by activity, plus the NAF 2025 codes? See &lt;a href="https://dev.to/saber3188/how-to-get-a-list-of-french-companies-by-naf-code-and-prepare-for-naf-2025-j1h"&gt;How to Get a List of French Companies by NAF Code (and Prepare for NAF 2025)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead generation (company-level):&lt;/strong&gt; build lists by NAF code, location and creation date, and schedule with &lt;code&gt;onlyNew&lt;/code&gt; to catch new companies. Prospecting must follow GDPR and CNIL rules (see below), and &lt;code&gt;diffusionStatus = "P"&lt;/code&gt; units are off-limits for marketing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYB / KYC verification:&lt;/strong&gt; confirm a SIREN or SIRET exists and check &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;legalFormCode&lt;/code&gt;, head office and &lt;code&gt;vatNumber&lt;/code&gt; before onboarding. &lt;code&gt;annuaireUrl&lt;/code&gt; gives a human-readable reference; &lt;code&gt;sourceUpdatedAt&lt;/code&gt; shows freshness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supplier due diligence:&lt;/strong&gt; batch-check suppliers for closures (&lt;code&gt;closureDate&lt;/code&gt;), establishment counts and head-office location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market mapping:&lt;/strong&gt; list companies in a sector and region over a creation-date window.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;$0.003 per company written to the dataset ($3 per 1,000 companies). Invalid numbers, not-found numbers, duplicates and companies removed by filters or &lt;code&gt;onlyNew&lt;/code&gt; are not charged.&lt;/p&gt;

&lt;h2&gt;
  
  
  GDPR and directors' data
&lt;/h2&gt;

&lt;p&gt;Directors are off by default. With &lt;code&gt;includeDirigeants&lt;/code&gt; enabled, each director entry contains name, role, birth year and month, and nationality only, never addresses or full birth dates. The keys are &lt;code&gt;type&lt;/code&gt; (&lt;code&gt;natural_person&lt;/code&gt; or &lt;code&gt;legal_entity&lt;/code&gt;), &lt;code&gt;lastName&lt;/code&gt;, &lt;code&gt;firstNames&lt;/code&gt;, &lt;code&gt;role&lt;/code&gt;, &lt;code&gt;birthYear&lt;/code&gt;, &lt;code&gt;birthMonth&lt;/code&gt;, &lt;code&gt;nationality&lt;/code&gt;, plus &lt;code&gt;siren&lt;/code&gt; and &lt;code&gt;denomination&lt;/code&gt; when the director is a company. Sole traders' company names are personal names. Units with &lt;code&gt;diffusionStatus = "P"&lt;/code&gt; must not be used for marketing or prospecting. You are the data controller, B2B marketing must follow GDPR and CNIL rules (see the CNIL's guidance on &lt;a href="https://www.cnil.fr/fr/la-prospection-commerciale-par-courrier-electronique-sms-mms-et-automate-dappel" rel="noopener noreferrer"&gt;electronic commercial prospecting&lt;/a&gt;, in French), and this is not legal advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is the difference between a SIREN and a SIRET number?&lt;/strong&gt;&lt;br&gt;
A SIREN is the 9-digit number of a French legal unit (the company). A SIRET is the 14-digit number of one establishment: the SIREN plus a 5-digit suffix. The Actor accepts both and normalises spaces, dots and dashes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I look up French companies by SIREN without an API key?&lt;/strong&gt;&lt;br&gt;
Yes. France Company Search (SIRENE) needs no API key. It uses the public API Recherche d'entreprises, the API behind Annuaire des Entreprises run by DINUM, and is not affiliated with INSEE, DINUM or the French government.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this INSEE's Sirene API?&lt;/strong&gt;&lt;br&gt;
No. INSEE's Sirene API is a separate government service that requires an account. This is an independent Apify Actor reusing open data from the API Recherche d'entreprises under Licence Ouverte 2.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I find all French companies with a given NAF code in a department?&lt;/strong&gt;&lt;br&gt;
Put the NAF code (e.g. 62.01Z) in &lt;code&gt;nafCodes&lt;/code&gt; and the department (e.g. 75, 2A, 971) in &lt;code&gt;departments&lt;/code&gt;, optionally with a creation-date range. Each query scans at most 10,000 results, so narrow large segments with postcodes or more specific codes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What data does France Company Search return?&lt;/strong&gt;&lt;br&gt;
One record per legal unit: SIREN, name, legal form code, status, creation and closure dates, NAF code, company category, employee range, head office, VAT number, an Annuaire des Entreprises link, optional directors and a &lt;code&gt;sourceUpdatedAt&lt;/code&gt; date.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does it cost?&lt;/strong&gt;&lt;br&gt;
$0.003 per company written to the dataset ($3 per 1,000 companies). Invalid or not-found numbers, duplicates and companies removed by filters or &lt;code&gt;onlyNew&lt;/code&gt; are not charged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I get directors (dirigeants) of French companies?&lt;/strong&gt;&lt;br&gt;
Yes, with &lt;code&gt;includeDirigeants&lt;/code&gt; (off by default). Only name, role, birth year and month, and nationality are returned. This is personal data under GDPR, so you need your own lawful basis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this the complete Sirene database?&lt;/strong&gt;&lt;br&gt;
No. Non-diffusible units and units that refused RCS registration are absent, and establishment predecessor/successor links are not included. For the full register with history, use INSEE's Sirene API or the &lt;a href="https://www.data.gouv.fr/datasets/base-sirene-des-entreprises-et-de-leurs-etablissements-siren-siret" rel="noopener noreferrer"&gt;bulk Sirene files on data.gouv.fr&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;France Company Search (SIRENE) is a SIREN lookup API with no key: search by SIREN, SIRET, NAF code, department or postcode, get clean JSON or CSV, and pay $0.003 per company. Run the 3-company example, then try your own NAF + department query: &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE) on Apify&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Working on UK + France KYB? See the &lt;a href="https://apify.com/kingly_apple/companies-house-scraper" rel="noopener noreferrer"&gt;Companies House Scraper on Apify&lt;/a&gt; for UK company, officer and PSC data.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Data: Annuaire des Entreprises / API Recherche d'entreprises (DINUM), INSEE Sirene and other French public registers, reused under Licence Ouverte 2.0.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This Actor is independent: it is not affiliated with or endorsed by INSEE, DINUM or the French government, and is not a government service.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>webscraping</category>
      <category>opendata</category>
    </item>
    <item>
      <title>How to Use the Companies House API Without Writing the Plumbing: UK Company, Officers and PSC Data</title>
      <dc:creator>link</dc:creator>
      <pubDate>Sat, 17 Oct 2026 06:42:15 +0000</pubDate>
      <link>https://dev.to/saber3188/how-to-use-the-companies-house-api-without-writing-the-plumbing-uk-company-officers-and-psc-data-31ip</link>
      <guid>https://dev.to/saber3188/how-to-use-the-companies-house-api-without-writing-the-plumbing-uk-company-officers-and-psc-data-31ip</guid>
      <description>&lt;p&gt;The Companies House API gives you free access to every company on the UK register. Getting that data into a spreadsheet or pipeline is another job: authentication, pagination, rate limits and separate calls for officers and persons with significant control (PSC). This tutorial shows how to pull company profiles, with optional officers and PSC, into JSON or CSV using the &lt;a href="https://apify.com/kingly_apple/companies-house-scraper" rel="noopener noreferrer"&gt;Companies House Scraper on Apify&lt;/a&gt;, from the console or code. The data comes from the Companies House public data API under the Open Government Licence v3.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Companies House API gives you (and where it gets painful)
&lt;/h2&gt;

&lt;p&gt;The REST API is free. You get an API key from the &lt;a href="https://developer.company-information.service.gov.uk/get-started" rel="noopener noreferrer"&gt;Companies House Developer Hub&lt;/a&gt; and send it with HTTP Basic authentication: the key is the username, the password is empty.&lt;/p&gt;

&lt;p&gt;The friction starts with more than one company:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate limit:&lt;/strong&gt; 600 requests per 5-minute window per key (&lt;a href="https://developer.company-information.service.gov.uk/developer-guidelines/" rel="noopener noreferrer"&gt;developer guidelines&lt;/a&gt;), then HTTP 429.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagination:&lt;/strong&gt; you loop over &lt;code&gt;start_index&lt;/code&gt; yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Separate endpoints:&lt;/strong&gt; officers and PSC each need their own calls per company.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a single &lt;strong&gt;UK company lookup&lt;/strong&gt;, the free GOV.UK &lt;a href="https://find-and-update.company-information.service.gov.uk/" rel="noopener noreferrer"&gt;Find and update company information&lt;/a&gt; service is quickest. For whole-register dumps, use the free &lt;a href="https://download.companieshouse.gov.uk/en_output.html" rel="noopener noreferrer"&gt;monthly bulk snapshot&lt;/a&gt; or the &lt;a href="https://download.companieshouse.gov.uk/en_pscdata.html" rel="noopener noreferrer"&gt;daily PSC snapshot&lt;/a&gt;. The scraper covers targeted lists in between.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Companies House Scraper does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data you get per company
&lt;/h3&gt;

&lt;p&gt;Company name, number, type, status, jurisdiction and incorporation date; registered office address; SIC codes; previous names; and accounts and confirmation statement due dates. Each record also has a Companies House link, the licence line and a &lt;code&gt;fetchedAt&lt;/code&gt; timestamp.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional officers and PSC
&lt;/h3&gt;

&lt;p&gt;Turn on &lt;code&gt;includeOfficers&lt;/code&gt; and &lt;code&gt;includePsc&lt;/code&gt; to attach officers and PSC to the same record. Both are off by default. Home and correspondence addresses are never returned, and birth dates are month and year only.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built for reliability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Stays under 600 requests per 5 minutes and retries automatically on 429.&lt;/li&gt;
&lt;li&gt;Your API key is a secret input, never written to logs, the dataset or key-value stores.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onlyNew&lt;/code&gt; skips companies already collected. The &lt;code&gt;SEEN-COMPANIES&lt;/code&gt; store holds company numbers only.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;runStats&lt;/code&gt; reports HTTP totals, the busiest 5-minute window, 429s and retries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to get a free Companies House API key
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Searching by company name, company number or any filter requires your own free Companies House API key.&lt;/strong&gt; Without a key, the only run that works is the built-in demo: company number &lt;code&gt;00445790&lt;/code&gt; (Tesco PLC) with no other filters.&lt;/p&gt;

&lt;p&gt;From the Companies House developer docs (&lt;a href="https://developer.company-information.service.gov.uk/how-to-create-an-application" rel="noopener noreferrer"&gt;How to create an application&lt;/a&gt;):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Register a Companies House user account and sign in to the Developer Hub at developer.company-information.service.gov.uk.&lt;/li&gt;
&lt;li&gt;Create an application: add a name and description, choose a &lt;strong&gt;live&lt;/strong&gt; application (test applications use the sandbox), and select 'Create'.&lt;/li&gt;
&lt;li&gt;Open the application and select 'Create new key'.&lt;/li&gt;
&lt;li&gt;Name the key, choose the &lt;strong&gt;API key&lt;/strong&gt; client type (not a stream key or OAuth web client) and select 'Create'.&lt;/li&gt;
&lt;li&gt;Paste it into &lt;code&gt;apiKey&lt;/code&gt;. In code, use a placeholder like &lt;code&gt;YOUR_COMPANIES_HOUSE_API_KEY&lt;/code&gt; and load the real key from an environment variable or secret store.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step-by-step: run it in the Apify console
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://apify.com/kingly_apple/companies-house-scraper" rel="noopener noreferrer"&gt;Companies House Scraper page&lt;/a&gt; and click &lt;strong&gt;Try for free&lt;/strong&gt;. Sign in to Apify.&lt;/li&gt;
&lt;li&gt;The Input tab is pre-filled with &lt;code&gt;00445790&lt;/code&gt; (Tesco PLC). Run it as-is to see a sample record (the only keyless run).&lt;/li&gt;
&lt;li&gt;Paste your API key into &lt;strong&gt;apiKey&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose how to search: add &lt;strong&gt;companyNumbers&lt;/strong&gt;, &lt;strong&gt;companyNameKeywords&lt;/strong&gt;, or filters (&lt;strong&gt;sicCodes&lt;/strong&gt;, &lt;strong&gt;location&lt;/strong&gt;, &lt;strong&gt;incorporatedFrom&lt;/strong&gt; / &lt;strong&gt;incorporatedTo&lt;/strong&gt;, &lt;strong&gt;companyStatus&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Optional: switch on &lt;strong&gt;includeOfficers&lt;/strong&gt; and/or &lt;strong&gt;includePsc&lt;/strong&gt; (each +$0.001 per company).&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;maxItems&lt;/strong&gt; to cap records written and charged.&lt;/li&gt;
&lt;li&gt;Optional: tick &lt;strong&gt;onlyNew&lt;/strong&gt; for recurring runs.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start&lt;/strong&gt;, then open the dataset for your &lt;strong&gt;Companies House data export&lt;/strong&gt;. Apify datasets export to JSON, CSV, XML, Excel, HTML table, RSS or JSONL. Pick CSV for &lt;strong&gt;Companies House to CSV&lt;/strong&gt; spreadsheet imports.&lt;/li&gt;
&lt;li&gt;Optional: schedule it daily with &lt;code&gt;onlyNew&lt;/code&gt; to monitor new registrations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A number lookup with both add-ons:&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;"companyNameKeywords"&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;"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;"sicCodes"&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;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyStatus"&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;"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;"includePsc"&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;"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="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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;companyStatus&lt;/code&gt; accepts any of: &lt;code&gt;active&lt;/code&gt;, &lt;code&gt;dissolved&lt;/code&gt;, &lt;code&gt;liquidation&lt;/code&gt;, &lt;code&gt;receivership&lt;/code&gt;, &lt;code&gt;administration&lt;/code&gt;, &lt;code&gt;voluntary-arrangement&lt;/code&gt;, &lt;code&gt;converted-closed&lt;/code&gt;, &lt;code&gt;insolvency-proceedings&lt;/code&gt;, &lt;code&gt;registered&lt;/code&gt;, &lt;code&gt;removed&lt;/code&gt;, &lt;code&gt;closed&lt;/code&gt;, &lt;code&gt;open&lt;/code&gt;. Leave it empty for any status. &lt;code&gt;maxItems&lt;/code&gt; accepts 1 to 10,000 (default 100).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-step: run it via API (Python / JavaScript / cURL)
&lt;/h2&gt;

&lt;p&gt;For a &lt;strong&gt;Companies House API Python&lt;/strong&gt; workflow, use the Apify Python client. This lists London companies under SIC 47110 incorporated in H1 2026, with officers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;run_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apiKey&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_COMPANIES_HOUSE_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sicCodes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;47110&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;London&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incorporatedFrom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;incorporatedTo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-06-30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeOfficers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includePsc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onlyNew&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kingly_apple/companies-house-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default_dataset_id&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JavaScript client works the same way. From a terminal, use the Apify CLI or cURL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Apify CLI&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'{"apiKey":"YOUR_COMPANIES_HOUSE_API_KEY","companyNumbers":["00445790"]}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | apify call kingly_apple/companies-house-scraper &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--output-dataset&lt;/span&gt;

&lt;span class="c"&gt;# cURL (Apify API, returns the dataset items)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/kingly_apple~companies-house-scraper/run-sync-get-dataset-items"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_APIFY_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"apiKey":"YOUR_COMPANIES_HOUSE_API_KEY","companyNumbers":["00445790"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Actor page also shows an Apify MCP server config for AI agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Filtering: search by name, number, SIC code, location, date and status
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name keywords&lt;/strong&gt; alone use &lt;code&gt;/search/companies&lt;/code&gt;. Combined with other filters, they become &lt;code&gt;company_name_includes&lt;/code&gt; on advanced search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Companies House advanced search by SIC code:&lt;/strong&gt; SIC 2007 codes in &lt;code&gt;sicCodes&lt;/code&gt;, a town, region or postcode fragment in &lt;code&gt;location&lt;/code&gt;, dates in &lt;code&gt;incorporatedFrom&lt;/code&gt; / &lt;code&gt;incorporatedTo&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Company numbers&lt;/strong&gt; are normalised (spaces removed, uppercased, short numeric ones left-padded to 8 digits). Invalid ones are skipped.&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;incorporatedFrom&lt;/code&gt; is later than &lt;code&gt;incorporatedTo&lt;/code&gt;, the run fails before any request.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sample output
&lt;/h2&gt;

&lt;p&gt;From a live run of the Tesco demo on Apify (15 October 2026), trimmed, values unchanged. &lt;code&gt;officers&lt;/code&gt; and &lt;code&gt;psc&lt;/code&gt; are &lt;code&gt;null&lt;/code&gt; because the demo skips the add-ons.&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;"companyNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&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;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TESCO PLC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyStatus"&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;"companyType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"plc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jurisdiction"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"england-wales"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dateOfCreation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1947-11-27"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sicCodes"&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;"47110"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"registeredOfficeAddressText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"previousCompanyNames"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"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;"TESCO STORES (HOLDINGS) PUBLIC LIMITED COMPANY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"effectiveFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1981-12-14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ceasedOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1983-08-25"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"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;"TESCO STORES (HOLDINGS) LIMITED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"effectiveFrom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1947-11-27"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"ceasedOn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1981-12-14"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accountsNextDue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-08-26"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"accountsLastMadeUpTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-02-28"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confirmationStatementNextDue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-07-02"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confirmationStatementLastMadeUpTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-06-18"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyUrl"&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://find-and-update.company-information.service.gov.uk/company/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;"officers"&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;"psc"&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;"source"&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 House Public Data API"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"licence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Contains public sector information licensed under the Open Government Licence v3.0."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fetchedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-15T01:07:11Z"&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;With &lt;code&gt;includeOfficers&lt;/code&gt; on, each officer entry has &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;officerRole&lt;/code&gt;, &lt;code&gt;appointedOn&lt;/code&gt;, &lt;code&gt;resignedOn&lt;/code&gt;, &lt;code&gt;nationality&lt;/code&gt;, &lt;code&gt;occupation&lt;/code&gt;, &lt;code&gt;countryOfResidence&lt;/code&gt;, &lt;code&gt;dateOfBirth&lt;/code&gt; (month and year) and &lt;code&gt;appointmentId&lt;/code&gt;. With &lt;code&gt;includePsc&lt;/code&gt; on, each PSC entry has &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;kind&lt;/code&gt;, &lt;code&gt;naturesOfControl&lt;/code&gt;, &lt;code&gt;notifiedOn&lt;/code&gt;, &lt;code&gt;ceasedOn&lt;/code&gt;, &lt;code&gt;nationality&lt;/code&gt;, &lt;code&gt;countryOfResidence&lt;/code&gt;, &lt;code&gt;dateOfBirth&lt;/code&gt; (month and year) and, for corporate PSCs, &lt;code&gt;identification&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead generation (company-level):&lt;/strong&gt; list companies by SIC code, location and incorporation date; schedule with &lt;code&gt;onlyNew&lt;/code&gt; for a daily &lt;strong&gt;new company registrations UK list&lt;/strong&gt;. Officer and PSC data must not be used for unsolicited marketing, and UK GDPR and PECR apply to outreach.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC / KYB / AML:&lt;/strong&gt; get profile, officers and PSC in one call to check status and control. You determine your own lawful basis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Due diligence:&lt;/strong&gt; batch-check numbers for status, overdue filings, previous names and controllers, and re-run on a schedule to refresh the data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market research:&lt;/strong&gt; list incorporations by sector, region and date.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Need the directors of every company in one industry? See &lt;a href="https://dev.to/saber3188/how-to-get-a-list-of-directors-for-uk-companies-in-any-industry-sic-code-29la"&gt;How to Get a List of Directors for UK Companies in Any Industry (SIC Code)&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;$0.003 per company&lt;/li&gt;
&lt;li&gt;+$0.001 per company with officers&lt;/li&gt;
&lt;li&gt;+$0.001 per company with PSC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Failed lookups, 404s and duplicates are not charged.&lt;/p&gt;

&lt;p&gt;Example calculation: 1,000 companies with officers and PSC = 1,000 x ($0.003 + $0.001 + $0.001) = $5.00.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data licence and personal data
&lt;/h2&gt;

&lt;p&gt;Contains public sector information licensed under the &lt;a href="https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/" rel="noopener noreferrer"&gt;Open Government Licence v3.0&lt;/a&gt;. Source: Companies House. The scraper is independent and not endorsed by Companies House.&lt;/p&gt;

&lt;p&gt;Officer and PSC details are personal data under UK GDPR. You are the data controller, need a lawful basis (KYB, AML, due diligence) and must not use it for unsolicited marketing. No home or correspondence addresses are returned; birth dates are month and year only. See the &lt;a href="https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/lawful-basis/" rel="noopener noreferrer"&gt;ICO guidance on lawful basis&lt;/a&gt;. This is not legal advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is the Companies House API free?&lt;/strong&gt;&lt;br&gt;
Yes, with a free key from the Developer Hub, rate-limited to 600 requests per 5 minutes. The scraper uses your own key and charges only per company returned.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do I get a Companies House API key?&lt;/strong&gt;&lt;br&gt;
Register a Companies House account, sign in to the Developer Hub, create a live application, select 'Create new key' and choose the API key type. Paste it into &lt;code&gt;apiKey&lt;/code&gt;, where it is stored as a secret and never logged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I get directors and officers data from Companies House?&lt;/strong&gt;&lt;br&gt;
Yes. The &lt;strong&gt;Companies House officers API&lt;/strong&gt; endpoint is &lt;code&gt;/company/{company_number}/officers&lt;/code&gt;. The scraper adds officers when &lt;code&gt;includeOfficers&lt;/code&gt; is on (+$0.001 per company), without addresses and with month/year birth dates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is PSC data?&lt;/strong&gt;&lt;br&gt;
"Persons with significant control": who owns or controls a UK company. &lt;strong&gt;Persons with significant control data&lt;/strong&gt; is available per company via the API or as a free daily snapshot. The scraper attaches it when &lt;code&gt;includePsc&lt;/code&gt; is on (+$0.001 per company).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How much does the Companies House Scraper cost?&lt;/strong&gt;&lt;br&gt;
$0.003 per company, plus $0.001 per company with officers and $0.001 per company with PSC. Failed lookups, 404s and duplicates are not charged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I search Companies House by SIC code or location?&lt;/strong&gt;&lt;br&gt;
Yes. SIC codes, location, status and incorporation dates go to the advanced search endpoint, and you can add name keywords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is the Companies House API rate limit?&lt;/strong&gt;&lt;br&gt;
600 requests per 5 minutes per key, with HTTP 429 beyond that. The scraper stays under the &lt;strong&gt;Companies House API rate limit&lt;/strong&gt; and retries on 429.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it legal to use Companies House officer and PSC data?&lt;/strong&gt;&lt;br&gt;
It is public, OGL v3.0 data, but officer and PSC details are personal data under UK GDPR. You need a lawful basis, and the tool's guidance rules out unsolicited marketing. This is not legal advice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;You get flexible filters, officers and PSC in one record, and no rate-limit, retry or pagination code to maintain. Try it on the Tesco PLC example, then add your own API key: &lt;a href="https://apify.com/kingly_apple/companies-house-scraper" rel="noopener noreferrer"&gt;Companies House Scraper on Apify&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Need French companies too? See &lt;a href="https://apify.com/kingly_apple/sirene-company-search" rel="noopener noreferrer"&gt;France Company Search (SIRENE) on Apify&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opendata</category>
      <category>api</category>
      <category>python</category>
      <category>webscraping</category>
    </item>
  </channel>
</rss>
